gallium: Fix memory leak.
[mesa.git] / src / mesa / glapi / glX_doc.py
index 8a2ecb79e824c97718f4deee46f6e8f785c05b4c..e9fbbe6f169ff9a51a9df48fc82f21dfc822d4ef 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/python2
+#!/usr/bin/env python
 
 # (C) Copyright IBM Corporation 2004, 2005
 # All Rights Reserved.
 # Authors:
 #    Ian Romanick <idr@us.ibm.com>
 
-from xml.sax import saxutils
-from xml.sax import make_parser
-from xml.sax.handler import feature_namespaces
-
-import gl_XML
-import glX_XML
-import license
+import gl_XML, glX_XML, glX_proto_common, license
 import sys, getopt
 
 
-class glXDocItemFactory(glX_XML.glXItemFactory):
+class glx_doc_item_factory(glX_proto_common.glx_proto_item_factory):
        """Factory to create GLX protocol documentation oriented objects derived from glItem."""
     
-       def create(self, context, name, attrs):
-               if name == "param":
-                       return glXDocParameter(context, name, attrs)
+       def create_item(self, name, element, context):
+               if name == "parameter":
+                       return glx_doc_parameter(element, context)
                else:
-                       return glX_XML.glXItemFactory.create(self, context, name, attrs)
-
-class glXDocParameter(gl_XML.glParameter):
-       def __init__(self, context, name, attrs):
-               self.order = 1;
-               gl_XML.glParameter.__init__(self, context, name, attrs);
+                       return glX_proto_common.glx_proto_item_factory.create_item(self, name, element, context)
 
 
-       def packet_type(self):
+class glx_doc_parameter(gl_XML.gl_parameter):
+       def packet_type(self, type_dict):
                """Get the type string for the packet header
                
                GLX protocol documentation uses type names like CARD32,
@@ -61,13 +51,15 @@ class glXDocParameter(gl_XML.glParameter):
                if self.is_array():
                        list_of = "LISTof"
 
-               if self.p_type.glx_name == "":
+               t_name = self.get_base_type_string()
+               if not type_dict.has_key( t_name ):
                        type_name = "CARD8"
                else:
-                       type_name = self.p_type.glx_name
+                       type_name = type_dict[ t_name ]
 
                return "%s%s" % (list_of, type_name)
 
+
        def packet_size(self):
                p = None
                s = self.size()
@@ -75,11 +67,11 @@ class glXDocParameter(gl_XML.glParameter):
                        a_prod = "n"
                        b_prod = self.p_type.size
 
-                       if self.p_count_parameters == None and self.counter != None:
+                       if not self.count_parameter_list and self.counter:
                                a_prod = self.counter
-                       elif (self.p_count_parameters != None and self.counter == None) or (self.is_output):
+                       elif self.count_parameter_list and not self.counter or self.is_output:
                                pass
-                       elif self.p_count_parameters != None and self.counter != None:
+                       elif self.count_parameter_list and self.counter:
                                b_prod = self.counter
                        else:
                                raise RuntimeError("Parameter '%s' to function '%s' has size 0." % (self.name, self.context.name))
@@ -93,16 +85,16 @@ class glXDocParameter(gl_XML.glParameter):
 
                        return [str(s), p]
 
-class PrintGlxProtoText(glX_XML.GlxProto):
+class PrintGlxProtoText(gl_XML.gl_print_base):
        def __init__(self):
-               glX_XML.GlxProto.__init__(self)
-               self.factory = glXDocItemFactory()
-               self.last_category = ""
+               gl_XML.gl_print_base.__init__(self)
                self.license = ""
 
+
        def printHeader(self):
                return
 
+
        def body_size(self, f):
                # At some point, refactor this function and
                # glXFunction::command_payload_length.
@@ -111,7 +103,7 @@ class PrintGlxProtoText(glX_XML.GlxProto):
                size_str = ""
                pad_str = ""
                plus = ""
-               for p in f.parameterIterator(1, 2):
+               for p in f.parameterIterateGlxSend():
                        [s, pad] = p.packet_size()
                        try: 
                                size += int(s)
@@ -124,6 +116,7 @@ class PrintGlxProtoText(glX_XML.GlxProto):
 
                return [size, size_str, pad_str]
 
+
        def print_render_header(self, f):
                [size, size_str, pad_str] = self.body_size(f)
                size += 4;
@@ -166,6 +159,7 @@ class PrintGlxProtoText(glX_XML.GlxProto):
 
                return
                
+
        def print_reply(self, f):
                print '          =>'
                print '            1        1               reply'
@@ -180,33 +174,39 @@ class PrintGlxProtoText(glX_XML.GlxProto):
                        print '            4        m               reply length, m = (n == 1 ? 0 : n)'
 
 
+               output = None
+               for x in f.parameterIterateOutputs():
+                       output = x
+                       break
+
+
                unused = 24
-               if f.fn_return_type != 'void':
-                       print '            4        %-15s return value' % (f.fn_return_type)
+               if f.return_type != 'void':
+                       print '            4        %-15s return value' % (f.return_type)
                        unused -= 4
-               elif f.output != None:
+               elif output != None:
                        print '            4                        unused'
                        unused -= 4
 
-               if f.output != None:
+               if output != None:
                        print '            4        CARD32          n'
                        unused -= 4
 
-               if f.output != None:
+               if output != None:
                        if not f.reply_always_array:
                                print ''
                                print '            if (n = 1) this follows:'
                                print ''
-                               print '            4        CARD32          %s' % (f.output.name)
+                               print '            4        CARD32          %s' % (output.name)
                                print '            %-2u                       unused' % (unused - 4)
                                print ''
                                print '            otherwise this follows:'
                                print ''
 
                        print '            %-2u                       unused' % (unused)
-                       p = f.output
-                       [s, pad] = p.packet_size()
-                       print '            %-8s %-15s %s' % (s, p.packet_type(), p.name)
+
+                       [s, pad] = output.packet_size()
+                       print '            %-8s %-15s %s' % (s, output.packet_type( self.type_map ), output.name)
                        if pad != None:
                                try:
                                        bytes = int(s)
@@ -219,9 +219,9 @@ class PrintGlxProtoText(glX_XML.GlxProto):
 
 
        def print_body(self, f):
-               for p in f.parameterIterator(1, 2):
+               for p in f.parameterIterateGlxSend():
                        [s, pad] = p.packet_size()
-                       print '            %-8s %-15s %s' % (s, p.packet_type(), p.name)
+                       print '            %-8s %-15s %s' % (s, p.packet_type( self.type_map ), p.name)
                        if pad != None:
                                try:
                                        bytes = int(s)
@@ -230,26 +230,35 @@ class PrintGlxProtoText(glX_XML.GlxProto):
                                except Exception,e:
                                        print '            %-8s %-15s unused, %s=pad(%s)' % (pad, "", pad, s)
 
-       def printFunction(self, f):
+       def printBody(self, api):
+               self.type_map = {}
+               for t in api.typeIterate():
+                       self.type_map[ "GL" + t.name ] = t.glx_name
+
+
                # At some point this should be expanded to support pixel
                # functions, but I'm not going to lose any sleep over it now.
 
-               if f.fn_offset < 0 or f.client_handcode or f.server_handcode or f.ignore or f.vectorequiv or f.image:
-                       return
+               for f in api.functionIterateByOffset():
+                       if f.client_handcode or f.server_handcode or f.vectorequiv or len(f.get_images()):
+                               continue
 
-               print '        %s' % (f.name)
 
-               if f.glx_rop != 0:
-                       self.print_render_header(f)
-               else:
-                       self.print_single_header(f)
-               
-               self.print_body(f)
+                       if f.glx_rop:
+                               print '        %s' % (f.name)
+                               self.print_render_header(f)
+                       elif f.glx_sop or f.glx_vendorpriv:
+                               print '        %s' % (f.name)
+                               self.print_single_header(f)
+                       else:
+                               continue
+
+                       self.print_body(f)
 
-               if f.needs_reply():
-                       self.print_reply(f)
+                       if f.needs_reply():
+                               self.print_reply(f)
 
-               print ''
+                       print ''
                return
 
 
@@ -265,14 +274,7 @@ if __name__ == '__main__':
                if arg == "-f":
                        file_name = val
 
-       dh = PrintGlxProtoText()
-
-       parser = make_parser()
-       parser.setFeature(feature_namespaces, 0)
-       parser.setContentHandler(dh)
-
-       f = open(file_name)
+       api = gl_XML.parse_GL_API( file_name, glx_doc_item_factory() )
 
-       dh.printHeader()
-       parser.parse(f)
-       dh.printFooter()
+       printer = PrintGlxProtoText()
+       printer.Print( api )