#include #include #include #include #include "QR.hpp" #define UNUSED(var) (void) var; constexpr const char* VERSION = "1.0.0"; 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" -h --help show this help -o --output output file name -s --size desired output file size in pixels -t --type output QR code type. can be one of "small, medium, large" )EOF"; std::cout << "qr " << VERSION; std::cout << helpText << std::endl; } int main(int argc, char* argv[]) { if (argc < 1) { printHelp(); exit(1); } const option options[] = { {"help", no_argument, nullptr, 'h'}, {"output", required_argument, nullptr, 'o'}, {"size", required_argument, nullptr, 's'}, {"type", required_argument, nullptr, 't'}, {"format", required_argument, nullptr, 'f'}, {nullptr} }; std::string outputFile; size_t segmentSize = 0; 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:", options, &index); if (result == -1) break; const option* opt = &options[index]; UNUSED(opt); switch(result) { case 'o': { if (strlen(optarg) > 0) outputFile = optarg; break; } case 's': { segmentSize = std::atoi(optarg); break; } case 't': { std::string value = optarg; if (value == "small") type = massivedynamic::Type::SMALL; else if (value == "medium") type = massivedynamic::Type::MEDIUM; else if (value == "large") type = massivedynamic::Type::LARGE; else { printHelp(); return 1; } break; } case 'f': { std::string value = optarg; if (value == "cli") format = massivedynamic::Format::CONSOLE; else if (value == "svg") format = massivedynamic::Format::SVG; else if (value == "png") format = massivedynamic::Format::PNG; else { printHelp(); return 1; } break; } case 'h': default: printHelp(); return 0; } } std::string line; std::stringstream data; if (!isatty(fileno(stdin))) { while (std::getline(std::cin, line)) { if (std::cin.eof() || line.empty()) { std::cin.clear(); break; } data << line; } } if (isatty(fileno(stdin)) || data.str().empty()) { std::cerr << "ERROR: no data from stdinput." << std::endl; exit(1); } if ((format == massivedynamic::Format::PNG || format == massivedynamic::Format::SVG) && outputFile.empty()) { std::cerr << "output file name (-o, --output) can not be empty" << std::endl; return 1; } std::unique_ptr qr = std::make_unique(data.str(), outputFile, segmentSize, type, format); return 0; }