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