Blame python/generator.py

Packit Service a31ea6
#!/usr/bin/python -u
Packit Service a31ea6
#
Packit Service a31ea6
# generate python wrappers from the XML API description
Packit Service a31ea6
#
Packit Service a31ea6
Packit Service a31ea6
functions = {}
Packit Service a31ea6
enums = {} # { enumType: { enumConstant: enumValue } }
Packit Service a31ea6
Packit Service a31ea6
import os
Packit Service a31ea6
import sys
Packit Service a31ea6
import string
Packit Service a31ea6
Packit Service a31ea6
if __name__ == "__main__":
Packit Service a31ea6
    # launched as a script
Packit Service a31ea6
    srcPref = os.path.dirname(sys.argv[0])
Packit Service a31ea6
else:
Packit Service a31ea6
    # imported
Packit Service a31ea6
    srcPref = os.path.dirname(__file__)
Packit Service a31ea6
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
#
Packit Service a31ea6
#  That part if purely the API acquisition phase from the
Packit Service a31ea6
#  XML API description
Packit Service a31ea6
#
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
import os
Packit Service a31ea6
import xml.sax
Packit Service a31ea6
Packit Service a31ea6
debug = 0
Packit Service a31ea6
Packit Service a31ea6
def getparser():
Packit Service a31ea6
    # Attach parser to an unmarshalling object. return both objects.
Packit Service a31ea6
    target = docParser()
Packit Service a31ea6
    parser = xml.sax.make_parser()
Packit Service a31ea6
    parser.setContentHandler(target)
Packit Service a31ea6
    return parser, target
Packit Service a31ea6
Packit Service a31ea6
class docParser(xml.sax.handler.ContentHandler):
Packit Service a31ea6
    def __init__(self):
Packit Service a31ea6
        self._methodname = None
Packit Service a31ea6
        self._data = []
Packit Service a31ea6
        self.in_function = 0
Packit Service a31ea6
Packit Service a31ea6
        self.startElement = self.start
Packit Service a31ea6
        self.endElement = self.end
Packit Service a31ea6
        self.characters = self.data
Packit Service a31ea6
Packit Service a31ea6
    def close(self):
Packit Service a31ea6
        if debug:
Packit Service a31ea6
            print("close")
Packit Service a31ea6
Packit Service a31ea6
    def getmethodname(self):
Packit Service a31ea6
        return self._methodname
Packit Service a31ea6
Packit Service a31ea6
    def data(self, text):
Packit Service a31ea6
        if debug:
Packit Service a31ea6
            print("data %s" % text)
Packit Service a31ea6
        self._data.append(text)
Packit Service a31ea6
Packit Service a31ea6
    def start(self, tag, attrs):
Packit Service a31ea6
        if debug:
Packit Service a31ea6
            print("start %s, %s" % (tag, attrs))
Packit Service a31ea6
        if tag == 'function':
Packit Service a31ea6
            self._data = []
Packit Service a31ea6
            self.in_function = 1
Packit Service a31ea6
            self.function = None
Packit Service a31ea6
            self.function_cond = None
Packit Service a31ea6
            self.function_args = []
Packit Service a31ea6
            self.function_descr = None
Packit Service a31ea6
            self.function_return = None
Packit Service a31ea6
            self.function_file = None
Packit Service a31ea6
            if 'name' in attrs.keys():
Packit Service a31ea6
                self.function = attrs['name']
Packit Service a31ea6
            if 'file' in attrs.keys():
Packit Service a31ea6
                self.function_file = attrs['file']
Packit Service a31ea6
        elif tag == 'cond':
Packit Service a31ea6
            self._data = []
Packit Service a31ea6
        elif tag == 'info':
Packit Service a31ea6
            self._data = []
Packit Service a31ea6
        elif tag == 'arg':
Packit Service a31ea6
            if self.in_function == 1:
Packit Service a31ea6
                self.function_arg_name = None
Packit Service a31ea6
                self.function_arg_type = None
Packit Service a31ea6
                self.function_arg_info = None
Packit Service a31ea6
                if 'name' in attrs.keys():
Packit Service a31ea6
                    self.function_arg_name = attrs['name']
Packit Service a31ea6
                if 'type' in attrs.keys():
Packit Service a31ea6
                    self.function_arg_type = attrs['type']
Packit Service a31ea6
                if 'info' in attrs.keys():
Packit Service a31ea6
                    self.function_arg_info = attrs['info']
Packit Service a31ea6
        elif tag == 'return':
Packit Service a31ea6
            if self.in_function == 1:
Packit Service a31ea6
                self.function_return_type = None
Packit Service a31ea6
                self.function_return_info = None
Packit Service a31ea6
                self.function_return_field = None
Packit Service a31ea6
                if 'type' in attrs.keys():
Packit Service a31ea6
                    self.function_return_type = attrs['type']
Packit Service a31ea6
                if 'info' in attrs.keys():
Packit Service a31ea6
                    self.function_return_info = attrs['info']
Packit Service a31ea6
                if 'field' in attrs.keys():
Packit Service a31ea6
                    self.function_return_field = attrs['field']
Packit Service a31ea6
        elif tag == 'enum':
Packit Service a31ea6
            enum(attrs['type'],attrs['name'],attrs['value'])
Packit Service a31ea6
Packit Service a31ea6
    def end(self, tag):
Packit Service a31ea6
        if debug:
Packit Service a31ea6
            print("end %s" % tag)
Packit Service a31ea6
        if tag == 'function':
Packit Service a31ea6
            if self.function != None:
Packit Service a31ea6
                function(self.function, self.function_descr,
Packit Service a31ea6
                         self.function_return, self.function_args,
Packit Service a31ea6
                         self.function_file, self.function_cond)
Packit Service a31ea6
                self.in_function = 0
Packit Service a31ea6
        elif tag == 'arg':
Packit Service a31ea6
            if self.in_function == 1:
Packit Service a31ea6
                self.function_args.append([self.function_arg_name,
Packit Service a31ea6
                                           self.function_arg_type,
Packit Service a31ea6
                                           self.function_arg_info])
Packit Service a31ea6
        elif tag == 'return':
Packit Service a31ea6
            if self.in_function == 1:
Packit Service a31ea6
                self.function_return = [self.function_return_type,
Packit Service a31ea6
                                        self.function_return_info,
Packit Service a31ea6
                                        self.function_return_field]
Packit Service a31ea6
        elif tag == 'info':
Packit Service a31ea6
            str = ''
Packit Service a31ea6
            for c in self._data:
Packit Service a31ea6
                str = str + c
Packit Service a31ea6
            if self.in_function == 1:
Packit Service a31ea6
                self.function_descr = str
Packit Service a31ea6
        elif tag == 'cond':
Packit Service a31ea6
            str = ''
Packit Service a31ea6
            for c in self._data:
Packit Service a31ea6
                str = str + c
Packit Service a31ea6
            if self.in_function == 1:
Packit Service a31ea6
                self.function_cond = str
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
def function(name, desc, ret, args, file, cond):
Packit Service a31ea6
    functions[name] = (desc, ret, args, file, cond)
Packit Service a31ea6
Packit Service a31ea6
def enum(type, name, value):
Packit Service a31ea6
    if type not in enums:
Packit Service a31ea6
        enums[type] = {}
Packit Service a31ea6
    enums[type][name] = value
