From 3ad02f6dc1ab1f5b6835272e0ceae619486eb194 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Sat, 2 Dec 2023 13:31:29 +0100 Subject: [PATCH] Update volk_gnsssdr_option_helpers --- .../apps/volk_gnsssdr_option_helpers.cc | 251 ++++++++++++------ .../apps/volk_gnsssdr_option_helpers.h | 36 ++- .../volk_gnsssdr/apps/volk_gnsssdr_profile.cc | 3 +- 3 files changed, 199 insertions(+), 91 deletions(-) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.cc b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.cc index 84d09aa3d..752359499 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.cc +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.cc @@ -15,70 +15,118 @@ #include // for pair -/* - * Option type - */ -option_t::option_t(std::string longform, std::string shortform, std::string msg, void (*callback)()) - : longform("--" + longform), - shortform("-" + shortform), - msg(msg), - callback(callback) { option_type = VOID_CALLBACK; } +option_t::option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)()) + : longform("--" + t_longform), + shortform("-" + t_shortform), + msg(t_msg), + callback(t_callback) +{ + option_type = VOID_CALLBACK; +} -option_t::option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(int)) - : longform("--" + longform), - shortform("-" + shortform), - msg(msg), - callback((void (*)())callback) { option_type = INT_CALLBACK; } -option_t::option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(float)) - : longform("--" + longform), - shortform("-" + shortform), - msg(msg), - callback((void (*)())callback) { option_type = FLOAT_CALLBACK; } +option_t::option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(int)) + : longform("--" + t_longform), + shortform("-" + t_shortform), + msg(t_msg), + callback((void (*)())t_callback) +{ + option_type = INT_CALLBACK; +} -option_t::option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(bool)) - : longform("--" + longform), - shortform("-" + shortform), - msg(msg), - callback((void (*)())callback) { option_type = BOOL_CALLBACK; } -option_t::option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(std::string)) - : longform("--" + longform), - shortform("-" + shortform), - msg(msg), - callback((void (*)())callback) { option_type = STRING_CALLBACK; } +option_t::option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(float)) + : longform("--" + t_longform), + shortform("-" + t_shortform), + msg(t_msg), + callback((void (*)())t_callback) +{ + option_type = FLOAT_CALLBACK; +} -option_t::option_t(std::string longform, std::string shortform, std::string msg, std::string printval) - : longform("--" + longform), - shortform("-" + shortform), - msg(msg), - printval(printval) { option_type = STRING; } + +option_t::option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(bool)) + : longform("--" + t_longform), + shortform("-" + t_shortform), + msg(t_msg), + callback((void (*)())t_callback) +{ + option_type = BOOL_CALLBACK; +} + + +option_t::option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(std::string)) + : longform("--" + t_longform), + shortform("-" + t_shortform), + msg(t_msg), + callback((void (*)())t_callback) +{ + option_type = STRING_CALLBACK; +} + + +option_t::option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + std::string t_printval) + : longform("--" + t_longform), + shortform("-" + t_shortform), + msg(t_msg), + printval(t_printval) +{ + option_type = STRING; +} /* * Option List */ -option_list::option_list(std::string program_name) : program_name(program_name) +option_list::option_list(std::string program_name) : d_program_name(program_name) { - { - internal_list = std::vector(); - } + d_internal_list = std::vector(); } -void option_list::add(const option_t &opt) { internal_list.push_back(opt); } -void option_list::parse(int argc, char **argv) +void option_list::add(const option_t& opt) { d_internal_list.push_back(opt); } + + +void option_list::parse(int argc, char** argv) { for (int arg_number = 0; arg_number < argc; ++arg_number) { - for (std::vector::iterator this_option = internal_list.begin(); - this_option != internal_list.end(); + for (std::vector::iterator this_option = d_internal_list.begin(); + this_option != d_internal_list.end(); this_option++) { + int int_val = INT_MIN; if (this_option->longform == std::string(argv[arg_number]) || this_option->shortform == std::string(argv[arg_number])) { + if (d_present_options.count(this_option->longform) == 0) + { + d_present_options.insert( + std::pair(this_option->longform, 1)); + } + else + { + d_present_options[this_option->longform] += 1; + } switch (this_option->option_type) { case VOID_CALLBACK: @@ -87,54 +135,94 @@ void option_list::parse(int argc, char **argv) case INT_CALLBACK: try { - int int_val = std::stoi(argv[++arg_number]); + int_val = atoi(argv[++arg_number]); ((void (*)(int))this_option->callback)(int_val); } - catch (std::exception &exc) + catch (std::exception& exc) { - std::cout << "An int option can only receive a number\n"; + std::cout << "An int option can only receive a number" + << std::endl; throw std::exception(); }; break; case FLOAT_CALLBACK: try { - int int_val = std::stof(argv[++arg_number]); - ((void (*)(float))this_option->callback)(int_val); + double double_val = atof(argv[++arg_number]); + ((void (*)(float))this_option->callback)(double_val); } - catch (std::exception &exc) + catch (std::exception& exc) { - std::cout << "A float option can only receive a number\n"; + std::cout << "A float option can only receive a number" + << std::endl; throw std::exception(); }; break; case BOOL_CALLBACK: try { - bool int_val = (bool)std::stoi(argv[++arg_number]); + if (arg_number == (argc - 1)) + { // this is the last arg + int_val = 1; + } + else + { // sneak a look at the next arg since it's present + char* next_arg = argv[arg_number + 1]; + if ((strncmp(next_arg, "-", 1) == 0) || + (strncmp(next_arg, "--", 2) == 0)) + { + // the next arg is actually an arg, the bool is just + // present, set to true + int_val = 1; + } + else if (strncmp(next_arg, "true", 4) == 0) + { + int_val = 1; + } + else if (strncmp(next_arg, "false", 5) == 0) + { + int_val = 0; + } + else + { + // we got a number or a string. + // convert it to a number and depend on the catch to + // report an error condition + int_val = (bool)atoi(argv[++arg_number]); + } + } + } + catch (std::exception& e) + { + int_val = INT_MIN; + }; + if (int_val == INT_MIN) + { + std::cout + << "option: '" << argv[arg_number - 1] + << "' -> received an unknown value. Boolean " + "options should receive one of '0', '1', 'true', 'false'." + << std::endl; + throw std::exception(); + } + else if (int_val) + { ((void (*)(bool))this_option->callback)(int_val); } - catch (std::exception &exc) - { - std::cout << "A bool option can only receive 0 or 1\n"; - throw std::exception(); - }; break; case STRING_CALLBACK: try { - ((void (*)(std::string))this_option->callback)(argv[++arg_number]); + ((void (*)(std::string))this_option->callback)( + argv[++arg_number]); } - catch (std::exception &exc) + catch (std::exception& exc) { throw std::exception(); }; break; case STRING: - std::cout << this_option->printval << '\n'; - break; - default: - this_option->callback(); + std::cout << this_option->printval << std::endl; break; } } @@ -142,17 +230,31 @@ void option_list::parse(int argc, char **argv) if (std::string("--help") == std::string(argv[arg_number]) || std::string("-h") == std::string(argv[arg_number])) { + d_present_options.insert(std::pair("--help", 1)); help(); } } } + +bool option_list::present(std::string option_name) +{ + if (d_present_options.count("--" + option_name)) + { + return true; + } + else + { + return false; + } +} + void option_list::help() { - std::cout << program_name << '\n'; - std::cout << " -h [ --help ] \t\tDisplay this help message\n"; - for (std::vector::iterator this_option = internal_list.begin(); - this_option != internal_list.end(); + std::cout << d_program_name << std::endl; + std::cout << " -h [ --help ] \t\tdisplay this help message" << std::endl; + for (std::vector::iterator this_option = d_internal_list.begin(); + this_option != d_internal_list.end(); this_option++) { std::string help_line(" "); @@ -165,24 +267,11 @@ void option_list::help() help_line += this_option->shortform + " [ " + this_option->longform + " ]"; } - switch (help_line.size() / 8) + while (help_line.size() < 32) { - case 0: - help_line += "\t\t\t\t"; - break; - case 1: - help_line += "\t\t\t"; - break; - case 2: - help_line += "\t\t"; - break; - case 3: - help_line += "\t"; - break; - default: - break; + help_line += " "; } help_line += this_option->msg; - std::cout << help_line << '\n'; + std::cout << help_line << std::endl; } -} +} \ No newline at end of file diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.h index cc481b4a8..6a30eaaaa 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_option_helpers.h @@ -29,12 +29,30 @@ typedef enum class option_t { public: - option_t(std::string longform, std::string shortform, std::string msg, void (*callback)()); - option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(int)); - option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(float)); - option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(bool)); - option_t(std::string longform, std::string shortform, std::string msg, void (*callback)(std::string)); - option_t(std::string longform, std::string shortform, std::string msg, std::string printval); + option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)()); + option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(int)); + option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(float)); + option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(bool)); + option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + void (*t_callback)(std::string)); + option_t(std::string t_longform, + std::string t_shortform, + std::string t_msg, + std::string t_printval); std::string longform; std::string shortform; @@ -48,6 +66,7 @@ class option_list { public: explicit option_list(std::string program_name); + bool present(std::string option_name); void add(const option_t &opt); @@ -56,8 +75,9 @@ public: void help(); private: - std::string program_name; - std::vector internal_list; + std::string d_program_name; + std::vector d_internal_list; + std::map d_present_options; }; diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_profile.cc b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_profile.cc index 5a060c3d1..f4d248f79 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_profile.cc +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/apps/volk_gnsssdr_profile.cc @@ -81,8 +81,7 @@ int main(int argc, char *argv[]) for (int arg_number = 0; arg_number < argc; ++arg_number) { - if (std::string("--help") == std::string(argv[arg_number]) || - std::string("-h") == std::string(argv[arg_number])) + if (profile_options.present("help")) { return 0; }