first commit
This commit is contained in:
		
							
								
								
									
										72
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| include premake.make | ||||
|  | ||||
| BIN := $(shell basename $$(pwd)) | ||||
|  | ||||
| MANSECTION := 1 | ||||
| MANPAGE := $(BIN).$(MANSECTION) | ||||
|  | ||||
| SRCS := $(notdir $(wildcard src/*.cpp)) | ||||
| OBJS := $(SRCS:.cpp=.o) | ||||
| DEPS := $(SRCS:.cpp=.d) | ||||
|  | ||||
| BUILDDIR := build/intermediates/ | ||||
| PREFIX ?= /usr/local | ||||
| BINDIR ?= $(PREFIX)/bin | ||||
| CONFIGDIR ?= $(PREFIX)/etc | ||||
| DATADIR ?= $(PREFIX)/share | ||||
| MANDIR ?= $(DATADIR)/man/man | ||||
| DOCDIR ?= $(DATADIR)/$(BIN)/doc | ||||
|  | ||||
| CXX ?= g++ | ||||
| RM := /bin/rm -rf | ||||
| INSTALL := /usr/bin/install -c | ||||
|  | ||||
| CXXFLAGS := $(CXXFLAGS) -Wshadow -Wall -Wpedantic -Wextra -g -fno-strict-aliasing -std=c++17 -pthread | ||||
| ifeq ($(DEBUG),1) | ||||
| 	CXXFLAGS += -D DEBUG -O0 | ||||
| 	CONFIG := debug | ||||
| else | ||||
| 	CXXFLAGS += -D NDEBUG -O3 | ||||
| 	CONFIG := release | ||||
| endif | ||||
| OUTDIR := build/$(CONFIG)/ | ||||
|  | ||||
| vpath %.cpp src | ||||
| vpath %.d $(BUILDDIR) | ||||
| vpath %.o $(BUILDDIR) | ||||
|  | ||||
| .PHONY: all clean install prebuild test dist-clean | ||||
|  | ||||
| all: prebuild $(OUTDIR)$(BIN) | ||||
|  | ||||
| prebuild: | ||||
| 	@mkdir -p $(BUILDDIR) $(OUTDIR) | ||||
|  | ||||
| $(OUTDIR)$(BIN): $(OBJS) $(DEPS) | ||||
| 	$(CXX) $(addprefix $(BUILDDIR),$(OBJS)) $(LDFLAGS) $(LDLIBS) -o $(OUTDIR)$(BIN) | ||||
| 	@ln -sf $(OUTDIR)$(BIN) $(BIN) | ||||
|  | ||||
| %.o: %.cpp %.d | ||||
| 	$(CXX) $(CXXFLAGS) -MMD -MP -MT $@ -MF $*.d -c $< | ||||
| 	@mv $@ $*.d $(BUILDDIR) | ||||
|  | ||||
| -include $(BUILDDIR)*.d | ||||
|  | ||||
| %.d: ; | ||||
|  | ||||
| test: | ||||
| 	$(MAKE) -C tests && tests/tests | ||||
|  | ||||
| clean: | ||||
| 	$(RM) $(BUILDDIR) | ||||
| 	$(MAKE) -C tests clean | ||||
|  | ||||
| dist-clean: | ||||
| 	$(RM) build $(BIN) | ||||
| 	$(MAKE) -C tests clean | ||||
|  | ||||
| install: $(OUTDIR)$(BIN) | ||||
| 	$(INSTALL) -d $(BINDIR) | ||||
| 	$(INSTALL) $(OUTDIR)$(BIN) $(BINDIR) | ||||
| 	$(INSTALL) -d $(MANDIR)$(MANSECTION) | ||||
| 	$(INSTALL) -m 0644 $(MANPAGE) $(MANDIR)$(MANSECTION) | ||||
							
								
								
									
										1
									
								
								premake.make
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								premake.make
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| LDLIBS := -lm -lpthread -lscnumerics | ||||
							
								
								
									
										57
									
								
								pw.1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								pw.1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| .Dd $Mdocdate$ | ||||
| .Dt pw 1 | ||||
| .Os | ||||
| .Sh NAME | ||||
| .Nm pw | ||||
| .Nd one line about what it does | ||||
| .\" .Sh LIBRARY | ||||
| .\" For sections 2, 3, and 9	only. | ||||
| .\" Not used in OpenBSD. | ||||
| .Sh SYNOPSIS | ||||
| .Nm | ||||
| .Fl h | v | ||||
| .Nm | ||||
| .Op Ar | ||||
| .Sh DESCRIPTION | ||||
| The | ||||
| .Nm | ||||
| utility processes files ... | ||||
| When no file arguments are given, | ||||
| .Nm | ||||
| will read from the standard input. | ||||
| .Pp | ||||
| The options are as follows: | ||||
| .Bl -tag -width Ds | ||||
| .It Fl h, \-help | ||||
| Print help text and exit. | ||||
| .It Fl v, \-version | ||||
| Print version info and exit. | ||||
| .El | ||||
| .\" .Sh CONTEXT | ||||
| .\" For section 9 functions only. | ||||
| .\" .Sh IMPLEMENTATION NOTES | ||||
| .\" Not used in OpenBSD. | ||||
| .\" .Sh RETURN VALUES | ||||
| .\" For sections 2, 3, and 9 function return values only. | ||||
| .\" .Sh ENVIRONMENT | ||||
| .\" For sections 1, 6, 7, and 8 only. | ||||
| .\" .Sh FILES | ||||
| .Sh EXIT STATUS | ||||
| .\" For sections 1, 6, and 8 only. | ||||
| .Nm | ||||
| exits 0 on success, and 1 if an error occurs. | ||||
| .\" .Sh EXAMPLES | ||||
| .\" .Sh DIAGNOSTICS | ||||
| .\" For sections 1, 4, 6, 7, 8, and 9 printf/stderr messages only. | ||||
| .\" .Sh ERRORS | ||||
| .\" For sections 2, 3, 4, and 9 errno settings only. | ||||
| .\" .Sh SEE ALSO | ||||
| .\" .Xr foobar 1 | ||||
| .\" .Sh STANDARDS | ||||
| .\" .Sh HISTORY | ||||
| .Sh AUTHORS | ||||
| Bob Polis | ||||
| .\" .Sh CAVEATS | ||||
| .\" .Sh BUGS | ||||
| .\" .Sh SECURITY CONSIDERATIONS | ||||
| .\" Not used in OpenBSD. | ||||
							
								
								
									
										106
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| // | ||||
| // main.cpp | ||||
| // pw | ||||
| // | ||||
| // Created by Bob Polis at 2021-11-05 | ||||
| // Copyright (c) 2021 SwiftCoder. All rights reserved. | ||||
| // | ||||
|  | ||||
| #include <iostream> | ||||
| #include <cstdlib> | ||||
| #include <string> | ||||
| #include <stdexcept> | ||||
| #include <getopt.h> | ||||
| #include <libscnumerics.hpp> | ||||
|  | ||||
| void print_help() { | ||||
|     std::cout << "usage: pw [-h|--version]\n"; | ||||
|     std::cout << "  -h, --help    show this help text and exit\n"; | ||||
|     std::cout << "  --version     show version number and exit\n"; | ||||
| } | ||||
|  | ||||
| void print_version() { | ||||
|     std::cout << "pw version 1.0\n"; | ||||
| } | ||||
|  | ||||
| int main(int argc, char* argv[]) { | ||||
|     try { | ||||
|         std::string upper {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}; | ||||
|         std::string lower {"abcdefghijklmnopqrstuvwxyz"}; | ||||
|         std::string digits {"0123456789"}; | ||||
|         std::string symbols {"_-=+<>,.!@#$%^&*"}; | ||||
|         std::string valid; | ||||
|         int len {12}; | ||||
|         bool noflags {true}; | ||||
|         int opt_char, opt_val; | ||||
|         struct option long_options[] = { | ||||
|             {"help", no_argument, nullptr, 'h'}, | ||||
|             {"version", no_argument, &opt_val, 1}, | ||||
|             {"upper", no_argument, nullptr, 'u'}, | ||||
|             {"lower", no_argument, nullptr, 'l'}, | ||||
|             {"digit", no_argument, nullptr, 'd'}, | ||||
|             {"symbol", no_argument, nullptr, 's'}, | ||||
|             {"count", required_argument, nullptr, 'c'}, | ||||
|             {nullptr, 0, nullptr, 0} | ||||
|         }; | ||||
|         while ((opt_char = getopt_long(argc, argv, "c:hulds", long_options, nullptr)) != -1) { | ||||
|             std::string arg {optarg ? optarg : ""}; | ||||
|             switch (opt_char) { | ||||
|                 case 0: { | ||||
|                     // handle long-only options here | ||||
|                     switch (opt_val) { | ||||
|                         case 1: | ||||
|                             print_version(); | ||||
|                             return EXIT_SUCCESS; | ||||
|                     } | ||||
|                     break; | ||||
|                 } | ||||
|                 case 'h': | ||||
|                     print_help(); | ||||
|                     return EXIT_SUCCESS; | ||||
|                 case 'u': | ||||
|                     noflags = false; | ||||
|                     valid += upper; | ||||
|                     break; | ||||
|                 case 'l': | ||||
|                     noflags = false; | ||||
|                     valid += lower; | ||||
|                     break; | ||||
|                 case 'd': | ||||
|                     noflags = false; | ||||
|                     valid += digits; | ||||
|                     break; | ||||
|                 case 's': | ||||
|                     noflags = false; | ||||
|                     valid += symbols; | ||||
|                     break; | ||||
|                 case 'c': | ||||
|                     len = std::stoi(optarg); | ||||
|                     break; | ||||
|                 case '?': | ||||
|                     throw std::runtime_error("unrecognized option"); | ||||
|             } | ||||
|         } | ||||
|         if (optind == argc) { | ||||
|             // here when no file args | ||||
|             if (noflags) { | ||||
|                 valid = upper + lower + digits + symbols; | ||||
|             } | ||||
|             for (int i = 0; i < len; ++i) { | ||||
|                 std::cout << sc::random::choice<char>(valid.begin(), valid.end()); | ||||
|             } | ||||
|             std::cout << std::endl; | ||||
|         } | ||||
|         for (int i = optind; i < argc; ++i) { | ||||
|             try { | ||||
|                 // process file argv[i] | ||||
|             } catch (const std::runtime_error& ex) { | ||||
|                 std::cerr << "pw: " << ex.what() << '\n'; | ||||
|             } | ||||
|         } | ||||
|     } catch (const std::exception& ex) { | ||||
|         std::cerr << "pw: " << ex.what() << '\n'; | ||||
|         return EXIT_FAILURE; | ||||
|     } | ||||
|     return EXIT_SUCCESS; | ||||
| } | ||||
							
								
								
									
										51
									
								
								tests/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								tests/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| include ../premake.make | ||||
| LDLIBS += -lboost_unit_test_framework | ||||
|  | ||||
| BIN := $(shell basename $$(pwd)) | ||||
|  | ||||
| SRCS := $(notdir $(wildcard src/*.cpp)) | ||||
| SRCS += $(notdir $(filter-out ../src/main.cpp,$(wildcard ../src/*.cpp))) | ||||
| OBJS := $(SRCS:.cpp=.o) | ||||
| DEPS := $(SRCS:.cpp=.d) | ||||
|  | ||||
| BUILDDIR := build/intermediates/ | ||||
|  | ||||
| CXX ?= g++ | ||||
| RM := /bin/rm -rf | ||||
| INSTALL := /usr/bin/install -c | ||||
|  | ||||
| CXXFLAGS := $(CXXFLAGS) -Wshadow -Wall -Wpedantic -Wextra -g -fno-strict-aliasing -std=c++17 -pthread -I../src | ||||
| ifeq ($(DEBUG),1) | ||||
| 	CXXFLAGS += -D DEBUG -O0 | ||||
| 	CONFIG := debug | ||||
| else | ||||
| 	CXXFLAGS += -D NDEBUG -O3 | ||||
| 	CONFIG := release | ||||
| endif | ||||
| OUTDIR := build/$(CONFIG)/ | ||||
|  | ||||
| vpath %.cpp src ../src | ||||
| vpath %.d $(BUILDDIR) | ||||
| vpath %.o $(BUILDDIR) | ||||
|  | ||||
| .PHONY: all clean prebuild | ||||
|  | ||||
| all: prebuild $(OUTDIR)$(BIN) | ||||
|  | ||||
| prebuild: | ||||
| 	@mkdir -p $(BUILDDIR) $(OUTDIR) | ||||
|  | ||||
| $(OUTDIR)$(BIN): $(OBJS) $(DEPS) | ||||
| 	$(CXX) $(addprefix $(BUILDDIR),$(OBJS)) $(LDFLAGS) $(LDLIBS) -o $(OUTDIR)$(BIN) | ||||
| 	@ln -sf $(OUTDIR)$(BIN) $(BIN) | ||||
|  | ||||
| %.o: %.cpp %.d | ||||
| 	$(CXX) $(CXXFLAGS) -MMD -MP -MT $@ -MF $*.d -c $< | ||||
| 	@mv $@ $*.d $(BUILDDIR) | ||||
|  | ||||
| -include $(BUILDDIR)*.d | ||||
|  | ||||
| %.d: ; | ||||
|  | ||||
| clean: | ||||
| 	$(RM) build $(BIN) | ||||
							
								
								
									
										8
									
								
								tests/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								tests/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #define BOOST_TEST_MODULE My Test | ||||
| #define BOOST_TEST_DYN_LINK | ||||
| #include <boost/test/unit_test.hpp> | ||||
|  | ||||
| BOOST_AUTO_TEST_CASE(first_test) | ||||
| { | ||||
|     BOOST_TEST(1 == 1); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Bob Polis
					Bob Polis