Commit graph

128 commits

Author SHA1 Message Date
Alexandre Duret-Lutz
d362e752d1 * src/tgbatest/ltl2tgba.cc (main): Fix typo to re-enable
reductions by simulation.
2009-11-26 17:40:21 +01:00
Alexandre Duret-Lutz
1e19aa3a5f * src/tgbatest/ltl2tgba.cc (main): Stop the SCC timer. I mean
really stop it!
2009-11-25 18:06:46 +01:00
Alexandre Duret-Lutz
b796bb3d0a Detect running timers, and stop a timer in ltl2tgba.
* src/misc/timer.hh (time_info::running): New attribute.
(time_info::start, time_info::stop): Update and check
time_info::running.
* src/misc/timer.cc (timer_map::print): Mark running timers with
a "+" in the output.
* src/tgbatest/ltl2tgba.cc (main): Rename the name of the timers
for SCC and simulation reduction, and actually stop the SCC timer.
2009-11-24 11:47:42 +01:00
Alexandre Duret-Lutz
7ea51cc65f Replace prune_scc() by scc_filter().
prune_scc() leaked memory and failed to remove chains of useless SCCs.

* src/tgbaalgos/reductgba_sim.cc (reduc_tgba_sim): Call
scc_filter() instead of prune_scc(), and do it before running
any simulation-based reduction.
* src/tgbaalgos/reductgba_sim.hh (reduc_tgba_sim): Return a const
tgba*.
* src/tgbatest/ltl2tgba.cc: Call scc_filter() instead of
prune_scc().
* src/tgbatest/scc.test: Add two more tests that failed with
prune_scc().
2009-11-18 18:22:45 +01:00
Alexandre Duret-Lutz
c9b65cff71 Cleanup the help of ltl2tgba.
* src/tgbatest/ltl2tgba.cc (syntax): Reorganize the help text, so
that we can find options without resorting to grep...  Also
cleanup the program name if it is a libtool wrapper.
2009-11-12 16:38:24 +01:00
Alexandre Duret-Lutz
8ccc2b81c1 * src/tgbatest/ltl2tgba.cc (-l): New option to select the lacim
translation.  It still is the default translation.
(opt_fm, opt_taa): Replace these two variables by ...
(translation): ... this enum.  And use a switch to call the
correct translation.
2009-11-12 15:30:55 +01:00
Alexandre Duret-Lutz
8c6a2b33d9 Do not comment states in the never claim by default. It takes too
much time when the formula is large, and it is useless when the
purpose is model-checking with Spin.

* src/tgbaalgos/neverclaim.hh (never_claim_reachable): Add the
comments option.
* src/tgbaalgos/neverclaim.cc (never_claim_bfs,
never_claim_reachable): Honor the comment option.
* src/tgba/tests/ltl2tgba.cc (-N): Do not comment states.
(-NN) New option to output a commented never claim.
2009-11-10 17:46:25 +01:00
Alexandre Duret-Lutz
32a4647d03 Ease debugging of LTL formulae leaks.
* src/tgbatest/ltl2tgba.cc: Dump all LTLinstances with their
reference count.
2009-11-10 16:57:36 +01:00
Alexandre Duret-Lutz
4e22bb8b09 Introduce tgba_explicit_labelled<label> so that we can build
tgba_explicit instances labelled by other objects than strings.

