]> git.cworth.org Git - apitrace/blobdiff - specs/scripts/cdecl.py
Parse C comments around prototypes in gltxt.py
[apitrace] / specs / scripts / cdecl.py
index 4f36b3c7c772a92c8c38506c30dbd5e7cd9b2c31..d6ee05850df2159ff0e7b2246ed9be3e650c8220 100755 (executable)
@@ -34,9 +34,9 @@ import re
 import optparse
 
 
-class Parser:
+class DeclParser:
 
-    token_re = re.compile(r'(\w+|\s+|.)')
+    token_re = re.compile(r'(\d[x0-9a-fA-F.UL]*|\w+|\s+|.)')
 
     multi_comment_re = re.compile(r'/\*.*?\*/', flags = re.DOTALL)
     single_comment_re = re.compile(r'//.*',)
@@ -93,7 +93,9 @@ class Parser:
 
     def parse_declaration(self):
         self.parse_tags()
-        if self.match('enum'):
+        if self.match('#'):
+            self.parse_define()
+        elif self.match('enum'):
             self.parse_enum()
         elif self.match('interface'):
             self.parse_interface()
@@ -162,17 +164,21 @@ class Parser:
         print '%s = %s(%s, [' % (name, constructor, type)
 
         while self.lookahead() != '}':
-            self.consume('#')
-            self.consume('define')
-            name = self.consume()
-            value = self.consume()
-            #print '    "%s",\t# %s' % (name, value) 
-            print '    "%s",' % (name,) 
+            name, value = self.parse_define()
         self.consume('}')
 
         print '])'
         print
 
+    def parse_define(self):
+        self.consume('#')
+        self.consume('define')
+        name = self.consume()
+        value = self.consume()
+        #print '    "%s",\t# %s' % (name, value) 
+        print '    "%s",' % (name,) 
+        return name, value
+
     def parse_struct(self):
         self.consume('struct')
         name = self.consume()
@@ -269,7 +275,11 @@ class Parser:
             self.consume()
             length = self.consume()
             self.consume(']')
-            type = 'Array(%s, "%s")' % (type, length)
+            try:
+                int(length)
+            except ValueError:
+                length = "%s" % length
+            type = 'Array(%s, %s)' % (type, length)
         return type, name
 
     int_tokens = ('unsigned', 'signed', 'int', 'long', 'short', 'char')
@@ -344,14 +354,15 @@ class Parser:
         return type
 
 
-
-        
-
-
 def main():
-    parser = Parser()
-    for arg in sys.argv[1:]:
-        parser.parse(open(arg, 'rt').read())
+    args = sys.argv[1:]
+
+    parser = DeclParser()
+    if args:
+        for arg in args:
+            parser.parse(open(arg, 'rt').read())
+    else:
+        parser.parse(sys.stdin.read())
     
 
 if __name__ == '__main__':