commit 91e1cca43e23bb718a3c2bdd5d5c87dbc0d990ef Author: Bob Polis Date: Fri Nov 5 16:47:27 2021 +0100 first commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a34594f --- /dev/null +++ b/Makefile @@ -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) diff --git a/premake.make b/premake.make new file mode 100644 index 0000000..54dcdf5 --- /dev/null +++ b/premake.make @@ -0,0 +1 @@ +LDLIBS := -lm -lpthread -lscnumerics diff --git a/pw.1 b/pw.1 new file mode 100644 index 0000000..75497dc --- /dev/null +++ b/pw.1 @@ -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. diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..a495f03 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,106 @@ +// +// main.cpp +// pw +// +// Created by Bob Polis at 2021-11-05 +// Copyright (c) 2021 SwiftCoder. All rights reserved. +// + +#include +#include +#include +#include +#include +#include + +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(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; +} diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..ae065a3 --- /dev/null +++ b/tests/Makefile @@ -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) diff --git a/tests/src/main.cpp b/tests/src/main.cpp new file mode 100644 index 0000000..533ab2a --- /dev/null +++ b/tests/src/main.cpp @@ -0,0 +1,8 @@ +#define BOOST_TEST_MODULE My Test +#define BOOST_TEST_DYN_LINK +#include + +BOOST_AUTO_TEST_CASE(first_test) +{ + BOOST_TEST(1 == 1); +}