summaryrefslogtreecommitdiffstats
path: root/libxml2/build_glob.py
diff options
context:
space:
mode:
Diffstat (limited to 'libxml2/build_glob.py')
-rwxr-xr-xlibxml2/build_glob.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/libxml2/build_glob.py b/libxml2/build_glob.py
new file mode 100755
index 0000000..8855ec7
--- /dev/null
+++ b/libxml2/build_glob.py
@@ -0,0 +1,122 @@
+#! /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 */")