From c40ac55789ef7da23bc7baaf77e47944de0faccb Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Mon, 15 Mar 2010 23:20:25 +0100 Subject: tools/dfagen: limit output using origin, refs #102 --- tools/dfagen/dfagen/automaton.py | 23 +++++++++++++++-------- tools/dfagen/dfagen/command.py | 4 +++- tools/dfagen/dfagen/output/c.py | 4 +++- tools/dfagen/dfagen/output/dot.py | 6 +++--- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/tools/dfagen/dfagen/automaton.py b/tools/dfagen/dfagen/automaton.py index 63a701f6..50a5dcd0 100644 --- a/tools/dfagen/dfagen/automaton.py +++ b/tools/dfagen/dfagen/automaton.py @@ -1,3 +1,10 @@ +def filter_origin_iter (list, origin): + if origin is None: + return iter (list) + else: + import itertools + return itertools.ifilter (lambda x: x.origin in origin, iter (list)) + class Event: """Event definition.""" @@ -63,8 +70,8 @@ class Transition: self.branches[branch.name] = branch self.branches_list.append (branch) - def iter_branches (self): - return iter (self.branches_list) + def iter_branches (self, origin = None): + return filter_origin_iter (self.branches_list, origin) def get_attributes (self): return [ b.attributes for b in self.iter_branches () @@ -124,14 +131,14 @@ class Automaton: self.events[event.name] = event self.events_list.append (event) - def iter_states (self): - return iter (self.states_list) + def iter_states (self, origin = None): + return filter_origin_iter (self.states_list, origin) - def iter_initials (self): - return iter (self.initials) + def iter_initials (self, origin = None): + return filter_origin_iter (self.initials, origin) - def iter_events (self): - return iter (self.events_list) + def iter_events (self, origin = None): + return filter_origin_iter (self.events_list, origin) def __str__ (self): s = self.name + '\n' diff --git a/tools/dfagen/dfagen/command.py b/tools/dfagen/dfagen/command.py index 3325d6c1..223deeaa 100644 --- a/tools/dfagen/dfagen/command.py +++ b/tools/dfagen/dfagen/command.py @@ -17,6 +17,8 @@ def run (): help='read output configuration from FILE', metavar='FILE') opt.add_option ('-p', '--prefix', dest='prefix', help='use PREFIX for generated output', metavar='PREFIX') + opt.add_option ('--origin', dest='origin', action='append', + help='restrict output to given automaton name(s)', metavar='NAME') opt.add_option ('-O', '--output-dir', dest='output_dir', default='', help='generate output in DIR', metavar='DIR') opt.add_option ('--dump', action='store_true', default=False, @@ -38,4 +40,4 @@ def run (): # Produce output. if options.output is not None: dfagen.output.get_output (options.output).write (options.prefix, a, - cfg, options.output_dir) + cfg, options.output_dir, options.origin) diff --git a/tools/dfagen/dfagen/output/c.py b/tools/dfagen/dfagen/output/c.py index 5a44d0e3..2d45720e 100644 --- a/tools/dfagen/dfagen/output/c.py +++ b/tools/dfagen/dfagen/output/c.py @@ -258,7 +258,9 @@ class Writer: for (t, f) in templates.iteritems (): self.write_template (t, f.replace ('%', self.data.prefix)) -def write (prefix, automaton, user, outputdir): +def write (prefix, automaton, user, outputdir, origin): + if origin is not None: + raise NotImplementedError ("--origin is not implemented for C output") templatedir = os.path.splitext (__file__)[0] if 'template-dir' in user: templatedir = os.path.join (os.path.split (user.file)[0], diff --git a/tools/dfagen/dfagen/output/dot.py b/tools/dfagen/dfagen/output/dot.py index ce9c4db8..46b2289c 100644 --- a/tools/dfagen/dfagen/output/dot.py +++ b/tools/dfagen/dfagen/output/dot.py @@ -1,13 +1,13 @@ import os.path -def write (prefix, automaton, user, outputdir): +def write (prefix, automaton, user, outputdir, origin): output = prefix + '.dot' o = open (os.path.join (outputdir, output), 'w') o.write ('digraph %s {' % prefix) - for s in automaton.iter_states (): + for s in automaton.iter_states (origin): o.write (' %s\n' % s.name) for tr in s.iter_transitions (): - for br in tr.iter_branches (): + for br in tr.iter_branches (origin): o.write (' %(state)s -> %(to)s [ label = "%(event)s" ];\n' % dict ( state = s.name, -- cgit v1.2.3