On Jun 13, 2017, at 3:09 PM, Belcourt, Kenneth via Boost-users <boost-users@lists.boost.org> 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);