/* * Public function that loops until command line options were parsed */ void jsoncat_options_parser (int argc, char* argv[], options_t* options) { set_default_options(options); int arg; /* Current option */ /* getopt allowed options */ static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'v'}, {"no-colors", no_argument, 0, 0}, {"tab-stop", required_argument, 0, 't'} }; while (true) { int option_index = 0; arg = getopt_long(argc, argv, "hvt:", long_options, &option_index); /* End of the options? */ if (arg == -1) break; /* Find the matching case of the argument */ switch_options(arg, options); } /* Gets the file name or exits with error */ get_file_name(argc, argv, options); }
CommandLineOptions ParseCommandLine(int argc, char* argv[]) { CommandLineOptions result; namespace bpo = boost::program_options; bpo::options_description switch_options("Allowed Options"); switch_options.add_options() ("help", "Produce help message") ("separation-distance", bpo::value<double>(&result.SeparationDistance)->default_value(100), "Set maximum separation distance for trajectory points") ("separation-seconds", bpo::value<double>(&result.SeparationSeconds)->default_value(1200), "Set maximum separation time (in seconds) for trajectory points") ("portal-sep", bpo::value<double>(&result.PortalSeparation)->default_value(10), "Set minimum portal separation distance (in lat-lon)") ("depth", bpo::value<std::size_t>(&result.Depth)->default_value(5), "Set depth for portal decomposition") ("bin_size", bpo::value<std::size_t>(&result.BinSize)->default_value(2), "Portal chopping factor (default is 2)") ("min_val", bpo::value<std::size_t>(&result.MinVal)->default_value(16), "Miniumum number of portal pairs (default is 16)") ("domain", bpo::value<string_type>(&result.Domain)->default_value("cartesian2d"), "Set point domain ('terrestrial' or 'cartesian2d')") ("input", bpo::value<string_type>(&result.InputFilename)->default_value("-"), "Filename for input (use '-' for standard input)") ("output", bpo::value<string_type>(&result.OutputDirectory)->default_value("output"), "directory for output") ("real-field", multiple_tokens_value<string_vector_type>(2, 2), "Field name and column number for a real-valued point field") ("integer-field", multiple_tokens_value<string_vector_type>(2, 2), "Field name and column number for an integer-valued point field") ("string-field", multiple_tokens_value<string_vector_type>(2, 2), "Field name and column number for a string point field") ("timestamp-field", multiple_tokens_value<string_vector_type>(2, 2), "Field name and column number for a timestamp point field") ("object-id-column", bpo::value<std::size_t>(&result.ObjectIdColumn)->default_value(0), "Column containing object ID for points") ("timestamp-column", bpo::value<std::size_t>(&result.TimestampColumn)->default_value(1), "Column containing timestamp for points") ("x-column", bpo::value<std::size_t>(&result.FirstCoordinateColumn)->default_value(2), "Column containing X / longitude coordinate") ("y-column", bpo::value<std::size_t>(&result.SecondCoordinateColumn)->default_value(3), "Column containing Y / latitude coordinate") ("delimiter", bpo::value<string_type>(&result.FieldDelimiter)->default_value("\t"), "Delimiter for fields in input file") ("min-points", bpo::value<std::size_t>(&result.MinimumNumPoints)->default_value(10), "Trajectories shorter than this will be discarded") ; bpo::positional_options_description positional_options; positional_options.add("input", 1); positional_options.add("output", 1); bpo::variables_map retrieved_variables; bpo::store(bpo::command_line_parser(argc, argv) .options(switch_options) .positional(positional_options) .run(), retrieved_variables); bpo::notify(retrieved_variables); if (retrieved_variables.count("help")) { // std::cout << switch_options << "\n"; exit(1); } // Parse out the field assignments if (retrieved_variables.count("real-field")) { string_vector_type field_args(retrieved_variables["real-field"].as<string_vector_type>()); for (std::size_t i = 0; i < field_args.size(); i += 2) { field_assignment_type assignment( field_args[i], boost::lexical_cast<std::size_t>(field_args[i+1]) ); result.RealFields.push_back(assignment); } } if (retrieved_variables.count("integer-field")) { string_vector_type field_args(retrieved_variables["integer-field"].as<string_vector_type>()); for (std::size_t i = 0; i < field_args.size(); i += 2) { field_assignment_type assignment( field_args[i], boost::lexical_cast<std::size_t>(field_args[i+1]) ); result.IntegerFields.push_back(assignment); } } if (retrieved_variables.count("string-field")) { string_vector_type field_args(retrieved_variables["string-field"].as<string_vector_type>()); for (std::size_t i = 0; i < field_args.size(); i += 2) { field_assignment_type assignment( field_args[i], boost::lexical_cast<std::size_t>(field_args[i+1]) ); result.StringFields.push_back(assignment); } } if (retrieved_variables.count("timestamp-field")) { string_vector_type field_args(retrieved_variables["timestamp-field"].as<string_vector_type>()); for (std::size_t i = 0; i < field_args.size(); i += 2) { field_assignment_type assignment( field_args[i], boost::lexical_cast<std::size_t>(field_args[i+1]) ); result.TimestampFields.push_back(assignment); } } if (result.FieldDelimiter == "tab") { result.FieldDelimiter = "\t"; } return result; }