Packit Service a31ea6
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
#
Packit Service a31ea6
#  Some filtering rukes to drop functions/types which should not
Packit Service a31ea6
#  be exposed as-is on the Python interface
Packit Service a31ea6
#
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
Packit Service a31ea6
skipped_modules = {
Packit Service a31ea6
    'xmlmemory': None,
Packit Service a31ea6
    'DOCBparser': None,
Packit Service a31ea6
    'SAX': None,
Packit Service a31ea6
    'hash': None,
Packit Service a31ea6
    'list': None,
Packit Service a31ea6
    'threads': None,
Packit Service a31ea6
#    'xpointer': None,
Packit Service a31ea6
}
Packit Service a31ea6
skipped_types = {
Packit Service a31ea6
    'int *': "usually a return type",
Packit Service a31ea6
    'xmlSAXHandlerPtr': "not the proper interface for SAX",
Packit Service a31ea6
    'htmlSAXHandlerPtr': "not the proper interface for SAX",
Packit Service a31ea6
    'xmlRMutexPtr': "thread specific, skipped",
Packit Service a31ea6
    'xmlMutexPtr': "thread specific, skipped",
Packit Service a31ea6
    'xmlGlobalStatePtr': "thread specific, skipped",
Packit Service a31ea6
    'xmlListPtr': "internal representation not suitable for python",
Packit Service a31ea6
    'xmlBufferPtr': "internal representation not suitable for python",
Packit Service a31ea6
    'FILE *': None,
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
#
Packit Service a31ea6
#  Table of remapping to/from the python type or class to the C
Packit Service a31ea6
#  counterpart.
Packit Service a31ea6
#
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
Packit Service a31ea6
py_types = {
Packit Service a31ea6
    'void': (None, None, None, None),
Packit Service a31ea6
    'int':  ('i', None, "int", "int"),
Packit Service a31ea6
    'long':  ('l', None, "long", "long"),
Packit Service a31ea6
    'double':  ('d', None, "double", "double"),
Packit Service a31ea6
    'unsigned int':  ('i', None, "int", "int"),
Packit Service a31ea6
    'xmlChar':  ('c', None, "int", "int"),
Packit Service a31ea6
    'unsigned char *':  ('z', None, "charPtr", "char *"),
Packit Service a31ea6
    'char *':  ('z', None, "charPtr", "char *"),
Packit Service a31ea6
    'const char *':  ('z', None, "charPtrConst", "const char *"),
Packit Service a31ea6
    'xmlChar *':  ('z', None, "xmlCharPtr", "xmlChar *"),
Packit Service a31ea6
    'const xmlChar *':  ('z', None, "xmlCharPtrConst", "const xmlChar *"),
Packit Service a31ea6
    'xmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlDtdPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlDtdPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlDtd *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlDtd *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlAttrPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlAttrPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlAttr *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlAttr *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlEntityPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlEntityPtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlEntity *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const xmlEntity *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlElementPtr':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
Packit Service a31ea6
    'const xmlElementPtr':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
Packit Service a31ea6
    'xmlElement *':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
Packit Service a31ea6
    'const xmlElement *':  ('O', "xmlElement", "xmlElementPtr", "xmlElementPtr"),
Packit Service a31ea6
    'xmlAttributePtr':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
Packit Service a31ea6
    'const xmlAttributePtr':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
Packit Service a31ea6
    'xmlAttribute *':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
Packit Service a31ea6
    'const xmlAttribute *':  ('O', "xmlAttribute", "xmlAttributePtr", "xmlAttributePtr"),
Packit Service a31ea6
    'xmlNsPtr':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
Packit Service a31ea6
    'const xmlNsPtr':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
Packit Service a31ea6
    'xmlNs *':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
Packit Service a31ea6
    'const xmlNs *':  ('O', "xmlNode", "xmlNsPtr", "xmlNsPtr"),
Packit Service a31ea6
    'xmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'const xmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'xmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'const xmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'htmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'const htmlDocPtr':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'htmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'const htmlDoc *':  ('O', "xmlNode", "xmlDocPtr", "xmlDocPtr"),
Packit Service a31ea6
    'htmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const htmlNodePtr':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'htmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'const htmlNode *':  ('O', "xmlNode", "xmlNodePtr", "xmlNodePtr"),
Packit Service a31ea6
    'xmlXPathContextPtr':  ('O', "xmlXPathContext", "xmlXPathContextPtr", "xmlXPathContextPtr"),
Packit Service a31ea6
    'xmlXPathContext *':  ('O', "xpathContext", "xmlXPathContextPtr", "xmlXPathContextPtr"),
Packit Service a31ea6
    'xmlXPathParserContextPtr':  ('O', "xmlXPathParserContext", "xmlXPathParserContextPtr", "xmlXPathParserContextPtr"),
Packit Service a31ea6
    'xmlParserCtxtPtr': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
Packit Service a31ea6
    'xmlParserCtxt *': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
Packit Service a31ea6
    'htmlParserCtxtPtr': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
Packit Service a31ea6
    'htmlParserCtxt *': ('O', "parserCtxt", "xmlParserCtxtPtr", "xmlParserCtxtPtr"),
Packit Service a31ea6
    'xmlValidCtxtPtr': ('O', "ValidCtxt", "xmlValidCtxtPtr", "xmlValidCtxtPtr"),
Packit Service a31ea6
    'xmlCatalogPtr': ('O', "catalog", "xmlCatalogPtr", "xmlCatalogPtr"),
Packit Service a31ea6
    'FILE *': ('O', "File", "FILEPtr", "FILE *"),
Packit Service a31ea6
    'xmlURIPtr': ('O', "URI", "xmlURIPtr", "xmlURIPtr"),
Packit Service a31ea6
    'xmlErrorPtr': ('O', "Error", "xmlErrorPtr", "xmlErrorPtr"),
Packit Service a31ea6
    'xmlOutputBufferPtr': ('O', "outputBuffer", "xmlOutputBufferPtr", "xmlOutputBufferPtr"),
Packit Service a31ea6
    'xmlParserInputBufferPtr': ('O', "inputBuffer", "xmlParserInputBufferPtr", "xmlParserInputBufferPtr"),
Packit Service a31ea6
    'xmlRegexpPtr': ('O', "xmlReg", "xmlRegexpPtr", "xmlRegexpPtr"),
Packit Service a31ea6
    'xmlTextReaderLocatorPtr': ('O', "xmlTextReaderLocator", "xmlTextReaderLocatorPtr", "xmlTextReaderLocatorPtr"),
Packit Service a31ea6
    'xmlTextReaderPtr': ('O', "xmlTextReader", "xmlTextReaderPtr", "xmlTextReaderPtr"),
Packit Service a31ea6
    'xmlRelaxNGPtr': ('O', "relaxNgSchema", "xmlRelaxNGPtr", "xmlRelaxNGPtr"),
Packit Service a31ea6
    'xmlRelaxNGParserCtxtPtr': ('O', "relaxNgParserCtxt", "xmlRelaxNGParserCtxtPtr", "xmlRelaxNGParserCtxtPtr"),
Packit Service a31ea6
    'xmlRelaxNGValidCtxtPtr': ('O', "relaxNgValidCtxt", "xmlRelaxNGValidCtxtPtr", "xmlRelaxNGValidCtxtPtr"),
Packit Service a31ea6
    'xmlSchemaPtr': ('O', "Schema", "xmlSchemaPtr", "xmlSchemaPtr"),
Packit Service a31ea6
    'xmlSchemaParserCtxtPtr': ('O', "SchemaParserCtxt", "xmlSchemaParserCtxtPtr", "xmlSchemaParserCtxtPtr"),
Packit Service a31ea6
    'xmlSchemaValidCtxtPtr': ('O', "SchemaValidCtxt", "xmlSchemaValidCtxtPtr", "xmlSchemaValidCtxtPtr"),
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
py_return_types = {
Packit Service a31ea6
    'xmlXPathObjectPtr':  ('O', "foo", "xmlXPathObjectPtr", "xmlXPathObjectPtr"),
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
unknown_types = {}
Packit Service a31ea6
Packit Service a31ea6
foreign_encoding_args = (
Packit Service a31ea6
    'htmlCreateMemoryParserCtxt',
Packit Service a31ea6
    'htmlCtxtReadMemory',
Packit Service a31ea6
    'htmlParseChunk',
Packit Service a31ea6
    'htmlReadMemory',
Packit Service a31ea6
    'xmlCreateMemoryParserCtxt',
Packit Service a31ea6
    'xmlCtxtReadMemory',
Packit Service a31ea6
    'xmlCtxtResetPush',
Packit Service a31ea6
    'xmlParseChunk',
Packit Service a31ea6
    'xmlParseMemory',
Packit Service a31ea6
    'xmlReadMemory',
Packit Service a31ea6
    'xmlRecoverMemory',
Packit Service a31ea6
)
Packit Service a31ea6
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
#
Packit Service a31ea6
#  This part writes the C <-> Python stubs libxml2-py.[ch] and
Packit Service a31ea6
#  the table libxml2-export.c to add when registrering the Python module
Packit Service a31ea6
#
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
Packit Service a31ea6
# Class methods which are written by hand in libxml.c but the Python-level
Packit Service a31ea6
# code is still automatically generated (so they are not in skip_function()).
Packit Service a31ea6
skip_impl = (
Packit Service a31ea6
    'xmlSaveFileTo',
Packit Service a31ea6
    'xmlSaveFormatFileTo',
Packit Service a31ea6
)
Packit Service a31ea6
Packit Service a31ea6
def skip_function(name):
Packit Service a31ea6
    if name[0:12] == "xmlXPathWrap":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlFreeParserCtxt":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlCleanupParser":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlFreeTextReader":
Packit Service a31ea6
        return 1
Packit Service a31ea6
#    if name[0:11] == "xmlXPathNew":
Packit Service a31ea6
#        return 1
Packit Service a31ea6
    # the next function is defined in libxml.c
Packit Service a31ea6
    if name == "xmlRelaxNGFreeValidCtxt":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlFreeValidCtxt":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlSchemaFreeValidCtxt":
Packit Service a31ea6
        return 1
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Those are skipped because the Const version is used of the bindings
Packit Service a31ea6
# instead.
Packit Service a31ea6
#
Packit Service a31ea6
    if name == "xmlTextReaderBaseUri":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlTextReaderLocalName":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlTextReaderName":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlTextReaderNamespaceUri":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlTextReaderPrefix":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlTextReaderXmlLang":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlTextReaderValue":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlOutputBufferClose": # handled by by the superclass
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlOutputBufferFlush": # handled by by the superclass
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlErrMemory":
Packit Service a31ea6
        return 1
Packit Service a31ea6
Packit Service a31ea6
    if name == "xmlValidBuildContentModel":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlValidateElementDecl":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlValidateAttributeDecl":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if name == "xmlPopInputCallbacks":
Packit Service a31ea6
        return 1
Packit Service a31ea6
Packit Service a31ea6
    return 0
Packit Service a31ea6
Packit Service a31ea6
def print_function_wrapper(name, output, export, include):
Packit Service a31ea6
    global py_types
Packit Service a31ea6
    global unknown_types
Packit Service a31ea6
    global functions
Packit Service a31ea6
    global skipped_modules
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
        (desc, ret, args, file, cond) = functions[name]
Packit Service a31ea6
    except:
Packit Service a31ea6
        print("failed to get function %s infos")
Packit Service a31ea6
        return
Packit Service a31ea6
Packit Service a31ea6
    if file in skipped_modules:
Packit Service a31ea6
        return 0
Packit Service a31ea6
    if skip_function(name) == 1:
Packit Service a31ea6
        return 0
Packit Service a31ea6
    if name in skip_impl:
Packit Service a31ea6
        # Don't delete the function entry in the caller.
Packit Service a31ea6
        return 1
Packit Service a31ea6
Packit Service a31ea6
    c_call = ""
Packit Service a31ea6
    format=""
Packit Service a31ea6
    format_args=""
Packit Service a31ea6
    c_args=""
Packit Service a31ea6
    c_return=""
Packit Service a31ea6
    c_convert=""
Packit Service a31ea6
    c_release=""
Packit Service a31ea6
    num_bufs=0
Packit Service a31ea6
    for arg in args:
Packit Service a31ea6
        # This should be correct
Packit Service a31ea6
        if arg[1][0:6] == "const ":
Packit Service a31ea6
            arg[1] = arg[1][6:]
Packit Service a31ea6
        c_args = c_args + "    %s %s;\n" % (arg[1], arg[0])
Packit Service a31ea6
        if arg[1] in py_types:
Packit Service a31ea6
            (f, t, n, c) = py_types[arg[1]]
Packit Service a31ea6
            if (f == 'z') and (name in foreign_encoding_args) and (num_bufs == 0):
Packit Service a31ea6
                f = 's#'
Packit Service a31ea6
            if f != None:
Packit Service a31ea6
                format = format + f
Packit Service a31ea6
            if t != None:
Packit Service a31ea6
                format_args = format_args + ", &pyobj_%s" % (arg[0])
Packit Service a31ea6
                c_args = c_args + "    PyObject *pyobj_%s;\n" % (arg[0])
Packit Service a31ea6
                c_convert = c_convert + \
Packit Service a31ea6
                   "    %s = (%s) Py%s_Get(pyobj_%s);\n" % (arg[0],
Packit Service a31ea6
                   arg[1], t, arg[0])
Packit Service a31ea6
            else:
Packit Service a31ea6
                format_args = format_args + ", &%s" % (arg[0])
Packit Service a31ea6
            if f == 's#':
Packit Service a31ea6
                format_args = format_args + ", &py_buffsize%d" % num_bufs
Packit Service a31ea6
                c_args = c_args + "    int py_buffsize%d;\n" % num_bufs
Packit Service a31ea6
                num_bufs = num_bufs + 1
Packit Service a31ea6
            if c_call != "":
Packit Service a31ea6
                c_call = c_call + ", "
Packit Service a31ea6
            c_call = c_call + "%s" % (arg[0])
Packit Service a31ea6
            if t == "File":
Packit Service a31ea6
                c_release = c_release + \
Packit Service a31ea6
		            "    PyFile_Release(%s);\n" % (arg[0])
Packit Service a31ea6
        else:
Packit Service a31ea6
            if arg[1] in skipped_types:
Packit Service a31ea6
                return 0
Packit Service a31ea6
            if arg[1] in unknown_types:
Packit Service a31ea6
                lst = unknown_types[arg[1]]
Packit Service a31ea6
                lst.append(name)
Packit Service a31ea6
            else:
Packit Service a31ea6
                unknown_types[arg[1]] = [name]
Packit Service a31ea6
            return -1
Packit Service a31ea6
    if format != "":
Packit Service a31ea6
        format = format + ":%s" % (name)
Packit Service a31ea6
Packit Service a31ea6
    if ret[0] == 'void':
Packit Service a31ea6
        if file == "python_accessor":
Packit Service a31ea6
            if args[1][1] == "char *" or args[1][1] == "xmlChar *":
Packit Service a31ea6
                c_call = "\n    if (%s->%s != NULL) xmlFree(%s->%s);\n" % (
Packit Service a31ea6
                                 args[0][0], args[1][0], args[0][0], args[1][0])
Packit Service a31ea6
                c_call = c_call + "    %s->%s = (%s)xmlStrdup((const xmlChar *)%s);\n" % (args[0][0],
Packit Service a31ea6
                                 args[1][0], args[1][1], args[1][0])
Packit Service a31ea6
            else:
Packit Service a31ea6
                c_call = "\n    %s->%s = %s;\n" % (args[0][0], args[1][0],
Packit Service a31ea6
                                                   args[1][0])
Packit Service a31ea6
        else:
Packit Service a31ea6
            c_call = "\n    %s(%s);\n" % (name, c_call)
Packit Service a31ea6
        ret_convert = "    Py_INCREF(Py_None);\n    return(Py_None);\n"
Packit Service a31ea6
    elif ret[0] in py_types:
Packit Service a31ea6
        (f, t, n, c) = py_types[ret[0]]
Packit Service a31ea6
        c_return = c_return + "    %s c_retval;\n" % (ret[0])
Packit Service a31ea6
        if file == "python_accessor" and ret[2] != None:
Packit Service a31ea6
            c_call = "\n    c_retval = %s->%s;\n" % (args[0][0], ret[2])
Packit Service a31ea6
        else:
Packit Service a31ea6
            c_call = "\n    c_retval = %s(%s);\n" % (name, c_call)
Packit Service a31ea6
        ret_convert = "    py_retval = libxml_%sWrap((%s) c_retval);\n" % (n,c)
Packit Service a31ea6
        ret_convert = ret_convert + "    return(py_retval);\n"
Packit Service a31ea6
    elif ret[0] in py_return_types:
Packit Service a31ea6
        (f, t, n, c) = py_return_types[ret[0]]
Packit Service a31ea6
        c_return = c_return + "    %s c_retval;\n" % (ret[0])
Packit Service a31ea6
        c_call = "\n    c_retval = %s(%s);\n" % (name, c_call)
Packit Service a31ea6
        ret_convert = "    py_retval = libxml_%sWrap((%s) c_retval);\n" % (n,c)
Packit Service a31ea6
        ret_convert = ret_convert + "    return(py_retval);\n"
Packit Service a31ea6
    else:
Packit Service a31ea6
        if ret[0] in skipped_types:
Packit Service a31ea6
            return 0
Packit Service a31ea6
        if ret[0] in unknown_types:
Packit Service a31ea6
            lst = unknown_types[ret[0]]
Packit Service a31ea6
            lst.append(name)
Packit Service a31ea6
        else:
Packit Service a31ea6
            unknown_types[ret[0]] = [name]
Packit Service a31ea6
        return -1
Packit Service a31ea6
Packit Service a31ea6
    if cond != None and cond != "":
Packit Service a31ea6
        include.write("#if %s\n" % cond)
Packit Service a31ea6
        export.write("#if %s\n" % cond)
Packit Service a31ea6
        output.write("#if %s\n" % cond)
Packit Service a31ea6
Packit Service a31ea6
    include.write("PyObject * ")
Packit Service a31ea6
    include.write("libxml_%s(PyObject *self, PyObject *args);\n" % (name))
Packit Service a31ea6
Packit Service a31ea6
    export.write("    { (char *)\"%s\", libxml_%s, METH_VARARGS, NULL },\n" %
Packit Service a31ea6
                 (name, name))
Packit Service a31ea6
Packit Service a31ea6
    if file == "python":
Packit Service a31ea6
        # Those have been manually generated
Packit Service a31ea6
        if cond != None and cond != "":
Packit Service a31ea6
            include.write("#endif\n")
Packit Service a31ea6
            export.write("#endif\n")
Packit Service a31ea6
            output.write("#endif\n")
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if file == "python_accessor" and ret[0] != "void" and ret[2] is None:
Packit Service a31ea6
        # Those have been manually generated
Packit Service a31ea6
        if cond != None and cond != "":
Packit Service a31ea6
            include.write("#endif\n")
Packit Service a31ea6
            export.write("#endif\n")
Packit Service a31ea6
            output.write("#endif\n")
Packit Service a31ea6
        return 1
Packit Service a31ea6
Packit Service a31ea6
    output.write("PyObject *\n")
Packit Service a31ea6
    output.write("libxml_%s(PyObject *self ATTRIBUTE_UNUSED," % (name))
Packit Service a31ea6
    output.write(" PyObject *args")
Packit Service a31ea6
    if format == "":
Packit Service a31ea6
        output.write(" ATTRIBUTE_UNUSED")
Packit Service a31ea6
    output.write(") {\n")
Packit Service a31ea6
    if ret[0] != 'void':
Packit Service a31ea6
        output.write("    PyObject *py_retval;\n")
Packit Service a31ea6
    if c_return != "":
Packit Service a31ea6
        output.write(c_return)
Packit Service a31ea6
    if c_args != "":
Packit Service a31ea6
        output.write(c_args)
Packit Service a31ea6
    if format != "":
Packit Service a31ea6
        output.write("\n    if (!PyArg_ParseTuple(args, (char *)\"%s\"%s))\n" %
Packit Service a31ea6
                     (format, format_args))
Packit Service a31ea6
        output.write("        return(NULL);\n")
Packit Service a31ea6
    if c_convert != "":
Packit Service a31ea6
        output.write(c_convert)
Packit Service a31ea6
Packit Service a31ea6
    output.write(c_call)
Packit Service a31ea6
    if c_release != "":
Packit Service a31ea6
        output.write(c_release)
Packit Service a31ea6
    output.write(ret_convert)
Packit Service a31ea6
    output.write("}\n\n")
Packit Service a31ea6
    if cond != None and cond != "":
Packit Service a31ea6
        include.write("#endif /* %s */\n" % cond)
Packit Service a31ea6
        export.write("#endif /* %s */\n" % cond)
Packit Service a31ea6
        output.write("#endif /* %s */\n" % cond)
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def buildStubs():
Packit Service a31ea6
    global py_types
Packit Service a31ea6
    global py_return_types
Packit Service a31ea6
    global unknown_types
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
        f = open(os.path.join(srcPref,"libxml2-api.xml"))
Packit Service a31ea6
        data = f.read()
Packit Service a31ea6
        (parser, target)  = getparser()
Packit Service a31ea6
        parser.feed(data)
Packit Service a31ea6
        parser.close()
Packit Service a31ea6
    except IOError as msg:
Packit Service a31ea6
        try:
Packit Service a31ea6
            f = open(os.path.join(srcPref,"..","doc","libxml2-api.xml"))
Packit Service a31ea6
            data = f.read()
Packit Service a31ea6
            (parser, target)  = getparser()
Packit Service a31ea6
            parser.feed(data)
Packit Service a31ea6
            parser.close()
Packit Service a31ea6
        except IOError as msg:
Packit Service a31ea6
            print(file, ":", msg)
Packit Service a31ea6
            sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
    n = len(list(functions.keys()))
Packit Service a31ea6
    print("Found %d functions in libxml2-api.xml" % (n))
Packit Service a31ea6
Packit Service a31ea6
    py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject")
Packit Service a31ea6
    try:
Packit Service a31ea6
        f = open(os.path.join(srcPref,"libxml2-python-api.xml"))
Packit Service a31ea6
        data = f.read()
Packit Service a31ea6
        (parser, target)  = getparser()
Packit Service a31ea6
        parser.feed(data)
Packit Service a31ea6
        parser.close()
Packit Service a31ea6
    except IOError as msg:
Packit Service a31ea6
        print(file, ":", msg)
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
    print("Found %d functions in libxml2-python-api.xml" % (
Packit Service a31ea6
          len(list(functions.keys())) - n))
Packit Service a31ea6
    nb_wrap = 0
Packit Service a31ea6
    failed = 0
Packit Service a31ea6
    skipped = 0
Packit Service a31ea6
Packit Service a31ea6
    include = open("libxml2-py.h", "w")
Packit Service a31ea6
    include.write("/* Generated */\n\n")
Packit Service a31ea6
    export = open("libxml2-export.c", "w")
Packit Service a31ea6
    export.write("/* Generated */\n\n")
Packit Service a31ea6
    wrapper = open("libxml2-py.c", "w")
Packit Service a31ea6
    wrapper.write("/* Generated */\n\n")
Packit Service a31ea6
    wrapper.write("#include <Python.h>\n")
Packit Service a31ea6
    wrapper.write("#include <libxml/xmlversion.h>\n")
Packit Service a31ea6
    wrapper.write("#include <libxml/tree.h>\n")
Packit Service a31ea6
    wrapper.write("#include <libxml/xmlschemastypes.h>\n")
Packit Service a31ea6
    wrapper.write("#include \"libxml_wrap.h\"\n")
Packit Service a31ea6
    wrapper.write("#include \"libxml2-py.h\"\n\n")
Packit Service a31ea6
    for function in sorted(functions.keys()):
Packit Service a31ea6
        ret = print_function_wrapper(function, wrapper, export, include)
Packit Service a31ea6
        if ret < 0:
Packit Service a31ea6
            failed = failed + 1
Packit Service a31ea6
            del functions[function]
Packit Service a31ea6
        if ret == 0:
Packit Service a31ea6
            skipped = skipped + 1
Packit Service a31ea6
            del functions[function]
Packit Service a31ea6
        if ret == 1:
Packit Service a31ea6
            nb_wrap = nb_wrap + 1
Packit Service a31ea6
    include.close()
Packit Service a31ea6
    export.close()
Packit Service a31ea6
    wrapper.close()
Packit Service a31ea6
Packit Service a31ea6
    print("Generated %d wrapper functions, %d failed, %d skipped\n" % (nb_wrap,
Packit Service a31ea6
                                                              failed, skipped))
Packit Service a31ea6
    print("Missing type converters: ")
Packit Service a31ea6
    for type in list(unknown_types.keys()):
Packit Service a31ea6
        print("%s:%d " % (type, len(unknown_types[type])))
Packit Service a31ea6
    print()
Packit Service a31ea6
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
#
Packit Service a31ea6
#  This part writes part of the Python front-end classes based on
Packit Service a31ea6
#  mapping rules between types and classes and also based on function
Packit Service a31ea6
#  renaming to get consistent function names at the Python level
Packit Service a31ea6
#
Packit Service a31ea6
#######################################################################
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# The type automatically remapped to generated classes
Packit Service a31ea6
#
Packit Service a31ea6
classes_type = {
Packit Service a31ea6
    "xmlNodePtr": ("._o", "xmlNode(_obj=%s)", "xmlNode"),
Packit Service a31ea6
    "xmlNode *": ("._o", "xmlNode(_obj=%s)", "xmlNode"),
Packit Service a31ea6
    "xmlDocPtr": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
Packit Service a31ea6
    "xmlDoc *": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
Packit Service a31ea6
    "htmlDocPtr": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
Packit Service a31ea6
    "htmlxmlDocPtr *": ("._o", "xmlDoc(_obj=%s)", "xmlDoc"),
Packit Service a31ea6
    "xmlAttrPtr": ("._o", "xmlAttr(_obj=%s)", "xmlAttr"),
Packit Service a31ea6
    "xmlAttr *": ("._o", "xmlAttr(_obj=%s)", "xmlAttr"),
Packit Service a31ea6
    "xmlNsPtr": ("._o", "xmlNs(_obj=%s)", "xmlNs"),
Packit Service a31ea6
    "xmlNs *": ("._o", "xmlNs(_obj=%s)", "xmlNs"),
Packit Service a31ea6
    "xmlDtdPtr": ("._o", "xmlDtd(_obj=%s)", "xmlDtd"),
Packit Service a31ea6
    "xmlDtd *": ("._o", "xmlDtd(_obj=%s)", "xmlDtd"),
Packit Service a31ea6
    "xmlEntityPtr": ("._o", "xmlEntity(_obj=%s)", "xmlEntity"),
Packit Service a31ea6
    "xmlEntity *": ("._o", "xmlEntity(_obj=%s)", "xmlEntity"),
Packit Service a31ea6
    "xmlElementPtr": ("._o", "xmlElement(_obj=%s)", "xmlElement"),
Packit Service a31ea6
    "xmlElement *": ("._o", "xmlElement(_obj=%s)", "xmlElement"),
Packit Service a31ea6
    "xmlAttributePtr": ("._o", "xmlAttribute(_obj=%s)", "xmlAttribute"),
Packit Service a31ea6
    "xmlAttribute *": ("._o", "xmlAttribute(_obj=%s)", "xmlAttribute"),
Packit Service a31ea6
    "xmlXPathContextPtr": ("._o", "xpathContext(_obj=%s)", "xpathContext"),
Packit Service a31ea6
    "xmlXPathContext *": ("._o", "xpathContext(_obj=%s)", "xpathContext"),
Packit Service a31ea6
    "xmlXPathParserContext *": ("._o", "xpathParserContext(_obj=%s)", "xpathParserContext"),
Packit Service a31ea6
    "xmlXPathParserContextPtr": ("._o", "xpathParserContext(_obj=%s)", "xpathParserContext"),
Packit Service a31ea6
    "xmlParserCtxtPtr": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
Packit Service a31ea6
    "xmlParserCtxt *": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
Packit Service a31ea6
    "htmlParserCtxtPtr": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
Packit Service a31ea6
    "htmlParserCtxt *": ("._o", "parserCtxt(_obj=%s)", "parserCtxt"),
Packit Service a31ea6
    "xmlValidCtxtPtr": ("._o", "ValidCtxt(_obj=%s)", "ValidCtxt"),
Packit Service a31ea6
    "xmlCatalogPtr": ("._o", "catalog(_obj=%s)", "catalog"),
Packit Service a31ea6
    "xmlURIPtr": ("._o", "URI(_obj=%s)", "URI"),
Packit Service a31ea6
    "xmlErrorPtr": ("._o", "Error(_obj=%s)", "Error"),
Packit Service a31ea6
    "xmlOutputBufferPtr": ("._o", "outputBuffer(_obj=%s)", "outputBuffer"),
Packit Service a31ea6
    "xmlParserInputBufferPtr": ("._o", "inputBuffer(_obj=%s)", "inputBuffer"),
Packit Service a31ea6
    "xmlRegexpPtr": ("._o", "xmlReg(_obj=%s)", "xmlReg"),
Packit Service a31ea6
    "xmlTextReaderLocatorPtr": ("._o", "xmlTextReaderLocator(_obj=%s)", "xmlTextReaderLocator"),
Packit Service a31ea6
    "xmlTextReaderPtr": ("._o", "xmlTextReader(_obj=%s)", "xmlTextReader"),
Packit Service a31ea6
    'xmlRelaxNGPtr': ('._o', "relaxNgSchema(_obj=%s)", "relaxNgSchema"),
Packit Service a31ea6
    'xmlRelaxNGParserCtxtPtr': ('._o', "relaxNgParserCtxt(_obj=%s)", "relaxNgParserCtxt"),
Packit Service a31ea6
    'xmlRelaxNGValidCtxtPtr': ('._o', "relaxNgValidCtxt(_obj=%s)", "relaxNgValidCtxt"),
Packit Service a31ea6
    'xmlSchemaPtr': ("._o", "Schema(_obj=%s)", "Schema"),
Packit Service a31ea6
    'xmlSchemaParserCtxtPtr': ("._o", "SchemaParserCtxt(_obj=%s)", "SchemaParserCtxt"),
Packit Service a31ea6
    'xmlSchemaValidCtxtPtr': ("._o", "SchemaValidCtxt(_obj=%s)", "SchemaValidCtxt"),
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
converter_type = {
Packit Service a31ea6
    "xmlXPathObjectPtr": "xpathObjectRet(%s)",
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
primary_classes = ["xmlNode", "xmlDoc"]
Packit Service a31ea6
Packit Service a31ea6
classes_ancestor = {
Packit Service a31ea6
    "xmlNode" : "xmlCore",
Packit Service a31ea6
    "xmlDtd" : "xmlNode",
Packit Service a31ea6
    "xmlDoc" : "xmlNode",
Packit Service a31ea6
    "xmlAttr" : "xmlNode",
Packit Service a31ea6
    "xmlNs" : "xmlNode",
Packit Service a31ea6
    "xmlEntity" : "xmlNode",
Packit Service a31ea6
    "xmlElement" : "xmlNode",
Packit Service a31ea6
    "xmlAttribute" : "xmlNode",
Packit Service a31ea6
    "outputBuffer": "ioWriteWrapper",
Packit Service a31ea6
    "inputBuffer": "ioReadWrapper",
Packit Service a31ea6
    "parserCtxt": "parserCtxtCore",
Packit Service a31ea6
    "xmlTextReader": "xmlTextReaderCore",
Packit Service a31ea6
    "ValidCtxt": "ValidCtxtCore",
Packit Service a31ea6
    "SchemaValidCtxt": "SchemaValidCtxtCore",
Packit Service a31ea6
    "relaxNgValidCtxt": "relaxNgValidCtxtCore",
Packit Service a31ea6
}
Packit Service a31ea6
classes_destructors = {
Packit Service a31ea6
    "parserCtxt": "xmlFreeParserCtxt",
Packit Service a31ea6
    "catalog": "xmlFreeCatalog",
Packit Service a31ea6
    "URI": "xmlFreeURI",
Packit Service a31ea6
#    "outputBuffer": "xmlOutputBufferClose",
Packit Service a31ea6
    "inputBuffer": "xmlFreeParserInputBuffer",
Packit Service a31ea6
    "xmlReg": "xmlRegFreeRegexp",
Packit Service a31ea6
    "xmlTextReader": "xmlFreeTextReader",
Packit Service a31ea6
    "relaxNgSchema": "xmlRelaxNGFree",
Packit Service a31ea6
    "relaxNgParserCtxt": "xmlRelaxNGFreeParserCtxt",
Packit Service a31ea6
    "relaxNgValidCtxt": "xmlRelaxNGFreeValidCtxt",
Packit Service a31ea6
        "Schema": "xmlSchemaFree",
Packit Service a31ea6
        "SchemaParserCtxt": "xmlSchemaFreeParserCtxt",
Packit Service a31ea6
        "SchemaValidCtxt": "xmlSchemaFreeValidCtxt",
Packit Service a31ea6
        "ValidCtxt": "xmlFreeValidCtxt",
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
functions_noexcept = {
Packit Service a31ea6
    "xmlHasProp": 1,
Packit Service a31ea6
    "xmlHasNsProp": 1,
Packit Service a31ea6
    "xmlDocSetRootElement": 1,
Packit Service a31ea6
    "xmlNodeGetNs": 1,
Packit Service a31ea6
    "xmlNodeGetNsDefs": 1,
Packit Service a31ea6
    "xmlNextElementSibling": 1,
Packit Service a31ea6
    "xmlPreviousElementSibling": 1,
Packit Service a31ea6
    "xmlFirstElementChild": 1,
Packit Service a31ea6
    "xmlLastElementChild": 1,
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
reference_keepers = {
Packit Service a31ea6
    "xmlTextReader": [('inputBuffer', 'input')],
Packit Service a31ea6
    "relaxNgValidCtxt": [('relaxNgSchema', 'schema')],
Packit Service a31ea6
        "SchemaValidCtxt": [('Schema', 'schema')],
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
function_classes = {}
Packit Service a31ea6
Packit Service a31ea6
function_classes["None"] = []
Packit Service a31ea6
Packit Service a31ea6
def nameFixup(name, classe, type, file):
Packit Service a31ea6
    listname = classe + "List"
Packit Service a31ea6
    ll = len(listname)
Packit Service a31ea6
    l = len(classe)
Packit Service a31ea6
    if name[0:l] == listname:
Packit Service a31ea6
        func = name[l:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:12] == "xmlParserGet" and file == "python_accessor":
Packit Service a31ea6
        func = name[12:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:12] == "xmlParserSet" and file == "python_accessor":
Packit Service a31ea6
        func = name[12:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:10] == "xmlNodeGet" and file == "python_accessor":
Packit Service a31ea6
        func = name[10:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:9] == "xmlURIGet" and file == "python_accessor":
Packit Service a31ea6
        func = name[9:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:9] == "xmlURISet" and file == "python_accessor":
Packit Service a31ea6
        func = name[6:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:11] == "xmlErrorGet" and file == "python_accessor":
Packit Service a31ea6
        func = name[11:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:17] == "xmlXPathParserGet" and file == "python_accessor":
Packit Service a31ea6
        func = name[17:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:11] == "xmlXPathGet" and file == "python_accessor":
Packit Service a31ea6
        func = name[11:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:11] == "xmlXPathSet" and file == "python_accessor":
Packit Service a31ea6
        func = name[8:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:15] == "xmlOutputBuffer" and file != "python":
Packit Service a31ea6
        func = name[15:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:20] == "xmlParserInputBuffer" and file != "python":
Packit Service a31ea6
        func = name[20:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:9] == "xmlRegexp" and file == "xmlregexp":
Packit Service a31ea6
        func = "regexp" + name[9:]
Packit Service a31ea6
    elif name[0:6] == "xmlReg" and file == "xmlregexp":
Packit Service a31ea6
        func = "regexp" + name[6:]
Packit Service a31ea6
    elif name[0:20] == "xmlTextReaderLocator" and file == "xmlreader":
Packit Service a31ea6
        func = name[20:]
Packit Service a31ea6
    elif name[0:18] == "xmlTextReaderConst" and file == "xmlreader":
Packit Service a31ea6
        func = name[18:]
Packit Service a31ea6
    elif name[0:13] == "xmlTextReader" and file == "xmlreader":
Packit Service a31ea6
        func = name[13:]
Packit Service a31ea6
    elif name[0:12] == "xmlReaderNew" and file == "xmlreader":
Packit Service a31ea6
        func = name[9:]
Packit Service a31ea6
    elif name[0:11] == "xmlACatalog":
Packit Service a31ea6
        func = name[11:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:l] == classe:
Packit Service a31ea6
        func = name[l:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:7] == "libxml_":
Packit Service a31ea6
        func = name[7:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:6] == "xmlGet":
Packit Service a31ea6
        func = name[6:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    elif name[0:3] == "xml":
Packit Service a31ea6
        func = name[3:]
Packit Service a31ea6
        func = func[0:1].lower() + func[1:]
Packit Service a31ea6
    else:
Packit Service a31ea6
        func = name
Packit Service a31ea6
    if func[0:5] == "xPath":
Packit Service a31ea6
        func = "xpath" + func[5:]
Packit Service a31ea6
    elif func[0:4] == "xPtr":
Packit Service a31ea6
        func = "xpointer" + func[4:]
Packit Service a31ea6
    elif func[0:8] == "xInclude":
Packit Service a31ea6
        func = "xinclude" + func[8:]
Packit Service a31ea6
    elif func[0:2] == "iD":
Packit Service a31ea6
        func = "ID" + func[2:]
Packit Service a31ea6
    elif func[0:3] == "uRI":
Packit Service a31ea6
        func = "URI" + func[3:]
Packit Service a31ea6
    elif func[0:4] == "uTF8":
Packit Service a31ea6
        func = "UTF8" + func[4:]
Packit Service a31ea6
    elif func[0:3] == 'sAX':
Packit Service a31ea6
        func = "SAX" + func[3:]
Packit Service a31ea6
    return func
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
def functionCompare(info1, info2):
Packit Service a31ea6
    (index1, func1, name1, ret1, args1, file1) = info1
Packit Service a31ea6
    (index2, func2, name2, ret2, args2, file2) = info2
Packit Service a31ea6
    if file1 == file2:
Packit Service a31ea6
        if func1 < func2:
Packit Service a31ea6
            return -1
Packit Service a31ea6
        if func1 > func2:
Packit Service a31ea6
            return 1
Packit Service a31ea6
    if file1 == "python_accessor":
Packit Service a31ea6
        return -1
Packit Service a31ea6
    if file2 == "python_accessor":
Packit Service a31ea6
        return 1
Packit Service a31ea6
    if file1 < file2:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    if file1 > file2:
Packit Service a31ea6
        return 1
Packit Service a31ea6
    return 0
Packit Service a31ea6
Packit Service a31ea6
def cmp_to_key(mycmp):
Packit Service a31ea6
    'Convert a cmp= function into a key= function'
Packit Service a31ea6
    class K(object):
Packit Service a31ea6
        def __init__(self, obj, *args):
Packit Service a31ea6
            self.obj = obj
Packit Service a31ea6
        def __lt__(self, other):
Packit Service a31ea6
            return mycmp(self.obj, other.obj) < 0
Packit Service a31ea6
        def __gt__(self, other):
Packit Service a31ea6
            return mycmp(self.obj, other.obj) > 0
Packit Service a31ea6
        def __eq__(self, other):
Packit Service a31ea6
            return mycmp(self.obj, other.obj) == 0
Packit Service a31ea6
        def __le__(self, other):
Packit Service a31ea6
            return mycmp(self.obj, other.obj) <= 0
Packit Service a31ea6
        def __ge__(self, other):
Packit Service a31ea6
            return mycmp(self.obj, other.obj) >= 0
Packit Service a31ea6
        def __ne__(self, other):
Packit Service a31ea6
            return mycmp(self.obj, other.obj) != 0
Packit Service a31ea6
    return K
Packit Service a31ea6
def writeDoc(name, args, indent, output):
Packit Service a31ea6
     if functions[name][0] is None or functions[name][0] == "":
Packit Service a31ea6
         return
Packit Service a31ea6
     val = functions[name][0]
Packit Service a31ea6
     val = val.replace("NULL", "None")
Packit Service a31ea6
     output.write(indent)
Packit Service a31ea6
     output.write('"""')
Packit Service a31ea6
     while len(val) > 60:
Packit Service a31ea6
         if val[0] == " ":
Packit Service a31ea6
             val = val[1:]
Packit Service a31ea6
             continue
Packit Service a31ea6
         str = val[0:60]
Packit Service a31ea6
         i = str.rfind(" ")
Packit Service a31ea6
         if i < 0:
Packit Service a31ea6
             i = 60
Packit Service a31ea6
         str = val[0:i]
Packit Service a31ea6
         val = val[i:]
Packit Service a31ea6
         output.write(str)
Packit Service a31ea6
         output.write('\n  ')
Packit Service a31ea6
         output.write(indent)
Packit Service a31ea6
     output.write(val)
Packit Service a31ea6
     output.write(' """\n')
Packit Service a31ea6
Packit Service a31ea6
def buildWrappers():
Packit Service a31ea6
    global ctypes
Packit Service a31ea6
    global py_types
Packit Service a31ea6
    global py_return_types
Packit Service a31ea6
    global unknown_types
Packit Service a31ea6
    global functions
Packit Service a31ea6
    global function_classes
Packit Service a31ea6
    global classes_type
Packit Service a31ea6
    global classes_list
Packit Service a31ea6
    global converter_type
Packit Service a31ea6
    global primary_classes
Packit Service a31ea6
    global converter_type
Packit Service a31ea6
    global classes_ancestor
Packit Service a31ea6
    global converter_type
Packit Service a31ea6
    global primary_classes
Packit Service a31ea6
    global classes_ancestor
Packit Service a31ea6
    global classes_destructors
Packit Service a31ea6
    global functions_noexcept
Packit Service a31ea6
Packit Service a31ea6
    for type in classes_type.keys():
Packit Service a31ea6
        function_classes[classes_type[type][2]] = []
Packit Service a31ea6
Packit Service a31ea6
    #
Packit Service a31ea6
    # Build the list of C types to look for ordered to start
Packit Service a31ea6
    # with primary classes
Packit Service a31ea6
    #
Packit Service a31ea6
    ctypes = []
Packit Service a31ea6
    classes_list = []
Packit Service a31ea6
    ctypes_processed = {}
Packit Service a31ea6
    classes_processed = {}
Packit Service a31ea6
    for classe in primary_classes:
Packit Service a31ea6
        classes_list.append(classe)
Packit Service a31ea6
        classes_processed[classe] = ()
Packit Service a31ea6
        for type in classes_type.keys():
Packit Service a31ea6
            tinfo = classes_type[type]
Packit Service a31ea6
            if tinfo[2] == classe:
Packit Service a31ea6
                ctypes.append(type)
Packit Service a31ea6
                ctypes_processed[type] = ()
Packit Service a31ea6
    for type in sorted(classes_type.keys()):
Packit Service a31ea6
        if type in ctypes_processed:
Packit Service a31ea6
            continue
Packit Service a31ea6
        tinfo = classes_type[type]
Packit Service a31ea6
        if tinfo[2] not in classes_processed:
Packit Service a31ea6
            classes_list.append(tinfo[2])
Packit Service a31ea6
            classes_processed[tinfo[2]] = ()
Packit Service a31ea6
Packit Service a31ea6
        ctypes.append(type)
Packit Service a31ea6
        ctypes_processed[type] = ()
Packit Service a31ea6
Packit Service a31ea6
    for name in functions.keys():
Packit Service a31ea6
        found = 0
Packit Service a31ea6
        (desc, ret, args, file, cond) = functions[name]
Packit Service a31ea6
        for type in ctypes:
Packit Service a31ea6
            classe = classes_type[type][2]
Packit Service a31ea6
Packit Service a31ea6
            if name[0:3] == "xml" and len(args) >= 1 and args[0][1] == type:
Packit Service a31ea6
                found = 1
Packit Service a31ea6
                func = nameFixup(name, classe, type, file)
Packit Service a31ea6
                info = (0, func, name, ret, args, file)
Packit Service a31ea6
                function_classes[classe].append(info)
Packit Service a31ea6
            elif name[0:3] == "xml" and len(args) >= 2 and args[1][1] == type \
Packit Service a31ea6
                and file != "python_accessor":
Packit Service a31ea6
                found = 1
Packit Service a31ea6
                func = nameFixup(name, classe, type, file)
Packit Service a31ea6
                info = (1, func, name, ret, args, file)
Packit Service a31ea6
                function_classes[classe].append(info)
Packit Service a31ea6
            elif name[0:4] == "html" and len(args) >= 1 and args[0][1] == type:
Packit Service a31ea6
                found = 1
Packit Service a31ea6
                func = nameFixup(name, classe, type, file)
Packit Service a31ea6
                info = (0, func, name, ret, args, file)
Packit Service a31ea6
                function_classes[classe].append(info)
Packit Service a31ea6
            elif name[0:4] == "html" and len(args) >= 2 and args[1][1] == type \
Packit Service a31ea6
                and file != "python_accessor":
Packit Service a31ea6
                found = 1
Packit Service a31ea6
                func = nameFixup(name, classe, type, file)
Packit Service a31ea6
                info = (1, func, name, ret, args, file)
Packit Service a31ea6
                function_classes[classe].append(info)
Packit Service a31ea6
        if found == 1:
Packit Service a31ea6
            continue
Packit Service a31ea6
        if name[0:8] == "xmlXPath":
Packit Service a31ea6
            continue
Packit Service a31ea6
        if name[0:6] == "xmlStr":
Packit Service a31ea6
            continue
Packit Service a31ea6
        if name[0:10] == "xmlCharStr":
Packit Service a31ea6
            continue
Packit Service a31ea6
        func = nameFixup(name, "None", file, file)
Packit Service a31ea6
        info = (0, func, name, ret, args, file)
Packit Service a31ea6
        function_classes['None'].append(info)
Packit Service a31ea6
   
Packit Service a31ea6
    classes = open("libxml2class.py", "w")
Packit Service a31ea6
    txt = open("libxml2class.txt", "w")
Packit Service a31ea6
    txt.write("          Generated Classes for libxml2-python\n\n")
Packit Service a31ea6
Packit Service a31ea6
    txt.write("#\n# Global functions of the module\n#\n\n")
Packit Service a31ea6
    if "None" in function_classes:
Packit Service a31ea6
        flist = function_classes["None"]
Packit Service a31ea6
        flist = sorted(flist, key=cmp_to_key(functionCompare))
Packit Service a31ea6
        oldfile = ""
Packit Service a31ea6
        for info in flist:
Packit Service a31ea6
            (index, func, name, ret, args, file) = info
Packit Service a31ea6
            if file != oldfile:
Packit Service a31ea6
                classes.write("#\n# Functions from module %s\n#\n\n" % file)
Packit Service a31ea6
                txt.write("\n# functions from module %s\n" % file)
Packit Service a31ea6
                oldfile = file
Packit Service a31ea6
            classes.write("def %s(" % func)
Packit Service a31ea6
            txt.write("%s()\n" % func)
Packit Service a31ea6
            n = 0
Packit Service a31ea6
            for arg in args:
Packit Service a31ea6
                if n != 0:
Packit Service a31ea6
                    classes.write(", ")
Packit Service a31ea6
                classes.write("%s" % arg[0])
Packit Service a31ea6
                n = n + 1
Packit Service a31ea6
            classes.write("):\n")
Packit Service a31ea6
            writeDoc(name, args, '    ', classes)
Packit Service a31ea6
Packit Service a31ea6
            for arg in args:
Packit Service a31ea6
                if arg[1] in classes_type:
Packit Service a31ea6
                    classes.write("    if %s is None: %s__o = None\n" %
Packit Service a31ea6
                                  (arg[0], arg[0]))
Packit Service a31ea6
                    classes.write("    else: %s__o = %s%s\n" %
Packit Service a31ea6
                                  (arg[0], arg[0], classes_type[arg[1]][0]))
Packit Service a31ea6
                if arg[1] in py_types:
Packit Service a31ea6
                    (f, t, n, c) = py_types[arg[1]]
Packit Service a31ea6
                    if t == "File":
Packit Service a31ea6
                        classes.write("    if %s is not None: %s.flush()\n" % (
Packit Service a31ea6
                                      arg[0], arg[0]))
Packit Service a31ea6
Packit Service a31ea6
            if ret[0] != "void":
Packit Service a31ea6
                classes.write("    ret = ")
Packit Service a31ea6
            else:
Packit Service a31ea6
                classes.write("    ")
Packit Service a31ea6
            classes.write("libxml2mod.%s(" % name)
Packit Service a31ea6
            n = 0
Packit Service a31ea6
            for arg in args:
Packit Service a31ea6
                if n != 0:
Packit Service a31ea6
                    classes.write(", ")
Packit Service a31ea6
                classes.write("%s" % arg[0])
Packit Service a31ea6
                if arg[1] in classes_type:
Packit Service a31ea6
                    classes.write("__o")
Packit Service a31ea6
                n = n + 1
Packit Service a31ea6
            classes.write(")\n")
Packit Service a31ea6
Packit Service a31ea6
# This may be needed to reposition the I/O, but likely to cause more harm
Packit Service a31ea6
# than good. Those changes in Python3 really break the model.
Packit Service a31ea6
#           for arg in args:
Packit Service a31ea6
#               if arg[1] in py_types:
Packit Service a31ea6
#                   (f, t, n, c) = py_types[arg[1]]
Packit Service a31ea6
#                   if t == "File":
Packit Service a31ea6
#                       classes.write("    if %s is not None: %s.seek(0,0)\n"%(
Packit Service a31ea6
#                                     arg[0], arg[0]))
Packit Service a31ea6
Packit Service a31ea6
            if ret[0] != "void":
Packit Service a31ea6
                if ret[0] in classes_type:
Packit Service a31ea6
                    #
Packit Service a31ea6
                    # Raise an exception
Packit Service a31ea6
                    #
Packit Service a31ea6
                    if name in functions_noexcept:
Packit Service a31ea6
                        classes.write("    if ret is None:return None\n")
Packit Service a31ea6
                    elif name.find("URI") >= 0:
Packit Service a31ea6
                        classes.write(
Packit Service a31ea6
                        "    if ret is None:raise uriError('%s() failed')\n"
Packit Service a31ea6
                                      % (name))
Packit Service a31ea6
                    elif name.find("XPath") >= 0:
Packit Service a31ea6
                        classes.write(
Packit Service a31ea6
                        "    if ret is None:raise xpathError('%s() failed')\n"
Packit Service a31ea6
                                      % (name))
Packit Service a31ea6
                    elif name.find("Parse") >= 0:
Packit Service a31ea6
                        classes.write(
Packit Service a31ea6
                        "    if ret is None:raise parserError('%s() failed')\n"
Packit Service a31ea6
                                      % (name))
Packit Service a31ea6
                    else:
Packit Service a31ea6
                        classes.write(
Packit Service a31ea6
                        "    if ret is None:raise treeError('%s() failed')\n"
Packit Service a31ea6
                                      % (name))
Packit Service a31ea6
                    classes.write("    return ")
Packit Service a31ea6
                    classes.write(classes_type[ret[0]][1] % ("ret"))
Packit Service a31ea6
                    classes.write("\n")
Packit Service a31ea6
                else:
Packit Service a31ea6
                    classes.write("    return ret\n")
Packit Service a31ea6
            classes.write("\n")
Packit Service a31ea6
Packit Service a31ea6
    txt.write("\n\n#\n# Set of classes of the module\n#\n\n")
Packit Service a31ea6
    for classname in classes_list:
Packit Service a31ea6
        if classname == "None":
Packit Service a31ea6
            pass
Packit Service a31ea6
        else:
Packit Service a31ea6
            if classname in classes_ancestor:
Packit Service a31ea6
                txt.write("\n\nClass %s(%s)\n" % (classname,
Packit Service a31ea6
                          classes_ancestor[classname]))
Packit Service a31ea6
                classes.write("class %s(%s):\n" % (classname,
Packit Service a31ea6
                              classes_ancestor[classname]))
Packit Service a31ea6
                classes.write("    def __init__(self, _obj=None):\n")
Packit Service a31ea6
                if classes_ancestor[classname] == "xmlCore" or \
Packit Service a31ea6
                   classes_ancestor[classname] == "xmlNode":
Packit Service a31ea6
                    classes.write("        if checkWrapper(_obj) != 0:")
Packit Service a31ea6
                    classes.write("            raise TypeError")
Packit Service a31ea6
                    classes.write("('%s got a wrong wrapper object type')\n" % \
Packit Service a31ea6
                                classname)
Packit Service a31ea6
                if classname in reference_keepers:
Packit Service a31ea6
                    rlist = reference_keepers[classname]
Packit Service a31ea6
                    for ref in rlist:
Packit Service a31ea6
                        classes.write("        self.%s = None\n" % ref[1])
Packit Service a31ea6
                classes.write("        self._o = _obj\n")
Packit Service a31ea6
                classes.write("        %s.__init__(self, _obj=_obj)\n\n" % (
Packit Service a31ea6
                              classes_ancestor[classname]))
Packit Service a31ea6
                if classes_ancestor[classname] == "xmlCore" or \
Packit Service a31ea6
                   classes_ancestor[classname] == "xmlNode":
Packit Service a31ea6
                    classes.write("    def __repr__(self):\n")
Packit Service a31ea6
                    format = "<%s (%%s) object at 0x%%x>" % (classname)
Packit Service a31ea6
                    classes.write("        return \"%s\" %% (self.name, int(pos_id (self)))\n\n" % (
Packit Service a31ea6
                                  format))
Packit Service a31ea6
            else:
Packit Service a31ea6
                txt.write("Class %s()\n" % (classname))
Packit Service a31ea6
                classes.write("class %s:\n" % (classname))
Packit Service a31ea6
                classes.write("    def __init__(self, _obj=None):\n")
Packit Service a31ea6
                if classname in reference_keepers:
Packit Service a31ea6
                    list = reference_keepers[classname]
Packit Service a31ea6
                    for ref in list:
Packit Service a31ea6
                        classes.write("        self.%s = None\n" % ref[1])
Packit Service a31ea6
                classes.write("        if _obj != None:self._o = _obj;return\n")
Packit Service a31ea6
                classes.write("        self._o = None\n\n")
Packit Service a31ea6
            destruct=None
Packit Service a31ea6
            if classname in classes_destructors:
Packit Service a31ea6
                classes.write("    def __del__(self):\n")
Packit Service a31ea6
                classes.write("        if self._o != None:\n")
Packit Service a31ea6
                classes.write("            libxml2mod.%s(self._o)\n" %
Packit Service a31ea6
                              classes_destructors[classname])
Packit Service a31ea6
                classes.write("        self._o = None\n\n")
Packit Service a31ea6
                destruct=classes_destructors[classname]
Packit Service a31ea6
            flist = function_classes[classname]
Packit Service a31ea6
            flist = sorted(flist, key=cmp_to_key(functionCompare))
Packit Service a31ea6
            oldfile = ""
Packit Service a31ea6
            for info in flist:
Packit Service a31ea6
                (index, func, name, ret, args, file) = info
Packit Service a31ea6
                #
Packit Service a31ea6
                # Do not provide as method the destructors for the class
Packit Service a31ea6
                # to avoid double free
Packit Service a31ea6
                #
Packit Service a31ea6
                if name == destruct:
Packit Service a31ea6
                    continue
Packit Service a31ea6
                if file != oldfile:
Packit Service a31ea6
                    if file == "python_accessor":
Packit Service a31ea6
                        classes.write("    # accessors for %s\n" % (classname))
Packit Service a31ea6
                        txt.write("    # accessors\n")
Packit Service a31ea6
                    else:
Packit Service a31ea6
                        classes.write("    #\n")
Packit Service a31ea6
                        classes.write("    # %s functions from module %s\n" % (
Packit Service a31ea6
                                      classname, file))
Packit Service a31ea6
                        txt.write("\n    # functions from module %s\n" % file)
Packit Service a31ea6
                        classes.write("    #\n\n")
Packit Service a31ea6
                oldfile = file
Packit Service a31ea6
                classes.write("    def %s(self" % func)
Packit Service a31ea6
                txt.write("    %s()\n" % func)
Packit Service a31ea6
                n = 0
Packit Service a31ea6
                for arg in args:
Packit Service a31ea6
                    if n != index:
Packit Service a31ea6
                        classes.write(", %s" % arg[0])
Packit Service a31ea6
                    n = n + 1
Packit Service a31ea6
                classes.write("):\n")
Packit Service a31ea6
                writeDoc(name, args, '        ', classes)
Packit Service a31ea6
                n = 0
Packit Service a31ea6
                for arg in args:
Packit Service a31ea6
                    if arg[1] in classes_type:
Packit Service a31ea6
                        if n != index:
Packit Service a31ea6
                            classes.write("        if %s is None: %s__o = None\n" %
Packit Service a31ea6
                                          (arg[0], arg[0]))
Packit Service a31ea6
                            classes.write("        else: %s__o = %s%s\n" %
Packit Service a31ea6
                                          (arg[0], arg[0], classes_type[arg[1]][0]))
Packit Service a31ea6
                    n = n + 1
Packit Service a31ea6
                if ret[0] != "void":
Packit Service a31ea6
                    classes.write("        ret = ")
Packit Service a31ea6
                else:
Packit Service a31ea6
                    classes.write("        ")
Packit Service a31ea6
                classes.write("libxml2mod.%s(" % name)
Packit Service a31ea6
                n = 0
Packit Service a31ea6
                for arg in args:
Packit Service a31ea6
                    if n != 0:
Packit Service a31ea6
                        classes.write(", ")
Packit Service a31ea6
                    if n != index:
Packit Service a31ea6
                        classes.write("%s" % arg[0])
Packit Service a31ea6
                        if arg[1] in classes_type:
Packit Service a31ea6
                            classes.write("__o")
Packit Service a31ea6
                    else:
Packit Service a31ea6
                        classes.write("self")
Packit Service a31ea6
                        if arg[1] in classes_type:
Packit Service a31ea6
                            classes.write(classes_type[arg[1]][0])
Packit Service a31ea6
                    n = n + 1
Packit Service a31ea6
                classes.write(")\n")
Packit Service a31ea6
                if ret[0] != "void":
Packit Service a31ea6
                    if ret[0] in classes_type:
Packit Service a31ea6
                        #
Packit Service a31ea6
                        # Raise an exception
Packit Service a31ea6
                        #
Packit Service a31ea6
                        if name in functions_noexcept:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                                "        if ret is None:return None\n")
Packit Service a31ea6
                        elif name.find("URI") >= 0:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise uriError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
                        elif name.find("XPath") >= 0:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise xpathError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
                        elif name.find("Parse") >= 0:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise parserError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
                        else:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise treeError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
Packit Service a31ea6
                        #
Packit Service a31ea6
                        # generate the returned class wrapper for the object
Packit Service a31ea6
                        #
Packit Service a31ea6
                        classes.write("        __tmp = ")
Packit Service a31ea6
                        classes.write(classes_type[ret[0]][1] % ("ret"))
Packit Service a31ea6
                        classes.write("\n")
Packit Service a31ea6
Packit Service a31ea6
                        #
Packit Service a31ea6
                        # Sometime one need to keep references of the source
Packit Service a31ea6
                        # class in the returned class object.
Packit Service a31ea6
                        # See reference_keepers for the list
Packit Service a31ea6
                        #
Packit Service a31ea6
                        tclass = classes_type[ret[0]][2]
Packit Service a31ea6
                        if tclass in reference_keepers:
Packit Service a31ea6
                            list = reference_keepers[tclass]
Packit Service a31ea6
                            for pref in list:
Packit Service a31ea6
                                if pref[0] == classname:
Packit Service a31ea6
                                    classes.write("        __tmp.%s = self\n" %
Packit Service a31ea6
                                                  pref[1])
Packit Service a31ea6
                        #
Packit Service a31ea6
                        # return the class
Packit Service a31ea6
                        #
Packit Service a31ea6
                        classes.write("        return __tmp\n")
Packit Service a31ea6
                    elif ret[0] in converter_type:
Packit Service a31ea6
                        #
Packit Service a31ea6
                        # Raise an exception
Packit Service a31ea6
                        #
Packit Service a31ea6
                        if name in functions_noexcept:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                                "        if ret is None:return None")
Packit Service a31ea6
                        elif name.find("URI") >= 0:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise uriError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
                        elif name.find("XPath") >= 0:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise xpathError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
                        elif name.find("Parse") >= 0:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise parserError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
                        else:
Packit Service a31ea6
                            classes.write(
Packit Service a31ea6
                    "        if ret is None:raise treeError('%s() failed')\n"
Packit Service a31ea6
                                          % (name))
Packit Service a31ea6
                        classes.write("        return ")
Packit Service a31ea6
                        classes.write(converter_type[ret[0]] % ("ret"))
Packit Service a31ea6
                        classes.write("\n")
Packit Service a31ea6
                    else:
Packit Service a31ea6
                        classes.write("        return ret\n")
Packit Service a31ea6
                classes.write("\n")
Packit Service a31ea6
Packit Service a31ea6
    #
Packit Service a31ea6
    # Generate enum constants
Packit Service a31ea6
    #
Packit Service a31ea6
    for type,enum in enums.items():
Packit Service a31ea6
        classes.write("# %s\n" % type)
Packit Service a31ea6
        items = enum.items()
Packit Service a31ea6
        items = sorted(items, key=(lambda i: int(i[1])))
Packit Service a31ea6
        for name,value in items:
Packit Service a31ea6
            classes.write("%s = %s\n" % (name,value))
Packit Service a31ea6
        classes.write("\n")
Packit Service a31ea6
Packit Service a31ea6
    txt.close()
Packit Service a31ea6
    classes.close()
Packit Service a31ea6
Packit Service a31ea6
buildStubs()
Packit Service a31ea6
buildWrappers()