Boost logo

Boost Users :

Subject: Re: [Boost-users] [EXTERNAL] [Boost.Program_options] String options parser
From: Belcourt, Kenneth (kbelco_at_[hidden])
Date: 2017-06-13 22:11:54



On Jun 13, 2017, at 3:09 PM, Belcourt, Kenneth via Boost-users <boost-users_at_[hidden]<mailto:boost-users_at_[hidden]>> wrote:

[ snip …]

Now we’re trying to automate some testing and we test our executable with an input file that has hundreds of lines like this:

--inverse 1 --tolerance 1e-15 --rank 2
--inverse 1 --tolerance 1e-15 --rank 3
--inverse 1 --tolerance 1e-15 --rank 4

where each line is a separate test case that we run with the specified options. I was looking for a program options parser that can parse a string, so I can read one line of input from this file into a string, and run that test case:

[ snip ]

The only program option parsers I see are parse_command_line, parse_config_file, and parse_environment. Is there an easy way (without having to construct an argc/argv data structure) to parse a string of program options?

Here’s my less than robust solution that converts a line of input into a config file syntax, which I pass into stringstream.

  char dashes[] = "--";
  char dash[] = " -";
  string::size_type loc;
  string buffer;
  // open file
  ifstream ifp(s);
  while (!ifp.eof() && ifp.good()) {
    // read a line of input
    getline(ifp, buffer);
    // replace all occurrences of double-dash with newline
    loc = buffer.rfind(dashes);
    while (string::npos != loc) {
      buffer[loc] = '\n';
      buffer[loc+integer::one] = ' ';
      loc = buffer.rfind(dashes);
    }
    // replace all occurrences of space-dash with newline
    loc = buffer.rfind(dash);
    while (string::npos != loc) {
      buffer[loc+integer::one] = '\n';
      loc = buffer.rfind(dash);
    }
    // check if first option has single dash without leading space
    if ('-' == buffer[0]) {
      // remove leading dash
      buffer.erase(integer::zero, integer::one);
    }
    stringstream ss(buffer);
    po::parse_config_file(ss, desc);
  }

This still requires modifying our input files to use assignment form so this:

--inverse 1 --tolerance 1e-15 --rank 2

becomes this:

—inverse=1 —tolerance=1e-15 —rank=2

as the equal sign is required for config file syntax.

How about a new api to parse command line options from a string?

po::store(po::parse_string(buffer, desc), vm);

N.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net