]> git.cworth.org Git - apitrace/blobdiff - specs/scripts/cdecl.py
Draft D2D trace support.
[apitrace] / specs / scripts / cdecl.py
index 4f36b3c7c772a92c8c38506c30dbd5e7cd9b2c31..3ef4a0110352be11db08680343f09d7f5f98c402 100755 (executable)
@@ -36,7 +36,7 @@ import optparse
 
 class Parser:
 
-    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()
@@ -183,6 +189,11 @@ class Parser:
         value = 0
         while self.lookahead() != '}':
             type, name = self.parse_named_type()
+
+            if self.match(':'):
+                self.consume()
+                self.consume()
+
             if self.match(','):
                 self.consume(',')
             self.consume(';')
@@ -199,6 +210,8 @@ class Parser:
         if self.match(';'):
             return
         self.consume(':')
+        if self.lookahead() in ('public', 'protected'):
+            self.consume()
         base = self.consume()
         self.consume('{')
 
@@ -219,7 +232,7 @@ class Parser:
 
         ret = self.parse_type()
 
-        if self.match('__stdcall'):
+        if self.match('__stdcall', 'WINAPI'):
             self.consume()
             creator = 'StdFunction'
 
@@ -238,7 +251,10 @@ class Parser:
             args.append(arg)
             if self.match(','):
                 self.consume()
-        self.consume() == ')'
+        self.consume(')')
+        if self.lookahead() == 'const':
+            self.consume()
+            extra = ', const=True' + extra
         
         print '    %s(%s, "%s", [%s]%s),' % (creator, ret, name, ', '.join(args), extra)
 
@@ -250,6 +266,12 @@ class Parser:
         arg = '(%s, "%s")' % (type, name)
         if 'out' in tags:
             arg = 'Out' + arg
+
+        if self.match('='):
+            self.consume()
+            while not self.match(',', ')'):
+                self.consume()
+
         return arg
 
     def parse_tags(self):