Fixes #539. * AUTHORS: Update by indicating the status of each contributor. * Makefile.am, bench/Makefile.am, bench/dtgbasat/Makefile.am, bench/dtgbasat/gen.py, bench/emptchk/Makefile.am, bench/emptchk/defs.in, bench/ltl2tgba/Makefile.am, bench/ltl2tgba/defs.in, bench/ltl2tgba/sum.py, bench/ltlclasses/Makefile.am, bench/ltlcounter/Makefile.am, bench/spin13/Makefile.am, bench/stutter/Makefile.am, bench/stutter/stutter_invariance_formulas.cc, bench/stutter/stutter_invariance_randomgraph.cc, bench/wdba/Makefile.am, bin/Makefile.am, bin/autcross.cc, bin/autfilt.cc, bin/common_aoutput.cc, bin/common_aoutput.hh, bin/common_color.cc, bin/common_color.hh, bin/common_conv.cc, bin/common_conv.hh, bin/common_cout.cc, bin/common_cout.hh, bin/common_file.cc, bin/common_file.hh, bin/common_finput.cc, bin/common_finput.hh, bin/common_hoaread.cc, bin/common_hoaread.hh, bin/common_output.cc, bin/common_output.hh, bin/common_post.cc, bin/common_post.hh, bin/common_r.cc, bin/common_r.hh, bin/common_range.cc, bin/common_range.hh, bin/common_setup.cc, bin/common_setup.hh, bin/common_sys.hh, bin/common_trans.cc, bin/common_trans.hh, bin/dstar2tgba.cc, bin/genaut.cc, bin/genltl.cc, bin/ltl2tgba.cc, bin/ltl2tgta.cc, bin/ltlcross.cc, bin/ltldo.cc, bin/ltlfilt.cc, bin/ltlgrind.cc, bin/ltlsynt.cc, bin/man/Makefile.am, bin/options.py, bin/randaut.cc, bin/randltl.cc, bin/spot-x.cc, bin/spot.cc, configure.ac, debian/copyright, doc/Makefile.am, doc/tl/Makefile.am, elisp/Makefile.am, python/Makefile.am, python/buddy.i, python/spot/__init__.py, python/spot/aux_.py, python/spot/gen.i, python/spot/impl.i, python/spot/jupyter.py, python/spot/ltsmin.i, spot/Makefile.am, spot/gen/Makefile.am, spot/gen/automata.cc, spot/gen/automata.hh, spot/gen/formulas.cc, spot/gen/formulas.hh, spot/graph/Makefile.am, spot/graph/graph.hh, spot/graph/ngraph.hh, spot/kripke/Makefile.am, spot/kripke/fairkripke.cc, spot/kripke/fairkripke.hh, spot/kripke/fwd.hh, spot/kripke/kripke.cc, spot/kripke/kripke.hh, spot/kripke/kripkegraph.hh, spot/ltsmin/Makefile.am, spot/ltsmin/ltsmin.cc, spot/ltsmin/ltsmin.hh, spot/ltsmin/spins_interface.cc, spot/ltsmin/spins_interface.hh, spot/ltsmin/spins_kripke.hh, spot/ltsmin/spins_kripke.hxx, spot/mc/Makefile.am, spot/mc/bloemen.hh, spot/mc/bloemen_ec.hh, spot/mc/cndfs.hh, spot/mc/deadlock.hh, spot/mc/intersect.hh, spot/mc/lpar13.hh, spot/mc/mc.hh, spot/mc/mc_instanciator.hh, spot/mc/unionfind.cc, spot/mc/unionfind.hh, spot/mc/utils.hh, spot/misc/Makefile.am, spot/misc/bareword.cc, spot/misc/bareword.hh, spot/misc/bddlt.hh, spot/misc/bitset.cc, spot/misc/bitset.hh, spot/misc/bitvect.cc, spot/misc/bitvect.hh, spot/misc/casts.hh, spot/misc/clz.hh, spot/misc/common.hh, spot/misc/escape.cc, spot/misc/escape.hh, spot/misc/fixpool.hh, spot/misc/formater.cc, spot/misc/formater.hh, spot/misc/hash.hh, spot/misc/hashfunc.hh, spot/misc/intvcmp2.cc, spot/misc/intvcmp2.hh, spot/misc/intvcomp.cc, spot/misc/intvcomp.hh, spot/misc/ltstr.hh, spot/misc/memusage.cc, spot/misc/memusage.hh, spot/misc/minato.cc, spot/misc/minato.hh, spot/misc/mspool.hh, spot/misc/optionmap.cc, spot/misc/optionmap.hh, spot/misc/random.cc, spot/misc/random.hh, spot/misc/satsolver.cc, spot/misc/satsolver.hh, spot/misc/timer.cc, spot/misc/timer.hh, spot/misc/tmpfile.cc, spot/misc/tmpfile.hh, spot/misc/trival.hh, spot/misc/version.cc, spot/misc/version.hh, spot/parseaut/Makefile.am, spot/parseaut/fmterror.cc, spot/parseaut/parseaut.yy, spot/parseaut/parsedecl.hh, spot/parseaut/public.hh, spot/parseaut/scanaut.ll, spot/parsetl/Makefile.am, spot/parsetl/fmterror.cc, spot/parsetl/parsedecl.hh, spot/parsetl/parsetl.yy, spot/parsetl/scantl.ll, spot/priv/Makefile.am, spot/priv/accmap.hh, spot/priv/bddalloc.cc, spot/priv/bddalloc.hh, spot/priv/freelist.cc, spot/priv/freelist.hh, spot/priv/partitioned_relabel.cc, spot/priv/partitioned_relabel.hh, spot/priv/satcommon.cc, spot/priv/satcommon.hh, spot/priv/trim.cc, spot/priv/trim.hh, spot/priv/weight.cc, spot/priv/weight.hh, spot/ta/Makefile.am, spot/ta/ta.cc, spot/ta/ta.hh, spot/ta/taexplicit.cc, spot/ta/taexplicit.hh, spot/ta/taproduct.cc, spot/ta/taproduct.hh, spot/ta/tgta.hh, spot/ta/tgtaexplicit.cc, spot/ta/tgtaexplicit.hh, spot/ta/tgtaproduct.cc, spot/ta/tgtaproduct.hh, spot/taalgos/Makefile.am, spot/taalgos/dot.cc, spot/taalgos/dot.hh, spot/taalgos/emptinessta.cc, spot/taalgos/emptinessta.hh, spot/taalgos/minimize.cc, spot/taalgos/minimize.hh, spot/taalgos/reachiter.cc, spot/taalgos/reachiter.hh, spot/taalgos/statessetbuilder.cc, spot/taalgos/statessetbuilder.hh, spot/taalgos/stats.cc, spot/taalgos/stats.hh, spot/taalgos/tgba2ta.cc, spot/taalgos/tgba2ta.hh, spot/tl/Makefile.am, spot/tl/apcollect.cc, spot/tl/apcollect.hh, spot/tl/contain.cc, spot/tl/contain.hh, spot/tl/declenv.cc, spot/tl/declenv.hh, spot/tl/defaultenv.cc, spot/tl/defaultenv.hh, spot/tl/dot.cc, spot/tl/dot.hh, spot/tl/environment.hh, spot/tl/exclusive.cc, spot/tl/exclusive.hh, spot/tl/formula.cc, spot/tl/formula.hh, spot/tl/hierarchy.cc, spot/tl/hierarchy.hh, spot/tl/length.cc, spot/tl/length.hh, spot/tl/ltlf.cc, spot/tl/ltlf.hh, spot/tl/mark.cc, spot/tl/mark.hh, spot/tl/mutation.cc, spot/tl/mutation.hh, spot/tl/nenoform.cc, spot/tl/nenoform.hh, spot/tl/parse.hh, spot/tl/print.cc, spot/tl/print.hh, spot/tl/randomltl.cc, spot/tl/randomltl.hh, spot/tl/relabel.cc, spot/tl/relabel.hh, spot/tl/remove_x.cc, spot/tl/remove_x.hh, spot/tl/simplify.cc, spot/tl/simplify.hh, spot/tl/snf.cc, spot/tl/snf.hh, spot/tl/sonf.cc, spot/tl/sonf.hh, spot/tl/unabbrev.cc, spot/tl/unabbrev.hh, spot/twa/Makefile.am, spot/twa/acc.cc, spot/twa/acc.hh, spot/twa/bdddict.cc, spot/twa/bdddict.hh, spot/twa/bddprint.cc, spot/twa/bddprint.hh, spot/twa/formula2bdd.cc, spot/twa/formula2bdd.hh, spot/twa/fwd.hh, spot/twa/taatgba.cc, spot/twa/taatgba.hh, spot/twa/twa.cc, spot/twa/twa.hh, spot/twa/twagraph.cc, spot/twa/twagraph.hh, spot/twa/twaproduct.cc, spot/twa/twaproduct.hh, spot/twaalgos/Makefile.am, spot/twaalgos/aiger.cc, spot/twaalgos/aiger.hh, spot/twaalgos/alternation.cc, spot/twaalgos/alternation.hh, spot/twaalgos/are_isomorphic.cc, spot/twaalgos/are_isomorphic.hh, spot/twaalgos/bfssteps.cc, spot/twaalgos/bfssteps.hh, spot/twaalgos/canonicalize.cc, spot/twaalgos/canonicalize.hh, spot/twaalgos/cleanacc.cc, spot/twaalgos/cleanacc.hh, spot/twaalgos/cobuchi.cc, spot/twaalgos/cobuchi.hh, spot/twaalgos/complement.cc, spot/twaalgos/complement.hh, spot/twaalgos/complete.cc, spot/twaalgos/complete.hh, spot/twaalgos/compsusp.cc, spot/twaalgos/compsusp.hh, spot/twaalgos/contains.cc, spot/twaalgos/contains.hh, spot/twaalgos/copy.hh, spot/twaalgos/couvreurnew.cc, spot/twaalgos/couvreurnew.hh, spot/twaalgos/cycles.cc, spot/twaalgos/cycles.hh, spot/twaalgos/dbranch.cc, spot/twaalgos/dbranch.hh, spot/twaalgos/degen.cc, spot/twaalgos/degen.hh, spot/twaalgos/determinize.cc, spot/twaalgos/determinize.hh, spot/twaalgos/dot.cc, spot/twaalgos/dot.hh, spot/twaalgos/dtbasat.cc, spot/twaalgos/dtbasat.hh, spot/twaalgos/dtwasat.cc, spot/twaalgos/dtwasat.hh, spot/twaalgos/dualize.cc, spot/twaalgos/dualize.hh, spot/twaalgos/emptiness.cc, spot/twaalgos/emptiness.hh, spot/twaalgos/emptiness_stats.hh, spot/twaalgos/forq_contains.cc, spot/twaalgos/forq_contains.hh, spot/twaalgos/game.cc, spot/twaalgos/game.hh, spot/twaalgos/genem.cc, spot/twaalgos/genem.hh, spot/twaalgos/gfguarantee.cc, spot/twaalgos/gfguarantee.hh, spot/twaalgos/gtec/Makefile.am, spot/twaalgos/gtec/ce.cc, spot/twaalgos/gtec/ce.hh, spot/twaalgos/gtec/gtec.cc, spot/twaalgos/gtec/gtec.hh, spot/twaalgos/gtec/sccstack.cc, spot/twaalgos/gtec/sccstack.hh, spot/twaalgos/gtec/status.cc, spot/twaalgos/gtec/status.hh, spot/twaalgos/gv04.cc, spot/twaalgos/gv04.hh, spot/twaalgos/hoa.cc, spot/twaalgos/hoa.hh, spot/twaalgos/iscolored.cc, spot/twaalgos/iscolored.hh, spot/twaalgos/isdet.cc, spot/twaalgos/isdet.hh, spot/twaalgos/isunamb.cc, spot/twaalgos/isunamb.hh, spot/twaalgos/isweakscc.cc, spot/twaalgos/isweakscc.hh, spot/twaalgos/langmap.cc, spot/twaalgos/langmap.hh, spot/twaalgos/lbtt.cc, spot/twaalgos/lbtt.hh, spot/twaalgos/ltl2taa.cc, spot/twaalgos/ltl2taa.hh, spot/twaalgos/ltl2tgba_fm.cc, spot/twaalgos/ltl2tgba_fm.hh, spot/twaalgos/magic.cc, spot/twaalgos/magic.hh, spot/twaalgos/mask.cc, spot/twaalgos/mask.hh, spot/twaalgos/mealy_machine.cc, spot/twaalgos/mealy_machine.hh, spot/twaalgos/minimize.cc, spot/twaalgos/minimize.hh, spot/twaalgos/ndfs_result.hxx, spot/twaalgos/neverclaim.cc, spot/twaalgos/neverclaim.hh, spot/twaalgos/parity.cc, spot/twaalgos/parity.hh, spot/twaalgos/postproc.cc, spot/twaalgos/postproc.hh, spot/twaalgos/powerset.cc, spot/twaalgos/powerset.hh, spot/twaalgos/product.cc, spot/twaalgos/product.hh, spot/twaalgos/randomgraph.cc, spot/twaalgos/randomgraph.hh, spot/twaalgos/randomize.cc, spot/twaalgos/randomize.hh, spot/twaalgos/reachiter.cc, spot/twaalgos/reachiter.hh, spot/twaalgos/relabel.cc, spot/twaalgos/relabel.hh, spot/twaalgos/remfin.cc, spot/twaalgos/remfin.hh, spot/twaalgos/remprop.cc, spot/twaalgos/remprop.hh, spot/twaalgos/sbacc.cc, spot/twaalgos/sbacc.hh, spot/twaalgos/sccfilter.cc, spot/twaalgos/sccfilter.hh, spot/twaalgos/sccinfo.cc, spot/twaalgos/sccinfo.hh, spot/twaalgos/se05.cc, spot/twaalgos/se05.hh, spot/twaalgos/sepsets.cc, spot/twaalgos/sepsets.hh, spot/twaalgos/simulation.cc, spot/twaalgos/simulation.hh, spot/twaalgos/split.cc, spot/twaalgos/split.hh, spot/twaalgos/stats.cc, spot/twaalgos/stats.hh, spot/twaalgos/strength.cc, spot/twaalgos/strength.hh, spot/twaalgos/stripacc.cc, spot/twaalgos/stripacc.hh, spot/twaalgos/stutter.cc, spot/twaalgos/stutter.hh, spot/twaalgos/sum.cc, spot/twaalgos/sum.hh, spot/twaalgos/synthesis.cc, spot/twaalgos/synthesis.hh, spot/twaalgos/tau03.cc, spot/twaalgos/tau03.hh, spot/twaalgos/tau03opt.cc, spot/twaalgos/tau03opt.hh, spot/twaalgos/toparity.cc, spot/twaalgos/toparity.hh, spot/twaalgos/totgba.cc, spot/twaalgos/totgba.hh, spot/twaalgos/toweak.cc, spot/twaalgos/toweak.hh, spot/twaalgos/translate.cc, spot/twaalgos/translate.hh, spot/twaalgos/word.cc, spot/twaalgos/word.hh, spot/twaalgos/zlktree.cc, spot/twaalgos/zlktree.hh, spot/twacube/Makefile.am, spot/twacube/cube.cc, spot/twacube/cube.hh, spot/twacube/fwd.hh, spot/twacube/twacube.cc, spot/twacube/twacube.hh, spot/twacube_algos/Makefile.am, spot/twacube_algos/convert.cc, spot/twacube_algos/convert.hh, tests/Makefile.am, tests/core/385.test, tests/core/500.test, tests/core/521.test, tests/core/522.test, tests/core/acc.cc, tests/core/acc.test, tests/core/acc2.test, tests/core/acc_word.test, tests/core/accsimpl.test, tests/core/alternating.test, tests/core/autcross.test, tests/core/autcross2.test, tests/core/autcross3.test, tests/core/autcross4.test, tests/core/autcross5.test, tests/core/babiak.test, tests/core/bare.test, tests/core/basimul.test, tests/core/bdd.test, tests/core/bdddict.cc, tests/core/bdddict.test, tests/core/bitvect.cc, tests/core/bitvect.test, tests/core/bricks.cc, tests/core/bricks.test, tests/core/checkpsl.cc, tests/core/checkta.cc, tests/core/complement.test, tests/core/complementation.test, tests/core/complete.test, tests/core/consterm.cc, tests/core/consterm.test, tests/core/cube.cc, tests/core/cube.test, tests/core/cycles.test, tests/core/dbacomp.test, tests/core/dca.test, tests/core/dca2.test, tests/core/defs.in, tests/core/degendet.test, tests/core/degenid.test, tests/core/degenlskip.test, tests/core/degenscc.test, tests/core/det.test, tests/core/dfs.test, tests/core/dnfstreett.test, tests/core/dot2tex.test, tests/core/dra2dba.test, tests/core/dstar.test, tests/core/dualize.test, tests/core/dupexp.test, tests/core/emptchk.cc, tests/core/emptchk.test, tests/core/emptchke.test, tests/core/emptchkr.test, tests/core/equals.test, tests/core/equalsf.cc, tests/core/eventuniv.test, tests/core/exclusive-ltl.test, tests/core/exclusive-tgba.test, tests/core/explpro2.test, tests/core/explpro3.test, tests/core/explpro4.test, tests/core/explprod.test, tests/core/explsum.test, tests/core/format.test, tests/core/full.test, tests/core/gamehoa.test, tests/core/genaut.test, tests/core/genltl.test, tests/core/gragsa.test, tests/core/graph.cc, tests/core/graph.test, tests/core/hierarchy.test, tests/core/highlightstate.test, tests/core/ikwiad.cc, tests/core/included.test, tests/core/intvcmp2.cc, tests/core/intvcomp.cc, tests/core/intvcomp.test, tests/core/isomorph.test, tests/core/isop.test, tests/core/kind.cc, tests/core/kind.test, tests/core/kripke.test, tests/core/kripkecat.cc, tests/core/latex.test, tests/core/lbt.test, tests/core/lbttparse.test, tests/core/length.cc, tests/core/length.test, tests/core/lenient.test, tests/core/ltl2dstar.test, tests/core/ltl2dstar2.test, tests/core/ltl2dstar3.test, tests/core/ltl2dstar4.test, tests/core/ltl2neverclaim-lbtt.test, tests/core/ltl2neverclaim.test, tests/core/ltl2ta.test, tests/core/ltl2ta2.test, tests/core/ltl2tgba.test, tests/core/ltl2tgba2.test, tests/core/ltl3ba.test, tests/core/ltl3dra.test, tests/core/ltlcounter.test, tests/core/ltlcross.test, tests/core/ltlcross2.test, tests/core/ltlcross3.test, tests/core/ltlcross4.test, tests/core/ltlcross5.test, tests/core/ltlcross6.test, tests/core/ltlcrossce.test, tests/core/ltlcrossce2.test, tests/core/ltlcrossgrind.test, tests/core/ltldo.test, tests/core/ltldo2.test, tests/core/ltlf.test, tests/core/ltlfilt.test, tests/core/ltlgrind.test, tests/core/ltlrel.cc, tests/core/ltlrel.test, tests/core/ltlsynt-pgame.test, tests/core/ltlsynt.test, tests/core/ltlsynt2.test, tests/core/lunabbrev.test, tests/core/maskacc.test, tests/core/maskkeep.test, tests/core/mempool.cc, tests/core/mempool.test, tests/core/minterm.cc, tests/core/minterm.test, tests/core/minusx.test, tests/core/monitor.test, tests/core/nenoform.test, tests/core/neverclaimread.test, tests/core/ngraph.cc, tests/core/ngraph.test, tests/core/nondet.test, tests/core/obligation.test, tests/core/optba.test, tests/core/parity.cc, tests/core/parity.test, tests/core/parity2.test, tests/core/parse.test, tests/core/parseaut.test, tests/core/parseerr.test, tests/core/pdegen.test, tests/core/pgsolver.test, tests/core/prodchain.test, tests/core/prodor.test, tests/core/rabin2parity.test, tests/core/rand.test, tests/core/randaut.test, tests/core/randomize.test, tests/core/randpsl.test, tests/core/randtgba.cc, tests/core/randtgba.test, tests/core/readltl.cc, tests/core/readsave.test, tests/core/reduc.cc, tests/core/reduc.test, tests/core/reduc0.test, tests/core/reduccmp.test, tests/core/reducpsl.test, tests/core/remfin.test, tests/core/remove_x.test, tests/core/remprop.test, tests/core/renault.test, tests/core/safra.cc, tests/core/safra.test, tests/core/satmin.test, tests/core/satmin2.test, tests/core/satmin3.test, tests/core/sbacc.test, tests/core/scc.test, tests/core/sccdot.test, tests/core/sccif.cc, tests/core/sccif.test, tests/core/sccsimpl.test, tests/core/semidet.test, tests/core/sepsets.test, tests/core/serial.test, tests/core/sim2.test, tests/core/sim3.test, tests/core/sonf.test, tests/core/split.test, tests/core/spotlbtt.test, tests/core/spotlbtt2.test, tests/core/streett.test, tests/core/strength.test, tests/core/stutter-ltl.test, tests/core/stutter-tgba.test, tests/core/sugar.test, tests/core/syfco.test, tests/core/syntimpl.cc, tests/core/syntimpl.test, tests/core/taatgba.cc, tests/core/taatgba.test, tests/core/tgbagraph.test, tests/core/tostring.cc, tests/core/tostring.test, tests/core/tripprod.test, tests/core/trival.cc, tests/core/trival.test, tests/core/tunabbrev.test, tests/core/tunenoform.test, tests/core/twacube.cc, tests/core/twacube.test, tests/core/twagraph.cc, tests/core/unabbrevwm.test, tests/core/unambig.test, tests/core/unambig2.test, tests/core/uniq.test, tests/core/utf8.test, tests/core/uwrm.test, tests/core/wdba.test, tests/core/wdba2.test, tests/ltsmin/check.test, tests/ltsmin/check2.test, tests/ltsmin/check3.test, tests/ltsmin/finite.test, tests/ltsmin/finite2.test, tests/ltsmin/finite3.test, tests/ltsmin/kripke.test, tests/ltsmin/modelcheck.cc, tests/ltsmin/testconvert.cc, tests/ltsmin/testconvert.test, tests/python/298.py, tests/python/341.py, tests/python/471.py, tests/python/acc.py, tests/python/accparse2.py, tests/python/aiger.py, tests/python/alarm.py, tests/python/aliases.py, tests/python/alternating.py, tests/python/bdddict.py, tests/python/bdditer.py, tests/python/bddnqueen.py, tests/python/bugdet.py, tests/python/complement_semidet.py, tests/python/dbranch.py, tests/python/declenv.py, tests/python/decompose_scc.py, tests/python/det.py, tests/python/dualize.py, tests/python/ecfalse.py, tests/python/except.py, tests/python/forq_contains.py, tests/python/game.py, tests/python/gen.py, tests/python/genem.py, tests/python/implies.py, tests/python/interdep.py, tests/python/intrun.py, tests/python/kripke.py, tests/python/langmap.py, tests/python/ltl2tgba.py, tests/python/ltl2tgba.test, tests/python/ltlf.py, tests/python/ltlparse.py, tests/python/ltlsimple.py, tests/python/mealy.py, tests/python/merge.py, tests/python/mergedge.py, tests/python/minato.py, tests/python/misc-ec.py, tests/python/optionmap.py, tests/python/origstate.py, tests/python/otfcrash.py, tests/python/parity.py, tests/python/parsetgba.py, tests/python/pdegen.py, tests/python/powerset.py, tests/python/prodexpt.py, tests/python/randgen.py, tests/python/relabel.py, tests/python/remfin.py, tests/python/removeap.py, tests/python/rs_like.py, tests/python/satmin.py, tests/python/sbacc.py, tests/python/sccfilter.py, tests/python/sccinfo.py, tests/python/sccsplit.py, tests/python/semidet.py, tests/python/setacc.py, tests/python/setxor.py, tests/python/simplacc.py, tests/python/simstate.py, tests/python/sonf.py, tests/python/split.py, tests/python/splitedge.py, tests/python/streett_totgba.py, tests/python/streett_totgba2.py, tests/python/stutter.py, tests/python/sum.py, tests/python/synthesis.py, tests/python/toparity.py, tests/python/toweak.py, tests/python/tra2tba.py, tests/python/trival.py, tests/python/twagraph.py, tests/python/zlktree.py, tests/run.in, tests/sanity/80columns.test, tests/sanity/bin.test, tests/sanity/getenv.test, tests/sanity/includes.test, tests/sanity/ipynb.pl, tests/sanity/namedprop.test, tests/sanity/private.test, tests/sanity/readme.pl, tests/sanity/style.test, tools/man2html.pl: Update all copyright headers.
482 lines
14 KiB
C++
482 lines
14 KiB
C++
// -*- coding: utf-8 -*-
|
|
// Copyright (C) by the Spot authors, see the AUTHORS file for details.
|
|
//
|
|
// 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 3 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#include "common_sys.hh"
|
|
#include "common_output.hh"
|
|
#include "common_aoutput.hh"
|
|
#include "common_setup.hh"
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <memory>
|
|
#include <spot/tl/print.hh>
|
|
#include <spot/tl/length.hh>
|
|
#include <spot/tl/apcollect.hh>
|
|
#include <spot/tl/hierarchy.hh>
|
|
#include <spot/misc/formater.hh>
|
|
#include <spot/misc/escape.hh>
|
|
#include "common_cout.hh"
|
|
#include "error.h"
|
|
|
|
enum {
|
|
OPT_CSV = 1,
|
|
OPT_FORMAT,
|
|
OPT_LATEX,
|
|
OPT_SPOT,
|
|
OPT_WRING,
|
|
};
|
|
|
|
output_format_t output_format = spot_output;
|
|
bool full_parenth = false;
|
|
bool escape_csv = false;
|
|
char output_terminator = '\n';
|
|
bool output_ratexp = false;
|
|
|
|
static const argp_option options[] =
|
|
{
|
|
{ "full-parentheses", 'p', nullptr, 0,
|
|
"output fully-parenthesized formulas", -20 },
|
|
{ "spin", 's', nullptr, 0, "output in Spin's syntax", -20 },
|
|
{ "spot", OPT_SPOT, nullptr, 0, "output in Spot's syntax (default)", -20 },
|
|
{ "lbt", 'l', nullptr, 0, "output in LBT's syntax", -20 },
|
|
{ "wring", OPT_WRING, nullptr, 0, "output in Wring's syntax", -20 },
|
|
{ "utf8", '8', nullptr, 0, "output using UTF-8 characters", -20 },
|
|
{ "latex", OPT_LATEX, nullptr, 0, "output using LaTeX macros", -20 },
|
|
// --csv-escape was deprecated in Spot 2.1, we can remove it at
|
|
// some point
|
|
{ "csv-escape", OPT_CSV, nullptr, OPTION_HIDDEN,
|
|
"quote the formula for use in a CSV file", -20 },
|
|
{ "format", OPT_FORMAT, "FORMAT", 0,
|
|
"specify how each line should be output (default: \"%f\")", -20 },
|
|
{ "stats", 0, nullptr, OPTION_ALIAS, nullptr, 0 },
|
|
{ "output", 'o', "FORMAT", 0,
|
|
"send output to a file named FORMAT instead of standard output. The"
|
|
" first formula sent to a file truncates it unless FORMAT starts"
|
|
" with '>>'.", 0 },
|
|
{ "zero-terminated-output", '0', nullptr, 0,
|
|
"separate output formulas with \\0 instead of \\n "
|
|
"(for use with xargs -0)", 0 },
|
|
{ nullptr, 0, nullptr, 0, nullptr, 0 }
|
|
};
|
|
|
|
const struct argp output_argp = { options, parse_opt_output,
|
|
nullptr, nullptr, nullptr,
|
|
nullptr, nullptr };
|
|
|
|
static
|
|
void
|
|
report_not_ltl(spot::formula f,
|
|
const char* filename, const char* linenum, const char* syn)
|
|
{
|
|
std::string s = spot::str_psl(f);
|
|
static const char msg[] =
|
|
"formula '%s' cannot be written in %s's syntax because it is not LTL";
|
|
if (filename)
|
|
error_at_line(2, 0, filename, atoi(linenum), msg, s.c_str(), syn);
|
|
else
|
|
error(2, 0, msg, s.c_str(), syn);
|
|
}
|
|
|
|
std::ostream&
|
|
stream_formula(std::ostream& out,
|
|
spot::formula f, const char* filename,
|
|
const char* linenum)
|
|
{
|
|
switch (output_format)
|
|
{
|
|
case lbt_output:
|
|
if (f.is_ltl_formula())
|
|
spot::print_lbt_ltl(out, f);
|
|
else
|
|
report_not_ltl(f, filename, linenum, "LBT");
|
|
break;
|
|
case spot_output:
|
|
if (output_ratexp)
|
|
spot::print_sere(out, f, full_parenth);
|
|
else
|
|
spot::print_psl(out, f, full_parenth);
|
|
break;
|
|
case spin_output:
|
|
if (f.is_ltl_formula())
|
|
spot::print_spin_ltl(out, f, full_parenth);
|
|
else
|
|
report_not_ltl(f, filename, linenum, "Spin");
|
|
break;
|
|
case wring_output:
|
|
if (f.is_ltl_formula())
|
|
spot::print_wring_ltl(out, f);
|
|
else
|
|
report_not_ltl(f, filename, linenum, "Wring");
|
|
break;
|
|
case utf8_output:
|
|
if (output_ratexp)
|
|
spot::print_utf8_sere(out, f, full_parenth);
|
|
else
|
|
spot::print_utf8_psl(out, f, full_parenth);
|
|
break;
|
|
case latex_output:
|
|
if (output_ratexp)
|
|
spot::print_latex_sere(out, f, full_parenth);
|
|
else
|
|
spot::print_latex_psl(out, f, full_parenth);
|
|
break;
|
|
case count_output:
|
|
case quiet_output:
|
|
break;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
static void
|
|
stream_escapable_formula(std::ostream& os,
|
|
spot::formula f,
|
|
const char* filename,
|
|
const char* linenum)
|
|
{
|
|
if (escape_csv)
|
|
{
|
|
std::ostringstream out;
|
|
stream_formula(out, f, filename, linenum);
|
|
os << '"';
|
|
spot::escape_rfc4180(os, out.str());
|
|
os << '"';
|
|
}
|
|
else
|
|
{
|
|
stream_formula(os, f, filename, linenum);
|
|
}
|
|
}
|
|
|
|
|
|
namespace
|
|
{
|
|
struct formula_with_location
|
|
{
|
|
spot::formula f;
|
|
const char* filename;
|
|
const char* line;
|
|
unsigned index;
|
|
const char* prefix;
|
|
const char* suffix;
|
|
};
|
|
|
|
class printable_formula_class final:
|
|
public spot::printable_value<char>
|
|
{
|
|
public:
|
|
printable_formula_class&
|
|
operator=(char new_val)
|
|
{
|
|
val_ = new_val;
|
|
return *this;
|
|
}
|
|
|
|
virtual void
|
|
print(std::ostream& os, const char* opt) const override
|
|
{
|
|
if (*opt == '[')
|
|
os << spot::mp_class(val_, opt + 1);
|
|
else
|
|
os << val_;
|
|
}
|
|
};
|
|
|
|
class printable_formula_nesting final:
|
|
public spot::printable_value<spot::formula>
|
|
{
|
|
public:
|
|
printable_formula_nesting&
|
|
operator=(spot::formula new_val)
|
|
{
|
|
val_ = new_val;
|
|
return *this;
|
|
}
|
|
|
|
virtual void
|
|
print(std::ostream& os, const char* opt) const override
|
|
{
|
|
if (*opt == '[' && opt[1] != ']')
|
|
os << spot::nesting_depth(val_, opt + 1);
|
|
else
|
|
throw std::runtime_error("%n expects arguments, e.g. %[X]n");
|
|
}
|
|
};
|
|
|
|
class printable_formula_with_location final:
|
|
public spot::printable_value<const formula_with_location*>
|
|
{
|
|
public:
|
|
printable_formula_with_location&
|
|
operator=(const formula_with_location* new_val)
|
|
{
|
|
val_ = new_val;
|
|
return *this;
|
|
}
|
|
|
|
virtual void
|
|
print(std::ostream& os, const char*) const override
|
|
{
|
|
stream_escapable_formula(os, val_->f, val_->filename, val_->line);
|
|
}
|
|
};
|
|
|
|
class formula_printer final: public spot::formater
|
|
{
|
|
public:
|
|
formula_printer(std::ostream& os, const char* format)
|
|
: format_(format)
|
|
{
|
|
declare('a', &ap_); // deprecated in 2.3.2
|
|
declare('b', &bool_size_);
|
|
declare('f', &fl_);
|
|
declare('F', &filename_);
|
|
declare('R', &timer_);
|
|
declare('r', &timer_);
|
|
declare('L', &line_);
|
|
declare('l', &index_);
|
|
declare('s', &size_);
|
|
declare('h', &class_);
|
|
declare('n', &nesting_);
|
|
declare('x', &ap_);
|
|
declare('<', &prefix_);
|
|
declare('>', &suffix_);
|
|
set_output(os);
|
|
prime(format);
|
|
}
|
|
|
|
std::ostream&
|
|
print(const formula_with_location& fl,
|
|
spot::process_timer* ptimer)
|
|
{
|
|
if (has('R') || has('r'))
|
|
timer_ = *ptimer;
|
|
|
|
fl_ = &fl;
|
|
filename_ = fl.filename ? fl.filename : "";
|
|
line_ = fl.line;
|
|
index_ = fl.index;
|
|
prefix_ = fl.prefix ? fl.prefix : "";
|
|
suffix_ = fl.suffix ? fl.suffix : "";
|
|
auto f = fl_.val()->f;
|
|
if (has('a') || has('x'))
|
|
{
|
|
auto s = spot::atomic_prop_collect(f);
|
|
ap_.set(s->begin(), s->end());
|
|
delete s;
|
|
}
|
|
if (has('b'))
|
|
bool_size_ = spot::length_boolone(f);
|
|
if (has('s'))
|
|
size_ = spot::length(f);
|
|
if (has('h'))
|
|
class_ = spot::mp_class(f);
|
|
nesting_ = f;
|
|
auto& res = format(format_);
|
|
// Make sure we do not store the formula until the next one is
|
|
// printed, as the order in which APs are registered may
|
|
// influence the automata output.
|
|
fl_ = nullptr;
|
|
nesting_ = nullptr;
|
|
ap_.clear();
|
|
return res;
|
|
}
|
|
|
|
private:
|
|
const char* format_;
|
|
printable_formula_with_location fl_;
|
|
printable_timer timer_;
|
|
spot::printable_value<const char*> filename_;
|
|
spot::printable_value<const char*> line_;
|
|
spot::printable_value<unsigned> index_;
|
|
spot::printable_value<const char*> prefix_;
|
|
spot::printable_value<const char*> suffix_;
|
|
spot::printable_value<int> size_;
|
|
printable_formula_class class_;
|
|
printable_formula_nesting nesting_;
|
|
spot::printable_value<int> bool_size_;
|
|
printable_varset ap_;
|
|
};
|
|
}
|
|
|
|
static std::unique_ptr<formula_printer> format;
|
|
static std::ostringstream outputname;
|
|
static std::unique_ptr<formula_printer> outputnamer;
|
|
static std::map<std::string, std::unique_ptr<output_file>> outputfiles;
|
|
|
|
int
|
|
parse_opt_output(int key, char* arg, struct argp_state*)
|
|
{
|
|
// Called from C code, so should not raise any exception.
|
|
BEGIN_EXCEPTION_PROTECT;
|
|
// This switch is alphabetically-ordered.
|
|
switch (key)
|
|
{
|
|
case '0':
|
|
output_terminator = 0;
|
|
break;
|
|
case '8':
|
|
output_format = utf8_output;
|
|
break;
|
|
case 'l':
|
|
output_format = lbt_output;
|
|
break;
|
|
case 'o':
|
|
outputnamer = std::make_unique<formula_printer>(outputname, arg);
|
|
break;
|
|
case 'p':
|
|
full_parenth = true;
|
|
break;
|
|
case 's':
|
|
output_format = spin_output;
|
|
break;
|
|
case OPT_CSV:
|
|
escape_csv = true;
|
|
break;
|
|
case OPT_LATEX:
|
|
output_format = latex_output;
|
|
break;
|
|
case OPT_SPOT:
|
|
output_format = spot_output;
|
|
break;
|
|
case OPT_WRING:
|
|
output_format = wring_output;
|
|
break;
|
|
case OPT_FORMAT:
|
|
format = std::make_unique<formula_printer>(std::cout, arg);
|
|
break;
|
|
default:
|
|
return ARGP_ERR_UNKNOWN;
|
|
}
|
|
END_EXCEPTION_PROTECT;
|
|
return 0;
|
|
}
|
|
|
|
|
|
static void
|
|
output_formula(std::ostream& out,
|
|
spot::formula f, spot::process_timer* ptimer,
|
|
const char* filename, const char* linenum,
|
|
unsigned index,
|
|
const char* prefix, const char* suffix)
|
|
{
|
|
if (!format)
|
|
{
|
|
if (prefix)
|
|
out << prefix << ',';
|
|
// For backward compatibility, we still run
|
|
// stream_escapable_formula when --csv-escape has been given.
|
|
// But eventually --csv-escape should be removed, and the
|
|
// formula printed raw.
|
|
if ((prefix || suffix) && !escape_csv)
|
|
{
|
|
std::ostringstream tmp;
|
|
stream_formula(tmp, f, filename, linenum);
|
|
std::string tmpstr = tmp.str();
|
|
if (tmpstr.find_first_of("\",") != std::string::npos)
|
|
{
|
|
out << '"';
|
|
spot::escape_rfc4180(out, tmpstr);
|
|
out << '"';
|
|
}
|
|
else
|
|
{
|
|
out << tmpstr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
stream_escapable_formula(out, f, filename, linenum);
|
|
}
|
|
if (suffix)
|
|
out << ',' << suffix;
|
|
}
|
|
else
|
|
{
|
|
formula_with_location fl = { f, filename, linenum,
|
|
index, prefix, suffix };
|
|
format->set_output(out);
|
|
format->print(fl, ptimer);
|
|
}
|
|
}
|
|
|
|
void
|
|
output_formula_checked(spot::formula f, spot::process_timer* ptimer,
|
|
const char* filename, const char* linenum,
|
|
unsigned index,
|
|
const char* prefix, const char* suffix)
|
|
{
|
|
if (output_format == count_output)
|
|
{
|
|
if (outputnamer)
|
|
throw std::runtime_error
|
|
("options --output and --count are incompatible");
|
|
return;
|
|
}
|
|
if (output_format == quiet_output)
|
|
return;
|
|
std::ostream* out = &std::cout;
|
|
if (outputnamer)
|
|
{
|
|
outputname.str("");
|
|
formula_with_location fl = { f, filename, linenum,
|
|
index, prefix, suffix };
|
|
outputnamer->print(fl, ptimer);
|
|
std::string fname = outputname.str();
|
|
auto [it, b] = outputfiles.try_emplace(fname, nullptr);
|
|
if (b)
|
|
it->second.reset(new output_file(fname.c_str()));
|
|
else
|
|
// reopen if the file has been closed; see below
|
|
it->second->reopen_for_append(fname);
|
|
out = &it->second->ostream();
|
|
|
|
// If we have opened fewer than 10 files, we keep them all open
|
|
// to avoid wasting time on open/close calls.
|
|
//
|
|
// However we cannot keep all files open, especially in
|
|
// scenarios were we use thousands of files only once. To keep
|
|
// things simple, we only close the previous file if it is not
|
|
// the current output. This way we still save the close/open
|
|
// cost when consecutive formulas are sent to the same file.
|
|
static output_file* previous = nullptr;
|
|
static const std::string* previous_name = nullptr;
|
|
if (previous
|
|
&& outputfiles.size() > 10
|
|
&& &previous->ostream() != out)
|
|
previous->close(*previous_name);
|
|
previous = it->second.get();
|
|
previous_name = &it->first;
|
|
}
|
|
output_formula(*out, f, ptimer, filename, linenum, index, prefix, suffix);
|
|
*out << output_terminator;
|
|
// Make sure we abort if we can't write to std::cout anymore
|
|
// (like disk full or broken pipe with SIGPIPE ignored).
|
|
check_cout();
|
|
}
|
|
|
|
void output_formula_checked(spot::formula f,
|
|
spot::process_timer* ptimer,
|
|
const char* filename, int linenum,
|
|
unsigned index,
|
|
const char* prefix,
|
|
const char* suffix)
|
|
{
|
|
output_formula_checked(f, ptimer, filename,
|
|
std::to_string(linenum).c_str(),
|
|
index,
|
|
prefix, suffix);
|
|
}
|