#! /usr/bin/env python ### # # build_glob.py : Build the global_functions.h and global_functions.c # files which are required to implement the user # interface to global variables now that thread specific # data (TSD) is used to emulate global state. # # See Copyright for the status of this software. # Gary.Pennington@sun.com ### import os, string class globvar: def __init__(self, type, name): self.type=type self.name=name def striplinesep(line): while line and line[-1] in ('\r','\n'): line = line[:-1] return line def writeline(file, line=None): if line: file.write(line) file.write("\n") if __name__ == "__main__": globals={} global_data=open("global.data").readlines() global_code=open("globals.c").readlines() global_hdr=open("include/libxml/globals.h").readlines() global_functions_hdr=open("include/libxml/globals.h", "w+") global_functions_impl=open("globals.c", "w+") # # Rebuild the beginning of the file up to the # Automatically generated string # for line in global_hdr: line = striplinesep(line) if line == " * Automatically generated by build_glob.py.": break writeline(global_functions_hdr, line) writeline(global_functions_hdr, " * Automatically generated by build_glob.py.") writeline(global_functions_hdr, " * Do not modify the previous line.") writeline(global_functions_hdr, " */") writeline(global_functions_hdr) for line in global_code: line = striplinesep(line) if line == " * Automatically generated by build_glob.py.": break writeline(global_functions_impl, line) writeline(global_functions_impl, " * Automatically generated by build_glob.py.") writeline(global_functions_impl, " * Do not modify the previous line.") writeline(global_functions_impl, " */") writeline(global_functions_impl) # Now process the data and write it to the appropriate output file for line in global_data: if line[0]=='#': continue line = striplinesep(line) fields = string.split(line, ",") # Update the header file writeline(global_functions_hdr) global_functions_hdr.write("extern "+fields[0]+" *") if fields[2]: global_functions_hdr.write("(*") global_functions_hdr.write("__"+fields[1]+"(void)") if fields[2]: global_functions_hdr.write(")"+fields[2]) writeline(global_functions_hdr,";") writeline(global_functions_hdr, "#ifdef LIBXML_THREAD_ENABLED") writeline(global_functions_hdr,"#define "+fields[1]+" \\") writeline(global_functions_hdr,"(*(__"+fields[1]+"()))") writeline(global_functions_hdr,"#else") if fields[2]: writeline(global_functions_hdr,"LIBXML_DLL_IMPORT extern "+fields[0]+" "+fields[1]+fields[2]+";") else: writeline(global_functions_hdr,"LIBXML_DLL_IMPORT extern "+fields[0]+" "+fields[1]+";") writeline(global_functions_hdr,"#endif") # set/get for per-thread global defaults if fields[3]: writeline(global_functions_hdr,fields[0]+" "+fields[1][:3]+"ThrDef"+fields[1][3:]+"("+fields[0]+" v);") # Update the implementation file writeline(global_functions_impl) # writeline(global_functions_impl, "extern "+fields[0]+" "+fields[1]+";") writeline(global_functions_impl, "#undef\t"+fields[1]) writeline(global_functions_impl, fields[0]+" *") if fields[2]: global_functions_impl.write("(*") global_functions_impl.write("__"+fields[1]+"(void)") if fields[2]: writeline(global_functions_impl, ")[]") writeline(global_functions_impl, " {") writeline(global_functions_impl, " if (IS_MAIN_THREAD)") writeline(global_functions_impl, "\treturn (&"+fields[1]+");") writeline(global_functions_impl, " else") writeline(global_functions_impl, "\treturn (&xmlGetGlobalState()->"+fields[1]+");") writeline(global_functions_impl, "}") # set/get for per-thread global defaults if fields[3]: writeline(global_functions_impl,fields[0]+" "+fields[1][:3]+"ThrDef"+fields[1][3:]+"("+fields[0]+" v) {") writeline(global_functions_impl," "+fields[0]+" ret;"); writeline(global_functions_impl," xmlMutexLock(xmlThrDefMutex);") writeline(global_functions_impl," ret = "+fields[1][:3]+fields[1][3:]+"ThrDef;") writeline(global_functions_impl," "+fields[1][:3]+fields[1][3:]+"ThrDef = v;") writeline(global_functions_impl," xmlMutexUnlock(xmlThrDefMutex);") writeline(global_functions_impl," return ret;") writeline(global_functions_impl,"}") # Terminate the header file with appropriate boilerplate writeline(global_functions_hdr) writeline(global_functions_hdr, "#ifdef __cplusplus") writeline(global_functions_hdr, "}") writeline(global_functions_hdr, "#endif") writeline(global_functions_hdr) writeline(global_functions_hdr, "#endif /* __XML_GLOBALS_H */")