a QR code generator for the command line
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

126 lines
2.9 KiB

#include <memory>
#include <getopt.h>
#include <iostream>
#include <sstream>
#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 <miko@massivedynamic.eu>
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<massivedynamic::QR> qr = std::make_unique<massivedynamic::QR>(data.str(), outputFile, segmentSize, type, format);
return 0;
}