]> git.cworth.org Git - apitrace/blobdiff - specs/scripts/cdecl.py
dxgi: Support tracng DWM process.
[apitrace] / specs / scripts / cdecl.py
index 013dec0db4ba6b7add8911e0c49a4d45c3c7b813..7deb2955d51778d1c4559a54e9f0e227cf379b69 100755 (executable)
@@ -36,7 +36,7 @@ import optparse
 
 class DeclParser:
 
-    token_re = re.compile(r'(\d[x0-9a-fA-F.UL]*|\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'//.*',)
@@ -122,7 +122,7 @@ class DeclParser:
                     self.consume()
                     type = 'Pointer(%s)' % type
                 name = self.consume()
-                print '%s = Alias(%r, %s)' % (name, name, type)
+                print '%s = Alias("%s", %s)' % (name, name, type)
                 if self.match(','):
                     self.consume()
                 else:
@@ -136,7 +136,7 @@ class DeclParser:
         name = self.consume()
         self.consume('{')
 
-        print '%s = Enum(%r, [' % (name, name)
+        print '%s = Enum("%s", [' % (name, name)
 
         #value = 0
         while self.lookahead() != '}':
@@ -147,8 +147,8 @@ class DeclParser:
             if self.match(','):
                 self.consume(',')
             tags = self.parse_tags()
-            #print '    %r,\t# %s' % (name, value) 
-            print '    %r,' % (name,) 
+            #print '    "%s",\t# %s' % (name, value) 
+            print '    "%s",' % (name,) 
             #value += 1
         self.consume('}')
 
@@ -175,17 +175,17 @@ class DeclParser:
         self.consume('define')
         name = self.consume()
         value = self.consume()
-        #print '    %r,\t# %s' % (name, value) 
-        print '    %r,' % (name,) 
+        #print '    "%s",\t# %s' % (name, value) 
+        print '    "%s",' % (name,) 
         return name, value
 
     def parse_struct(self):
         self.consume('struct')
         name = self.consume()
 
-        print '%s = Struct(%r, [' % (name, name)
+        print '%s = Struct("%s", [' % (name, name)
         for type, name in self.parse_members():
-            print '    (%s, %r),' % (type, name)
+            print '    (%s, "%s"),' % (type, name)
         print '])'
         print
 
@@ -196,7 +196,7 @@ class DeclParser:
         else:
             name = None
         members = self.parse_members()
-        return 'Union(%r, [%s])' % (name, ', '.join('%s, %r' % member for member in members))
+        return 'Union("%s", [%s])' % (name, ', '.join('%s, "%s"' % member for member in members))
 
     def parse_members(self):
         members = []
@@ -226,7 +226,7 @@ class DeclParser:
         base = self.consume()
         self.consume('{')
 
-        print '%s = Interface(%r, %s)' % (name, name, base)
+        print '%s = Interface("%s", %s)' % (name, name, base)
         print '%s.methods += [' % (name,)
 
         while self.lookahead() != '}':
@@ -247,7 +247,7 @@ class DeclParser:
 
         ret = self.parse_type()
 
-        if self.match('__stdcall', 'WINAPI'):
+        if self.match('__stdcall', 'WINAPI', 'STDMETHODCALLTYPE'):
             self.consume()
             creator = 'Std' + creator
 
@@ -275,14 +275,14 @@ class DeclParser:
             self.consume()
             self.consume('0')
         
-        print '    %s(%s, %r, [%s]%s),' % (creator, ret, name, ', '.join(args), extra)
+        print '    %s(%s, "%s", [%s]%s),' % (creator, ret, name, ', '.join(args), extra)
 
     def parse_arg(self):
         tags = self.parse_tags()
 
         type, name = self.parse_named_type()
 
-        arg = '(%s, %r)' % (type, name)
+        arg = '(%s, "%s")' % (type, name)
         if 'out' in tags or 'inout' in tags:
             arg = 'Out' + arg
 
@@ -301,16 +301,38 @@ class DeclParser:
                 tag = self.consume()
                 tags.append(tag)
             self.consume(']')
-        if self.lookahead().startswith('__'):
+            if tags[0] == 'annotation':
+                assert tags[1] == '('
+                assert tags[3] == ')'
+                tags = tags[2]
+                assert tags[0] == '"'
+                assert tags[-1] == '"'
+                tags = tags[1:-1]
+                tags = parse_sal_annotation(tags)
+        token = self.lookahead()
+        if token[0] == '_' and (token[1] == '_' or token[-1] == '_'):
             # Parse __in, __out, etc tags
-            tag = self.consume()[2:]
-            args = []
+            tag = self.consume()
             if self.match('('):
-                self.consume()
+                tag += self.consume()
                 while not self.match(')'):
-                    self.consume()
-                self.consume(')')
-            tags.extend(tag.split('_'))
+                    tag += self.consume()
+                tag += self.consume(')')
+            tags.extend(self.parse_sal_annotation(tag))
+        return tags
+
+    def parse_sal_annotation(self, tags):
+        try:
+            tags, args = tags.split('(')
+        except ValueError:
+            pass
+        assert tags[0] == '_'
+        if tags[1] == '_':
+            tags = tags[2:]
+        if tags[-1] == '_':
+            tags = tags[1:-1]
+        tags = tags.lower()
+        tags = tags.split('_')
         return tags
 
     def parse_named_type(self):
@@ -322,12 +344,14 @@ class DeclParser:
             name = self.consume()
             if self.match('['):
                 self.consume()
-                length = self.consume()
+                length = ''
+                while not self.match(']'):
+                    length += self.consume()
                 self.consume(']')
                 try:
                     int(length)
                 except ValueError:
-                    length = repr(length)
+                    length = '"%s"' % length
                 type = 'Array(%s, %s)' % (type, length)
         return type, name