diff --git a/bin/usgscsm_cam_test.cc b/bin/usgscsm_cam_test.cc index 48e894d47cc6c68734cd313b95400013fc4055c9..e514c00a0639a522e354d99f6f08fdeae3ff2f0e 100644 --- a/bin/usgscsm_cam_test.cc +++ b/bin/usgscsm_cam_test.cc @@ -18,7 +18,6 @@ #include <iostream> #include <fstream> -#include <getopt.h> // For parsing command-line options struct Options { std::string model; // the .json file in isd or model state format @@ -27,81 +26,66 @@ struct Options { double subpixel_offset, height_above_datum; Options(): sample_rate(0), subpixel_offset(0.0), height_above_datum(0.0) {} }; - -// Parse the input options with getopt. -bool parseOptions(int argc, char **argv, Options & opt) { - // Collect the parsed options in a map - std::map<std::string, std::string> parsed_options; - - int digit_optind = 0; - while (1) { - int this_option_optind = optind ? optind : 1; - std::string short_options = ""; // no short options - int option_index = 0; - static struct option long_options[] = { - {"model", required_argument, 0, 0}, - {"output-model-state", required_argument, 0, 0}, - {"sample-rate", required_argument, 0, 0}, - {"subpixel-offset", required_argument, 0, 0}, - {"height-above-datum", required_argument, 0, 0}, - {"help", no_argument, 0, 0} - }; +void printUsage(std::string const& progName) { + std::cout << "Usage: " << progName << " --model <model file> [other options]" + << "\nSee the documentation for more information.\n"; +} - int c = getopt_long(argc, argv, short_options.c_str(), long_options, &option_index); - if (c == -1) // done parsing all options - break; +// Do some naive parsing. Every option is assumed to start with two +// dashes and have a string value. The --help option is handled +// separately. +bool parseOptions(int argc, char **argv, Options & opt) { - std::string opt_name = long_options[option_index].name; - if (c == 0) { - if (optarg) { - // The option has a value - parsed_options[opt_name] = optarg; - } else { - // The option has no value - parsed_options[opt_name] = ""; - } - } else { - // Something went wrong in parsing. The parser will print a message. Just add to it. - std::cout << "Cannot continue.\n"; + std::vector<std::string> params; + for (int it = 1; it < argc; it++) { + if (std::string(argv[it]) == std::string("--help")) { + printUsage(argv[0]); return false; } + params.push_back(argv[it]); } - // Print unexpected input arguments - if (optind < argc) { - printf("Unexpected argument: "); - while (optind < argc) - printf("%s ", argv[optind++]); - printf("\n"); - + if (params.size() %2 != 0 || params.empty()) { + std::cout << "Could not parse correctly the input arguments.\n"; + printUsage(argv[0]); return false; } - // See if the user asked for help - bool print_help_and_exit = (parsed_options.find("help") != parsed_options.end()); + // Collect the parsed options in a map + std::map<std::string, std::string> parsed_options; + int num = params.size() / 2; + for (int it = 0; it < num; it++) { + std::string opt = params[2*it + 0]; + std::string val = params[2*it + 1]; + if (opt.size() <= 2 || opt[0] != '-' || opt[1] != '-' || val.empty() || val[0] == '-' ) { + std::cout << "Could not parse correctly the input arguments.\n"; + printUsage(argv[0]); + return false; + } + opt = opt.substr(2); // wipe the dashes + parsed_options[opt] = val; + } // It is safe to access non-existent values from a map, the result // will be an empty string opt.model = parsed_options["model"]; - if (opt.model == "") - print_help_and_exit = true; + if (opt.model == "") { + std::cout << "The input model file is empty.\n"; + printUsage(argv[0]); + return false; + } - // Enforce that the sample rate is an integer + // Enforce that the sample rate is an integer. Later the user can add + // a subpixel offset to each sampled pixel, if desired. double sample_rate_double = atof(parsed_options["sample-rate"].c_str()); if (sample_rate_double != round(sample_rate_double)) { std::cout << "The value of --sample-rate must be an integer.\n"; - print_help_and_exit = true; - } - - // Print the help and exit - if (print_help_and_exit) { - std::cout << "Usage: " << argv[0] << " --model <model file> [other options]" - << "\nSee the documentation for more information.\n"; + printUsage(argv[0]); return false; } - // Collect all other option values. If not set the values will default to 0. + // Collect all other option values. If not set, the values will default to 0. opt.output_model_state = parsed_options["output-model-state"]; opt.sample_rate = sample_rate_double; opt.subpixel_offset = atof(parsed_options["subpixel-offset"].c_str());