* src/tgba/tgbaexplicit.cc, src/tgba/tgbaexplicit.hh:
Split tgba_explicit in two levels: tgba_explicit with unlabelled
states, and tgba_explicit_labelled templated by the type of
the label.  Define tgba_explicit_string (with the interface
of the former tgba_explicit class) and tgba_explicit_formula
for future use in ltl2tgba.cc.
* src/tgba/tgbareduc.cc, src/tgba/tgbareduc.hh,
src/tgbaalgos/cutscc.cc, src/tgbaalgos/dupexp.cc,
src/tgbaalgos/emptiness.cc, src/tgbaalgos/ltl2tgba_fm.cc,
src/tgbaalgos/powerset.cc, src/tgbaalgos/randomgraph.cc,
src/tgbaparse/public.hh, src/tgbaparse/tgbaparse.yy,
src/tgbatest/explicit.cc, src/tgbatest/ltl2tgba.cc: Adjust to
use tgba_explicit_string when appropriate.
2009-11-10 16:57:28 +01:00
Alexandre Duret-Lutz
e539226e13 Use a timer to clock the different phases of the translation.
* src/tgbatest/ltl2tgba.cc: Add option -T.
2009-11-09 12:14:20 +01:00
Alexandre Duret-Lutz
77df39b4dd Deprecate ltl::destroy(f) in favor of f->destroy()
* src/ltlast/formula.cc, src/ltlast/formula.hh (formula::clone):
Transform this static function into a member function.
* src/ltlvisit/destroy.hh (destroy): Document and declare as
deprecated.
* bench/split-product/cutscc.cc, iface/gspn/ltlgspn.cc,
src/eltlparse/eltlparse.yy, src/eltltest/acc.cc,
src/evtgbaalgos/tgba2evtgba.cc, src/evtgbatest/ltl2evtgba.cc,
src/ltlast/automatop.cc, src/ltlast/binop.cc,
src/ltlast/multop.cc, src/ltlast/unop.cc, src/ltlenv/declenv.cc,
src/ltlenv/declenv.hh, src/ltlparse/ltlparse.yy,
src/ltltest/equals.cc, src/ltltest/randltl.cc,
src/ltltest/readltl.cc, src/ltltest/reduc.cc,
src/ltltest/syntimpl.cc, src/ltltest/tostring.cc,
src/ltlvisit/destroy.cc src/ltlvisit/basicreduce.cc,
src/ltlvisit/contain.cc, src/ltlvisit/reduce.cc,
src/ltlvisit/syntimpl.cc, src/tgba/bdddict.cc,
src/tgba/bddprint.cc, src/tgba/taa.cc,
src/tgba/tgbabddconcretefactory.cc, src/tgba/tgbaexplicit.cc,
src/tgba/tgbafromfile.cc, src/tgbaalgos/eltl2tgba_lacim.cc,
src/tgbaalgos/ltl2taa.cc, src/tgbaalgos/ltl2tgba_fm.cc,
src/tgbaalgos/ltl2tgba_lacim.cc, src/tgbaalgos/neverclaim.cc,
src/tgbaalgos/randomgraph.cc, src/tgbaparse/tgbaparse.yy,
src/tgbatest/complementation.cc, src/tgbatest/eltl2tgba.cc,
src/tgbatest/ltl2tgba.cc, src/tgbatest/ltlprod.cc,
src/tgbatest/mixprod.cc, src/tgbatest/randtgba.cc,
src/tgbatest/reductgba.cc, wrap/python/cgi/ltl2tgba.in,
wrap/python/tests/ltl2tgba.py, wrap/python/tests/ltlparse.py,
wrap/python/tests/ltlsimple.py: Adjust destroy() usage, and remove
the #include "destroy.hh" when appropriate.
2009-11-09 07:13:31 +01:00
Alexandre Duret-Lutz
f2e941cd07 Add missing instance_count() in automatop and eltl2tgba.
* src/ltlast/automatop.hh, src/ltlast/automatop.cc: Add missing
instance_count() functions.
* src/tgbatests/eltl2tgba.cc: Add missing instance_count()
assertions at the end.
* src/tgbatests/ltl2tgba.cc: Also call automatop::instance_count(),
even if automatop are not used in ltl2tgba yet.  This way we won't
forget once eltl2tgba and ltl2tgba are merged.
2009-11-09 07:13:31 +01:00
Alexandre Duret-Lutz
24b78fde34 Fix the help text of ltl2tgba.
* src/tgbatest/ltl2tgba.cc (syntax): Add missing std::endl
before -taa.  Remove -r8 and -fr8, since they do not exist.
2009-11-03 16:35:54 +01:00
Damien Lefortier
7ce27ef994 Improve ltl_to_taa.
* src/tgba/taa.cc, src/tgba/taa.hh: taa_succ_iterator is not
on-the-fly anymore allowing some redundant transitions to be
removed. Also a new function to output a TAA.
* src/tgbaalgos/ltl2taa.cc, src/tgbaalgos/ltl2taa.hh: Add the
refined rules from Tauriainen.
* src/tgbatest/ltl2tgba.cc: Use -c to activate refined rules in
ltl_to_taa.
* src/tgbatest/spotlbtt.test: More tests.
2009-10-22 16:18:31 +02:00
Damien Lefortier
627b667712 Add a new algorithm (from Tauriainen) to translate LTL formulae to
TGBA which uses TAA as an intermediate representation.  This is a
basic version, optimizations and enhancements will come later.

