* wrap/python/cgi/Makefile.am, wrap/python/cgi/ltl2tgba.in,
wrap/python/cgi/README: New files. * wrap/python/Makefile.am (SUBDIRS): Add cgi. * configure.ac: Output wrap/python/cgi/Makefile.
This commit is contained in:
parent
4d819969d0
commit
bdfbf9c519
7 changed files with 289 additions and 1 deletions
|
|
@ -1,5 +1,10 @@
|
||||||
2003-08-05 Alexandre Duret-Lutz <aduret@src.lip6.fr>
|
2003-08-05 Alexandre Duret-Lutz <aduret@src.lip6.fr>
|
||||||
|
|
||||||
|
* wrap/python/cgi/Makefile.am, wrap/python/cgi/ltl2tgba.in,
|
||||||
|
wrap/python/cgi/README: New files.
|
||||||
|
* wrap/python/Makefile.am (SUBDIRS): Add cgi.
|
||||||
|
* configure.ac: Output wrap/python/cgi/Makefile.
|
||||||
|
|
||||||
* wrap/python/spot.i: Add an ostringstream emulation.
|
* wrap/python/spot.i: Add an ostringstream emulation.
|
||||||
|
|
||||||
2003-08-04 Alexandre Duret-Lutz <aduret@src.lip6.fr>
|
2003-08-04 Alexandre Duret-Lutz <aduret@src.lip6.fr>
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ AC_CONFIG_FILES([
|
||||||
src/misc/Makefile
|
src/misc/Makefile
|
||||||
wrap/Makefile
|
wrap/Makefile
|
||||||
wrap/python/Makefile
|
wrap/python/Makefile
|
||||||
|
wrap/python/cgi/Makefile
|
||||||
wrap/python/tests/Makefile
|
wrap/python/tests/Makefile
|
||||||
])
|
])
|
||||||
AC_CONFIG_FILES([wrap/python/tests/run], [chmod +x wrap/python/tests/run])
|
AC_CONFIG_FILES([wrap/python/tests/run], [chmod +x wrap/python/tests/run])
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
SUBDIRS = tests
|
SUBDIRS = cgi tests
|
||||||
|
|
||||||
AM_CPPFLAGS = -I$(PYTHONINC) -I$(top_srcdir)/src $(BUDDY_CPPFLAGS)
|
AM_CPPFLAGS = -I$(PYTHONINC) -I$(top_srcdir)/src $(BUDDY_CPPFLAGS)
|
||||||
|
|
||||||
|
|
|
||||||
4
wrap/python/cgi/.cvsignore
Normal file
4
wrap/python/cgi/.cvsignore
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
Makefile.in
|
||||||
|
Makefile
|
||||||
|
ltl2tgba.py
|
||||||
|
|
||||||
10
wrap/python/cgi/Makefile.am
Normal file
10
wrap/python/cgi/Makefile.am
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
nodist_noinst_SCRIPTS = ltl2tgba.py
|
||||||
|
EXTRA_DIST = $(srcdir)/ltl2tgba.in README
|
||||||
|
|
||||||
|
ltl2tgba.py: $(srcdir)/ltl2tgba.in
|
||||||
|
sed -e 's|[@]PYTHON[@]|@PYTHON@|g' \
|
||||||
|
-e 's|[@]pythondir[@]|@pythondir@|g' \
|
||||||
|
-e 's|[@]PACKAGE_VERSION[@]|@PACKAGE_VERSION@|g' \
|
||||||
|
<$(srcdir)/ltl2tgba.in >ltl2tgba.tmp
|
||||||
|
chmod +x ltl2tgba.tmp
|
||||||
|
mv -f ltl2tgba.tmp $@
|
||||||
41
wrap/python/cgi/README
Normal file
41
wrap/python/cgi/README
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
ltl2tgba.py is a CGI script that translate user-supplied LTL formulae
|
||||||
|
to Transition-based Generalized Büchi Automata.
|
||||||
|
|
||||||
|
You have to install the script yourself if you want to test it.
|
||||||
|
|
||||||
|
1) Install Spot first (run `make install' from the top-level).
|
||||||
|
|
||||||
|
The CGI scripts uses the Python bindings and assume they
|
||||||
|
have been installed. Near the top of the script, you
|
||||||
|
should see a call to sys.path.insert(), with the expected
|
||||||
|
location og the Python bindings for spot. This path was
|
||||||
|
configured from ./configure's arguments and you should not
|
||||||
|
have to fiddle with it. I'm mentionning it just in case.
|
||||||
|
|
||||||
|
2) Copy ltl2tgba.py to some place were CGI execution is allowed.
|
||||||
|
Depending on your HTTP server's configuration, you may have
|
||||||
|
to rename the script as ltl2tgba.cgi or something else, so
|
||||||
|
that the server accept to run it.
|
||||||
|
|
||||||
|
Apache users in trouble should look at the following options
|
||||||
|
before digging the Apache manual deeper. These can go
|
||||||
|
in a .htaccess file (if allowed).
|
||||||
|
|
||||||
|
# Treat *.py files as CGI scripts
|
||||||
|
AddHandle cgi-script .py
|
||||||
|
|
||||||
|
# Allow CGI execution in some directory.
|
||||||
|
Options +ExecCGI
|
||||||
|
|
||||||
|
3) In the directory where you have installed ltl2tgba.py,
|
||||||
|
create a subdirectory called spotimg/. This is where
|
||||||
|
the script will output its images and other temporary
|
||||||
|
files. (If you want to change this name, see the imgdir
|
||||||
|
variable at the top of the script.)
|
||||||
|
|
||||||
|
This directory must be writable by the Unix user that
|
||||||
|
will run the script when the HTTP server processes the
|
||||||
|
request.
|
||||||
|
|
||||||
|
ltl2tgba purges old files (>10min) from this directory
|
||||||
|
each time it runs.
|
||||||
227
wrap/python/cgi/ltl2tgba.in
Normal file
227
wrap/python/cgi/ltl2tgba.in
Normal file
|
|
@ -0,0 +1,227 @@
|
||||||
|
#!@PYTHON@
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import cgi
|
||||||
|
import cgitb; cgitb.enable()
|
||||||
|
|
||||||
|
sys.path.insert(0, '@pythondir@')
|
||||||
|
# Directory for temporary files (images and other auxiliary files).
|
||||||
|
imgdir = 'spotimg'
|
||||||
|
|
||||||
|
# Cleanup stale files from our image directory.
|
||||||
|
os.system('find ' + imgdir + ' -type f -amin +10 -print | xargs rm -f')
|
||||||
|
|
||||||
|
myself = os.environ['SCRIPT_NAME'];
|
||||||
|
form = cgi.FieldStorage()
|
||||||
|
filled = form.has_key('formula')
|
||||||
|
# FIXME: This assumes Apache.
|
||||||
|
uid = os.environ['UNIQUE_ID'];
|
||||||
|
imgprefix = imgdir + '/' + uid
|
||||||
|
|
||||||
|
def escaped_print_dot(dict, what):
|
||||||
|
print '<pre>'; sys.stdout.flush()
|
||||||
|
s = spot.ostringstream()
|
||||||
|
spot.bdd_print_dot(s, dict, what)
|
||||||
|
print cgi.escape(s.str())
|
||||||
|
del s
|
||||||
|
print '</pre>'; sys.stdout.flush()
|
||||||
|
|
||||||
|
def escaped_print_set(dict, what):
|
||||||
|
print '<pre>'; sys.stdout.flush()
|
||||||
|
s = spot.ostringstream()
|
||||||
|
spot.bdd_print_set(s, dict, what)
|
||||||
|
print cgi.escape(s.str())
|
||||||
|
del s
|
||||||
|
print '</pre>'; sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
print "Content-Type: text/html"
|
||||||
|
print
|
||||||
|
|
||||||
|
os.close(sys.stderr.fileno())
|
||||||
|
os.dup2(sys.stdout.fileno(), sys.stderr.fileno())
|
||||||
|
|
||||||
|
import spot
|
||||||
|
|
||||||
|
print "<TITLE>LTL-to-Büchi test</TITLE>"
|
||||||
|
print "<H1>Input</H1>"
|
||||||
|
|
||||||
|
formula = form.getfirst('formula', '')
|
||||||
|
|
||||||
|
options = [
|
||||||
|
('show_parse', 'show traces during parsing', 0),
|
||||||
|
('show_automaton_dot', 'print Büchi automaton as .dot', 0),
|
||||||
|
('show_automaton_gif', 'draw Büchi automaton', 1),
|
||||||
|
('show_degen_dot', 'print degeneralized Büchi automaton as .dot', 0),
|
||||||
|
('show_degen_gif', 'draw degeneralized Büchi automaton', 0),
|
||||||
|
('show_dictionnay', 'print BDD dictionary', 0),
|
||||||
|
('show_relation_dot', 'print the transition relation as .dot', 0),
|
||||||
|
('show_relation_set', 'print the transition relation as a BDD set', 0),
|
||||||
|
('show_relation_gif', 'draw the transition relation', 0),
|
||||||
|
('show_acceptance_dot', 'print the acceptance relation as .dot' , 0),
|
||||||
|
('show_acceptance_set', 'print the acceptance relation as a BDD set', 0),
|
||||||
|
('show_acceptance_gif', 'draw the acceptance relation', 0),
|
||||||
|
('show_lbtt', 'convert automaton for LBTT', 0),
|
||||||
|
]
|
||||||
|
|
||||||
|
print """<FORM action="%s" method="post"><P>
|
||||||
|
Formula to translate: <INPUT type="text" name="formula" value="%s"><BR>
|
||||||
|
Options:<TABLE><TR><TD>""" % (myself, formula)
|
||||||
|
|
||||||
|
for opt, desc, arg, in options:
|
||||||
|
if formula:
|
||||||
|
val = int(form.getfirst(opt, 0))
|
||||||
|
else:
|
||||||
|
val = arg
|
||||||
|
if val:
|
||||||
|
str = "checked"
|
||||||
|
else:
|
||||||
|
str = ""
|
||||||
|
globals()[opt] = val
|
||||||
|
print '<INPUT type="checkbox" name="%s" value="1" %s>%s<br>' % (opt, str,
|
||||||
|
desc)
|
||||||
|
print '</TD></TR></TABLE><INPUT type="submit" value="Send"></FORM>'
|
||||||
|
|
||||||
|
if not filled:
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
print "<hr><H1>Output</H1>"
|
||||||
|
|
||||||
|
env = spot.default_environment.instance()
|
||||||
|
|
||||||
|
print "<H2>LTL Formula</H2>"
|
||||||
|
|
||||||
|
if show_parse: print '<pre>'
|
||||||
|
sys.stdout.flush()
|
||||||
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
pel = spot.empty_parse_error_list()
|
||||||
|
f = spot.parse(formula, pel, env, show_parse)
|
||||||
|
if show_parse: print '</pre>'
|
||||||
|
|
||||||
|
print '<font color="red"><pre>'
|
||||||
|
err = spot.format_parse_errors(spot.get_cout(), formula, pel)
|
||||||
|
print '</pre></font>'
|
||||||
|
|
||||||
|
if not f:
|
||||||
|
print '<p><b>Aborting...</b></p>'
|
||||||
|
sys.exit(0)
|
||||||
|
if err:
|
||||||
|
print '<p><b>Continuing anyway...</b></p>'
|
||||||
|
|
||||||
|
print "<p>Formula is<code>", f, "</code></p>"
|
||||||
|
|
||||||
|
print '<H2>Automaton</H2>'
|
||||||
|
|
||||||
|
dict = spot.bdd_dict()
|
||||||
|
|
||||||
|
print '<p>Building automaton...',
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
concrete = spot.ltl_to_tgba(f, dict)
|
||||||
|
|
||||||
|
print 'done.</p>'
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
if show_automaton_dot:
|
||||||
|
print '<pre>'; sys.stdout.flush()
|
||||||
|
s = spot.ostringstream()
|
||||||
|
spot.dotty_reachable(s, concrete)
|
||||||
|
print cgi.escape(s.str())
|
||||||
|
del s
|
||||||
|
print '</pre>'; sys.stdout.flush()
|
||||||
|
|
||||||
|
if show_automaton_gif:
|
||||||
|
outfile = spot.ofstream(imgprefix + '-a.dot')
|
||||||
|
spot.dotty_reachable(outfile, concrete)
|
||||||
|
del outfile
|
||||||
|
os.spawnlp(os.P_WAIT, 'dot', 'dot', '-Tgif', '-o',
|
||||||
|
imgprefix + '-a.gif', imgprefix + '-a.dot')
|
||||||
|
print '<img src="' + imgprefix + '-a.gif">'
|
||||||
|
|
||||||
|
|
||||||
|
if show_degen_dot or show_degen_gif:
|
||||||
|
print '<H3>Degeneralized automaton</H3>'
|
||||||
|
degen = spot.tgba_tba_proxy(concrete)
|
||||||
|
if show_degen_dot:
|
||||||
|
print '<pre>'; sys.stdout.flush()
|
||||||
|
s = spot.ostringstream()
|
||||||
|
spot.dotty_reachable(s, degen)
|
||||||
|
print cgi.escape(s.str())
|
||||||
|
del s
|
||||||
|
print '</pre>'; sys.stdout.flush()
|
||||||
|
if show_degen_gif:
|
||||||
|
outfile = spot.ofstream(imgprefix + '-d.dot')
|
||||||
|
spot.dotty_reachable(outfile, degen)
|
||||||
|
del outfile
|
||||||
|
os.spawnlp(os.P_WAIT, 'dot', 'dot', '-Tgif', '-o',
|
||||||
|
imgprefix + '-d.gif', imgprefix + '-d.dot')
|
||||||
|
print '<img src="' + imgprefix + '-d.gif">'
|
||||||
|
else:
|
||||||
|
degen = 0
|
||||||
|
|
||||||
|
if show_dictionnay:
|
||||||
|
print '<H3>BDD dictionary</H3>'
|
||||||
|
print '<pre>'
|
||||||
|
sys.stdout.flush()
|
||||||
|
concrete.get_dict().dump(spot.get_cout())
|
||||||
|
print '</pre>'
|
||||||
|
|
||||||
|
if show_relation_dot or show_relation_set or show_relation_gif:
|
||||||
|
print '<H3>Transition relation</H3>'
|
||||||
|
if show_relation_dot:
|
||||||
|
escaped_print_dot(concrete.get_dict(),
|
||||||
|
concrete.get_core_data().relation)
|
||||||
|
if show_relation_set:
|
||||||
|
escaped_print_set(concrete.get_dict(),
|
||||||
|
concrete.get_core_data().relation)
|
||||||
|
if show_relation_gif:
|
||||||
|
outfile = spot.ofstream(imgprefix + '-b.dot')
|
||||||
|
spot.bdd_print_dot(outfile, concrete.get_dict(),
|
||||||
|
concrete.get_core_data().relation)
|
||||||
|
del outfile
|
||||||
|
os.spawnlp(os.P_WAIT, 'dot', 'dot', '-Tgif', '-o',
|
||||||
|
imgprefix + '-b.gif', imgprefix + '-b.dot')
|
||||||
|
print '<img src="' + imgprefix + '-b.gif">'
|
||||||
|
|
||||||
|
if show_acceptance_dot or show_acceptance_set or show_acceptance_gif:
|
||||||
|
print '<H3>Acceptance relation</H3>'
|
||||||
|
if show_acceptance_dot:
|
||||||
|
escaped_print_dot(concrete.get_dict(),
|
||||||
|
concrete.get_core_data().accepting_conditions)
|
||||||
|
if show_acceptance_set:
|
||||||
|
escaped_print_set(concrete.get_dict(),
|
||||||
|
concrete.get_core_data().accepting_conditions)
|
||||||
|
if show_acceptance_gif:
|
||||||
|
outfile = spot.ofstream(imgprefix + '-c.dot')
|
||||||
|
spot.bdd_print_dot(outfile, concrete.get_dict(),
|
||||||
|
concrete.get_core_data().accepting_conditions)
|
||||||
|
del outfile
|
||||||
|
os.spawnlp(os.P_WAIT, 'dot', 'dot', '-Tgif', '-o',
|
||||||
|
imgprefix + '-c.gif', imgprefix + '-c.dot')
|
||||||
|
print '<img src="' + imgprefix + '-c.gif">'
|
||||||
|
|
||||||
|
if show_lbtt:
|
||||||
|
print '<H3>LBTT conversion</H3>'
|
||||||
|
if degen:
|
||||||
|
print '<H4>Conversion of the generalized automaton</H4>'
|
||||||
|
print '<pre>'
|
||||||
|
sys.stdout.flush()
|
||||||
|
spot.lbtt_reachable(spot.get_cout(), concrete)
|
||||||
|
print '</pre>'
|
||||||
|
if degen:
|
||||||
|
print '<H4>Conversion of the degeneralized automaton</H4>'
|
||||||
|
print '<pre>'
|
||||||
|
sys.stdout.flush()
|
||||||
|
spot.lbtt_reachable(spot.get_cout(), degen)
|
||||||
|
print '</pre>'
|
||||||
|
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
# Make sure degen is cleared before concrete.
|
||||||
|
del degen
|
||||||
|
del concrete
|
||||||
|
|
||||||
|
print '<hr>'
|
||||||
|
print 'Spot @PACKAGE_VERSION@'
|
||||||
Loading…
Add table
Add a link
Reference in a new issue