* src/misc/optionmap.hh, src/misc/optionmap.cc

(option_map::parse_options): Rewrite.  Do not modify the input
string, allow !foo as a shorthand for foo=0, and support K and
M suffixes for values.
* src/tgbatest/randtgba.cc (cons_emptiness_check): Simplify.
* wrap/python/spot.i: Process optionmap.hh.
* wrap/python/tests/optionmap.py: New file.
* wrap/python/tests/Makefile.am (TESTS): Add it.
This commit is contained in:
Alexandre Duret-Lutz 2005-02-17 15:01:51 +00:00
parent f3effb9da0
commit fed4b6f05c
7 changed files with 170 additions and 40 deletions

View file

@ -25,40 +25,86 @@
namespace spot
{
namespace
{
bool
to_int(const char* s, int &i)
{
char* endptr;
int res = strtol(s, &endptr, 10);
if (*endptr)
return false;
i = res;
return true;
}
};
const char*
option_map::parse_options(char* options)
option_map::parse_options(const char* options)
{
char* opt = strtok(options, ", \t;");
while (opt)
while (*options)
{
char* equal = strchr(opt, '=');
if (equal)
// Skip leading separators.
while (*options && strchr(" \t\n,;", *options))
++options;
// `!foo' is a shorthand for `foo=0'.
const char* negated = 0;
if (*options == '!')
{
*equal = 0;
int val;
if (!to_int(equal + 1, val))
return opt;
options_[opt] = val;
// Skip spaces.
while (*options && strchr(" \t\n", *options))
++options;
negated = options++;
}
if (!*options)
{
if (negated)
return negated;
else
break;
}
const char* name_start = options;
// Find the end of the name.
while (*options && !strchr(", \t\n;=", *options))
++options;
std::string name(name_start, options);
// Skip spaces.
while (*options && strchr(" \t\n", *options))
++options;
if (*options != '=')
{
options_[name] = (negated ? 0 : 1);
}
else if (negated)
{
return negated;
}
else
{
options_[opt] = 1;
++options;
// Skip spaces.
while (*options && strchr(" \t\n", *options))
++options;
if (!*options)
return name_start;
char* val_end;
int val = strtol(options, &val_end, 10);
if (val_end == options)
return name_start;
if (*val_end == 'K')
{
val *= 1024;
++val_end;
}
else if (*val_end == 'M')
{
val *= 1024 * 1024;
++val_end;
}
else if (*val_end && !strchr(" \t\n,;", *val_end))
{
return options;
}
options = val_end;
options_[name] = val;
}
opt = strtok(0, ", \t;");
}
return 0;
}
@ -74,7 +120,8 @@ namespace spot
return it->second;
}
int option_map::operator[](const char* option) const
int
option_map::operator[](const char* option) const
{
return get(option);
}

View file

@ -40,9 +40,16 @@ namespace spot
/// can be optionnaly followed by an integer value (preceded by an equal
/// sign). If not specified, the default value is 1.
///
/// The following three lines are equivalent.
/// \verbatim
/// optA !optB optC=4194304
/// optA=1, optB=0, optC=4096K
/// optC = 4M; optA !optB
/// \endverbatim
///
/// \return A non-null pointer to the option for which an expected integer
/// value cannot be parsed.
const char* parse_options(char* options);
const char* parse_options(const char* options);
/// \brief Get the value of \a option.
///

View file

@ -104,17 +104,17 @@ struct ec_algo
ec_algo ec_algos[] =
{
{ "Cou99", "poprem=0",
{ "Cou99", "!poprem",
couvreur99_cons, 0, -1U, true },
{ "Cou99_shy-", "poprem=0,shy=1,group=0",
{ "Cou99_shy-", "!poprem shy !group",
couvreur99_cons, 0, -1U, true },
{ "Cou99_shy", "poprem=0,shy=1,group=1",
{ "Cou99_shy", "!poprem shy group",
couvreur99_cons, 0, -1U, true },
{ "Cou99_rem", "poprem=1",
{ "Cou99_rem", "poprem",
couvreur99_cons, 0, -1U, true },
{ "Cou99_rem_shy-", "poprem=1,shy=1,group=0",
{ "Cou99_rem_shy-", "poprem shy !group",
couvreur99_cons, 0, -1U, true },
{ "Cou99_rem_shy", "poprem=1,shy=1,group=1",
{ "Cou99_rem_shy", "poprem shy group",
couvreur99_cons, 0, -1U, true },
{ "CVWY90", 0,
ms_cons, 0, 1, true },
@ -141,11 +141,9 @@ cons_emptiness_check(int num, const spot::tgba* a,
spot::option_map o = options;
if (ec_algos[num].options)
{
char* x = strdup(ec_algos[num].options);
const char* err = o.parse_options(x);
const char* err = o.parse_options(ec_algos[num].options);
assert(!err);
(void)err;
free(x);
}
if (n_acc < ec_algos[num].min_acc || n_acc > ec_algos[num].max_acc)
a = degen;