You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
5.1 KiB
122 lines
5.1 KiB
#! /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 */")
|
|
|