Enable filtering of signal matches

Provide tooling to enable specification of pre-implemented filtering
functors for signal matches.

Add a default 'none' filter to be used when a filter isn't specified.

Change-Id: I3549d8cf44c5f475626875fa94ca3ee8f74d6d26
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/pimgen.py b/pimgen.py
index 15c91f6..8350d3a 100755
--- a/pimgen.py
+++ b/pimgen.py
@@ -38,9 +38,10 @@
 
 
 class MatchRender(object):
-    def __init__(self, name, signature):
+    def __init__(self, name, signature, fltr):
         self.name = valid_c_name_pattern.sub('_', name).lower()
         self.signature = signature
+        self.fltr = fltr
 
         if self.name in all_names:
             raise RuntimeError('The name "%s" is not unique.' % name)
@@ -58,20 +59,51 @@
         fd.write('        std::make_tuple(\n')
         for s in sig:
             fd.write('            %s' % s)
-        fd.write('\n')
+        fd.write(',\n')
+        self.fltr(fd)
         fd.write('        ),\n')
         fd.write('    },\n')
 
 
+class FilterRender(object):
+    namespace = 'filters'
+    default = 'none'
+
+    def __init__(self, fltr):
+        self.args = None
+        if fltr is None:
+            self.name = self.default
+        else:
+            self.name = fltr.get('name')
+            self.args = fltr.get('args')
+
+    def __call__(self, fd):
+        def fmt(x):
+            if x.get('type') is None:
+                return '"%s"' % x['value']
+            return str(x['value'])
+
+        fd.write('            %s::%s' % (self.namespace, self.name))
+        if self.args:
+            fd.write('(')
+            buf = ','.join(([fmt(x) for x in self.args]))
+            fd.write(buf)
+            fd.write(')')
+
+        fd.write('\n')
+
+
 class MatchEventParse(object):
     def __init__(self, match):
         self.name = match['name']
         self.signature = match['signature']
+        self.fltr = match.get('filter')
 
     def __call__(self):
         return MatchRender(
             self.name,
-            self.signature)
+            self.signature,
+            FilterRender(self.fltr))
 
 
 class EventsParse(object):