⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generator.py

📁 libxml,在UNIX/LINUX下非常重要的一个库,为XML相关应用提供方便.目前上载的是最新版本,若要取得最新版本,请参考里面的readme.
💻 PY
📖 第 1 页 / 共 4 页
字号:
#  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 + -