From 2a8e54610b2f8c4d4ce0e63987fc36ee7a9229e9 Mon Sep 17 00:00:00 2001 From: Michael Ochmann Date: Fri, 24 Feb 2023 14:25:51 +0100 Subject: [PATCH] added man page support --- CMakeLists.txt | 10 ++++++- main.cpp | 75 +++++++++++++++++++++++++++++++++----------------- src/QR.cpp | 10 ++++++- src/QR.hpp | 3 +- 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 091f0d5..e8c22cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,5 +27,13 @@ set_target_properties(qr PROPERTIES OUTPUT_NAME ${EXE_NAME}) target_compile_options(qr PUBLIC -Wall -std=c++20 -arch ${ARCH}) target_include_directories(qr PRIVATE src lib) +add_custom_target(man ALL) +add_custom_command( + TARGET man + COMMAND help2man -h "-h" -v "-v" -o qr.7 ${EXE_NAME} + COMMAND gzip -f qr.7 +) + install(TARGETS qr RUNTIME DESTINATION bin) -install(PROGRAMS build/${EXE_NAME} DESTINATION bin RENAME qr) \ No newline at end of file +install(PROGRAMS build/${EXE_NAME} DESTINATION bin RENAME qr) +install(FILES build/qr.7.gz DESTINATION /usr/local/share/man/man7/) \ No newline at end of file diff --git a/main.cpp b/main.cpp index 46e97cc..baa1fc6 100644 --- a/main.cpp +++ b/main.cpp @@ -12,20 +12,39 @@ constexpr const char* VERSION = "@qr_VERSION@"; void printHelp() { std::string helpText = R"EOF( -(C) 2023, MikO -– a tool for generating QR codes – -Released under MIT license. - -Usage: - -f --format output file format. can be one of "cli, png, svg, jpg, bmp" - -h --help show this help - -i --input take data from this argument instead of stdin - -o --output output file name without extension - -s --size desired output file size in pixels - -t --type output QR code type. can be one of "small, medium, large" - -In pixel based renderers (i.e. PNG), the output size may not be exactly as -specified but be the nearest multiple of the actual cell size for the QR code. + +qr is a tool for generating QR codes from the commandline + +Usage: qr [OPTION]... --input "data to encapsulate" + +*Caveats* + With no `--input` parameter defined, read STDIN + + In pixel based renderers (i.e. PNG), the output size may not be exactly as + specified but be the nearest multiple of the actual cell size for the QR code. + +Options: + -f --format output file format. can be one of "cli, png, svg, jpg, bmp" + -h --help show this help + -i --input take data from this argument instead of stdin + -o --output output file name without extension + -s --size desired output file size in pixels + -t --type output QR code type. can be one of "small, medium, large" + -v --version shows version info + +Examples: + qr -i "this is from parameter" -f png -s 512 -o my_qrcode_file + + echo "this is from stdin" | qr -t small -f png -s 512 -o my_qrcode_file_with_low_ecc + +Copyright: + (C) 2023, MikO + +*License* + Released under MIT license + +Report bugs and issues at out issue tracker: + https://git.mike-ochmann.de/MassiveDynamic/qr/issues )EOF"; std::cout << "qr " << VERSION; std::cout << helpText << std::endl; @@ -37,26 +56,27 @@ int main(int argc, char* argv[]) { exit(1); } const option options[] = { - {"help", no_argument, nullptr, 'h'}, - {"input", required_argument, nullptr, 'i'}, - {"output", required_argument, nullptr, 'o'}, - {"size", required_argument, nullptr, 's'}, - {"type", required_argument, nullptr, 't'}, - {"format", required_argument, nullptr, 'f'}, + {"help", no_argument, nullptr, 'h'}, + {"input", required_argument, nullptr, 'i'}, + {"output", required_argument, nullptr, 'o'}, + {"size", required_argument, nullptr, 's'}, + {"type", required_argument, nullptr, 't'}, + {"format", required_argument, nullptr, 'f'}, + {"version", no_argument, nullptr, 'v'}, {nullptr} }; std::string outputFile; + std::string paramData; size_t segmentSize = 0; - massivedynamic::Type type = massivedynamic::Type::MEDIUM; - massivedynamic::Format format = massivedynamic::Format::CONSOLE; bool fromStdin = true; bool anyParameterSet = false; - std::string paramData = ""; + massivedynamic::Type type = massivedynamic::Type::MEDIUM; + massivedynamic::Format format = massivedynamic::Format::CONSOLE; for(;;) { int index = -1; - int result = getopt_long(argc, argv, "ho:s:t:f:i:", options, &index); + int result = getopt_long(argc, argv, "vho:s:t:f:i:", options, &index); if (result == -1) break; @@ -112,6 +132,10 @@ int main(int argc, char* argv[]) { paramData = optarg; break; } + case 'v': { + std::cout << "qr " << VERSION << std::endl; + exit(0); + } case 'h': default: printHelp(); @@ -152,7 +176,8 @@ int main(int argc, char* argv[]) { return 1; } - std::unique_ptr qr = std::make_unique(data.str(), outputFile, segmentSize, type, format); + std::unique_ptr qr = std::make_unique(data.str(), outputFile, segmentSize, type); + qr->render(format); return 0; } \ No newline at end of file diff --git a/src/QR.cpp b/src/QR.cpp index 8530e43..89f2c53 100644 --- a/src/QR.cpp +++ b/src/QR.cpp @@ -12,7 +12,7 @@ namespace massivedynamic { -QR::QR(const std::string& data, std::string outputFile, size_t size, Type type, Format format) : outputFile(std::move(outputFile)) { +QR::QR(const std::string& data, std::string outputFile, size_t size, Type type) : outputFile(std::move(outputFile)) { qrcodegen::QrCode::Ecc errorCorrectionLevel = qrcodegen::QrCode::Ecc::HIGH; @@ -45,6 +45,14 @@ QR::QR(const std::string& data, std::string outputFile, size_t size, Type type, this->pixels.push_back(qr.getModule(x, y)); } +} + +void QR::render(Format format) { + if (this->renderers.find(format) == this->renderers.end()) { + std::cerr << "ERROR: a non-valid renderer has been selected" << std::endl; + exit(1); + } + this->renderers.at(format)->render(this->outputFile); } diff --git a/src/QR.hpp b/src/QR.hpp index ed9e0ac..34006b3 100644 --- a/src/QR.hpp +++ b/src/QR.hpp @@ -34,7 +34,8 @@ namespace massivedynamic { std::vector pixels; std::unordered_map> renderers; public: - QR(const std::string& data, std::string outputFile, size_t size, Type type, Format format); + QR(const std::string& data, std::string outputFile, size_t size, Type type); + void render(Format format); }; } \ No newline at end of file