mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-02-09 23:58:44 +01:00
103 lines
3.0 KiB
C++
103 lines
3.0 KiB
C++
#include "command_args.h"
|
|
|
|
int CommandArgsParser::parse(int argc, char* argv[]) {
|
|
for (int i = 1; i < argc; i++) {
|
|
std::string arg = argv[i];
|
|
|
|
// Check for long and short name arguments
|
|
if (!arg.rfind("--", 0)) {
|
|
arg = arg.substr(2);
|
|
}
|
|
else if (!arg.rfind("-", 0)) {
|
|
if (aliases.find(arg[1]) == aliases.end()) {
|
|
printf("Unknown argument\n");
|
|
showHelp();
|
|
return -1;
|
|
}
|
|
arg = aliases[arg[1]];
|
|
}
|
|
else {
|
|
printf("Invalid argument\n");
|
|
showHelp();
|
|
return -1;
|
|
}
|
|
|
|
// Make sure the argument exists
|
|
if (args.find(arg) == args.end()) {
|
|
printf("Unknown argument\n");
|
|
showHelp();
|
|
return -1;
|
|
}
|
|
|
|
// Parse depending on type
|
|
CLIArg& carg = args[arg];
|
|
|
|
// If not void, make sure an argument is available and retrieve it
|
|
if (carg.type != CLI_ARG_TYPE_VOID && i + 1 >= argc) {
|
|
printf("Missing argument\n");
|
|
showHelp();
|
|
return -1;
|
|
}
|
|
|
|
// Parse void since arg won't be needed
|
|
if (carg.type == CLI_ARG_TYPE_VOID) {
|
|
carg.bval = true;
|
|
continue;
|
|
}
|
|
|
|
// Parse types that require parsing
|
|
arg = argv[++i];
|
|
if (carg.type == CLI_ARG_TYPE_BOOL) {
|
|
// Enforce lower case
|
|
for (int i = 0; i < arg.size(); i++) { arg[i] = std::tolower(arg[i]); }
|
|
|
|
if (arg == "true" || arg == "on" || arg == "1") {
|
|
carg.bval = true;
|
|
}
|
|
else if (arg == "false" || arg == "off" || arg == "0") {
|
|
carg.bval = true;
|
|
}
|
|
else {
|
|
printf("Invald argument, expected bool (true, false, on, off, 1, 0)\n");
|
|
showHelp();
|
|
return -1;
|
|
}
|
|
}
|
|
else if (carg.type == CLI_ARG_TYPE_INT) {
|
|
try {
|
|
carg.ival = std::stoi(arg);
|
|
}
|
|
catch (std::exception e) {
|
|
printf("Invald argument, failed to parse integer\n");
|
|
showHelp();
|
|
return -1;
|
|
}
|
|
}
|
|
else if (carg.type == CLI_ARG_TYPE_FLOAT) {
|
|
try {
|
|
carg.fval = std::stod(arg);
|
|
}
|
|
catch (std::exception e) {
|
|
printf("Invald argument, failed to parse float\n");
|
|
showHelp();
|
|
return -1;
|
|
}
|
|
}
|
|
else if (carg.type == CLI_ARG_TYPE_STRING) {
|
|
carg.sval = arg;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CommandArgsParser::showHelp() {
|
|
for (auto const& [ln, arg] : args) {
|
|
if (arg.alias) {
|
|
printf("-%c\t--%s\t\t%s\n", arg.alias, ln.c_str(), arg.description.c_str());
|
|
}
|
|
else {
|
|
printf(" \t--%s\t\t%s\n", ln.c_str(), arg.description.c_str());
|
|
}
|
|
}
|
|
} |