* src/tgbaalgos/ltl2taa.cc, src/tgbaalgos/ltl2taa.hh: The algortihm.
* src/tgbaalgos/Makefile.am: Adjust.
* src/tgbatest/ltl2tgba: New option: -taa, which uses this new
translation algorithm.
* src/tgbatest/spotlbtt.test: Add ltl2tgba -taa.
2009-10-16 17:04:47 +02:00
Guillaume Sadegh
8f5f0354ad A wrapper around tgba to produce state-labeled automata.
* src/tgba/tgbasgba.hh, src/tgba/tgbasgba.hh: Here.
* src/tgbatest/ltl2tgba.cc: New option `-lS' for state-labeled
automata.
* src/tgba/Makefile.am: Adjust and sort files in tgba_HEADERS
and libtgba_la_SOURCES.
2009-10-01 00:32:06 +02:00
Alexandre Duret-Lutz
d74578ef6e Implement spot::future_conditions_collector.
* src/tgba/futurecondcol.hh, src/tgba/futurecondcol.cc:
New files.
* src/tgba/Makefile.am: Adjust.
* src/tgbatest/ltl2tgba.cc: Add option -FC.
2009-05-28 18:42:18 +02:00
Alexandre Duret-Lutz
07ead6134e Keep track of conditions in SCC, and add a more verbose dump.
* src/tgbaalgos/scc.hh (scc_map::scc_of_state,
scc_map::cond_set_of, scc_map::acc_set_of, scc_map::states_of):
New functions.
(scc_map::scc::conds): New attribute.
(dump_scc_dot): Take an optional VERBOSE argument.
* src/tgbaalgos/scc.cc (scc_map::scc_of_state,
scc_map::cond_set_of, scc_map::acc_set_of, scc_map::states_of):
Implement these new functions.
(dump_scc_dot): Display number of states, conditions and
acceptance conditions, with VERBOSE is set.
(build_map): Fill the new scc_map::scc::cond field.
2009-05-28 18:41:58 +02:00
Alexandre Duret-Lutz
b1bfdee870 Revert everything related to Damien's work in 2008 (he will commit a new version soon).
Here are the reverted patches:
8c0d1003b0,
25a3114287,
9afbaf6342,
dc0005f4e1,
543190f2bc.
2009-03-25 16:44:05 +01:00
Alexandre Duret-Lutz
c44d6277f2 Introduce scc.cc to compute SCC stats and map. 2008-12-10 18:14:44 +01:00
Alexandre Duret-Lutz
d5235c6901 Add option -k to ltl2tgba 2008-12-10 18:14:34 +01:00
Alexandre Duret-Lutz
25a3114287 Merge all ltlast/ files into formula.hh. The forward declaration of visitor was causing error messages too cryptic for users. 2008-06-12 16:33:03 +02:00
Alexandre Duret-Lutz
c764b2021d * src/tgbatest/ltl2tgba.cc, src/misc/hash.hh: Reformat the header
using 80 columns.
2008-03-21 17:02:57 +01:00
Alexandre Duret-Lutz
d3b702a97c Make sure Spot compiles with g++-4.3.
* src/ltlast/formula.hh (hash): Remove const from return type.
This kills a g++-4.3 warning.
* src/misc/hash.hh: Adjust to use unordered_set and unordered_map
from TR1 when g++-4.3 is used.
* src/evtgba/product.cc, src/ltltest/randltl.cc,
src/ltlvisit/randomltl.cc, src/ltlvisit/tostring.cc,
src/misc/freelist.hh, src/misc/optionmap.cc,
src/tgba/tgbareduc.hh, src/tgbaalgos/gv04.cc,
src/tgbaalgos/ltl2tgba_fm.cc, src/tgbaalgos/randomgraph.cc,
src/tgbatest/ltl2tgba.cc, src/tgbatest/randtgba.cc,
src/ltltest/equals.cc, src/ltltest/readltl.cc,
src/ltltest/reduc.cc, src/ltltest/syntimpl.cc,
src/ltltest/tostring.cc, src/tgbatest/ltlprod.cc,
src/tgbatest/powerset.cc, src/tgbatest/explprod.cc,
src/tgbatest/mixprod.cc, src/tgbatest/readsave.cc,
src/tgbatest/reductgba.cc, src/tgbatest/tgbaread.cc,
src/tgbatest/tripprod.cc, src/evtgbatest/product.cc,
src/evtgbatest/readsave.cc, src/evtgbatest/ltl2evtgba.cc,
src/evtgbatest/readsave.cc: Add missing includes.
* src/tgbatest/explicit.test, src/tgbatest/explprod.test,
src/tgbatest/explpro2.test, src/tgbatest/troprod.test,
src/tgbatest/emptchk.test: Cope with different outputs.
2008-03-14 22:45:37 +01:00
Alexandre Duret-Lutz
44e4beca2e * src/tgbatest/ltl2tgba.cc (main): Correctly destroy unobservable
events.
2008-02-25 14:37:54 +01:00
Alexandre Duret-Lutz
eb6bde4dd4 * src/tgbatest/ltl2tgba.cc (main): Fix handing of -R1q -R1t -R2q -R2t.
Add support for -r8/-fr8.
2008-02-25 14:36:59 +01:00
Alexandre Duret-Lutz
641db2d77d * src/evtgbaparse/public.hh: Work around Bison 2.3 unique guards.
* src/ltlvisit/reduce.hh, src/ltlvisit/reduce.hh:
Add Reduce_Containment_Checks and Reduce_Containment_Checks_Stronger
flags, and call reduce_tau03.
* src/ltlvisit/contain.hh (reduce_tau03): Make "stronger" the
default.
* src/ltlvisit/contain.cc: Style.
* src/ltltest/reduc.cc: Simplify using the reduce() interface
instead of reduce_tau03.
* src/tgbatest/ltl2tgba.cc: Likewise.  Add -fr5, -fr6, and -fr7
options.
* src/tgbatest/spotlbtt.test: Remove cases using "-c", since its
current implementation is not always correct (and apparently
reduces less than -fr7).
2008-02-25 14:36:59 +01:00
Alexandre Duret-Lutz
d4c9bf2b1e * src/ltlvisit/contain.hh, src/ltlvisit/contain.cc (reduce_tau03):
New function, performing LTL reduction a la tauriainen.03.a83.
* src/ltltest/equals.cc, src/ltltest/reduc.cc: Add support for
the new reduction.
* src/ltltest/reduc.test: Cut the test in half, and additionally
test the new reduction.
* src/ltltest/reduccmp.test: Run on the new reduction.
* src/ltltest/Makefile.am: Adjust.
* src/tgbatest/ltl2tgba.cc: Add new options to apply the reduction.
* src/tgbatest/spotlbtt.test: Use them.
2008-02-25 14:36:58 +01:00
Alexandre Duret-Lutz
85c5c870db * src/tgbaalgos/ltl2tgba_fm.hh, src/tgbaalgos/ltl2tgba_fm.cc
(ltl_to_tgba_fm): Add a new option "containment_checks" to enable
some language containment checks (via emptiness checks) during the
translation.  This first attempt currently only use containment
checks to merge states bisimulating each other.
* src/tgbatest/ltl2tgba.cc: Bind this to option "-c".
* src/tgbatest/spotlbtt.test: Check it.
2008-02-25 14:36:57 +01:00
Alexandre Duret-Lutz
ea9ee5d5c7 * src/tgbatest/ltl2tgba.cc: Pacify sanity.test. 2008-02-25 14:36:57 +01:00
Alexandre Duret-Lutz
5891679ce0 * src/tgbaparse/public.hh (tgba_parse): Take two environments
instead of one : one for the atomic propositions, and one
for the acceptance conditions.  This way it's easy for
the tools in iface/gspn/ to require some atomic proposition
to be declared and allow any acceptance conditions (there is nothing
to adjust in this files because of the default value of the argument).
* src/tgbaparse/tgbaparse.yy: Adjust.
* src/tgbatest/ltl2tgba.cc, src/tgbatest/readsave.cc,
src/tgbatest/reductgba.cc, src/tgbatest/tgbaread.cc: Adjust calls.
2008-02-25 14:36:57 +01:00
Alexandre Duret-Lutz
9063c5abb4 * src/tgbaalgos/ltl2tgba_fm.hh, src/tgbaalgos/ltl2tgba_fm.cc: Add
the reduce_ltl argument.
* src/tgbatest/ltl2tgba.cc: Add options -fr1, -fr2, -fr3, and -fr4.
* src/tgbatest/spotlbtt.test, bench/ltl2tgba/algorithms: Test -fr4.
* bench/ltl2tgba/parseout.pl: Suppress Perl warnings on disabled
algorithms.
2005-05-04 13:47:38 +00:00
Alexandre Duret-Lutz
7753938fe9 * src/tgbatest/ltl2tgba.cc (main): Delete the reduced automaton
before the degeneralized automaton.
2005-04-14 09:21:59 +00:00
Alexandre Duret-Lutz
3b3a196526 * src/tgbatest/ltl2tgba.cc: Simplify using
emptiness_check_instantiator.
* src/tgba/tgba.cc, src/tgba/tgba.hh
(tgba::number_of_acceptance_conditions): Return an unsigned.
* bench/emptchk/algorithms, bench/emptchk/README,
src/tgbatest/emptchk.test, src/tgbatest/emptchke.test: Adjust
references to algorithms.
* bench/emptchk/pml-clserv.sh, bench/emptchk/pml-eeaean.sh: Quote
variables properly.
2005-02-18 10:03:01 +00:00
Alexandre Duret-Lutz
f3effb9da0 * src/misc/optionmap.cc, src/misc/optionmap.hh (option_map::get,
option_map::set): Handle default values.
(anonymous::to_int): Do not print anything.
* src/tgbaalgos/gv04.cc, src/tgbaalgos/gv04.hh,
src/tgbaalgos/tau03.cc, src/tgbaalgos/tau03.hh,
src/tgbaalgos/tau03opt.cc, src/tgbaalgos/tau03opt.hh,
src/tgbaalgos/ce.cc, src/tgbaalgos/ce.hh: Take an option_map in
the constructor.
* src/tgbaalgos/gtec.cc, src/tgbaalgos/gtec.hh: Likewise.  Handle
the "poprem", "group", and "shy" options via the option_map.
Supply a couvreur99() wrapper to the shy/non-shy variant.
* src/tgbatest/ltl2tgba.cc, src/tgbatest/randtgba.cc,
iface/gspn/ssp.cc: Adjust.
2005-02-16 18:53:18 +00:00
Alexandre Duret-Lutz
5c6471daca * src/tgbatest/ltl2tgba.cc (main): Silence the "filename.tgba read"
message if -0 is used.
2005-01-29 16:05:28 +00:00
Alexandre Duret-Lutz
5fb5b68407 * src/tgbaalgos/emptiness_stats.hh: Make sure depth() >= 0.
* src/tgbaalgos/gtec/gtec.hh (couvreur99_check, couvreur99_check_shy):
Add the poprem option.
* src/tgbaalgos/gtec/gtec.cc: Implement it.
* src/tgbaalgos/gtec/sccstack.cc, src/tgbaalgos/gtec/sccstack.hh
(scc_stack::rem, scc_stack::clear_rem,
scc_stack::connected_component::rem): New.
* src/tgbatest/ltl2tgba.cc, src/tgbatest/randtgba.cc: Add rem variants.
2005-01-28 17:17:54 +00:00
Denis Poitrenaud
b1800e382c * src/tgbatest/dfs.test, src/tgbatest/emptchk.test,
src/tgbatest/emptchke.test, src/tgbatest/ltl2tgba.cc,
src/tgbatest/randtgba.cc, src/tgbatest/tba_samples_from_spin.test:
Adjust names of emptiness check algorithms.
2005-01-28 15:57:52 +00:00
Denis Poitrenaud
68c0aa2e38 * src/tgbatest/randtgba.cc: Complete performance measurements.
* src/tgbatest/ltl2tgba.cc: Typo.

* src/tgbaalgos/magic.hh: Correct pseudo-code.

dedicated to display of stats.
2005-01-25 12:31:05 +00:00
Denis Poitrenaud
f56abf58b8 * src/tgbatest/randtgba.cc, src/tgbatest/ltl2tgba.cc: Add options 2005-01-24 14:41:27 +00:00
Alexandre Duret-Lutz
1cc003ec38 * src/tgbatest/ltl2tgba.cc: Typo. 2005-01-10 17:26:11 +00:00
Denis Poitrenaud
a4b9b791ef * src/tgbaalgos/tau03.cc: Typo.
* src/tgbatest/ltl2tgba.cc: Add option -b.
2005-01-10 17:17:19 +00:00
Alexandre Duret-Lutz
0efca0f644 * src/ltlparse/ltlscan.ll: Pass yyleng to the std::string constructor,
so it doesn't have to compute it.
* src/tgbaparse/tgbascan.ll: Likewise.
(YY_USER_INIT, current_file): Remove, it is too costly to use
yy::Location::filename in the current implementation
of yy::Location (this attribute is duplicated for each token).
Leaving it empty divides the parsing time by 3.
* src/tgbaparse/fmterror.cc, src/tgbaparse/public.hh
(format_tgba_parse_errors): Take the filename as argument.
* src/tgbatest/explprod.cc, src/tgbatest/ltl2tgba.cc,
src/tgbatest/mixprod.cc, src/tgbatest/powerset.cc,
src/tgbatest/readsave.cc, src/tgbatest/reductgba.cc,
src/tgbatest/tgbaread.cc, src/tgbatest/tripprod.cc,
iface/gspn/dottyssp.cc, iface/gspn/ltlgspn.cc: Adjust calls
to format_tgba_parse_errors.
2004-12-16 12:33:37 +00:00
Alexandre Duret-Lutz
73c42db23d * src/tgbatest/ltl2tgba.cc: Add option -P. 2004-12-14 18:40:57 +00:00
Alexandre Duret-Lutz
9782b822f0 * src/tgbaalgos/gtec/gtec.hh, src/tgbaalgos/gtec/gtec.cc
(couvreur99_check_shy::couvreur99_check_shy): Add the group option,
and redefine todo as a list so it can be iterated over.
* src/tgbatest/ltl2tgba.cc, src/tgbatest/randtgba.cc: Introduce
couvreur99_shy- (for group=false) in addition to couvreur99_shy
(for group=true).
* iface/gspn/ssp.cc (couvreur99_check_ssp_shy_semi,
couvreur99_check_ssp_shy): Use group=true;
2004-12-10 16:16:38 +00:00
Denis Poitrenaud
446b85a842 * src/tgba/tgbaexplicit.hh, src/tgba/tgbaexplicit.cc
(set_init_state): Return a pointer to the initial state.

(tgba_run_to_tgba): New function.
2004-12-08 18:03:38 +00:00
Alexandre Duret-Lutz
e58743dbb7 * src/tgbaalgos/minimizerun.cc, src/tgbaalgos/minimizerun.hh
(minimize_run): Rename as ...
* src/tgbaalgos/reducerun.cc, src/tgbaalgos/reducerun.hh:
(reduce_run): ... this.
* src/tgbaalgos/Makefile.am, src/tgbatest/ltl2tgba.cc,
src/tgbatest/randtgba.cc: Adjust all references.
2004-11-29 10:01:08 +00:00
Alexandre Duret-Lutz
39ffa27338 * src/tgbatest/ltl2tgba.cc (syntax): Mention gv04 in help text. 2004-11-28 12:48:51 +00:00
Alexandre Duret-Lutz
6724f4bfbb * src/tgbaalgos/minimizerun.hh, src/tgbaalgos/minimizerun.cc: New
files.
* src/tgbaalgos/Makefile.am (tgbaalgos_HEADERS,
libtgbaalgos_la_SOURCES): Add them/
* src/tgbatest/randtgba.cc, src/tgbatest/ltl2tgba.cc: Add option -m.
* src/tgbatest/emptchkr.test: Use -m.
2004-11-26 23:54:53 +00:00
Alexandre Duret-Lutz
6cce60bed7 * src/tgbaalgos/gv04.cc, src/tgbaalgos/gv04.hh: New files, partly
based on Thomas Martinez's src/tgbaalgos/tarjan_on_fly.cc and
src/tgbaalgos/tarjan_on_fly.hh former implementation.
* src/tgbaalgos/Makefile.am (libtgbaalgos_la_SOURCES,
tgbaalgos_HEADERS): Add them.
* src/tgbatest/ltl2tgba.cc, src/tgbatest/randtgba.cc: Bind the
new algorithm.
* src/tgbatest/emptchk.test: Test it.
2004-11-22 16:57:31 +00:00