#! /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 writeline(file, line=None): if line: file.write(line) file.write(os.linesep) 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: if line[-len(os.linesep):] == os.linesep: line = line[:-len(os.linesep)] 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: if line[-len(os.linesep):] == os.linesep: line = line[:-len(os.linesep)] 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 if line[-len(os.linesep):] == os.linesep: line = line[:-len(os.linesep)] fields = string.split(line, ",") # Update the header file writeline(global_functions_hdr) global_functions_hdr.write("extern "+fields[0]+" *") if len(fields) == 3: global_functions_hdr.write("(*") global_functions_hdr.write("__"+fields[1]+"(void)") if len(fields) == 3: 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 len(fields) == 3: 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") # 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 len(fields) == 3: global_functions_impl.write("(*") global_functions_impl.write("__"+fields[1]+"(void)") if len(fields) == 3: 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, "}") # 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 */")