📄 generator.py
字号:
# This part writes the C <-> Python stubs libxml2-py.[ch] and# the table libxml2-export.c to add when registrering the Python module######################################################################### Class methods which are written by hand in libxml.c but the Python-level# code is still automatically generated (so they are not in skip_function()).skip_impl = ( 'xmlSaveFileTo', 'xmlSaveFormatFileTo',)def skip_function(name): if name[0:12] == "xmlXPathWrap": return 1 if name == "xmlFreeParserCtxt": return 1 if name == "xmlCleanupParser": return 1 if name == "xmlFreeTextReader": return 1# if name[0:11] == "xmlXPathNew":# return 1 # the next function is defined in libxml.c if name == "xmlRelaxNGFreeValidCtxt": return 1 if name == "xmlFreeValidCtxt": return 1 if name == "xmlSchemaFreeValidCtxt": return 1## Those are skipped because the Const version is used of the bindings# instead.# if name == "xmlTextReaderBaseUri": return 1 if name == "xmlTextReaderLocalName": return 1 if name == "xmlTextReaderName": return 1 if name == "xmlTextReaderNamespaceUri": return 1 if name == "xmlTextReaderPrefix": return 1 if name == "xmlTextReaderXmlLang": return 1 if name == "xmlTextReaderValue": return 1 if name == "xmlOutputBufferClose": # handled by by the superclass return 1 if name == "xmlOutputBufferFlush": # handled by by the superclass return 1 if name == "xmlErrMemory": return 1 if name == "xmlValidBuildContentModel": return 1 if name == "xmlValidateElementDecl": return 1 if name == "xmlValidateAttributeDecl": return 1 return 0def print_function_wrapper(name, output, export, include): global py_types global unknown_types global functions global skipped_modules try: (desc, ret, args, file) = functions[name] except: print "failed to get function %s infos" return if skipped_modules.has_key(file): return 0 if skip_function(name) == 1: return 0 if name in skip_impl: # Don't delete the function entry in the caller. return 1 c_call = ""; format="" format_args="" c_args="" c_return="" c_convert="" num_bufs=0 for arg in args: # This should be correct if arg[1][0:6] == "const ": arg[1] = arg[1][6:] c_args = c_args + " %s %s;\n" % (arg[1], arg[0]) if py_types.has_key(arg[1]): (f, t, n, c) = py_types[arg[1]] if (f == 'z') and (name in foreign_encoding_args) and (num_bufs == 0): f = 't#' if f != None: format = format + f if t != None: format_args = format_args + ", &pyobj_%s" % (arg[0]) c_args = c_args + " PyObject *pyobj_%s;\n" % (arg[0]) c_convert = c_convert + \ " %s = (%s) Py%s_Get(pyobj_%s);\n" % (arg[0], arg[1], t, arg[0]); else: format_args = format_args + ", &%s" % (arg[0]) if f == 't#': format_args = format_args + ", &py_buffsize%d" % num_bufs c_args = c_args + " int py_buffsize%d;\n" % num_bufs num_bufs = num_bufs + 1 if c_call != "": c_call = c_call + ", "; c_call = c_call + "%s" % (arg[0]) else: if skipped_types.has_key(arg[1]): return 0 if unknown_types.has_key(arg[1]): lst = unknown_types[arg[1]] lst.append(name) else: unknown_types[arg[1]] = [name] return -1 if format != "": format = format + ":%s" % (name) if ret[0] == 'void': if file == "python_accessor": if args[1][1] == "char *" or args[1][1] == "xmlChar *": c_call = "\n if (%s->%s != NULL) xmlFree(%s->%s);\n" % ( args[0][0], args[1][0], args[0][0], args[1][0]) c_call = c_call + " %s->%s = (%s)xmlStrdup((const xmlChar *)%s);\n" % (args[0][0], args[1][0], args[1][1], args[1][0]) else: c_call = "\n %s->%s = %s;\n" % (args[0][0], args[1][0], args[1][0]) else: c_call = "\n %s(%s);\n" % (name, c_call); ret_convert = " Py_INCREF(Py_None);\n return(Py_None);\n" elif py_types.has_key(ret[0]): (f, t, n, c) = py_types[ret[0]] c_return = " %s c_retval;\n" % (ret[0]) if file == "python_accessor" and ret[2] != None: c_call = "\n c_retval = %s->%s;\n" % (args[0][0], ret[2]) else: c_call = "\n c_retval = %s(%s);\n" % (name, c_call); ret_convert = " py_retval = libxml_%sWrap((%s) c_retval);\n" % (n,c) ret_convert = ret_convert + " return(py_retval);\n" elif py_return_types.has_key(ret[0]): (f, t, n, c) = py_return_types[ret[0]] c_return = " %s c_retval;\n" % (ret[0]) c_call = "\n c_retval = %s(%s);\n" % (name, c_call); ret_convert = " py_retval = libxml_%sWrap((%s) c_retval);\n" % (n,c) ret_convert = ret_convert + " return(py_retval);\n" else: if skipped_types.has_key(ret[0]): return 0 if unknown_types.has_key(ret[0]): lst = unknown_types[ret[0]] lst.append(name) else: unknown_types[ret[0]] = [name] return -1 if file == "debugXML": include.write("#ifdef LIBXML_DEBUG_ENABLED\n"); export.write("#ifdef LIBXML_DEBUG_ENABLED\n"); output.write("#ifdef LIBXML_DEBUG_ENABLED\n"); elif file == "HTMLtree" or file == "HTMLparser" or name[0:4] == "html": include.write("#ifdef LIBXML_HTML_ENABLED\n"); export.write("#ifdef LIBXML_HTML_ENABLED\n"); output.write("#ifdef LIBXML_HTML_ENABLED\n"); elif file == "c14n": include.write("#ifdef LIBXML_C14N_ENABLED\n"); export.write("#ifdef LIBXML_C14N_ENABLED\n"); output.write("#ifdef LIBXML_C14N_ENABLED\n"); elif file == "xpathInternals" or file == "xpath": include.write("#ifdef LIBXML_XPATH_ENABLED\n"); export.write("#ifdef LIBXML_XPATH_ENABLED\n"); output.write("#ifdef LIBXML_XPATH_ENABLED\n"); elif file == "xpointer": include.write("#ifdef LIBXML_XPTR_ENABLED\n"); export.write("#ifdef LIBXML_XPTR_ENABLED\n"); output.write("#ifdef LIBXML_XPTR_ENABLED\n"); elif file == "xinclude": include.write("#ifdef LIBXML_XINCLUDE_ENABLED\n"); export.write("#ifdef LIBXML_XINCLUDE_ENABLED\n"); output.write("#ifdef LIBXML_XINCLUDE_ENABLED\n"); elif file == "xmlregexp": include.write("#ifdef LIBXML_REGEXP_ENABLED\n"); export.write("#ifdef LIBXML_REGEXP_ENABLED\n"); output.write("#ifdef LIBXML_REGEXP_ENABLED\n"); elif file == "xmlschemas" or file == "xmlschemastypes" or \ file == "relaxng": include.write("#ifdef LIBXML_SCHEMAS_ENABLED\n"); export.write("#ifdef LIBXML_SCHEMAS_ENABLED\n"); output.write("#ifdef LIBXML_SCHEMAS_ENABLED\n"); include.write("PyObject * ") include.write("libxml_%s(PyObject *self, PyObject *args);\n" % (name)); export.write(" { (char *)\"%s\", libxml_%s, METH_VARARGS, NULL },\n" % (name, name)) if file == "python": # Those have been manually generated if name[0:4] == "html": include.write("#endif /* LIBXML_HTML_ENABLED */\n"); export.write("#endif /* LIBXML_HTML_ENABLED */\n"); output.write("#endif /* LIBXML_HTML_ENABLED */\n"); return 1 if file == "python_accessor" and ret[0] != "void" and ret[2] is None: # Those have been manually generated if name[0:4] == "html": include.write("#endif /* LIBXML_HTML_ENABLED */\n"); export.write("#endif /* LIBXML_HTML_ENABLED */\n"); output.write("#endif /* LIBXML_HTML_ENABLED */\n"); return 1 output.write("PyObject *\n") output.write("libxml_%s(PyObject *self ATTRIBUTE_UNUSED," % (name)) output.write(" PyObject *args") if format == "": output.write(" ATTRIBUTE_UNUSED") output.write(") {\n") if ret[0] != 'void': output.write(" PyObject *py_retval;\n") if c_return != "": output.write(c_return) if c_args != "": output.write(c_args) if format != "": output.write("\n if (!PyArg_ParseTuple(args, (char *)\"%s\"%s))\n" % (format, format_args)) output.write(" return(NULL);\n") if c_convert != "": output.write(c_convert) output.write(c_call) output.write(ret_convert) output.write("}\n\n") if file == "debugXML": include.write("#endif /* LIBXML_DEBUG_ENABLED */\n"); export.write("#endif /* LIBXML_DEBUG_ENABLED */\n"); output.write("#endif /* LIBXML_DEBUG_ENABLED */\n"); elif file == "HTMLtree" or file == "HTMLparser" or name[0:4] == "html": include.write("#endif /* LIBXML_HTML_ENABLED */\n"); export.write("#endif /* LIBXML_HTML_ENABLED */\n"); output.write("#endif /* LIBXML_HTML_ENABLED */\n"); elif file == "c14n": include.write("#endif /* LIBXML_C14N_ENABLED */\n"); export.write("#endif /* LIBXML_C14N_ENABLED */\n"); output.write("#endif /* LIBXML_C14N_ENABLED */\n"); elif file == "xpathInternals" or file == "xpath": include.write("#endif /* LIBXML_XPATH_ENABLED */\n"); export.write("#endif /* LIBXML_XPATH_ENABLED */\n"); output.write("#endif /* LIBXML_XPATH_ENABLED */\n"); elif file == "xpointer": include.write("#endif /* LIBXML_XPTR_ENABLED */\n"); export.write("#endif /* LIBXML_XPTR_ENABLED */\n"); output.write("#endif /* LIBXML_XPTR_ENABLED */\n"); elif file == "xinclude": include.write("#endif /* LIBXML_XINCLUDE_ENABLED */\n"); export.write("#endif /* LIBXML_XINCLUDE_ENABLED */\n"); output.write("#endif /* LIBXML_XINCLUDE_ENABLED */\n"); elif file == "xmlregexp": include.write("#endif /* LIBXML_REGEXP_ENABLED */\n"); export.write("#endif /* LIBXML_REGEXP_ENABLED */\n"); output.write("#endif /* LIBXML_REGEXP_ENABLED */\n"); elif file == "xmlschemas" or file == "xmlschemastypes" or \ file == "relaxng": include.write("#endif /* LIBXML_SCHEMAS_ENABLED */\n"); export.write("#endif /* LIBXML_SCHEMAS_ENABLED */\n"); output.write("#endif /* LIBXML_SCHEMAS_ENABLED */\n"); return 1def buildStubs(): global py_types global py_return_types global unknown_types try: f = open(os.path.join(srcPref,"libxml2-api.xml")) data = f.read() (parser, target) = getparser() parser.feed(data) parser.close() except IOError, msg: try: f = open(os.path.join(srcPref,"..","doc","libxml2-api.xml")) data = f.read() (parser, target) = getparser() parser.feed(data) parser.close() except IOError, msg: print file, ":", msg sys.exit(1) n = len(functions.keys()) print "Found %d functions in libxml2-api.xml" % (n) py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject") try: f = open(os.path.join(srcPref,"libxml2-python-api.xml")) data = f.read() (parser, target) = getparser() parser.feed(data) parser.close() except IOError, msg: print file, ":", msg print "Found %d functions in libxml2-python-api.xml" % ( len(functions.keys()) - n) nb_wrap = 0 failed = 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -