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