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

📄 apibuild.py

📁 xml开源解析代码.版本为libxml2-2.6.29,可支持GB3212.网络消息发送XML时很有用.
💻 PY
📖 第 1 页 / 共 5 页
字号:
		    val = info[0]		output.write(" value='%s'" % (val));	    if info[2] != None and info[2] != '':		output.write(" type='%s'" % info[2]);	    if info[1] != None and info[1] != '':		output.write(" info='%s'" % escape(info[1]));        output.write("/>\n")    def serialize_macro(self, output, name):        id = self.idx.macros[name]        output.write("    <macro name='%s' file='%s'>\n" % (name,	             self.modulename_file(id.header)))	if id.info != None:            try:		(args, desc) = id.info		if desc != None and desc != "":		    output.write("      <info>%s</info>\n" % (escape(desc)))		    self.indexString(name, desc)		for arg in args:		    (name, desc) = arg		    if desc != None and desc != "":			output.write("      <arg name='%s' info='%s'/>\n" % (				     name, escape(desc)))			self.indexString(name, desc)		    else:			output.write("      <arg name='%s'/>\n" % (name))            except:                pass        output.write("    </macro>\n")    def serialize_typedef(self, output, name):        id = self.idx.typedefs[name]	if id.info[0:7] == 'struct ':	    output.write("    <struct name='%s' file='%s' type='%s'" % (	             name, self.modulename_file(id.header), id.info))	    name = id.info[7:]	    if self.idx.structs.has_key(name) and ( \	       type(self.idx.structs[name].info) == type(()) or		type(self.idx.structs[name].info) == type([])):	        output.write(">\n");		try:		    for field in self.idx.structs[name].info:			desc = field[2]			self.indexString(name, desc)			if desc == None:			    desc = ''			else:			    desc = escape(desc)			output.write("      <field name='%s' type='%s' info='%s'/>\n" % (field[1] , field[0], desc))		except:		    print "Failed to serialize struct %s" % (name)		output.write("    </struct>\n")	    else:	        output.write("/>\n");	else :	    output.write("    <typedef name='%s' file='%s' type='%s'" % (	                 name, self.modulename_file(id.header), id.info))            try:		desc = id.extra		if desc != None and desc != "":		    output.write(">\n      <info>%s</info>\n" % (escape(desc)))		    output.write("    </typedef>\n")		else:		    output.write("/>\n")	    except:		output.write("/>\n")    def serialize_variable(self, output, name):        id = self.idx.variables[name]	if id.info != None:	    output.write("    <variable name='%s' file='%s' type='%s'/>\n" % (		    name, self.modulename_file(id.header), id.info))	else:	    output.write("    <variable name='%s' file='%s'/>\n" % (	            name, self.modulename_file(id.header)))	                  def serialize_function(self, output, name):        id = self.idx.functions[name]	if name == debugsym:	    print "=>", id        output.write("    <%s name='%s' file='%s' module='%s'>\n" % (id.type,	             name, self.modulename_file(id.header),		     self.modulename_file(id.module)))	#	# Processing of conditionals modified by Bill 1/1/05	#	if id.conditionals != None:	    apstr = ""	    for cond in id.conditionals:	        if apstr != "":		    apstr = apstr + " &amp;&amp; "		apstr = apstr + cond	    output.write("      <cond>%s</cond>\n"% (apstr));	try:	    (ret, params, desc) = id.info	    output.write("      <info>%s</info>\n" % (escape(desc)))	    self.indexString(name, desc)	    if ret[0] != None:	        if ret[0] == "void":		    output.write("      <return type='void'/>\n")		else:		    output.write("      <return type='%s' info='%s'/>\n" % (			     ret[0], escape(ret[1])))		    self.indexString(name, ret[1])	    for param in params:	        if param[0] == 'void':		    continue	        if param[2] == None:		    output.write("      <arg name='%s' type='%s' info=''/>\n" % (param[1], param[0]))		else:		    output.write("      <arg name='%s' type='%s' info='%s'/>\n" % (param[1], param[0], escape(param[2])))		    self.indexString(name, param[2])	except:	    print "Failed to save function %s info: " % name, `id.info`        output.write("    </%s>\n" % (id.type))    def serialize_exports(self, output, file):        module = self.modulename_file(file)	output.write("    <file name='%s'>\n" % (module))	dict = self.headers[file]	if dict.info != None:	    for data in ('Summary', 'Description', 'Author'):		try:		    output.write("     <%s>%s</%s>\n" % (		                 string.lower(data),				 escape(dict.info[data]),				 string.lower(data)))		except:		    print "Header %s lacks a %s description" % (module, data)	    if dict.info.has_key('Description'):	        desc = dict.info['Description']		if string.find(desc, "DEPRECATED") != -1:		    output.write("     <deprecated/>\n")        ids = dict.macros.keys()	ids.sort()	for id in uniq(ids):	    # Macros are sometime used to masquerade other types.	    if dict.functions.has_key(id):	        continue	    if dict.variables.has_key(id):	        continue	    if dict.typedefs.has_key(id):	        continue	    if dict.structs.has_key(id):	        continue	    if dict.enums.has_key(id):	        continue	    output.write("     <exports symbol='%s' type='macro'/>\n" % (id))        ids = dict.enums.keys()	ids.sort()	for id in uniq(ids):	    output.write("     <exports symbol='%s' type='enum'/>\n" % (id))        ids = dict.typedefs.keys()	ids.sort()	for id in uniq(ids):	    output.write("     <exports symbol='%s' type='typedef'/>\n" % (id))        ids = dict.structs.keys()	ids.sort()	for id in uniq(ids):	    output.write("     <exports symbol='%s' type='struct'/>\n" % (id))        ids = dict.variables.keys()	ids.sort()	for id in uniq(ids):	    output.write("     <exports symbol='%s' type='variable'/>\n" % (id))        ids = dict.functions.keys()	ids.sort()	for id in uniq(ids):	    output.write("     <exports symbol='%s' type='function'/>\n" % (id))	output.write("    </file>\n")    def serialize_xrefs_files(self, output):        headers = self.headers.keys()        headers.sort()        for file in headers:	    module = self.modulename_file(file)	    output.write("    <file name='%s'>\n" % (module))	    dict = self.headers[file]	    ids = uniq(dict.functions.keys() + dict.variables.keys() + \		  dict.macros.keys() + dict.typedefs.keys() + \		  dict.structs.keys() + dict.enums.keys())	    ids.sort()	    for id in ids:		output.write("      <ref name='%s'/>\n" % (id))	    output.write("    </file>\n")        pass    def serialize_xrefs_functions(self, output):        funcs = {}	for name in self.idx.functions.keys():	    id = self.idx.functions[name]	    try:		(ret, params, desc) = id.info		for param in params:		    if param[0] == 'void':			continue		    if funcs.has_key(param[0]):		        funcs[param[0]].append(name)		    else:		        funcs[param[0]] = [name]	    except:	        pass	typ = funcs.keys()	typ.sort()	for type in typ:	    if type == '' or type == 'void' or type == "int" or \	       type == "char *" or type == "const char *" :	        continue	    output.write("    <type name='%s'>\n" % (type))	    ids = funcs[type]	    ids.sort()	    pid = ''	# not sure why we have dups, but get rid of them!	    for id in ids:	        if id != pid:	            output.write("      <ref name='%s'/>\n" % (id))		    pid = id	    output.write("    </type>\n")    def serialize_xrefs_constructors(self, output):        funcs = {}	for name in self.idx.functions.keys():	    id = self.idx.functions[name]	    try:		(ret, params, desc) = id.info		if ret[0] == "void":		    continue		if funcs.has_key(ret[0]):		    funcs[ret[0]].append(name)		else:		    funcs[ret[0]] = [name]	    except:	        pass	typ = funcs.keys()	typ.sort()	for type in typ:	    if type == '' or type == 'void' or type == "int" or \	       type == "char *" or type == "const char *" :	        continue	    output.write("    <type name='%s'>\n" % (type))	    ids = funcs[type]	    ids.sort()	    for id in ids:	        output.write("      <ref name='%s'/>\n" % (id))	    output.write("    </type>\n")    def serialize_xrefs_alpha(self, output):	letter = None	ids = self.idx.identifiers.keys()	ids.sort()	for id in ids:	    if id[0] != letter:		if letter != None:		    output.write("    </letter>\n")		letter = id[0]		output.write("    <letter name='%s'>\n" % (letter))	    output.write("      <ref name='%s'/>\n" % (id))	if letter != None:	    output.write("    </letter>\n")    def serialize_xrefs_references(self, output):        typ = self.idx.identifiers.keys()	typ.sort()	for id in typ:	    idf = self.idx.identifiers[id]	    module = idf.header	    output.write("    <reference name='%s' href='%s'/>\n" % (id,	                 'html/' + self.basename + '-' +		         self.modulename_file(module) + '.html#' +			 id))    def serialize_xrefs_index(self, output):        index = self.xref	typ = index.keys()	typ.sort()	letter = None	count = 0	chunk = 0	chunks = []	for id in typ:	    if len(index[id]) > 30:		continue	    if id[0] != letter:		if letter == None or count > 200:		    if letter != None:			output.write("      </letter>\n")			output.write("    </chunk>\n")			count = 0			chunks.append(["chunk%s" % (chunk -1), first_letter, letter])		    output.write("    <chunk name='chunk%s'>\n" % (chunk))		    first_letter = id[0]		    chunk = chunk + 1		elif letter != None:		    output.write("      </letter>\n")		letter = id[0]		output.write("      <letter name='%s'>\n" % (letter))	    output.write("        <word name='%s'>\n" % (id))	    tokens = index[id];	    tokens.sort()	    tok = None	    for token in tokens:		if tok == token:		    continue		tok = token		output.write("          <ref name='%s'/>\n" % (token))		count = count + 1	    output.write("        </word>\n")	if letter != None:	    output.write("      </letter>\n")	    output.write("    </chunk>\n")	    if count != 0:	        chunks.append(["chunk%s" % (chunk -1), first_letter, letter])	    output.write("    <chunks>\n")	    for ch in chunks:		output.write("      <chunk name='%s' start='%s' end='%s'/>\n" % (			     ch[0], ch[1], ch[2]))	    output.write("    </chunks>\n")    def serialize_xrefs(self, output):	output.write("  <references>\n")	self.serialize_xrefs_references(output)	output.write("  </references>\n")	output.write("  <alpha>\n")	self.serialize_xrefs_alpha(output)	output.write("  </alpha>\n")	output.write("  <constructors>\n")	self.serialize_xrefs_constructors(output)	output.write("  </constructors>\n")	output.write("  <functions>\n")	self.serialize_xrefs_functions(output)	output.write("  </functions>\n")	output.write("  <files>\n")	self.serialize_xrefs_files(output)	output.write("  </files>\n")	output.write("  <index>\n")	self.serialize_xrefs_index(output)	output.write("  </index>\n")    def serialize(self):        filename = "%s-api.xml" % self.name        print "Saving XML description %s" % (filename)        output = open(filename, "w")        output.write('<?xml version="1.0" encoding="ISO-8859-1"?>\n')        output.write("<api name='%s'>\n" % self.name)        output.write("  <files>\n")        headers = self.headers.keys()        headers.sort()        for file in headers:            self.serialize_exports(output, file)        output.write("  </files>\n")        output.write("  <symbols>\n")        macros = self.idx.macros.keys()        macros.sort()        for macro in macros:            self.serialize_macro(output, macro)        enums = self.idx.enums.keys()        enums.sort()        for enum in enums:            self.serialize_enum(output, enum)        typedefs = self.idx.typedefs.keys()        typedefs.sort()        for typedef in typedefs:            self.serialize_typedef(output, typedef)        variables = self.idx.variables.keys()        variables.sort()        for variable in variables:            self.serialize_variable(output, variable)        functions = self.idx.functions.keys()        functions.sort()        for function in functions:            self.serialize_function(output, function)        output.write("  </symbols>\n")        output.write("</api>\n")        output.close()        filename = "%s-refs.xml" % self.name        print "Saving XML Cross References %s" % (filename)        output = open(filename, "w")        output.write('<?xml version="1.0" encoding="ISO-8859-1"?>\n')        output.write("<apirefs name='%s'>\n" % self.name)        self.serialize_xrefs(output)        output.write("</apirefs>\n")        output.close()def rebuild():    builder = None    if glob.glob("parser.c") != [] :        print "Rebuilding API description for libxml2"	builder = docBuilder("libxml2", [".", "."],	                     ["xmlwin32version.h", "tst.c"])    elif glob.glob("../parser.c") != [] :        print "Rebuilding API description for libxml2"	builder = docBuilder("libxml2", ["..", "../include/libxml"],	                     ["xmlwin32version.h", "tst.c"])    elif glob.glob("../libxslt/transform.c") != [] :        print "Rebuilding API description for libxslt"	builder = docBuilder("libxslt", ["../libxslt"],	                     ["win32config.h", "libxslt.h", "tst.c"])    else:        print "rebuild() failed, unable to guess the module"	return None    builder.scan()    builder.analyze()    builder.serialize()    if glob.glob("../libexslt/exslt.c") != [] :        extra = docBuilder("libexslt", ["../libexslt"], ["libexslt.h"])	extra.scan()	extra.analyze()	extra.serialize()    return builder## for debugging the parser#def parse(filename):    parser = CParser(filename)    idx = parser.parse()    return idxif __name__ == "__main__":    if len(sys.argv) > 1:        debug = 1        parse(sys.argv[1])    else:	rebuild()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -