| #! /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 */") |