예제 #1
0
파일: args.c 프로젝트: pantuza/jsoncat
/*
 * 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);
}
예제 #2
0
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;

}