* 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:
parent
f3effb9da0
commit
fed4b6f05c
7 changed files with 170 additions and 40 deletions
11
ChangeLog
11
ChangeLog
|
|
@ -1,3 +1,14 @@
|
||||||
|
2005-02-17 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2005-02-16 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
2005-02-16 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
||||||
|
|
||||||
* src/misc/optionmap.cc, src/misc/optionmap.hh (option_map::get,
|
* src/misc/optionmap.cc, src/misc/optionmap.hh (option_map::get,
|
||||||
|
|
|
||||||
|
|
@ -25,40 +25,86 @@
|
||||||
|
|
||||||
namespace spot
|
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*
|
const char*
|
||||||
option_map::parse_options(char* options)
|
option_map::parse_options(const char* options)
|
||||||
{
|
{
|
||||||
char* opt = strtok(options, ", \t;");
|
while (*options)
|
||||||
while (opt)
|
|
||||||
{
|
{
|
||||||
char* equal = strchr(opt, '=');
|
// Skip leading separators.
|
||||||
if (equal)
|
while (*options && strchr(" \t\n,;", *options))
|
||||||
|
++options;
|
||||||
|
|
||||||
|
// `!foo' is a shorthand for `foo=0'.
|
||||||
|
const char* negated = 0;
|
||||||
|
if (*options == '!')
|
||||||
{
|
{
|
||||||
*equal = 0;
|
// Skip spaces.
|
||||||
int val;
|
while (*options && strchr(" \t\n", *options))
|
||||||
if (!to_int(equal + 1, val))
|
++options;
|
||||||
return opt;
|
negated = options++;
|
||||||
options_[opt] = val;
|
}
|
||||||
|
|
||||||
|
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
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -74,7 +120,8 @@ namespace spot
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
int option_map::operator[](const char* option) const
|
int
|
||||||
|
option_map::operator[](const char* option) const
|
||||||
{
|
{
|
||||||
return get(option);
|
return get(option);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,9 +40,16 @@ namespace spot
|
||||||
/// can be optionnaly followed by an integer value (preceded by an equal
|
/// can be optionnaly followed by an integer value (preceded by an equal
|
||||||
/// sign). If not specified, the default value is 1.
|
/// 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
|
/// \return A non-null pointer to the option for which an expected integer
|
||||||
/// value cannot be parsed.
|
/// value cannot be parsed.
|
||||||
const char* parse_options(char* options);
|
const char* parse_options(const char* options);
|
||||||
|
|
||||||
/// \brief Get the value of \a option.
|
/// \brief Get the value of \a option.
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -104,17 +104,17 @@ struct ec_algo
|
||||||
|
|
||||||
ec_algo ec_algos[] =
|
ec_algo ec_algos[] =
|
||||||
{
|
{
|
||||||
{ "Cou99", "poprem=0",
|
{ "Cou99", "!poprem",
|
||||||
couvreur99_cons, 0, -1U, true },
|
couvreur99_cons, 0, -1U, true },
|
||||||
{ "Cou99_shy-", "poprem=0,shy=1,group=0",
|
{ "Cou99_shy-", "!poprem shy !group",
|
||||||
couvreur99_cons, 0, -1U, true },
|
couvreur99_cons, 0, -1U, true },
|
||||||
{ "Cou99_shy", "poprem=0,shy=1,group=1",
|
{ "Cou99_shy", "!poprem shy group",
|
||||||
couvreur99_cons, 0, -1U, true },
|
couvreur99_cons, 0, -1U, true },
|
||||||
{ "Cou99_rem", "poprem=1",
|
{ "Cou99_rem", "poprem",
|
||||||
couvreur99_cons, 0, -1U, true },
|
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 },
|
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 },
|
couvreur99_cons, 0, -1U, true },
|
||||||
{ "CVWY90", 0,
|
{ "CVWY90", 0,
|
||||||
ms_cons, 0, 1, true },
|
ms_cons, 0, 1, true },
|
||||||
|
|
@ -141,11 +141,9 @@ cons_emptiness_check(int num, const spot::tgba* a,
|
||||||
spot::option_map o = options;
|
spot::option_map o = options;
|
||||||
if (ec_algos[num].options)
|
if (ec_algos[num].options)
|
||||||
{
|
{
|
||||||
char* x = strdup(ec_algos[num].options);
|
const char* err = o.parse_options(ec_algos[num].options);
|
||||||
const char* err = o.parse_options(x);
|
|
||||||
assert(!err);
|
assert(!err);
|
||||||
(void)err;
|
(void)err;
|
||||||
free(x);
|
|
||||||
}
|
}
|
||||||
if (n_acc < ec_algos[num].min_acc || n_acc > ec_algos[num].max_acc)
|
if (n_acc < ec_algos[num].min_acc || n_acc > ec_algos[num].max_acc)
|
||||||
a = degen;
|
a = degen;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
// Copyright (C) 2003, 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
// et Marie Curie.
|
// et Marie Curie.
|
||||||
//
|
//
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
#include "misc/bddalloc.hh"
|
#include "misc/bddalloc.hh"
|
||||||
#include "misc/minato.hh"
|
#include "misc/minato.hh"
|
||||||
#include "misc/modgray.hh"
|
#include "misc/modgray.hh"
|
||||||
|
#include "misc/optionmap.hh"
|
||||||
#include "misc/random.hh"
|
#include "misc/random.hh"
|
||||||
|
|
||||||
#include "ltlast/formula.hh"
|
#include "ltlast/formula.hh"
|
||||||
|
|
@ -96,6 +97,7 @@ using namespace spot;
|
||||||
%include "misc/version.hh"
|
%include "misc/version.hh"
|
||||||
%include "misc/bddalloc.hh"
|
%include "misc/bddalloc.hh"
|
||||||
%include "misc/minato.hh"
|
%include "misc/minato.hh"
|
||||||
|
%include "misc/optionmap.hh"
|
||||||
%include "misc/random.hh"
|
%include "misc/random.hh"
|
||||||
|
|
||||||
%feature("director") spot::loopless_modular_mixed_radix_gray_code;
|
%feature("director") spot::loopless_modular_mixed_radix_gray_code;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
## Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
## Copyright (C) 2003, 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
## département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
## département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
## et Marie Curie.
|
## et Marie Curie.
|
||||||
##
|
##
|
||||||
|
|
@ -34,4 +34,5 @@ TESTS = \
|
||||||
ltl2tgba.test \
|
ltl2tgba.test \
|
||||||
interdep.py \
|
interdep.py \
|
||||||
minato.py \
|
minato.py \
|
||||||
modgray.py
|
modgray.py \
|
||||||
|
optionmap.py
|
||||||
|
|
|
||||||
64
wrap/python/tests/optionmap.py
Executable file
64
wrap/python/tests/optionmap.py
Executable file
|
|
@ -0,0 +1,64 @@
|
||||||
|
# -*- mode: python; coding: iso-8859-1 -*-
|
||||||
|
# Copyright (C) 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
|
# département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
|
# et Marie Curie.
|
||||||
|
#
|
||||||
|
# This file is part of Spot, a model checking library.
|
||||||
|
#
|
||||||
|
# Spot is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Spot is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
# License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Spot; see the file COPYING. If not, write to the Free
|
||||||
|
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
# 02111-1307, USA.
|
||||||
|
|
||||||
|
import ltihooks
|
||||||
|
import spot
|
||||||
|
|
||||||
|
o = spot.option_map()
|
||||||
|
res = o.parse_options("optA, opta=2M, optb =4 ; optB = 7\
|
||||||
|
, optC= 10")
|
||||||
|
assert not res
|
||||||
|
|
||||||
|
assert o.get('optA') == 1
|
||||||
|
assert o.get('opta') == 2*1024*1024
|
||||||
|
assert o.get('optb') == 4
|
||||||
|
assert o.get('optB') == 7
|
||||||
|
assert o.get('optC') == 10
|
||||||
|
assert o.get('none') == 0
|
||||||
|
assert o.get('none', 16) == 16
|
||||||
|
|
||||||
|
o.set('optb', 40)
|
||||||
|
assert o.get('optb') == 40
|
||||||
|
|
||||||
|
res = o.parse_options("!optA !optb optC, !optB")
|
||||||
|
assert not res
|
||||||
|
assert o.get('optA') == 0
|
||||||
|
assert o.get('opta') == 2*1024*1024
|
||||||
|
assert o.get('optb') == 0
|
||||||
|
assert o.get('optB') == 0
|
||||||
|
assert o.get('optC') == 1
|
||||||
|
|
||||||
|
res = o.parse_options("!")
|
||||||
|
print res
|
||||||
|
assert res == "!"
|
||||||
|
|
||||||
|
res = o.parse_options("foo, !opt = 1")
|
||||||
|
print res
|
||||||
|
assert res == "!opt = 1"
|
||||||
|
|
||||||
|
res = o.parse_options("foo=3, opt == 1")
|
||||||
|
print res
|
||||||
|
assert res == "opt == 1"
|
||||||
|
|
||||||
|
res = o.parse_options("foo=3opt == 1")
|
||||||
|
print res
|
||||||
|
assert res == "3opt == 1"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue