xref: /aosp_15_r20/external/libxml2/python/generator.py (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*7c568831SAndroid Build Coastguard Worker#
3*7c568831SAndroid Build Coastguard Worker# generate python wrappers from the XML API description
4*7c568831SAndroid Build Coastguard Worker#
5*7c568831SAndroid Build Coastguard Worker
6*7c568831SAndroid Build Coastguard Workerfunctions = {}
7*7c568831SAndroid Build Coastguard Workerenums = {} # { enumType: { enumConstant: enumValue } }
8*7c568831SAndroid Build Coastguard Worker
9*7c568831SAndroid Build Coastguard Workerimport os
10*7c568831SAndroid Build Coastguard Workerimport sys
11*7c568831SAndroid Build Coastguard Workerimport string
12*7c568831SAndroid Build Coastguard Worker
13*7c568831SAndroid Build Coastguard Workerif __name__ == "__main__":
14*7c568831SAndroid Build Coastguard Worker    # launched as a script
15*7c568831SAndroid Build Coastguard Worker    srcPref = os.path.dirname(sys.argv[0])
16*7c568831SAndroid Build Coastguard Workerelse:
17*7c568831SAndroid Build Coastguard Worker    # imported
18*7c568831SAndroid Build Coastguard Worker    srcPref = os.path.dirname(__file__)
19*7c568831SAndroid Build Coastguard Worker
20*7c568831SAndroid Build Coastguard Worker#######################################################################
21*7c568831SAndroid Build Coastguard Worker#
22*7c568831SAndroid Build Coastguard Worker#  That part if purely the API acquisition phase from the
23*7c568831SAndroid Build Coastguard Worker#  XML API description
24*7c568831SAndroid Build Coastguard Worker#
25*7c568831SAndroid Build Coastguard Worker#######################################################################
26*7c568831SAndroid Build Coastguard Workerimport os
27*7c568831SAndroid Build Coastguard Workerimport xml.sax
28*7c568831SAndroid Build Coastguard Worker
29*7c568831SAndroid Build Coastguard Workerdebug = 0
30*7c568831SAndroid Build Coastguard Worker
31*7c568831SAndroid Build Coastguard Workerdef getparser():
32*7c568831SAndroid Build Coastguard Worker    # Attach parser to an unmarshalling object. return both objects.
33*7c568831SAndroid Build Coastguard Worker    target = docParser()
34*7c568831SAndroid Build Coastguard Worker    parser = xml.sax.make_parser()
35*7c568831SAndroid Build Coastguard Worker    parser.setContentHandler(target)
36*7c568831SAndroid Build Coastguard Worker    return parser, target
37*7c568831SAndroid Build Coastguard Worker
38*7c568831SAndroid Build Coastguard Workerclass docParser(xml.sax.handler.ContentHandler):
39*7c568831SAndroid Build Coastguard Worker    def __init__(self):
40*7c568831SAndroid Build Coastguard Worker        self._methodname = None
41*7c568831SAndroid Build Coastguard Worker        self._data = []
42*7c568831SAndroid Build Coastguard Worker        self.in_function = 0
43*7c568831SAndroid Build Coastguard Worker
44*7c568831SAndroid Build Coastguard Worker        self.startElement = self.start
45*7c568831SAndroid Build Coastguard Worker        self.endElement = self.end
46*7c568831SAndroid Build Coastguard Worker        self.characters = self.data
47*7c568831SAndroid Build Coastguard Worker
48*7c568831SAndroid Build Coastguard Worker    def close(self):
49*7c568831SAndroid Build Coastguard Worker        if debug:
50*7c568831SAndroid Build Coastguard Worker            print("close")
51*7c568831SAndroid Build Coastguard Worker
52*7c568831SAndroid Build Coastguard Worker    def getmethodname(self):
53*7c568831SAndroid Build Coastguard Worker        return self._methodname
54*7c568831SAndroid Build Coastguard Worker
55*7c568831SAndroid Build Coastguard Worker    def data(self, text):
56*7c568831SAndroid Build Coastguard Worker        if debug:
57*7c568831SAndroid Build Coastguard Worker            print("data %s" % text)
58*7c568831SAndroid Build Coastguard Worker        self._data.append(text)
59*7c568831SAndroid Build Coastguard Worker
60*7c568831SAndroid Build Coastguard Worker    def start(self, tag, attrs):
61*7c568831SAndroid Build Coastguard Worker        if debug:
62*7c568831SAndroid Build Coastguard Worker            print("start %s, %s" % (tag, attrs))
63*7c568831SAndroid Build Coastguard Worker        if tag == 'function':
64*7c568831SAndroid Build Coastguard Worker            self._data = []
65*7c568831SAndroid Build Coastguard Worker            self.in_function = 1
66*7c568831SAndroid Build Coastguard Worker            self.function = None
67*7c568831SAndroid Build Coastguard Worker            self.function_cond = None
68*7c568831SAndroid Build Coastguard Worker            self.function_args = []
69*7c568831SAndroid Build Coastguard Worker            self.function_descr = None
70*7c568831SAndroid Build Coastguard Worker            self.function_return = None
71*7c568831SAndroid Build Coastguard Worker            self.function_file = None
72*7c568831SAndroid Build Coastguard Worker            if 'name' in attrs.keys():
73*7c568831SAndroid Build Coastguard Worker                self.function = attrs['name']
74*7c568831SAndroid Build Coastguard Worker            if 'file' in attrs.keys():
75*7c568831SAndroid Build Coastguard Worker                self.function_file = attrs['file']
76*7c568831SAndroid Build Coastguard Worker        elif tag == 'cond':
77*7c568831SAndroid Build Coastguard Worker            self._data = []
78*7c568831SAndroid Build Coastguard Worker        elif tag == 'info':
79*7c568831SAndroid Build Coastguard Worker            self._data = []
80*7c568831SAndroid Build Coastguard Worker        elif tag == 'arg':
81*7c568831SAndroid Build Coastguard Worker            if self.in_function == 1:
82*7c568831SAndroid Build Coastguard Worker                self.function_arg_name = None
83*7c568831SAndroid Build Coastguard Worker                self.function_arg_type = None
84*7c568831SAndroid Build Coastguard Worker                self.function_arg_info = None
85*7c568831SAndroid Build Coastguard Worker                if 'name' in attrs.keys():
86*7c568831SAndroid Build Coastguard Worker                    self.function_arg_name = attrs['name']
87*7c568831SAndroid Build Coastguard Worker                if 'type' in attrs.keys():
88*7c568831SAndroid Build Coastguard Worker                    self.function_arg_type = attrs['type']
89*7c568831SAndroid Build Coastguard Worker                if 'info' in attrs.keys():
90*7c568831SAndroid Build Coastguard Worker                    self.function_arg_info = attrs['info']
91*7c568831SAndroid Build Coastguard Worker        elif tag == 'return':
92*7c568831SAndroid Build Coastguard Worker            if self.in_function == 1:
93*7c568831SAndroid Build Coastguard Worker                self.function_return_type = None
94*7c568831SAndroid Build Coastguard Worker                self.function_return_info = None
95*7c568831SAndroid Build Coastguard Worker                self.function_return_field = None
96*7c568831SAndroid Build Coastguard Worker                if 'type' in attrs.keys():
97*7c568831SAndroid Build Coastguard Worker                    self.function_return_type = attrs['type']
98*7c568831SAndroid Build Coastguard Worker                if 'info' in attrs.keys():
99*7c568831SAndroid Build Coastguard Worker                    self.function_return_info = attrs['info']
100*7c568831SAndroid Build Coastguard Worker                if 'field' in attrs.keys():
101*7c568831SAndroid Build Coastguard Worker                    self.function_return_field = attrs['field']
102*7c568831SAndroid Build Coastguard Worker        elif tag == 'enum':
103*7c568831SAndroid Build Coastguard Worker            enum(attrs['type'],attrs['name'],attrs['value'])
104*7c568831SAndroid Build Coastguard Worker
105*7c568831SAndroid Build Coastguard Worker    def end(self, tag):
106*7c568831SAndroid Build Coastguard Worker        if debug:
107*7c568831SAndroid Build Coastguard Worker            print("end %s" % tag)
108*7c568831SAndroid Build Coastguard Worker        if tag == 'function':
109*7c568831SAndroid Build Coastguard Worker            if self.function != None:
110*7c568831SAndroid Build Coastguard Worker                function(self.function, self.function_descr,
111*7c568831SAndroid Build Coastguard Worker                         self.function_return, self.function_args,
112*7c568831SAndroid Build Coastguard Worker                         self.function_file, self.function_cond)
113*7c568831SAndroid Build Coastguard Worker                self.in_function = 0
114*7c568831SAndroid Build Coastguard Worker        elif tag == 'arg':
115*7c568831SAndroid Build Coastguard Worker            if self.in_function == 1:
116*7c568831SAndroid Build Coastguard Worker                self.function_args.append([self.function_arg_name,
117*7c568831SAndroid Build Coastguard Worker                                           self.function_arg_type,
118*7c568831SAndroid Build Coastguard Worker                                           self.function_arg_info])
119*7c568831SAndroid Build Coastguard Worker        elif tag == 'return':
120*7c568831SAndroid Build Coastguard Worker            if self.in_function == 1:
121*7c568831SAndroid Build Coastguard Worker                self.function_return = [self.function_return_type,
122*7c568831SAndroid Build Coastguard Worker                                        self.function_return_info,
123*7c568831SAndroid Build Coastguard Worker                                        self.function_return_field]
124*7c568831SAndroid Build Coastguard Worker        elif tag == 'info':
125*7c568831SAndroid Build Coastguard Worker            str = ''
126*7c568831SAndroid Build Coastguard Worker            for c in self._data:
127*7c568831SAndroid Build Coastguard Worker                str = str + c
128*7c568831SAndroid Build Coastguard Worker            if self.in_function == 1:
129*7c568831SAndroid Build Coastguard Worker                self.function_descr = str
130*7c568831SAndroid Build Coastguard Worker        elif tag == 'cond':
131*7c568831SAndroid Build Coastguard Worker            str = ''
132*7c568831SAndroid Build Coastguard Worker            for c in self._data:
133*7c568831SAndroid Build Coastguard Worker                str = str + c
134*7c568831SAndroid Build Coastguard Worker            if self.in_function == 1:
135*7c568831SAndroid Build Coastguard Worker                self.function_cond = str
136*7c568831SAndroid Build Coastguard Worker
137*7c568831SAndroid Build Coastguard Worker
138*7c568831SAndroid Build Coastguard Workerdef function(name, desc, ret, args, file, cond):
139*7c568831SAndroid Build Coastguard Worker    functions[name] = (desc, ret, args, file, cond)
140*7c568831SAndroid Build Coastguard Worker
141*7c568831SAndroid Build Coastguard Workerdef enum(type, name, value):
142*7c568831SAndroid Build Coastguard Worker    if type not in enums:
143*7c568831SAndroid Build Coastguard Worker        enums[type] = {}
144*7c568831SAndroid Build Coastguard Worker    enums[type][name] = value
145*7c568831SAndroid Build Coastguard Worker
146*7c568831SAndroid Build Coastguard Worker#######################################################################
147*7c568831SAndroid Build Coastguard Worker#
148*7c568831SAndroid Build Coastguard Worker#  Some filtering rukes to drop functions/types which should not
149*7c568831SAndroid Build Coastguard Worker#  be exposed as-is on the Python interface
150*7c568831SAndroid Build Coastguard Worker#
151*7c568831SAndroid Build Coastguard Worker#######################################################################
152*7c568831SAndroid Build Coastguard Worker
153*7c568831SAndroid Build Coastguard Workerskipped_modules = {
154*7c568831SAndroid Build Coastguard Worker    'xmlmemory': None,
155*7c568831SAndroid Build Coastguard Worker    'SAX': None,
156*7c568831SAndroid Build Coastguard Worker    'hash': None,
157*7c568831SAndroid Build Coastguard Worker    'list': None,
158*7c568831SAndroid Build Coastguard Worker    'threads': None,
159*7c568831SAndroid Build Coastguard Worker#    'xpointer': None,
160*7c568831SAndroid Build Coastguard Worker}
161*7c568831SAndroid Build Coastguard Workerskipped_types = {
162*7c568831SAndroid Build Coastguard Worker    'int *': "usually a return type",
163*7c568831SAndroid Build Coastguard Worker    'xmlSAXHandlerPtr': "not the proper interface for SAX",
164*7c568831SAndroid Build Coastguard Worker    'htmlSAXHandlerPtr': "not the proper interface for SAX",
165*7c568831SAndroid Build Coastguard Worker    'xmlRMutexPtr': "thread specific, skipped",
166*7c568831SAndroid Build Coastguard Worker    'xmlMutexPtr': "thread specific, skipped",
167*7c568831SAndroid Build Coastguard Worker    'xmlGlobalStatePtr': "thread specific, skipped",
168*7c568831SAndroid Build Coastguard Worker    'xmlListPtr': "internal representation not suitable for python",
169*7c568831SAndroid Build Coastguard Worker    'xmlBufferPtr': "internal representation not suitable for python",
170*7c568831SAndroid Build Coastguard Worker    'FILE *': None,
171*7c568831SAndroid Build Coastguard Worker}
172*7c568831SAndroid Build Coastguard Worker
173*7c568831SAndroid Build Coastguard Worker#######################################################################
174*7c568831SAndroid Build Coastguard Worker#
175*7c568831SAndroid Build Coastguard Worker#  Table of remapping to/from the python type or class to the C
176*7c568831SAndroid Build Coastguard Worker#  counterpart.
177*7c568831SAndroid Build Coastguard Worker#
178*7c568831SAndroid Build Coastguard Worker#######################################################################
179*7c568831SAndroid Build Coastguard Worker
180*7c568831SAndroid Build Coastguard Workerpy_types = {
181*7c568831SAndroid Build Coastguard Worker    'void': (None, None, None, None),
182*7c568831SAndroid Build Coastguard Worker    'int':  ('i', None, "int", "int"),
183*7c568831SAndroid Build Coastguard Worker    'long':  ('l', None, "long", "long"),
184*7c568831SAndroid Build Coastguard Worker    'double':  ('d', None, "double", "double"),
185*7c568831SAndroid Build Coastguard Worker    'unsigned int':  ('i', None, "int", "int"),
186*7c568831SAndroid Build Coastguard Worker    'xmlChar':  ('c', None, "int", "int"),
187*7c568831SAndroid Build Coastguard Worker    'unsigned char *':  ('z', None, "charPtr", "char *"),
188*7c568831SAndroid Build Coastguard Worker    'char *':  ('z', None, "charPtr", "char *"),
189*7c568831SAndroid Build Coastguard Worker    'const char *':  ('z', None, "charPtrConst", "const char *"),
190*7c568831SAndroid Build Coastguard Worker    'xmlChar *':  ('z', None, "xmlCharPtr", "xmlChar *"),
191*7c568831SAndroid Build Coastguard Worker    'const xmlChar *':  ('z', None, "xmlCharPtrConst", "const xmlChar *"),
192*7c568831SAndroid Build Coastguard Worker    'xmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
193*7c568831SAndroid Build Coastguard Worker    'const xmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
194*7c568831SAndroid Build Coastguard Worker    'xmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
195*7c568831SAndroid Build Coastguard Worker    'const xmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
196*7c568831SAndroid Build Coastguard Worker    'xmlDtdPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
197*7c568831SAndroid Build Coastguard Worker    'const xmlDtdPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
198*7c568831SAndroid Build Coastguard Worker    'xmlDtd *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
199*7c568831SAndroid Build Coastguard Worker    'const xmlDtd *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
200*7c568831SAndroid Build Coastguard Worker    'xmlAttrPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
201*7c568831SAndroid Build Coastguard Worker    'const xmlAttrPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
202*7c568831SAndroid Build Coastguard Worker    'xmlAttr *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
203*7c568831SAndroid Build Coastguard Worker    'const xmlAttr *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
204*7c568831SAndroid Build Coastguard Worker    'xmlEntityPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
205*7c568831SAndroid Build Coastguard Worker    'const xmlEntityPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
206*7c568831SAndroid Build Coastguard Worker    'xmlEntity *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
207*7c568831SAndroid Build Coastguard Worker    'const xmlEntity *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
208*7c568831SAndroid Build Coastguard Worker    'xmlElementPtr':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
209*7c568831SAndroid Build Coastguard Worker    'const xmlElementPtr':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
210*7c568831SAndroid Build Coastguard Worker    'xmlElement *':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
211*7c568831SAndroid Build Coastguard Worker    'const xmlElement *':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
212*7c568831SAndroid Build Coastguard Worker    'xmlAttributePtr':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
213*7c568831SAndroid Build Coastguard Worker    'const xmlAttributePtr':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
214*7c568831SAndroid Build Coastguard Worker    'xmlAttribute *':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
215*7c568831SAndroid Build Coastguard Worker    'const xmlAttribute *':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
216*7c568831SAndroid Build Coastguard Worker    'xmlNsPtr':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
217*7c568831SAndroid Build Coastguard Worker    'const xmlNsPtr':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
218*7c568831SAndroid Build Coastguard Worker    'xmlNs *':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
219*7c568831SAndroid Build Coastguard Worker    'const xmlNs *':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
220*7c568831SAndroid Build Coastguard Worker    'xmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
221*7c568831SAndroid Build Coastguard Worker    'const xmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
222*7c568831SAndroid Build Coastguard Worker    'xmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
223*7c568831SAndroid Build Coastguard Worker    'const xmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
224*7c568831SAndroid Build Coastguard Worker    'htmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
225*7c568831SAndroid Build Coastguard Worker    'const htmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
226*7c568831SAndroid Build Coastguard Worker    'htmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
227*7c568831SAndroid Build Coastguard Worker    'const htmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
228*7c568831SAndroid Build Coastguard Worker    'htmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
229*7c568831SAndroid Build Coastguard Worker    'const htmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
230*7c568831SAndroid Build Coastguard Worker    'htmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
231*7c568831SAndroid Build Coastguard Worker    'const htmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
232*7c568831SAndroid Build Coastguard Worker    'xmlXPathContextPtr':  ('O', "xmlXPathContext", "xmlXPathContextPtr", "xmlXPathContextPtr"),
233*7c568831SAndroid Build Coastguard Worker    'xmlXPathContext *':  ('O', "xpathContext", "xmlXPathContextPtr", "xmlXPathContextPtr"),
234*7c568831SAndroid Build Coastguard Worker    'xmlXPathParserContextPtr':  ('O', "xmlXPathParserContext", "xmlXPathParserContextPtr", "xmlXPathParserContextPtr"),
235*7c568831SAndroid Build Coastguard Worker    'xmlParserCtxtPtr': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
236*7c568831SAndroid Build Coastguard Worker    'xmlParserCtxt *': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
237*7c568831SAndroid Build Coastguard Worker    'htmlParserCtxtPtr': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
238*7c568831SAndroid Build Coastguard Worker    'htmlParserCtxt *': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
239*7c568831SAndroid Build Coastguard Worker    'xmlValidCtxtPtr': ('O', "ValidCtxt", "xmlValidCtxtPtr", "xmlValidCtxtPtr"),
240*7c568831SAndroid Build Coastguard Worker    'xmlCatalogPtr': ('O', "catalog", "xmlCatalogPtr", "xmlCatalogPtr"),
241*7c568831SAndroid Build Coastguard Worker    'FILE *': ('O', "File", "FILEPtr", "FILE *"),
242*7c568831SAndroid Build Coastguard Worker    'xmlURIPtr': ('O', "URI", "xmlURIPtr", "xmlURIPtr"),
243*7c568831SAndroid Build Coastguard Worker    'const xmlError *': ('O', "Error", "xmlErrorPtr", "const xmlError *"),
244*7c568831SAndroid Build Coastguard Worker    'xmlErrorPtr': ('O', "Error", "xmlErrorPtr", "xmlErrorPtr"),
245*7c568831SAndroid Build Coastguard Worker    'xmlOutputBufferPtr': ('O', "outputBuffer", "xmlOutputBufferPtr", "xmlOutputBufferPtr"),
246*7c568831SAndroid Build Coastguard Worker    'xmlParserInputBufferPtr': ('O', "inputBuffer", "xmlParserInputBufferPtr", "xmlParserInputBufferPtr"),
247*7c568831SAndroid Build Coastguard Worker    'xmlRegexpPtr': ('O', "xmlReg", "xmlRegexpPtr", "xmlRegexpPtr"),
248*7c568831SAndroid Build Coastguard Worker    'xmlTextReaderLocatorPtr': ('O', "xmlTextReaderLocator", "xmlTextReaderLocatorPtr", "xmlTextReaderLocatorPtr"),
249*7c568831SAndroid Build Coastguard Worker    'xmlTextReaderPtr': ('O', "xmlTextReader", "xmlTextReaderPtr", "xmlTextReaderPtr"),
250*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGPtr': ('O', "relaxNgSchema", "xmlRelaxNGPtr", "xmlRelaxNGPtr"),
251*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGParserCtxtPtr': ('O', "relaxNgParserCtxt", "xmlRelaxNGParserCtxtPtr", "xmlRelaxNGParserCtxtPtr"),
252*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGValidCtxtPtr': ('O', "relaxNgValidCtxt", "xmlRelaxNGValidCtxtPtr", "xmlRelaxNGValidCtxtPtr"),
253*7c568831SAndroid Build Coastguard Worker    'xmlSchemaPtr': ('O', "Schema", "xmlSchemaPtr", "xmlSchemaPtr"),
254*7c568831SAndroid Build Coastguard Worker    'xmlSchemaParserCtxtPtr': ('O', "SchemaParserCtxt", "xmlSchemaParserCtxtPtr", "xmlSchemaParserCtxtPtr"),
255*7c568831SAndroid Build Coastguard Worker    'xmlSchemaValidCtxtPtr': ('O', "SchemaValidCtxt", "xmlSchemaValidCtxtPtr", "xmlSchemaValidCtxtPtr"),
256*7c568831SAndroid Build Coastguard Worker}
257*7c568831SAndroid Build Coastguard Worker
258*7c568831SAndroid Build Coastguard Workerpy_return_types = {
259*7c568831SAndroid Build Coastguard Worker    'xmlXPathObjectPtr':  ('O', "foo", "xmlXPathObjectPtr", "xmlXPathObjectPtr"),
260*7c568831SAndroid Build Coastguard Worker}
261*7c568831SAndroid Build Coastguard Worker
262*7c568831SAndroid Build Coastguard Workerunknown_types = {}
263*7c568831SAndroid Build Coastguard Worker
264*7c568831SAndroid Build Coastguard Workerforeign_encoding_args = (
265*7c568831SAndroid Build Coastguard Worker    'htmlCreateMemoryParserCtxt',
266*7c568831SAndroid Build Coastguard Worker    'htmlCtxtReadMemory',
267*7c568831SAndroid Build Coastguard Worker    'htmlParseChunk',
268*7c568831SAndroid Build Coastguard Worker    'htmlReadMemory',
269*7c568831SAndroid Build Coastguard Worker    'xmlCreateMemoryParserCtxt',
270*7c568831SAndroid Build Coastguard Worker    'xmlCtxtReadMemory',
271*7c568831SAndroid Build Coastguard Worker    'xmlCtxtResetPush',
272*7c568831SAndroid Build Coastguard Worker    'xmlParseChunk',
273*7c568831SAndroid Build Coastguard Worker    'xmlParseMemory',
274*7c568831SAndroid Build Coastguard Worker    'xmlReadMemory',
275*7c568831SAndroid Build Coastguard Worker    'xmlRecoverMemory',
276*7c568831SAndroid Build Coastguard Worker)
277*7c568831SAndroid Build Coastguard Worker
278*7c568831SAndroid Build Coastguard Worker#######################################################################
279*7c568831SAndroid Build Coastguard Worker#
280*7c568831SAndroid Build Coastguard Worker#  This part writes the C <-> Python stubs libxml2-py.[ch] and
281*7c568831SAndroid Build Coastguard Worker#  the table libxml2-export.c to add when registrering the Python module
282*7c568831SAndroid Build Coastguard Worker#
283*7c568831SAndroid Build Coastguard Worker#######################################################################
284*7c568831SAndroid Build Coastguard Worker
285*7c568831SAndroid Build Coastguard Worker# Class methods which are written by hand in libxml.c but the Python-level
286*7c568831SAndroid Build Coastguard Worker# code is still automatically generated (so they are not in skip_function()).
287*7c568831SAndroid Build Coastguard Workerskip_impl = (
288*7c568831SAndroid Build Coastguard Worker    'xmlSaveFileTo',
289*7c568831SAndroid Build Coastguard Worker    'xmlSaveFormatFileTo',
290*7c568831SAndroid Build Coastguard Worker)
291*7c568831SAndroid Build Coastguard Worker
292*7c568831SAndroid Build Coastguard Workerdeprecated_funcs = {
293*7c568831SAndroid Build Coastguard Worker    'htmlAutoCloseTag': True,
294*7c568831SAndroid Build Coastguard Worker    'htmlDefaultSAXHandlerInit': True,
295*7c568831SAndroid Build Coastguard Worker    'htmlHandleOmittedElem': True,
296*7c568831SAndroid Build Coastguard Worker    'htmlInitAutoClose': True,
297*7c568831SAndroid Build Coastguard Worker    'htmlIsAutoClosed': True,
298*7c568831SAndroid Build Coastguard Worker    'htmlIsBooleanAttr': True,
299*7c568831SAndroid Build Coastguard Worker    'htmlParseCharRef': True,
300*7c568831SAndroid Build Coastguard Worker    'htmlParseElement': True,
301*7c568831SAndroid Build Coastguard Worker    'namePop': True,
302*7c568831SAndroid Build Coastguard Worker    'namePush': True,
303*7c568831SAndroid Build Coastguard Worker    'nodePop': True,
304*7c568831SAndroid Build Coastguard Worker    'nodePush': True,
305*7c568831SAndroid Build Coastguard Worker    'xmlByteConsumed': True,
306*7c568831SAndroid Build Coastguard Worker    'xmlCheckFilename': True,
307*7c568831SAndroid Build Coastguard Worker    'xmlCheckLanguageID': True,
308*7c568831SAndroid Build Coastguard Worker    'xmlCleanupCharEncodingHandlers': True,
309*7c568831SAndroid Build Coastguard Worker    'xmlCleanupGlobals': True,
310*7c568831SAndroid Build Coastguard Worker    'xmlCopyChar': True,
311*7c568831SAndroid Build Coastguard Worker    'xmlDefaultSAXHandlerInit': True,
312*7c568831SAndroid Build Coastguard Worker    'xmlDictCleanup': True,
313*7c568831SAndroid Build Coastguard Worker    'xmlFileMatch': True,
314*7c568831SAndroid Build Coastguard Worker    'xmlGetCompressMode': True,
315*7c568831SAndroid Build Coastguard Worker    'xmlInitCharEncodingHandlers': True,
316*7c568831SAndroid Build Coastguard Worker    'xmlInitGlobals': True,
317*7c568831SAndroid Build Coastguard Worker    'xmlInitializeDict': True,
318*7c568831SAndroid Build Coastguard Worker    'xmlIOFTPMatch': True,
319*7c568831SAndroid Build Coastguard Worker    'xmlIOHTTPMatch': True,
320*7c568831SAndroid Build Coastguard Worker    'xmlIsLetter': True,
321*7c568831SAndroid Build Coastguard Worker    'xmlIsRef': True,
322*7c568831SAndroid Build Coastguard Worker    'xmlKeepBlanksDefault': True,
323*7c568831SAndroid Build Coastguard Worker    'xmlLineNumbersDefault': True,
324*7c568831SAndroid Build Coastguard Worker    'xmlNanoHTTPCleanup': True,
325*7c568831SAndroid Build Coastguard Worker    'xmlNanoHTTPInit': True,
326*7c568831SAndroid Build Coastguard Worker    'xmlNanoHTTPScanProxy': True,
327*7c568831SAndroid Build Coastguard Worker    'xmlNextChar': True,
328*7c568831SAndroid Build Coastguard Worker    'xmlNormalizeWindowsPath': True,
329*7c568831SAndroid Build Coastguard Worker    'xmlParseAttValue': True,
330*7c568831SAndroid Build Coastguard Worker    'xmlParseAttributeListDecl': True,
331*7c568831SAndroid Build Coastguard Worker    'xmlParseCDSect': True,
332*7c568831SAndroid Build Coastguard Worker    'xmlParseCharData': True,
333*7c568831SAndroid Build Coastguard Worker    'xmlParseCharRef': True,
334*7c568831SAndroid Build Coastguard Worker    'xmlParseComment': True,
335*7c568831SAndroid Build Coastguard Worker    'xmlParseDocTypeDecl': True,
336*7c568831SAndroid Build Coastguard Worker    'xmlParseElement': True,
337*7c568831SAndroid Build Coastguard Worker    'xmlParseElementDecl': True,
338*7c568831SAndroid Build Coastguard Worker    'xmlParseEncName': True,
339*7c568831SAndroid Build Coastguard Worker    'xmlParseEncodingDecl': True,
340*7c568831SAndroid Build Coastguard Worker    'xmlParseEndTag': True,
341*7c568831SAndroid Build Coastguard Worker    'xmlParseEntity': True,
342*7c568831SAndroid Build Coastguard Worker    'xmlParseEntityDecl': True,
343*7c568831SAndroid Build Coastguard Worker    'xmlParseEntityRef': True,
344*7c568831SAndroid Build Coastguard Worker    'xmlParseMarkupDecl': True,
345*7c568831SAndroid Build Coastguard Worker    'xmlParseMisc': True,
346*7c568831SAndroid Build Coastguard Worker    'xmlParseName': True,
347*7c568831SAndroid Build Coastguard Worker    'xmlParseNmtoken': True,
348*7c568831SAndroid Build Coastguard Worker    'xmlParseNotationDecl': True,
349*7c568831SAndroid Build Coastguard Worker    'xmlParsePEReference': True,
350*7c568831SAndroid Build Coastguard Worker    'xmlParsePI': True,
351*7c568831SAndroid Build Coastguard Worker    'xmlParsePITarget': True,
352*7c568831SAndroid Build Coastguard Worker    'xmlParsePubidLiteral': True,
353*7c568831SAndroid Build Coastguard Worker    'xmlParseReference': True,
354*7c568831SAndroid Build Coastguard Worker    'xmlParseSDDecl': True,
355*7c568831SAndroid Build Coastguard Worker    'xmlParseStartTag': True,
356*7c568831SAndroid Build Coastguard Worker    'xmlParseSystemLiteral': True,
357*7c568831SAndroid Build Coastguard Worker    'xmlParseTextDecl': True,
358*7c568831SAndroid Build Coastguard Worker    'xmlParseVersionInfo': True,
359*7c568831SAndroid Build Coastguard Worker    'xmlParseVersionNum': True,
360*7c568831SAndroid Build Coastguard Worker    'xmlParseXMLDecl': True,
361*7c568831SAndroid Build Coastguard Worker    'xmlParserHandlePEReference': True,
362*7c568831SAndroid Build Coastguard Worker    'xmlParserInputBufferGrow': True,
363*7c568831SAndroid Build Coastguard Worker    'xmlParserInputBufferPush': True,
364*7c568831SAndroid Build Coastguard Worker    'xmlParserInputBufferRead': True,
365*7c568831SAndroid Build Coastguard Worker    'xmlParserSetLineNumbers': True,
366*7c568831SAndroid Build Coastguard Worker    'xmlParserSetLoadSubset': True,
367*7c568831SAndroid Build Coastguard Worker    'xmlParserSetPedantic': True,
368*7c568831SAndroid Build Coastguard Worker    'xmlParserSetReplaceEntities': True,
369*7c568831SAndroid Build Coastguard Worker    'xmlParserSetValidate': True,
370*7c568831SAndroid Build Coastguard Worker    'xmlPedanticParserDefault': True,
371*7c568831SAndroid Build Coastguard Worker    'xmlRecoverDoc': True,
372*7c568831SAndroid Build Coastguard Worker    'xmlRecoverFile': True,
373*7c568831SAndroid Build Coastguard Worker    'xmlRecoverMemory': True,
374*7c568831SAndroid Build Coastguard Worker    'xmlRegisterHTTPPostCallbacks': True,
375*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGCleanupTypes': True,
376*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGInitTypes': True,
377*7c568831SAndroid Build Coastguard Worker    'xmlRemoveRef': True,
378*7c568831SAndroid Build Coastguard Worker    'xmlSAXDefaultVersion': True,
379*7c568831SAndroid Build Coastguard Worker    'xmlSchemaCleanupTypes': True,
380*7c568831SAndroid Build Coastguard Worker    'xmlSchemaInitTypes': True,
381*7c568831SAndroid Build Coastguard Worker    'xmlSetCompressMode': True,
382*7c568831SAndroid Build Coastguard Worker    'xmlSetupParserForBuffer': True,
383*7c568831SAndroid Build Coastguard Worker    'xmlSkipBlankChars': True,
384*7c568831SAndroid Build Coastguard Worker    'xmlStringDecodeEntities': True,
385*7c568831SAndroid Build Coastguard Worker    'xmlStringLenDecodeEntities': True,
386*7c568831SAndroid Build Coastguard Worker    'xmlSubstituteEntitiesDefault': True,
387*7c568831SAndroid Build Coastguard Worker    'xmlThrDefDefaultBufferSize': True,
388*7c568831SAndroid Build Coastguard Worker    'xmlThrDefDoValidityCheckingDefaultValue': True,
389*7c568831SAndroid Build Coastguard Worker    'xmlThrDefGetWarningsDefaultValue': True,
390*7c568831SAndroid Build Coastguard Worker    'xmlThrDefIndentTreeOutput': True,
391*7c568831SAndroid Build Coastguard Worker    'xmlThrDefKeepBlanksDefaultValue': True,
392*7c568831SAndroid Build Coastguard Worker    'xmlThrDefLineNumbersDefaultValue': True,
393*7c568831SAndroid Build Coastguard Worker    'xmlThrDefLoadExtDtdDefaultValue': True,
394*7c568831SAndroid Build Coastguard Worker    'xmlThrDefParserDebugEntities': True,
395*7c568831SAndroid Build Coastguard Worker    'xmlThrDefPedanticParserDefaultValue': True,
396*7c568831SAndroid Build Coastguard Worker    'xmlThrDefSaveNoEmptyTags': True,
397*7c568831SAndroid Build Coastguard Worker    'xmlThrDefSubstituteEntitiesDefaultValue': True,
398*7c568831SAndroid Build Coastguard Worker    'xmlThrDefTreeIndentString': True,
399*7c568831SAndroid Build Coastguard Worker    'xmlValidCtxtNormalizeAttributeValue': True,
400*7c568831SAndroid Build Coastguard Worker    'xmlValidNormalizeAttributeValue': True,
401*7c568831SAndroid Build Coastguard Worker    'xmlValidateAttributeValue': True,
402*7c568831SAndroid Build Coastguard Worker    'xmlValidateDocumentFinal': True,
403*7c568831SAndroid Build Coastguard Worker    'xmlValidateDtdFinal': True,
404*7c568831SAndroid Build Coastguard Worker    'xmlValidateNotationUse': True,
405*7c568831SAndroid Build Coastguard Worker    'xmlValidateOneAttribute': True,
406*7c568831SAndroid Build Coastguard Worker    'xmlValidateOneElement': True,
407*7c568831SAndroid Build Coastguard Worker    'xmlValidateOneNamespace': True,
408*7c568831SAndroid Build Coastguard Worker    'xmlValidatePopElement': True,
409*7c568831SAndroid Build Coastguard Worker    'xmlValidatePushCData': True,
410*7c568831SAndroid Build Coastguard Worker    'xmlValidatePushElement': True,
411*7c568831SAndroid Build Coastguard Worker    'xmlValidateRoot': True,
412*7c568831SAndroid Build Coastguard Worker    'xmlValidate': True,
413*7c568831SAndroid Build Coastguard Worker    'xmlXPathEvalExpr': True,
414*7c568831SAndroid Build Coastguard Worker    'xmlXPathInit': True,
415*7c568831SAndroid Build Coastguard Worker    'xmlXPtrEvalRangePredicate': True,
416*7c568831SAndroid Build Coastguard Worker    'xmlXPtrNewCollapsedRange': True,
417*7c568831SAndroid Build Coastguard Worker    'xmlXPtrNewContext': True,
418*7c568831SAndroid Build Coastguard Worker    'xmlXPtrNewLocationSetNodes': True,
419*7c568831SAndroid Build Coastguard Worker    'xmlXPtrNewRange': True,
420*7c568831SAndroid Build Coastguard Worker    'xmlXPtrNewRangeNodes': True,
421*7c568831SAndroid Build Coastguard Worker    'xmlXPtrRangeToFunction': True,
422*7c568831SAndroid Build Coastguard Worker}
423*7c568831SAndroid Build Coastguard Worker
424*7c568831SAndroid Build Coastguard Workerdef skip_function(name):
425*7c568831SAndroid Build Coastguard Worker    if name[0:12] == "xmlXPathWrap":
426*7c568831SAndroid Build Coastguard Worker        return 1
427*7c568831SAndroid Build Coastguard Worker    if name == "xmlFreeParserCtxt":
428*7c568831SAndroid Build Coastguard Worker        return 1
429*7c568831SAndroid Build Coastguard Worker    if name == "xmlCleanupParser":
430*7c568831SAndroid Build Coastguard Worker        return 1
431*7c568831SAndroid Build Coastguard Worker    if name == "xmlFreeTextReader":
432*7c568831SAndroid Build Coastguard Worker        return 1
433*7c568831SAndroid Build Coastguard Worker#    if name[0:11] == "xmlXPathNew":
434*7c568831SAndroid Build Coastguard Worker#        return 1
435*7c568831SAndroid Build Coastguard Worker    # the next function is defined in libxml.c
436*7c568831SAndroid Build Coastguard Worker    if name == "xmlRelaxNGFreeValidCtxt":
437*7c568831SAndroid Build Coastguard Worker        return 1
438*7c568831SAndroid Build Coastguard Worker    if name == "xmlFreeValidCtxt":
439*7c568831SAndroid Build Coastguard Worker        return 1
440*7c568831SAndroid Build Coastguard Worker    if name == "xmlSchemaFreeValidCtxt":
441*7c568831SAndroid Build Coastguard Worker        return 1
442*7c568831SAndroid Build Coastguard Worker
443*7c568831SAndroid Build Coastguard Worker#
444*7c568831SAndroid Build Coastguard Worker# Those are skipped because the Const version is used of the bindings
445*7c568831SAndroid Build Coastguard Worker# instead.
446*7c568831SAndroid Build Coastguard Worker#
447*7c568831SAndroid Build Coastguard Worker    if name == "xmlTextReaderBaseUri":
448*7c568831SAndroid Build Coastguard Worker        return 1
449*7c568831SAndroid Build Coastguard Worker    if name == "xmlTextReaderLocalName":
450*7c568831SAndroid Build Coastguard Worker        return 1
451*7c568831SAndroid Build Coastguard Worker    if name == "xmlTextReaderName":
452*7c568831SAndroid Build Coastguard Worker        return 1
453*7c568831SAndroid Build Coastguard Worker    if name == "xmlTextReaderNamespaceUri":
454*7c568831SAndroid Build Coastguard Worker        return 1
455*7c568831SAndroid Build Coastguard Worker    if name == "xmlTextReaderPrefix":
456*7c568831SAndroid Build Coastguard Worker        return 1
457*7c568831SAndroid Build Coastguard Worker    if name == "xmlTextReaderXmlLang":
458*7c568831SAndroid Build Coastguard Worker        return 1
459*7c568831SAndroid Build Coastguard Worker    if name == "xmlTextReaderValue":
460*7c568831SAndroid Build Coastguard Worker        return 1
461*7c568831SAndroid Build Coastguard Worker    if name == "xmlOutputBufferClose": # handled by by the superclass
462*7c568831SAndroid Build Coastguard Worker        return 1
463*7c568831SAndroid Build Coastguard Worker    if name == "xmlOutputBufferFlush": # handled by by the superclass
464*7c568831SAndroid Build Coastguard Worker        return 1
465*7c568831SAndroid Build Coastguard Worker    if name == "xmlErrMemory":
466*7c568831SAndroid Build Coastguard Worker        return 1
467*7c568831SAndroid Build Coastguard Worker
468*7c568831SAndroid Build Coastguard Worker    if name == "xmlValidBuildContentModel":
469*7c568831SAndroid Build Coastguard Worker        return 1
470*7c568831SAndroid Build Coastguard Worker    if name == "xmlValidateElementDecl":
471*7c568831SAndroid Build Coastguard Worker        return 1
472*7c568831SAndroid Build Coastguard Worker    if name == "xmlValidateAttributeDecl":
473*7c568831SAndroid Build Coastguard Worker        return 1
474*7c568831SAndroid Build Coastguard Worker    if name == "xmlPopInputCallbacks":
475*7c568831SAndroid Build Coastguard Worker        return 1
476*7c568831SAndroid Build Coastguard Worker
477*7c568831SAndroid Build Coastguard Worker    return 0
478*7c568831SAndroid Build Coastguard Worker
479*7c568831SAndroid Build Coastguard Workerdef print_function_wrapper(name, output, export, include):
480*7c568831SAndroid Build Coastguard Worker    global py_types
481*7c568831SAndroid Build Coastguard Worker    global unknown_types
482*7c568831SAndroid Build Coastguard Worker    global functions
483*7c568831SAndroid Build Coastguard Worker    global skipped_modules
484*7c568831SAndroid Build Coastguard Worker
485*7c568831SAndroid Build Coastguard Worker    try:
486*7c568831SAndroid Build Coastguard Worker        (desc, ret, args, file, cond) = functions[name]
487*7c568831SAndroid Build Coastguard Worker    except:
488*7c568831SAndroid Build Coastguard Worker        print("failed to get function %s infos")
489*7c568831SAndroid Build Coastguard Worker        return
490*7c568831SAndroid Build Coastguard Worker
491*7c568831SAndroid Build Coastguard Worker    if file in skipped_modules:
492*7c568831SAndroid Build Coastguard Worker        return 0
493*7c568831SAndroid Build Coastguard Worker    if skip_function(name) == 1:
494*7c568831SAndroid Build Coastguard Worker        return 0
495*7c568831SAndroid Build Coastguard Worker    if name in skip_impl:
496*7c568831SAndroid Build Coastguard Worker        # Don't delete the function entry in the caller.
497*7c568831SAndroid Build Coastguard Worker        return 1
498*7c568831SAndroid Build Coastguard Worker
499*7c568831SAndroid Build Coastguard Worker    if name.startswith('xmlUCSIs'):
500*7c568831SAndroid Build Coastguard Worker        is_deprecated = name != 'xmlUCSIsBlock' and name != 'xmlUCSIsCat'
501*7c568831SAndroid Build Coastguard Worker    else:
502*7c568831SAndroid Build Coastguard Worker        is_deprecated = name in deprecated_funcs
503*7c568831SAndroid Build Coastguard Worker
504*7c568831SAndroid Build Coastguard Worker    c_call = ""
505*7c568831SAndroid Build Coastguard Worker    format=""
506*7c568831SAndroid Build Coastguard Worker    format_args=""
507*7c568831SAndroid Build Coastguard Worker    c_args=""
508*7c568831SAndroid Build Coastguard Worker    c_return=""
509*7c568831SAndroid Build Coastguard Worker    c_convert=""
510*7c568831SAndroid Build Coastguard Worker    c_release=""
511*7c568831SAndroid Build Coastguard Worker    num_bufs=0
512*7c568831SAndroid Build Coastguard Worker    for arg in args:
513*7c568831SAndroid Build Coastguard Worker        # This should be correct
514*7c568831SAndroid Build Coastguard Worker        if arg[1][0:6] == "const ":
515*7c568831SAndroid Build Coastguard Worker            arg[1] = arg[1][6:]
516*7c568831SAndroid Build Coastguard Worker        c_args = c_args + "    %s %s;\n" % (arg[1], arg[0])
517*7c568831SAndroid Build Coastguard Worker        if arg[1] in py_types:
518*7c568831SAndroid Build Coastguard Worker            (f, t, n, c) = py_types[arg[1]]
519*7c568831SAndroid Build Coastguard Worker            if (f == 'z') and (name in foreign_encoding_args) and (num_bufs == 0):
520*7c568831SAndroid Build Coastguard Worker                f = 's#'
521*7c568831SAndroid Build Coastguard Worker            if f != None:
522*7c568831SAndroid Build Coastguard Worker                format = format + f
523*7c568831SAndroid Build Coastguard Worker            if t != None:
524*7c568831SAndroid Build Coastguard Worker                format_args = format_args + ", &pyobj_%s" % (arg[0])
525*7c568831SAndroid Build Coastguard Worker                c_args = c_args + "    PyObject *pyobj_%s;\n" % (arg[0])
526*7c568831SAndroid Build Coastguard Worker                c_convert = c_convert + \
527*7c568831SAndroid Build Coastguard Worker                   "    %s = (%s) Py%s_Get(pyobj_%s);\n" % (arg[0],
528*7c568831SAndroid Build Coastguard Worker                   arg[1], t, arg[0])
529*7c568831SAndroid Build Coastguard Worker            else:
530*7c568831SAndroid Build Coastguard Worker                format_args = format_args + ", &%s" % (arg[0])
531*7c568831SAndroid Build Coastguard Worker            if f == 's#':
532*7c568831SAndroid Build Coastguard Worker                format_args = format_args + ", &py_buffsize%d" % num_bufs
533*7c568831SAndroid Build Coastguard Worker                c_args = c_args + "    Py_ssize_t  py_buffsize%d;\n" % num_bufs
534*7c568831SAndroid Build Coastguard Worker                num_bufs = num_bufs + 1
535*7c568831SAndroid Build Coastguard Worker            if c_call != "":
536*7c568831SAndroid Build Coastguard Worker                c_call = c_call + ", "
537*7c568831SAndroid Build Coastguard Worker            c_call = c_call + "%s" % (arg[0])
538*7c568831SAndroid Build Coastguard Worker            if t == "File":
539*7c568831SAndroid Build Coastguard Worker                c_release = c_release + \
540*7c568831SAndroid Build Coastguard Worker		            "    PyFile_Release(%s);\n" % (arg[0])
541*7c568831SAndroid Build Coastguard Worker        else:
542*7c568831SAndroid Build Coastguard Worker            if arg[1] in skipped_types:
543*7c568831SAndroid Build Coastguard Worker                return 0
544*7c568831SAndroid Build Coastguard Worker            if arg[1] in unknown_types:
545*7c568831SAndroid Build Coastguard Worker                lst = unknown_types[arg[1]]
546*7c568831SAndroid Build Coastguard Worker                lst.append(name)
547*7c568831SAndroid Build Coastguard Worker            else:
548*7c568831SAndroid Build Coastguard Worker                unknown_types[arg[1]] = [name]
549*7c568831SAndroid Build Coastguard Worker            return -1
550*7c568831SAndroid Build Coastguard Worker    if format != "":
551*7c568831SAndroid Build Coastguard Worker        format = format + ":%s" % (name)
552*7c568831SAndroid Build Coastguard Worker
553*7c568831SAndroid Build Coastguard Worker    if ret[0] == 'void':
554*7c568831SAndroid Build Coastguard Worker        if file == "python_accessor":
555*7c568831SAndroid Build Coastguard Worker            if args[1][1] == "char *" or args[1][1] == "xmlChar *":
556*7c568831SAndroid Build Coastguard Worker                c_call = "\n    if (%s->%s != NULL) xmlFree(%s->%s);\n" % (
557*7c568831SAndroid Build Coastguard Worker                                 args[0][0], args[1][0], args[0][0], args[1][0])
558*7c568831SAndroid Build Coastguard Worker                c_call = c_call + "    %s->%s = (%s)xmlStrdup((const xmlChar *)%s);\n" % (args[0][0],
559*7c568831SAndroid Build Coastguard Worker                                 args[1][0], args[1][1], args[1][0])
560*7c568831SAndroid Build Coastguard Worker            else:
561*7c568831SAndroid Build Coastguard Worker                c_call = "\n    %s->%s = %s;\n" % (args[0][0], args[1][0],
562*7c568831SAndroid Build Coastguard Worker                                                   args[1][0])
563*7c568831SAndroid Build Coastguard Worker        else:
564*7c568831SAndroid Build Coastguard Worker            c_call = "\n    %s(%s);\n" % (name, c_call)
565*7c568831SAndroid Build Coastguard Worker        ret_convert = "    Py_INCREF(Py_None);\n    return(Py_None);\n"
566*7c568831SAndroid Build Coastguard Worker    elif ret[0] in py_types:
567*7c568831SAndroid Build Coastguard Worker        (f, t, n, c) = py_types[ret[0]]
568*7c568831SAndroid Build Coastguard Worker        c_return = c_return + "    %s c_retval;\n" % (ret[0])
569*7c568831SAndroid Build Coastguard Worker        if file == "python_accessor" and ret[2] != None:
570*7c568831SAndroid Build Coastguard Worker            c_call = "\n    c_retval = %s->%s;\n" % (args[0][0], ret[2])
571*7c568831SAndroid Build Coastguard Worker        else:
572*7c568831SAndroid Build Coastguard Worker            c_call = "\n    c_retval = %s(%s);\n" % (name, c_call)
573*7c568831SAndroid Build Coastguard Worker        ret_convert = "    py_retval = libxml_%sWrap((%s) c_retval);\n" % (n,c)
574*7c568831SAndroid Build Coastguard Worker        ret_convert = ret_convert + "    return(py_retval);\n"
575*7c568831SAndroid Build Coastguard Worker    elif ret[0] in py_return_types:
576*7c568831SAndroid Build Coastguard Worker        (f, t, n, c) = py_return_types[ret[0]]
577*7c568831SAndroid Build Coastguard Worker        c_return = c_return + "    %s c_retval;\n" % (ret[0])
578*7c568831SAndroid Build Coastguard Worker        c_call = "\n    c_retval = %s(%s);\n" % (name, c_call)
579*7c568831SAndroid Build Coastguard Worker        ret_convert = "    py_retval = libxml_%sWrap((%s) c_retval);\n" % (n,c)
580*7c568831SAndroid Build Coastguard Worker        ret_convert = ret_convert + "    return(py_retval);\n"
581*7c568831SAndroid Build Coastguard Worker    else:
582*7c568831SAndroid Build Coastguard Worker        if ret[0] in skipped_types:
583*7c568831SAndroid Build Coastguard Worker            return 0
584*7c568831SAndroid Build Coastguard Worker        if ret[0] in unknown_types:
585*7c568831SAndroid Build Coastguard Worker            lst = unknown_types[ret[0]]
586*7c568831SAndroid Build Coastguard Worker            lst.append(name)
587*7c568831SAndroid Build Coastguard Worker        else:
588*7c568831SAndroid Build Coastguard Worker            unknown_types[ret[0]] = [name]
589*7c568831SAndroid Build Coastguard Worker        return -1
590*7c568831SAndroid Build Coastguard Worker
591*7c568831SAndroid Build Coastguard Worker    if cond != None and cond != "":
592*7c568831SAndroid Build Coastguard Worker        include.write("#if %s\n" % cond)
593*7c568831SAndroid Build Coastguard Worker        export.write("#if %s\n" % cond)
594*7c568831SAndroid Build Coastguard Worker        output.write("#if %s\n" % cond)
595*7c568831SAndroid Build Coastguard Worker
596*7c568831SAndroid Build Coastguard Worker    include.write("PyObject * ")
597*7c568831SAndroid Build Coastguard Worker    include.write("libxml_%s(PyObject *self, PyObject *args);\n" % (name))
598*7c568831SAndroid Build Coastguard Worker
599*7c568831SAndroid Build Coastguard Worker    export.write("    { (char *)\"%s\", libxml_%s, METH_VARARGS, NULL },\n" %
600*7c568831SAndroid Build Coastguard Worker                 (name, name))
601*7c568831SAndroid Build Coastguard Worker
602*7c568831SAndroid Build Coastguard Worker    if file == "python":
603*7c568831SAndroid Build Coastguard Worker        # Those have been manually generated
604*7c568831SAndroid Build Coastguard Worker        if cond != None and cond != "":
605*7c568831SAndroid Build Coastguard Worker            include.write("#endif\n")
606*7c568831SAndroid Build Coastguard Worker            export.write("#endif\n")
607*7c568831SAndroid Build Coastguard Worker            output.write("#endif\n")
608*7c568831SAndroid Build Coastguard Worker        return 1
609*7c568831SAndroid Build Coastguard Worker    if file == "python_accessor" and ret[0] != "void" and ret[2] is None:
610*7c568831SAndroid Build Coastguard Worker        # Those have been manually generated
611*7c568831SAndroid Build Coastguard Worker        if cond != None and cond != "":
612*7c568831SAndroid Build Coastguard Worker            include.write("#endif\n")
613*7c568831SAndroid Build Coastguard Worker            export.write("#endif\n")
614*7c568831SAndroid Build Coastguard Worker            output.write("#endif\n")
615*7c568831SAndroid Build Coastguard Worker        return 1
616*7c568831SAndroid Build Coastguard Worker
617*7c568831SAndroid Build Coastguard Worker    if is_deprecated:
618*7c568831SAndroid Build Coastguard Worker        output.write("XML_IGNORE_DEPRECATION_WARNINGS\n")
619*7c568831SAndroid Build Coastguard Worker    output.write("PyObject *\n")
620*7c568831SAndroid Build Coastguard Worker    output.write("libxml_%s(PyObject *self ATTRIBUTE_UNUSED," % (name))
621*7c568831SAndroid Build Coastguard Worker    output.write(" PyObject *args")
622*7c568831SAndroid Build Coastguard Worker    if format == "":
623*7c568831SAndroid Build Coastguard Worker        output.write(" ATTRIBUTE_UNUSED")
624*7c568831SAndroid Build Coastguard Worker    output.write(") {\n")
625*7c568831SAndroid Build Coastguard Worker    if ret[0] != 'void':
626*7c568831SAndroid Build Coastguard Worker        output.write("    PyObject *py_retval;\n")
627*7c568831SAndroid Build Coastguard Worker    if c_return != "":
628*7c568831SAndroid Build Coastguard Worker        output.write(c_return)
629*7c568831SAndroid Build Coastguard Worker    if c_args != "":
630*7c568831SAndroid Build Coastguard Worker        output.write(c_args)
631*7c568831SAndroid Build Coastguard Worker    if is_deprecated:
632*7c568831SAndroid Build Coastguard Worker        output.write("\n    if (libxml_deprecationWarning(\"%s\") == -1)\n" %
633*7c568831SAndroid Build Coastguard Worker                     name)
634*7c568831SAndroid Build Coastguard Worker        output.write("        return(NULL);\n")
635*7c568831SAndroid Build Coastguard Worker    if format != "":
636*7c568831SAndroid Build Coastguard Worker        output.write("\n    if (!PyArg_ParseTuple(args, (char *)\"%s\"%s))\n" %
637*7c568831SAndroid Build Coastguard Worker                     (format, format_args))
638*7c568831SAndroid Build Coastguard Worker        output.write("        return(NULL);\n")
639*7c568831SAndroid Build Coastguard Worker    if c_convert != "":
640*7c568831SAndroid Build Coastguard Worker        output.write(c_convert)
641*7c568831SAndroid Build Coastguard Worker
642*7c568831SAndroid Build Coastguard Worker    output.write(c_call)
643*7c568831SAndroid Build Coastguard Worker    if c_release != "":
644*7c568831SAndroid Build Coastguard Worker        output.write(c_release)
645*7c568831SAndroid Build Coastguard Worker    output.write(ret_convert)
646*7c568831SAndroid Build Coastguard Worker    output.write("}\n")
647*7c568831SAndroid Build Coastguard Worker    if is_deprecated:
648*7c568831SAndroid Build Coastguard Worker        output.write("XML_POP_WARNINGS\n")
649*7c568831SAndroid Build Coastguard Worker    output.write("\n")
650*7c568831SAndroid Build Coastguard Worker
651*7c568831SAndroid Build Coastguard Worker    if cond != None and cond != "":
652*7c568831SAndroid Build Coastguard Worker        include.write("#endif /* %s */\n" % cond)
653*7c568831SAndroid Build Coastguard Worker        export.write("#endif /* %s */\n" % cond)
654*7c568831SAndroid Build Coastguard Worker        output.write("#endif /* %s */\n" % cond)
655*7c568831SAndroid Build Coastguard Worker    return 1
656*7c568831SAndroid Build Coastguard Worker
657*7c568831SAndroid Build Coastguard Workerdef buildStubs():
658*7c568831SAndroid Build Coastguard Worker    global py_types
659*7c568831SAndroid Build Coastguard Worker    global py_return_types
660*7c568831SAndroid Build Coastguard Worker    global unknown_types
661*7c568831SAndroid Build Coastguard Worker
662*7c568831SAndroid Build Coastguard Worker    try:
663*7c568831SAndroid Build Coastguard Worker        f = open(os.path.join(srcPref,"libxml2-api.xml"))
664*7c568831SAndroid Build Coastguard Worker        data = f.read()
665*7c568831SAndroid Build Coastguard Worker        (parser, target)  = getparser()
666*7c568831SAndroid Build Coastguard Worker        parser.feed(data)
667*7c568831SAndroid Build Coastguard Worker        parser.close()
668*7c568831SAndroid Build Coastguard Worker    except IOError as msg:
669*7c568831SAndroid Build Coastguard Worker        try:
670*7c568831SAndroid Build Coastguard Worker            f = open(os.path.join(srcPref,"..","doc","libxml2-api.xml"))
671*7c568831SAndroid Build Coastguard Worker            data = f.read()
672*7c568831SAndroid Build Coastguard Worker            (parser, target)  = getparser()
673*7c568831SAndroid Build Coastguard Worker            parser.feed(data)
674*7c568831SAndroid Build Coastguard Worker            parser.close()
675*7c568831SAndroid Build Coastguard Worker        except IOError as msg:
676*7c568831SAndroid Build Coastguard Worker            print(file, ":", msg)
677*7c568831SAndroid Build Coastguard Worker            sys.exit(1)
678*7c568831SAndroid Build Coastguard Worker
679*7c568831SAndroid Build Coastguard Worker    n = len(list(functions.keys()))
680*7c568831SAndroid Build Coastguard Worker    print("Found %d functions in libxml2-api.xml" % (n))
681*7c568831SAndroid Build Coastguard Worker
682*7c568831SAndroid Build Coastguard Worker    py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject")
683*7c568831SAndroid Build Coastguard Worker    try:
684*7c568831SAndroid Build Coastguard Worker        f = open(os.path.join(srcPref,"libxml2-python-api.xml"))
685*7c568831SAndroid Build Coastguard Worker        data = f.read()
686*7c568831SAndroid Build Coastguard Worker        (parser, target)  = getparser()
687*7c568831SAndroid Build Coastguard Worker        parser.feed(data)
688*7c568831SAndroid Build Coastguard Worker        parser.close()
689*7c568831SAndroid Build Coastguard Worker    except IOError as msg:
690*7c568831SAndroid Build Coastguard Worker        print(file, ":", msg)
691*7c568831SAndroid Build Coastguard Worker
692*7c568831SAndroid Build Coastguard Worker
693*7c568831SAndroid Build Coastguard Worker    print("Found %d functions in libxml2-python-api.xml" % (
694*7c568831SAndroid Build Coastguard Worker          len(list(functions.keys())) - n))
695*7c568831SAndroid Build Coastguard Worker    nb_wrap = 0
696*7c568831SAndroid Build Coastguard Worker    failed = 0
697*7c568831SAndroid Build Coastguard Worker    skipped = 0
698*7c568831SAndroid Build Coastguard Worker
699*7c568831SAndroid Build Coastguard Worker    include = open("libxml2-py.h", "w")
700*7c568831SAndroid Build Coastguard Worker    include.write("/* Generated */\n\n")
701*7c568831SAndroid Build Coastguard Worker    export = open("libxml2-export.c", "w")
702*7c568831SAndroid Build Coastguard Worker    export.write("/* Generated */\n\n")
703*7c568831SAndroid Build Coastguard Worker    wrapper = open("libxml2-py.c", "w")
704*7c568831SAndroid Build Coastguard Worker    wrapper.write("/* Generated */\n\n")
705*7c568831SAndroid Build Coastguard Worker    wrapper.write("#define PY_SSIZE_T_CLEAN\n")
706*7c568831SAndroid Build Coastguard Worker    wrapper.write("#include <Python.h>\n")
707*7c568831SAndroid Build Coastguard Worker    wrapper.write("#include <libxml/xmlversion.h>\n")
708*7c568831SAndroid Build Coastguard Worker    wrapper.write("#include <libxml/tree.h>\n")
709*7c568831SAndroid Build Coastguard Worker    wrapper.write("#include <libxml/xmlschemastypes.h>\n")
710*7c568831SAndroid Build Coastguard Worker    wrapper.write("#include \"libxml_wrap.h\"\n")
711*7c568831SAndroid Build Coastguard Worker    wrapper.write("#include \"libxml2-py.h\"\n\n")
712*7c568831SAndroid Build Coastguard Worker    for function in sorted(functions.keys()):
713*7c568831SAndroid Build Coastguard Worker        ret = print_function_wrapper(function, wrapper, export, include)
714*7c568831SAndroid Build Coastguard Worker        if ret < 0:
715*7c568831SAndroid Build Coastguard Worker            failed = failed + 1
716*7c568831SAndroid Build Coastguard Worker            del functions[function]
717*7c568831SAndroid Build Coastguard Worker        if ret == 0:
718*7c568831SAndroid Build Coastguard Worker            skipped = skipped + 1
719*7c568831SAndroid Build Coastguard Worker            del functions[function]
720*7c568831SAndroid Build Coastguard Worker        if ret == 1:
721*7c568831SAndroid Build Coastguard Worker            nb_wrap = nb_wrap + 1
722*7c568831SAndroid Build Coastguard Worker    include.close()
723*7c568831SAndroid Build Coastguard Worker    export.close()
724*7c568831SAndroid Build Coastguard Worker    wrapper.close()
725*7c568831SAndroid Build Coastguard Worker
726*7c568831SAndroid Build Coastguard Worker    print("Generated %d wrapper functions, %d failed, %d skipped" % (nb_wrap,
727*7c568831SAndroid Build Coastguard Worker                                                              failed, skipped))
728*7c568831SAndroid Build Coastguard Worker#    print("Missing type converters: ")
729*7c568831SAndroid Build Coastguard Worker#    for type in list(unknown_types.keys()):
730*7c568831SAndroid Build Coastguard Worker#        print("%s:%d " % (type, len(unknown_types[type])))
731*7c568831SAndroid Build Coastguard Worker#    print()
732*7c568831SAndroid Build Coastguard Worker
733*7c568831SAndroid Build Coastguard Worker#######################################################################
734*7c568831SAndroid Build Coastguard Worker#
735*7c568831SAndroid Build Coastguard Worker#  This part writes part of the Python front-end classes based on
736*7c568831SAndroid Build Coastguard Worker#  mapping rules between types and classes and also based on function
737*7c568831SAndroid Build Coastguard Worker#  renaming to get consistent function names at the Python level
738*7c568831SAndroid Build Coastguard Worker#
739*7c568831SAndroid Build Coastguard Worker#######################################################################
740*7c568831SAndroid Build Coastguard Worker
741*7c568831SAndroid Build Coastguard Worker#
742*7c568831SAndroid Build Coastguard Worker# The type automatically remapped to generated classes
743*7c568831SAndroid Build Coastguard Worker#
744*7c568831SAndroid Build Coastguard Workerclasses_type = {
745*7c568831SAndroid Build Coastguard Worker    "xmlNodePtr": ("._o", "xmlNode(_obj=%s)", "xmlNode"),
746*7c568831SAndroid Build Coastguard Worker    "xmlNode *": ("._o", "xmlNode(_obj=%s)", "xmlNode"),
747*7c568831SAndroid Build Coastguard Worker    "xmlDocPtr": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
748*7c568831SAndroid Build Coastguard Worker    "xmlDoc *": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
749*7c568831SAndroid Build Coastguard Worker    "htmlDocPtr": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
750*7c568831SAndroid Build Coastguard Worker    "htmlxmlDocPtr *": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
751*7c568831SAndroid Build Coastguard Worker    "xmlAttrPtr": ("._o", "xmlAttr(_obj=%s)", "xmlAttr"),
752*7c568831SAndroid Build Coastguard Worker    "xmlAttr *": ("._o", "xmlAttr(_obj=%s)", "xmlAttr"),
753*7c568831SAndroid Build Coastguard Worker    "xmlNsPtr": ("._o", "xmlNs(_obj=%s)", "xmlNs"),
754*7c568831SAndroid Build Coastguard Worker    "xmlNs *": ("._o", "xmlNs(_obj=%s)", "xmlNs"),
755*7c568831SAndroid Build Coastguard Worker    "xmlDtdPtr": ("._o", "xmlDtd(_obj=%s)", "xmlDtd"),
756*7c568831SAndroid Build Coastguard Worker    "xmlDtd *": ("._o", "xmlDtd(_obj=%s)", "xmlDtd"),
757*7c568831SAndroid Build Coastguard Worker    "xmlEntityPtr": ("._o", "xmlEntity(_obj=%s)", "xmlEntity"),
758*7c568831SAndroid Build Coastguard Worker    "xmlEntity *": ("._o", "xmlEntity(_obj=%s)", "xmlEntity"),
759*7c568831SAndroid Build Coastguard Worker    "xmlElementPtr": ("._o", "xmlElement(_obj=%s)", "xmlElement"),
760*7c568831SAndroid Build Coastguard Worker    "xmlElement *": ("._o", "xmlElement(_obj=%s)", "xmlElement"),
761*7c568831SAndroid Build Coastguard Worker    "xmlAttributePtr": ("._o", "xmlAttribute(_obj=%s)", "xmlAttribute"),
762*7c568831SAndroid Build Coastguard Worker    "xmlAttribute *": ("._o", "xmlAttribute(_obj=%s)", "xmlAttribute"),
763*7c568831SAndroid Build Coastguard Worker    "xmlXPathContextPtr": ("._o", "xpathContext(_obj=%s)", "xpathContext"),
764*7c568831SAndroid Build Coastguard Worker    "xmlXPathContext *": ("._o", "xpathContext(_obj=%s)", "xpathContext"),
765*7c568831SAndroid Build Coastguard Worker    "xmlXPathParserContext *": ("._o", "xpathParserContext(_obj=%s)", "xpathParserContext"),
766*7c568831SAndroid Build Coastguard Worker    "xmlXPathParserContextPtr": ("._o", "xpathParserContext(_obj=%s)", "xpathParserContext"),
767*7c568831SAndroid Build Coastguard Worker    "xmlParserCtxtPtr": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
768*7c568831SAndroid Build Coastguard Worker    "xmlParserCtxt *": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
769*7c568831SAndroid Build Coastguard Worker    "htmlParserCtxtPtr": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
770*7c568831SAndroid Build Coastguard Worker    "htmlParserCtxt *": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
771*7c568831SAndroid Build Coastguard Worker    "xmlValidCtxtPtr": ("._o", "ValidCtxt(_obj=%s)", "ValidCtxt"),
772*7c568831SAndroid Build Coastguard Worker    "xmlCatalogPtr": ("._o", "catalog(_obj=%s)", "catalog"),
773*7c568831SAndroid Build Coastguard Worker    "xmlURIPtr": ("._o", "URI(_obj=%s)", "URI"),
774*7c568831SAndroid Build Coastguard Worker    "const xmlError *": ("._o", "Error(_obj=%s)", "Error"),
775*7c568831SAndroid Build Coastguard Worker    "xmlErrorPtr": ("._o", "Error(_obj=%s)", "Error"),
776*7c568831SAndroid Build Coastguard Worker    "xmlOutputBufferPtr": ("._o", "outputBuffer(_obj=%s)", "outputBuffer"),
777*7c568831SAndroid Build Coastguard Worker    "xmlParserInputBufferPtr": ("._o", "inputBuffer(_obj=%s)", "inputBuffer"),
778*7c568831SAndroid Build Coastguard Worker    "xmlRegexpPtr": ("._o", "xmlReg(_obj=%s)", "xmlReg"),
779*7c568831SAndroid Build Coastguard Worker    "xmlTextReaderLocatorPtr": ("._o", "xmlTextReaderLocator(_obj=%s)", "xmlTextReaderLocator"),
780*7c568831SAndroid Build Coastguard Worker    "xmlTextReaderPtr": ("._o", "xmlTextReader(_obj=%s)", "xmlTextReader"),
781*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGPtr': ('._o', "relaxNgSchema(_obj=%s)", "relaxNgSchema"),
782*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGParserCtxtPtr': ('._o', "relaxNgParserCtxt(_obj=%s)", "relaxNgParserCtxt"),
783*7c568831SAndroid Build Coastguard Worker    'xmlRelaxNGValidCtxtPtr': ('._o', "relaxNgValidCtxt(_obj=%s)", "relaxNgValidCtxt"),
784*7c568831SAndroid Build Coastguard Worker    'xmlSchemaPtr': ("._o", "Schema(_obj=%s)", "Schema"),
785*7c568831SAndroid Build Coastguard Worker    'xmlSchemaParserCtxtPtr': ("._o", "SchemaParserCtxt(_obj=%s)", "SchemaParserCtxt"),
786*7c568831SAndroid Build Coastguard Worker    'xmlSchemaValidCtxtPtr': ("._o", "SchemaValidCtxt(_obj=%s)", "SchemaValidCtxt"),
787*7c568831SAndroid Build Coastguard Worker}
788*7c568831SAndroid Build Coastguard Worker
789*7c568831SAndroid Build Coastguard Workerconverter_type = {
790*7c568831SAndroid Build Coastguard Worker    "xmlXPathObjectPtr": "xpathObjectRet(%s)",
791*7c568831SAndroid Build Coastguard Worker}
792*7c568831SAndroid Build Coastguard Worker
793*7c568831SAndroid Build Coastguard Workerprimary_classes = ["xmlNode", "xmlDoc"]
794*7c568831SAndroid Build Coastguard Worker
795*7c568831SAndroid Build Coastguard Workerclasses_ancestor = {
796*7c568831SAndroid Build Coastguard Worker    "xmlNode" : "xmlCore",
797*7c568831SAndroid Build Coastguard Worker    "xmlDtd" : "xmlNode",
798*7c568831SAndroid Build Coastguard Worker    "xmlDoc" : "xmlNode",
799*7c568831SAndroid Build Coastguard Worker    "xmlAttr" : "xmlNode",
800*7c568831SAndroid Build Coastguard Worker    "xmlNs" : "xmlNode",
801*7c568831SAndroid Build Coastguard Worker    "xmlEntity" : "xmlNode",
802*7c568831SAndroid Build Coastguard Worker    "xmlElement" : "xmlNode",
803*7c568831SAndroid Build Coastguard Worker    "xmlAttribute" : "xmlNode",
804*7c568831SAndroid Build Coastguard Worker    "outputBuffer": "ioWriteWrapper",
805*7c568831SAndroid Build Coastguard Worker    "inputBuffer": "ioReadWrapper",
806*7c568831SAndroid Build Coastguard Worker    "parserCtxt": "parserCtxtCore",
807*7c568831SAndroid Build Coastguard Worker    "xmlTextReader": "xmlTextReaderCore",
808*7c568831SAndroid Build Coastguard Worker    "ValidCtxt": "ValidCtxtCore",
809*7c568831SAndroid Build Coastguard Worker    "SchemaValidCtxt": "SchemaValidCtxtCore",
810*7c568831SAndroid Build Coastguard Worker    "relaxNgValidCtxt": "relaxNgValidCtxtCore",
811*7c568831SAndroid Build Coastguard Worker}
812*7c568831SAndroid Build Coastguard Workerclasses_destructors = {
813*7c568831SAndroid Build Coastguard Worker    "parserCtxt": "xmlFreeParserCtxt",
814*7c568831SAndroid Build Coastguard Worker    "catalog": "xmlFreeCatalog",
815*7c568831SAndroid Build Coastguard Worker    "URI": "xmlFreeURI",
816*7c568831SAndroid Build Coastguard Worker#    "outputBuffer": "xmlOutputBufferClose",
817*7c568831SAndroid Build Coastguard Worker    "inputBuffer": "xmlFreeParserInputBuffer",
818*7c568831SAndroid Build Coastguard Worker    "xmlReg": "xmlRegFreeRegexp",
819*7c568831SAndroid Build Coastguard Worker    "xmlTextReader": "xmlFreeTextReader",
820*7c568831SAndroid Build Coastguard Worker    "relaxNgSchema": "xmlRelaxNGFree",
821*7c568831SAndroid Build Coastguard Worker    "relaxNgParserCtxt": "xmlRelaxNGFreeParserCtxt",
822*7c568831SAndroid Build Coastguard Worker    "relaxNgValidCtxt": "xmlRelaxNGFreeValidCtxt",
823*7c568831SAndroid Build Coastguard Worker        "Schema": "xmlSchemaFree",
824*7c568831SAndroid Build Coastguard Worker        "SchemaParserCtxt": "xmlSchemaFreeParserCtxt",
825*7c568831SAndroid Build Coastguard Worker        "SchemaValidCtxt": "xmlSchemaFreeValidCtxt",
826*7c568831SAndroid Build Coastguard Worker        "ValidCtxt": "xmlFreeValidCtxt",
827*7c568831SAndroid Build Coastguard Worker}
828*7c568831SAndroid Build Coastguard Worker
829*7c568831SAndroid Build Coastguard Workerfunctions_noexcept = {
830*7c568831SAndroid Build Coastguard Worker    "xmlHasProp": 1,
831*7c568831SAndroid Build Coastguard Worker    "xmlHasNsProp": 1,
832*7c568831SAndroid Build Coastguard Worker    "xmlDocSetRootElement": 1,
833*7c568831SAndroid Build Coastguard Worker    "xmlNodeGetNs": 1,
834*7c568831SAndroid Build Coastguard Worker    "xmlNodeGetNsDefs": 1,
835*7c568831SAndroid Build Coastguard Worker    "xmlNextElementSibling": 1,
836*7c568831SAndroid Build Coastguard Worker    "xmlPreviousElementSibling": 1,
837*7c568831SAndroid Build Coastguard Worker    "xmlFirstElementChild": 1,
838*7c568831SAndroid Build Coastguard Worker    "xmlLastElementChild": 1,
839*7c568831SAndroid Build Coastguard Worker}
840*7c568831SAndroid Build Coastguard Worker
841*7c568831SAndroid Build Coastguard Workerreference_keepers = {
842*7c568831SAndroid Build Coastguard Worker    "xmlTextReader": [('inputBuffer', 'input')],
843*7c568831SAndroid Build Coastguard Worker    "relaxNgValidCtxt": [('relaxNgSchema', 'schema')],
844*7c568831SAndroid Build Coastguard Worker        "SchemaValidCtxt": [('Schema', 'schema')],
845*7c568831SAndroid Build Coastguard Worker}
846*7c568831SAndroid Build Coastguard Worker
847*7c568831SAndroid Build Coastguard Workerfunction_classes = {}
848*7c568831SAndroid Build Coastguard Worker
849*7c568831SAndroid Build Coastguard Workerfunction_classes["None"] = []
850*7c568831SAndroid Build Coastguard Worker
851*7c568831SAndroid Build Coastguard Workerdef nameFixup(name, classe, type, file):
852*7c568831SAndroid Build Coastguard Worker    listname = classe + "List"
853*7c568831SAndroid Build Coastguard Worker    ll = len(listname)
854*7c568831SAndroid Build Coastguard Worker    l = len(classe)
855*7c568831SAndroid Build Coastguard Worker    if name[0:l] == listname:
856*7c568831SAndroid Build Coastguard Worker        func = name[l:]
857*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
858*7c568831SAndroid Build Coastguard Worker    elif name[0:12] == "xmlParserGet" and file == "python_accessor":
859*7c568831SAndroid Build Coastguard Worker        func = name[12:]
860*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
861*7c568831SAndroid Build Coastguard Worker    elif name[0:12] == "xmlParserSet" and file == "python_accessor":
862*7c568831SAndroid Build Coastguard Worker        func = name[12:]
863*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
864*7c568831SAndroid Build Coastguard Worker    elif name[0:10] == "xmlNodeGet" and file == "python_accessor":
865*7c568831SAndroid Build Coastguard Worker        func = name[10:]
866*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
867*7c568831SAndroid Build Coastguard Worker    elif name[0:9] == "xmlURIGet" and file == "python_accessor":
868*7c568831SAndroid Build Coastguard Worker        func = name[9:]
869*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
870*7c568831SAndroid Build Coastguard Worker    elif name[0:9] == "xmlURISet" and file == "python_accessor":
871*7c568831SAndroid Build Coastguard Worker        func = name[6:]
872*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
873*7c568831SAndroid Build Coastguard Worker    elif name[0:11] == "xmlErrorGet" and file == "python_accessor":
874*7c568831SAndroid Build Coastguard Worker        func = name[11:]
875*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
876*7c568831SAndroid Build Coastguard Worker    elif name[0:17] == "xmlXPathParserGet" and file == "python_accessor":
877*7c568831SAndroid Build Coastguard Worker        func = name[17:]
878*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
879*7c568831SAndroid Build Coastguard Worker    elif name[0:11] == "xmlXPathGet" and file == "python_accessor":
880*7c568831SAndroid Build Coastguard Worker        func = name[11:]
881*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
882*7c568831SAndroid Build Coastguard Worker    elif name[0:11] == "xmlXPathSet" and file == "python_accessor":
883*7c568831SAndroid Build Coastguard Worker        func = name[8:]
884*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
885*7c568831SAndroid Build Coastguard Worker    elif name[0:15] == "xmlOutputBuffer" and file != "python":
886*7c568831SAndroid Build Coastguard Worker        func = name[15:]
887*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
888*7c568831SAndroid Build Coastguard Worker    elif name[0:20] == "xmlParserInputBuffer" and file != "python":
889*7c568831SAndroid Build Coastguard Worker        func = name[20:]
890*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
891*7c568831SAndroid Build Coastguard Worker    elif name[0:9] == "xmlRegexp" and file == "xmlregexp":
892*7c568831SAndroid Build Coastguard Worker        func = "regexp" + name[9:]
893*7c568831SAndroid Build Coastguard Worker    elif name[0:6] == "xmlReg" and file == "xmlregexp":
894*7c568831SAndroid Build Coastguard Worker        func = "regexp" + name[6:]
895*7c568831SAndroid Build Coastguard Worker    elif name[0:20] == "xmlTextReaderLocator" and file == "xmlreader":
896*7c568831SAndroid Build Coastguard Worker        func = name[20:]
897*7c568831SAndroid Build Coastguard Worker    elif name[0:18] == "xmlTextReaderConst" and file == "xmlreader":
898*7c568831SAndroid Build Coastguard Worker        func = name[18:]
899*7c568831SAndroid Build Coastguard Worker    elif name[0:13] == "xmlTextReader" and file == "xmlreader":
900*7c568831SAndroid Build Coastguard Worker        func = name[13:]
901*7c568831SAndroid Build Coastguard Worker    elif name[0:12] == "xmlReaderNew" and file == "xmlreader":
902*7c568831SAndroid Build Coastguard Worker        func = name[9:]
903*7c568831SAndroid Build Coastguard Worker    elif name[0:11] == "xmlACatalog":
904*7c568831SAndroid Build Coastguard Worker        func = name[11:]
905*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
906*7c568831SAndroid Build Coastguard Worker    elif name[0:l] == classe:
907*7c568831SAndroid Build Coastguard Worker        func = name[l:]
908*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
909*7c568831SAndroid Build Coastguard Worker    elif name[0:7] == "libxml_":
910*7c568831SAndroid Build Coastguard Worker        func = name[7:]
911*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
912*7c568831SAndroid Build Coastguard Worker    elif name[0:6] == "xmlGet":
913*7c568831SAndroid Build Coastguard Worker        func = name[6:]
914*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
915*7c568831SAndroid Build Coastguard Worker    elif name[0:3] == "xml":
916*7c568831SAndroid Build Coastguard Worker        func = name[3:]
917*7c568831SAndroid Build Coastguard Worker        func = func[0:1].lower() + func[1:]
918*7c568831SAndroid Build Coastguard Worker    else:
919*7c568831SAndroid Build Coastguard Worker        func = name
920*7c568831SAndroid Build Coastguard Worker    if func[0:5] == "xPath":
921*7c568831SAndroid Build Coastguard Worker        func = "xpath" + func[5:]
922*7c568831SAndroid Build Coastguard Worker    elif func[0:4] == "xPtr":
923*7c568831SAndroid Build Coastguard Worker        func = "xpointer" + func[4:]
924*7c568831SAndroid Build Coastguard Worker    elif func[0:8] == "xInclude":
925*7c568831SAndroid Build Coastguard Worker        func = "xinclude" + func[8:]
926*7c568831SAndroid Build Coastguard Worker    elif func[0:2] == "iD":
927*7c568831SAndroid Build Coastguard Worker        func = "ID" + func[2:]
928*7c568831SAndroid Build Coastguard Worker    elif func[0:3] == "uRI":
929*7c568831SAndroid Build Coastguard Worker        func = "URI" + func[3:]
930*7c568831SAndroid Build Coastguard Worker    elif func[0:4] == "uTF8":
931*7c568831SAndroid Build Coastguard Worker        func = "UTF8" + func[4:]
932*7c568831SAndroid Build Coastguard Worker    elif func[0:3] == 'sAX':
933*7c568831SAndroid Build Coastguard Worker        func = "SAX" + func[3:]
934*7c568831SAndroid Build Coastguard Worker    return func
935*7c568831SAndroid Build Coastguard Worker
936*7c568831SAndroid Build Coastguard Worker
937*7c568831SAndroid Build Coastguard Workerdef functionCompare(info1, info2):
938*7c568831SAndroid Build Coastguard Worker    (index1, func1, name1, ret1, args1, file1) = info1
939*7c568831SAndroid Build Coastguard Worker    (index2, func2, name2, ret2, args2, file2) = info2
940*7c568831SAndroid Build Coastguard Worker    if file1 == file2:
941*7c568831SAndroid Build Coastguard Worker        if func1 < func2:
942*7c568831SAndroid Build Coastguard Worker            return -1
943*7c568831SAndroid Build Coastguard Worker        if func1 > func2:
944*7c568831SAndroid Build Coastguard Worker            return 1
945*7c568831SAndroid Build Coastguard Worker    if file1 == "python_accessor":
946*7c568831SAndroid Build Coastguard Worker        return -1
947*7c568831SAndroid Build Coastguard Worker    if file2 == "python_accessor":
948*7c568831SAndroid Build Coastguard Worker        return 1
949*7c568831SAndroid Build Coastguard Worker    if file1 < file2:
950*7c568831SAndroid Build Coastguard Worker        return -1
951*7c568831SAndroid Build Coastguard Worker    if file1 > file2:
952*7c568831SAndroid Build Coastguard Worker        return 1
953*7c568831SAndroid Build Coastguard Worker    return 0
954*7c568831SAndroid Build Coastguard Worker
955*7c568831SAndroid Build Coastguard Workerdef cmp_to_key(mycmp):
956*7c568831SAndroid Build Coastguard Worker    'Convert a cmp= function into a key= function'
957*7c568831SAndroid Build Coastguard Worker    class K(object):
958*7c568831SAndroid Build Coastguard Worker        def __init__(self, obj, *args):
959*7c568831SAndroid Build Coastguard Worker            self.obj = obj
960*7c568831SAndroid Build Coastguard Worker        def __lt__(self, other):
961*7c568831SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) < 0
962*7c568831SAndroid Build Coastguard Worker        def __gt__(self, other):
963*7c568831SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) > 0
964*7c568831SAndroid Build Coastguard Worker        def __eq__(self, other):
965*7c568831SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) == 0
966*7c568831SAndroid Build Coastguard Worker        def __le__(self, other):
967*7c568831SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) <= 0
968*7c568831SAndroid Build Coastguard Worker        def __ge__(self, other):
969*7c568831SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) >= 0
970*7c568831SAndroid Build Coastguard Worker        def __ne__(self, other):
971*7c568831SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) != 0
972*7c568831SAndroid Build Coastguard Worker    return K
973*7c568831SAndroid Build Coastguard Workerdef writeDoc(name, args, indent, output):
974*7c568831SAndroid Build Coastguard Worker     if functions[name][0] is None or functions[name][0] == "":
975*7c568831SAndroid Build Coastguard Worker         return
976*7c568831SAndroid Build Coastguard Worker     val = functions[name][0]
977*7c568831SAndroid Build Coastguard Worker     val = val.replace("NULL", "None")
978*7c568831SAndroid Build Coastguard Worker     output.write(indent)
979*7c568831SAndroid Build Coastguard Worker     output.write('"""')
980*7c568831SAndroid Build Coastguard Worker     while len(val) > 60:
981*7c568831SAndroid Build Coastguard Worker         if val[0] == " ":
982*7c568831SAndroid Build Coastguard Worker             val = val[1:]
983*7c568831SAndroid Build Coastguard Worker             continue
984*7c568831SAndroid Build Coastguard Worker         str = val[0:60]
985*7c568831SAndroid Build Coastguard Worker         i = str.rfind(" ")
986*7c568831SAndroid Build Coastguard Worker         if i < 0:
987*7c568831SAndroid Build Coastguard Worker             i = 60
988*7c568831SAndroid Build Coastguard Worker         str = val[0:i]
989*7c568831SAndroid Build Coastguard Worker         val = val[i:]
990*7c568831SAndroid Build Coastguard Worker         output.write(str)
991*7c568831SAndroid Build Coastguard Worker         output.write('\n  ')
992*7c568831SAndroid Build Coastguard Worker         output.write(indent)
993*7c568831SAndroid Build Coastguard Worker     output.write(val)
994*7c568831SAndroid Build Coastguard Worker     output.write(' """\n')
995*7c568831SAndroid Build Coastguard Worker
996*7c568831SAndroid Build Coastguard Workerdef buildWrappers():
997*7c568831SAndroid Build Coastguard Worker    global ctypes
998*7c568831SAndroid Build Coastguard Worker    global py_types
999*7c568831SAndroid Build Coastguard Worker    global py_return_types
1000*7c568831SAndroid Build Coastguard Worker    global unknown_types
1001*7c568831SAndroid Build Coastguard Worker    global functions
1002*7c568831SAndroid Build Coastguard Worker    global function_classes
1003*7c568831SAndroid Build Coastguard Worker    global classes_type
1004*7c568831SAndroid Build Coastguard Worker    global classes_list
1005*7c568831SAndroid Build Coastguard Worker    global converter_type
1006*7c568831SAndroid Build Coastguard Worker    global primary_classes
1007*7c568831SAndroid Build Coastguard Worker    global converter_type
1008*7c568831SAndroid Build Coastguard Worker    global classes_ancestor
1009*7c568831SAndroid Build Coastguard Worker    global converter_type
1010*7c568831SAndroid Build Coastguard Worker    global primary_classes
1011*7c568831SAndroid Build Coastguard Worker    global classes_ancestor
1012*7c568831SAndroid Build Coastguard Worker    global classes_destructors
1013*7c568831SAndroid Build Coastguard Worker    global functions_noexcept
1014*7c568831SAndroid Build Coastguard Worker
1015*7c568831SAndroid Build Coastguard Worker    for type in classes_type.keys():
1016*7c568831SAndroid Build Coastguard Worker        function_classes[classes_type[type][2]] = []
1017*7c568831SAndroid Build Coastguard Worker
1018*7c568831SAndroid Build Coastguard Worker    #
1019*7c568831SAndroid Build Coastguard Worker    # Build the list of C types to look for ordered to start
1020*7c568831SAndroid Build Coastguard Worker    # with primary classes
1021*7c568831SAndroid Build Coastguard Worker    #
1022*7c568831SAndroid Build Coastguard Worker    ctypes = []
1023*7c568831SAndroid Build Coastguard Worker    classes_list = []
1024*7c568831SAndroid Build Coastguard Worker    ctypes_processed = {}
1025*7c568831SAndroid Build Coastguard Worker    classes_processed = {}
1026*7c568831SAndroid Build Coastguard Worker    for classe in primary_classes:
1027*7c568831SAndroid Build Coastguard Worker        classes_list.append(classe)
1028*7c568831SAndroid Build Coastguard Worker        classes_processed[classe] = ()
1029*7c568831SAndroid Build Coastguard Worker        for type in classes_type.keys():
1030*7c568831SAndroid Build Coastguard Worker            tinfo = classes_type[type]
1031*7c568831SAndroid Build Coastguard Worker            if tinfo[2] == classe:
1032*7c568831SAndroid Build Coastguard Worker                ctypes.append(type)
1033*7c568831SAndroid Build Coastguard Worker                ctypes_processed[type] = ()
1034*7c568831SAndroid Build Coastguard Worker    for type in sorted(classes_type.keys()):
1035*7c568831SAndroid Build Coastguard Worker        if type in ctypes_processed:
1036*7c568831SAndroid Build Coastguard Worker            continue
1037*7c568831SAndroid Build Coastguard Worker        tinfo = classes_type[type]
1038*7c568831SAndroid Build Coastguard Worker        if tinfo[2] not in classes_processed:
1039*7c568831SAndroid Build Coastguard Worker            classes_list.append(tinfo[2])
1040*7c568831SAndroid Build Coastguard Worker            classes_processed[tinfo[2]] = ()
1041*7c568831SAndroid Build Coastguard Worker
1042*7c568831SAndroid Build Coastguard Worker        ctypes.append(type)
1043*7c568831SAndroid Build Coastguard Worker        ctypes_processed[type] = ()
1044*7c568831SAndroid Build Coastguard Worker
1045*7c568831SAndroid Build Coastguard Worker    for name in functions.keys():
1046*7c568831SAndroid Build Coastguard Worker        found = 0
1047*7c568831SAndroid Build Coastguard Worker        (desc, ret, args, file, cond) = functions[name]
1048*7c568831SAndroid Build Coastguard Worker        for type in ctypes:
1049*7c568831SAndroid Build Coastguard Worker            classe = classes_type[type][2]
1050*7c568831SAndroid Build Coastguard Worker
1051*7c568831SAndroid Build Coastguard Worker            if name[0:3] == "xml" and len(args) >= 1 and args[0][1] == type:
1052*7c568831SAndroid Build Coastguard Worker                found = 1
1053*7c568831SAndroid Build Coastguard Worker                func = nameFixup(name, classe, type, file)
1054*7c568831SAndroid Build Coastguard Worker                info = (0, func, name, ret, args, file)
1055*7c568831SAndroid Build Coastguard Worker                function_classes[classe].append(info)
1056*7c568831SAndroid Build Coastguard Worker            elif name[0:3] == "xml" and len(args) >= 2 and args[1][1] == type \
1057*7c568831SAndroid Build Coastguard Worker                and file != "python_accessor":
1058*7c568831SAndroid Build Coastguard Worker                found = 1
1059*7c568831SAndroid Build Coastguard Worker                func = nameFixup(name, classe, type, file)
1060*7c568831SAndroid Build Coastguard Worker                info = (1, func, name, ret, args, file)
1061*7c568831SAndroid Build Coastguard Worker                function_classes[classe].append(info)
1062*7c568831SAndroid Build Coastguard Worker            elif name[0:4] == "html" and len(args) >= 1 and args[0][1] == type:
1063*7c568831SAndroid Build Coastguard Worker                found = 1
1064*7c568831SAndroid Build Coastguard Worker                func = nameFixup(name, classe, type, file)
1065*7c568831SAndroid Build Coastguard Worker                info = (0, func, name, ret, args, file)
1066*7c568831SAndroid Build Coastguard Worker                function_classes[classe].append(info)
1067*7c568831SAndroid Build Coastguard Worker            elif name[0:4] == "html" and len(args) >= 2 and args[1][1] == type \
1068*7c568831SAndroid Build Coastguard Worker                and file != "python_accessor":
1069*7c568831SAndroid Build Coastguard Worker                found = 1
1070*7c568831SAndroid Build Coastguard Worker                func = nameFixup(name, classe, type, file)
1071*7c568831SAndroid Build Coastguard Worker                info = (1, func, name, ret, args, file)
1072*7c568831SAndroid Build Coastguard Worker                function_classes[classe].append(info)
1073*7c568831SAndroid Build Coastguard Worker        if found == 1:
1074*7c568831SAndroid Build Coastguard Worker            continue
1075*7c568831SAndroid Build Coastguard Worker        if name[0:8] == "xmlXPath":
1076*7c568831SAndroid Build Coastguard Worker            continue
1077*7c568831SAndroid Build Coastguard Worker        if name[0:6] == "xmlStr":
1078*7c568831SAndroid Build Coastguard Worker            continue
1079*7c568831SAndroid Build Coastguard Worker        if name[0:10] == "xmlCharStr":
1080*7c568831SAndroid Build Coastguard Worker            continue
1081*7c568831SAndroid Build Coastguard Worker        func = nameFixup(name, "None", file, file)
1082*7c568831SAndroid Build Coastguard Worker        info = (0, func, name, ret, args, file)
1083*7c568831SAndroid Build Coastguard Worker        function_classes['None'].append(info)
1084*7c568831SAndroid Build Coastguard Worker
1085*7c568831SAndroid Build Coastguard Worker    classes = open("libxml2class.py", "w")
1086*7c568831SAndroid Build Coastguard Worker    txt = open("libxml2class.txt", "w")
1087*7c568831SAndroid Build Coastguard Worker    txt.write("          Generated Classes for libxml2-python\n\n")
1088*7c568831SAndroid Build Coastguard Worker
1089*7c568831SAndroid Build Coastguard Worker    txt.write("#\n# Global functions of the module\n#\n\n")
1090*7c568831SAndroid Build Coastguard Worker    if "None" in function_classes:
1091*7c568831SAndroid Build Coastguard Worker        flist = function_classes["None"]
1092*7c568831SAndroid Build Coastguard Worker        flist = sorted(flist, key=cmp_to_key(functionCompare))
1093*7c568831SAndroid Build Coastguard Worker        oldfile = ""
1094*7c568831SAndroid Build Coastguard Worker        for info in flist:
1095*7c568831SAndroid Build Coastguard Worker            (index, func, name, ret, args, file) = info
1096*7c568831SAndroid Build Coastguard Worker            if file != oldfile:
1097*7c568831SAndroid Build Coastguard Worker                classes.write("#\n# Functions from module %s\n#\n\n" % file)
1098*7c568831SAndroid Build Coastguard Worker                txt.write("\n# functions from module %s\n" % file)
1099*7c568831SAndroid Build Coastguard Worker                oldfile = file
1100*7c568831SAndroid Build Coastguard Worker            classes.write("def %s(" % func)
1101*7c568831SAndroid Build Coastguard Worker            txt.write("%s()\n" % func)
1102*7c568831SAndroid Build Coastguard Worker            n = 0
1103*7c568831SAndroid Build Coastguard Worker            for arg in args:
1104*7c568831SAndroid Build Coastguard Worker                if n != 0:
1105*7c568831SAndroid Build Coastguard Worker                    classes.write(", ")
1106*7c568831SAndroid Build Coastguard Worker                classes.write("%s" % arg[0])
1107*7c568831SAndroid Build Coastguard Worker                n = n + 1
1108*7c568831SAndroid Build Coastguard Worker            classes.write("):\n")
1109*7c568831SAndroid Build Coastguard Worker            writeDoc(name, args, '    ', classes)
1110*7c568831SAndroid Build Coastguard Worker
1111*7c568831SAndroid Build Coastguard Worker            for arg in args:
1112*7c568831SAndroid Build Coastguard Worker                if arg[1] in classes_type:
1113*7c568831SAndroid Build Coastguard Worker                    classes.write("    if %s is None: %s__o = None\n" %
1114*7c568831SAndroid Build Coastguard Worker                                  (arg[0], arg[0]))
1115*7c568831SAndroid Build Coastguard Worker                    classes.write("    else: %s__o = %s%s\n" %
1116*7c568831SAndroid Build Coastguard Worker                                  (arg[0], arg[0], classes_type[arg[1]][0]))
1117*7c568831SAndroid Build Coastguard Worker                if arg[1] in py_types:
1118*7c568831SAndroid Build Coastguard Worker                    (f, t, n, c) = py_types[arg[1]]
1119*7c568831SAndroid Build Coastguard Worker                    if t == "File":
1120*7c568831SAndroid Build Coastguard Worker                        classes.write("    if %s is not None: %s.flush()\n" % (
1121*7c568831SAndroid Build Coastguard Worker                                      arg[0], arg[0]))
1122*7c568831SAndroid Build Coastguard Worker
1123*7c568831SAndroid Build Coastguard Worker            if ret[0] != "void":
1124*7c568831SAndroid Build Coastguard Worker                classes.write("    ret = ")
1125*7c568831SAndroid Build Coastguard Worker            else:
1126*7c568831SAndroid Build Coastguard Worker                classes.write("    ")
1127*7c568831SAndroid Build Coastguard Worker            classes.write("libxml2mod.%s(" % name)
1128*7c568831SAndroid Build Coastguard Worker            n = 0
1129*7c568831SAndroid Build Coastguard Worker            for arg in args:
1130*7c568831SAndroid Build Coastguard Worker                if n != 0:
1131*7c568831SAndroid Build Coastguard Worker                    classes.write(", ")
1132*7c568831SAndroid Build Coastguard Worker                classes.write("%s" % arg[0])
1133*7c568831SAndroid Build Coastguard Worker                if arg[1] in classes_type:
1134*7c568831SAndroid Build Coastguard Worker                    classes.write("__o")
1135*7c568831SAndroid Build Coastguard Worker                n = n + 1
1136*7c568831SAndroid Build Coastguard Worker            classes.write(")\n")
1137*7c568831SAndroid Build Coastguard Worker
1138*7c568831SAndroid Build Coastguard Worker# This may be needed to reposition the I/O, but likely to cause more harm
1139*7c568831SAndroid Build Coastguard Worker# than good. Those changes in Python3 really break the model.
1140*7c568831SAndroid Build Coastguard Worker#           for arg in args:
1141*7c568831SAndroid Build Coastguard Worker#               if arg[1] in py_types:
1142*7c568831SAndroid Build Coastguard Worker#                   (f, t, n, c) = py_types[arg[1]]
1143*7c568831SAndroid Build Coastguard Worker#                   if t == "File":
1144*7c568831SAndroid Build Coastguard Worker#                       classes.write("    if %s is not None: %s.seek(0,0)\n"%(
1145*7c568831SAndroid Build Coastguard Worker#                                     arg[0], arg[0]))
1146*7c568831SAndroid Build Coastguard Worker
1147*7c568831SAndroid Build Coastguard Worker            if ret[0] != "void":
1148*7c568831SAndroid Build Coastguard Worker                if ret[0] in classes_type:
1149*7c568831SAndroid Build Coastguard Worker                    #
1150*7c568831SAndroid Build Coastguard Worker                    # Raise an exception
1151*7c568831SAndroid Build Coastguard Worker                    #
1152*7c568831SAndroid Build Coastguard Worker                    if name in functions_noexcept:
1153*7c568831SAndroid Build Coastguard Worker                        classes.write("    if ret is None:return None\n")
1154*7c568831SAndroid Build Coastguard Worker                    elif name.find("URI") >= 0:
1155*7c568831SAndroid Build Coastguard Worker                        classes.write(
1156*7c568831SAndroid Build Coastguard Worker                        "    if ret is None:raise uriError('%s() failed')\n"
1157*7c568831SAndroid Build Coastguard Worker                                      % (name))
1158*7c568831SAndroid Build Coastguard Worker                    elif name.find("XPath") >= 0:
1159*7c568831SAndroid Build Coastguard Worker                        classes.write(
1160*7c568831SAndroid Build Coastguard Worker                        "    if ret is None:raise xpathError('%s() failed')\n"
1161*7c568831SAndroid Build Coastguard Worker                                      % (name))
1162*7c568831SAndroid Build Coastguard Worker                    elif name.find("Parse") >= 0:
1163*7c568831SAndroid Build Coastguard Worker                        classes.write(
1164*7c568831SAndroid Build Coastguard Worker                        "    if ret is None:raise parserError('%s() failed')\n"
1165*7c568831SAndroid Build Coastguard Worker                                      % (name))
1166*7c568831SAndroid Build Coastguard Worker                    else:
1167*7c568831SAndroid Build Coastguard Worker                        classes.write(
1168*7c568831SAndroid Build Coastguard Worker                        "    if ret is None:raise treeError('%s() failed')\n"
1169*7c568831SAndroid Build Coastguard Worker                                      % (name))
1170*7c568831SAndroid Build Coastguard Worker                    classes.write("    return ")
1171*7c568831SAndroid Build Coastguard Worker                    classes.write(classes_type[ret[0]][1] % ("ret"))
1172*7c568831SAndroid Build Coastguard Worker                    classes.write("\n")
1173*7c568831SAndroid Build Coastguard Worker                else:
1174*7c568831SAndroid Build Coastguard Worker                    classes.write("    return ret\n")
1175*7c568831SAndroid Build Coastguard Worker            classes.write("\n")
1176*7c568831SAndroid Build Coastguard Worker
1177*7c568831SAndroid Build Coastguard Worker    txt.write("\n\n#\n# Set of classes of the module\n#\n\n")
1178*7c568831SAndroid Build Coastguard Worker    for classname in classes_list:
1179*7c568831SAndroid Build Coastguard Worker        if classname == "None":
1180*7c568831SAndroid Build Coastguard Worker            pass
1181*7c568831SAndroid Build Coastguard Worker        else:
1182*7c568831SAndroid Build Coastguard Worker            if classname in classes_ancestor:
1183*7c568831SAndroid Build Coastguard Worker                txt.write("\n\nClass %s(%s)\n" % (classname,
1184*7c568831SAndroid Build Coastguard Worker                          classes_ancestor[classname]))
1185*7c568831SAndroid Build Coastguard Worker                classes.write("class %s(%s):\n" % (classname,
1186*7c568831SAndroid Build Coastguard Worker                              classes_ancestor[classname]))
1187*7c568831SAndroid Build Coastguard Worker                classes.write("    def __init__(self, _obj=None):\n")
1188*7c568831SAndroid Build Coastguard Worker                if classes_ancestor[classname] == "xmlCore" or \
1189*7c568831SAndroid Build Coastguard Worker                   classes_ancestor[classname] == "xmlNode":
1190*7c568831SAndroid Build Coastguard Worker                    classes.write("        if checkWrapper(_obj) != 0:")
1191*7c568831SAndroid Build Coastguard Worker                    classes.write("            raise TypeError")
1192*7c568831SAndroid Build Coastguard Worker                    classes.write("('%s got a wrong wrapper object type')\n" % \
1193*7c568831SAndroid Build Coastguard Worker                                classname)
1194*7c568831SAndroid Build Coastguard Worker                if classname in reference_keepers:
1195*7c568831SAndroid Build Coastguard Worker                    rlist = reference_keepers[classname]
1196*7c568831SAndroid Build Coastguard Worker                    for ref in rlist:
1197*7c568831SAndroid Build Coastguard Worker                        classes.write("        self.%s = None\n" % ref[1])
1198*7c568831SAndroid Build Coastguard Worker                classes.write("        self._o = _obj\n")
1199*7c568831SAndroid Build Coastguard Worker                classes.write("        %s.__init__(self, _obj=_obj)\n\n" % (
1200*7c568831SAndroid Build Coastguard Worker                              classes_ancestor[classname]))
1201*7c568831SAndroid Build Coastguard Worker                if classes_ancestor[classname] == "xmlCore" or \
1202*7c568831SAndroid Build Coastguard Worker                   classes_ancestor[classname] == "xmlNode":
1203*7c568831SAndroid Build Coastguard Worker                    classes.write("    def __repr__(self):\n")
1204*7c568831SAndroid Build Coastguard Worker                    format = "<%s (%%s) object at 0x%%x>" % (classname)
1205*7c568831SAndroid Build Coastguard Worker                    classes.write("        return \"%s\" %% (self.name, int(pos_id (self)))\n\n" % (
1206*7c568831SAndroid Build Coastguard Worker                                  format))
1207*7c568831SAndroid Build Coastguard Worker            else:
1208*7c568831SAndroid Build Coastguard Worker                txt.write("Class %s()\n" % (classname))
1209*7c568831SAndroid Build Coastguard Worker                classes.write("class %s:\n" % (classname))
1210*7c568831SAndroid Build Coastguard Worker                classes.write("    def __init__(self, _obj=None):\n")
1211*7c568831SAndroid Build Coastguard Worker                if classname in reference_keepers:
1212*7c568831SAndroid Build Coastguard Worker                    list = reference_keepers[classname]
1213*7c568831SAndroid Build Coastguard Worker                    for ref in list:
1214*7c568831SAndroid Build Coastguard Worker                        classes.write("        self.%s = None\n" % ref[1])
1215*7c568831SAndroid Build Coastguard Worker                classes.write("        if _obj != None:self._o = _obj;return\n")
1216*7c568831SAndroid Build Coastguard Worker                classes.write("        self._o = None\n\n")
1217*7c568831SAndroid Build Coastguard Worker            destruct=None
1218*7c568831SAndroid Build Coastguard Worker            if classname in classes_destructors:
1219*7c568831SAndroid Build Coastguard Worker                classes.write("    def __del__(self):\n")
1220*7c568831SAndroid Build Coastguard Worker                classes.write("        if self._o != None:\n")
1221*7c568831SAndroid Build Coastguard Worker                classes.write("            libxml2mod.%s(self._o)\n" %
1222*7c568831SAndroid Build Coastguard Worker                              classes_destructors[classname])
1223*7c568831SAndroid Build Coastguard Worker                classes.write("        self._o = None\n\n")
1224*7c568831SAndroid Build Coastguard Worker                destruct=classes_destructors[classname]
1225*7c568831SAndroid Build Coastguard Worker            flist = function_classes[classname]
1226*7c568831SAndroid Build Coastguard Worker            flist = sorted(flist, key=cmp_to_key(functionCompare))
1227*7c568831SAndroid Build Coastguard Worker            oldfile = ""
1228*7c568831SAndroid Build Coastguard Worker            for info in flist:
1229*7c568831SAndroid Build Coastguard Worker                (index, func, name, ret, args, file) = info
1230*7c568831SAndroid Build Coastguard Worker                #
1231*7c568831SAndroid Build Coastguard Worker                # Do not provide as method the destructors for the class
1232*7c568831SAndroid Build Coastguard Worker                # to avoid double free
1233*7c568831SAndroid Build Coastguard Worker                #
1234*7c568831SAndroid Build Coastguard Worker                if name == destruct:
1235*7c568831SAndroid Build Coastguard Worker                    continue
1236*7c568831SAndroid Build Coastguard Worker                if file != oldfile:
1237*7c568831SAndroid Build Coastguard Worker                    if file == "python_accessor":
1238*7c568831SAndroid Build Coastguard Worker                        classes.write("    # accessors for %s\n" % (classname))
1239*7c568831SAndroid Build Coastguard Worker                        txt.write("    # accessors\n")
1240*7c568831SAndroid Build Coastguard Worker                    else:
1241*7c568831SAndroid Build Coastguard Worker                        classes.write("    #\n")
1242*7c568831SAndroid Build Coastguard Worker                        classes.write("    # %s functions from module %s\n" % (
1243*7c568831SAndroid Build Coastguard Worker                                      classname, file))
1244*7c568831SAndroid Build Coastguard Worker                        txt.write("\n    # functions from module %s\n" % file)
1245*7c568831SAndroid Build Coastguard Worker                        classes.write("    #\n\n")
1246*7c568831SAndroid Build Coastguard Worker                oldfile = file
1247*7c568831SAndroid Build Coastguard Worker                classes.write("    def %s(self" % func)
1248*7c568831SAndroid Build Coastguard Worker                txt.write("    %s()\n" % func)
1249*7c568831SAndroid Build Coastguard Worker                n = 0
1250*7c568831SAndroid Build Coastguard Worker                for arg in args:
1251*7c568831SAndroid Build Coastguard Worker                    if n != index:
1252*7c568831SAndroid Build Coastguard Worker                        classes.write(", %s" % arg[0])
1253*7c568831SAndroid Build Coastguard Worker                    n = n + 1
1254*7c568831SAndroid Build Coastguard Worker                classes.write("):\n")
1255*7c568831SAndroid Build Coastguard Worker                writeDoc(name, args, '        ', classes)
1256*7c568831SAndroid Build Coastguard Worker                n = 0
1257*7c568831SAndroid Build Coastguard Worker                for arg in args:
1258*7c568831SAndroid Build Coastguard Worker                    if arg[1] in classes_type:
1259*7c568831SAndroid Build Coastguard Worker                        if n != index:
1260*7c568831SAndroid Build Coastguard Worker                            classes.write("        if %s is None: %s__o = None\n" %
1261*7c568831SAndroid Build Coastguard Worker                                          (arg[0], arg[0]))
1262*7c568831SAndroid Build Coastguard Worker                            classes.write("        else: %s__o = %s%s\n" %
1263*7c568831SAndroid Build Coastguard Worker                                          (arg[0], arg[0], classes_type[arg[1]][0]))
1264*7c568831SAndroid Build Coastguard Worker                    n = n + 1
1265*7c568831SAndroid Build Coastguard Worker                if ret[0] != "void":
1266*7c568831SAndroid Build Coastguard Worker                    classes.write("        ret = ")
1267*7c568831SAndroid Build Coastguard Worker                else:
1268*7c568831SAndroid Build Coastguard Worker                    classes.write("        ")
1269*7c568831SAndroid Build Coastguard Worker                classes.write("libxml2mod.%s(" % name)
1270*7c568831SAndroid Build Coastguard Worker                n = 0
1271*7c568831SAndroid Build Coastguard Worker                for arg in args:
1272*7c568831SAndroid Build Coastguard Worker                    if n != 0:
1273*7c568831SAndroid Build Coastguard Worker                        classes.write(", ")
1274*7c568831SAndroid Build Coastguard Worker                    if n != index:
1275*7c568831SAndroid Build Coastguard Worker                        classes.write("%s" % arg[0])
1276*7c568831SAndroid Build Coastguard Worker                        if arg[1] in classes_type:
1277*7c568831SAndroid Build Coastguard Worker                            classes.write("__o")
1278*7c568831SAndroid Build Coastguard Worker                    else:
1279*7c568831SAndroid Build Coastguard Worker                        classes.write("self")
1280*7c568831SAndroid Build Coastguard Worker                        if arg[1] in classes_type:
1281*7c568831SAndroid Build Coastguard Worker                            classes.write(classes_type[arg[1]][0])
1282*7c568831SAndroid Build Coastguard Worker                    n = n + 1
1283*7c568831SAndroid Build Coastguard Worker                classes.write(")\n")
1284*7c568831SAndroid Build Coastguard Worker                if ret[0] != "void":
1285*7c568831SAndroid Build Coastguard Worker                    if ret[0] in classes_type:
1286*7c568831SAndroid Build Coastguard Worker                        #
1287*7c568831SAndroid Build Coastguard Worker                        # Raise an exception
1288*7c568831SAndroid Build Coastguard Worker                        #
1289*7c568831SAndroid Build Coastguard Worker                        if name in functions_noexcept:
1290*7c568831SAndroid Build Coastguard Worker                            classes.write(
1291*7c568831SAndroid Build Coastguard Worker                                "        if ret is None:return None\n")
1292*7c568831SAndroid Build Coastguard Worker                        elif name.find("URI") >= 0:
1293*7c568831SAndroid Build Coastguard Worker                            classes.write(
1294*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise uriError('%s() failed')\n"
1295*7c568831SAndroid Build Coastguard Worker                                          % (name))
1296*7c568831SAndroid Build Coastguard Worker                        elif name.find("XPath") >= 0:
1297*7c568831SAndroid Build Coastguard Worker                            classes.write(
1298*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise xpathError('%s() failed')\n"
1299*7c568831SAndroid Build Coastguard Worker                                          % (name))
1300*7c568831SAndroid Build Coastguard Worker                        elif name.find("Parse") >= 0:
1301*7c568831SAndroid Build Coastguard Worker                            classes.write(
1302*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise parserError('%s() failed')\n"
1303*7c568831SAndroid Build Coastguard Worker                                          % (name))
1304*7c568831SAndroid Build Coastguard Worker                        else:
1305*7c568831SAndroid Build Coastguard Worker                            classes.write(
1306*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise treeError('%s() failed')\n"
1307*7c568831SAndroid Build Coastguard Worker                                          % (name))
1308*7c568831SAndroid Build Coastguard Worker
1309*7c568831SAndroid Build Coastguard Worker                        #
1310*7c568831SAndroid Build Coastguard Worker                        # generate the returned class wrapper for the object
1311*7c568831SAndroid Build Coastguard Worker                        #
1312*7c568831SAndroid Build Coastguard Worker                        classes.write("        __tmp = ")
1313*7c568831SAndroid Build Coastguard Worker                        classes.write(classes_type[ret[0]][1] % ("ret"))
1314*7c568831SAndroid Build Coastguard Worker                        classes.write("\n")
1315*7c568831SAndroid Build Coastguard Worker
1316*7c568831SAndroid Build Coastguard Worker                        #
1317*7c568831SAndroid Build Coastguard Worker                        # Sometime one need to keep references of the source
1318*7c568831SAndroid Build Coastguard Worker                        # class in the returned class object.
1319*7c568831SAndroid Build Coastguard Worker                        # See reference_keepers for the list
1320*7c568831SAndroid Build Coastguard Worker                        #
1321*7c568831SAndroid Build Coastguard Worker                        tclass = classes_type[ret[0]][2]
1322*7c568831SAndroid Build Coastguard Worker                        if tclass in reference_keepers:
1323*7c568831SAndroid Build Coastguard Worker                            list = reference_keepers[tclass]
1324*7c568831SAndroid Build Coastguard Worker                            for pref in list:
1325*7c568831SAndroid Build Coastguard Worker                                if pref[0] == classname:
1326*7c568831SAndroid Build Coastguard Worker                                    classes.write("        __tmp.%s = self\n" %
1327*7c568831SAndroid Build Coastguard Worker                                                  pref[1])
1328*7c568831SAndroid Build Coastguard Worker                        #
1329*7c568831SAndroid Build Coastguard Worker                        # return the class
1330*7c568831SAndroid Build Coastguard Worker                        #
1331*7c568831SAndroid Build Coastguard Worker                        classes.write("        return __tmp\n")
1332*7c568831SAndroid Build Coastguard Worker                    elif ret[0] in converter_type:
1333*7c568831SAndroid Build Coastguard Worker                        #
1334*7c568831SAndroid Build Coastguard Worker                        # Raise an exception
1335*7c568831SAndroid Build Coastguard Worker                        #
1336*7c568831SAndroid Build Coastguard Worker                        if name in functions_noexcept:
1337*7c568831SAndroid Build Coastguard Worker                            classes.write(
1338*7c568831SAndroid Build Coastguard Worker                                "        if ret is None:return None")
1339*7c568831SAndroid Build Coastguard Worker                        elif name.find("URI") >= 0:
1340*7c568831SAndroid Build Coastguard Worker                            classes.write(
1341*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise uriError('%s() failed')\n"
1342*7c568831SAndroid Build Coastguard Worker                                          % (name))
1343*7c568831SAndroid Build Coastguard Worker                        elif name.find("XPath") >= 0:
1344*7c568831SAndroid Build Coastguard Worker                            classes.write(
1345*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise xpathError('%s() failed')\n"
1346*7c568831SAndroid Build Coastguard Worker                                          % (name))
1347*7c568831SAndroid Build Coastguard Worker                        elif name.find("Parse") >= 0:
1348*7c568831SAndroid Build Coastguard Worker                            classes.write(
1349*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise parserError('%s() failed')\n"
1350*7c568831SAndroid Build Coastguard Worker                                          % (name))
1351*7c568831SAndroid Build Coastguard Worker                        else:
1352*7c568831SAndroid Build Coastguard Worker                            classes.write(
1353*7c568831SAndroid Build Coastguard Worker                    "        if ret is None:raise treeError('%s() failed')\n"
1354*7c568831SAndroid Build Coastguard Worker                                          % (name))
1355*7c568831SAndroid Build Coastguard Worker                        classes.write("        return ")
1356*7c568831SAndroid Build Coastguard Worker                        classes.write(converter_type[ret[0]] % ("ret"))
1357*7c568831SAndroid Build Coastguard Worker                        classes.write("\n")
1358*7c568831SAndroid Build Coastguard Worker                    else:
1359*7c568831SAndroid Build Coastguard Worker                        classes.write("        return ret\n")
1360*7c568831SAndroid Build Coastguard Worker                classes.write("\n")
1361*7c568831SAndroid Build Coastguard Worker
1362*7c568831SAndroid Build Coastguard Worker    #
1363*7c568831SAndroid Build Coastguard Worker    # Generate enum constants
1364*7c568831SAndroid Build Coastguard Worker    #
1365*7c568831SAndroid Build Coastguard Worker    for type,enum in enums.items():
1366*7c568831SAndroid Build Coastguard Worker        classes.write("# %s\n" % type)
1367*7c568831SAndroid Build Coastguard Worker        items = enum.items()
1368*7c568831SAndroid Build Coastguard Worker        items = sorted(items, key=(lambda i: int(i[1])))
1369*7c568831SAndroid Build Coastguard Worker        for name,value in items:
1370*7c568831SAndroid Build Coastguard Worker            classes.write("%s = %s\n" % (name,value))
1371*7c568831SAndroid Build Coastguard Worker        classes.write("\n")
1372*7c568831SAndroid Build Coastguard Worker
1373*7c568831SAndroid Build Coastguard Worker    txt.close()
1374*7c568831SAndroid Build Coastguard Worker    classes.close()
1375*7c568831SAndroid Build Coastguard Worker
1376*7c568831SAndroid Build Coastguard WorkerbuildStubs()
1377*7c568831SAndroid Build Coastguard WorkerbuildWrappers()
1378