1 | #! /usr/bin/env python
|
---|
2 | ###
|
---|
3 | #
|
---|
4 | # build_glob.py : Build the global_functions.h and global_functions.c
|
---|
5 | # files which are required to implement the user
|
---|
6 | # interface to global variables now that thread specific
|
---|
7 | # data (TSD) is used to emulate global state.
|
---|
8 | #
|
---|
9 | # See Copyright for the status of this software.
|
---|
10 | # [email protected]
|
---|
11 | ###
|
---|
12 | import os, string
|
---|
13 |
|
---|
14 | class globvar:
|
---|
15 | def __init__(self, type, name):
|
---|
16 | self.type=type
|
---|
17 | self.name=name
|
---|
18 |
|
---|
19 | def striplinesep(line):
|
---|
20 | while line and line[-1] in ('\r','\n'):
|
---|
21 | line = line[:-1]
|
---|
22 | return line
|
---|
23 |
|
---|
24 | def writeline(file, line=None):
|
---|
25 | if line:
|
---|
26 | file.write(line)
|
---|
27 | file.write("\n")
|
---|
28 |
|
---|
29 | if __name__ == "__main__":
|
---|
30 | globals={}
|
---|
31 | global_data=open("global.data").readlines()
|
---|
32 | global_code=open("globals.c").readlines()
|
---|
33 | global_hdr=open("include/libxml/globals.h").readlines()
|
---|
34 | global_functions_hdr=open("include/libxml/globals.h", "w+")
|
---|
35 | global_functions_impl=open("globals.c", "w+")
|
---|
36 |
|
---|
37 | #
|
---|
38 | # Rebuild the beginning of the file up to the
|
---|
39 | # Automatically generated string
|
---|
40 | #
|
---|
41 | for line in global_hdr:
|
---|
42 | line = striplinesep(line)
|
---|
43 | if line == " * Automatically generated by build_glob.py.":
|
---|
44 | break
|
---|
45 | writeline(global_functions_hdr, line)
|
---|
46 |
|
---|
47 | writeline(global_functions_hdr, " * Automatically generated by build_glob.py.")
|
---|
48 | writeline(global_functions_hdr, " * Do not modify the previous line.")
|
---|
49 | writeline(global_functions_hdr, " */")
|
---|
50 | writeline(global_functions_hdr)
|
---|
51 |
|
---|
52 | for line in global_code:
|
---|
53 | line = striplinesep(line)
|
---|
54 | if line == " * Automatically generated by build_glob.py.":
|
---|
55 | break
|
---|
56 | writeline(global_functions_impl, line)
|
---|
57 |
|
---|
58 | writeline(global_functions_impl, " * Automatically generated by build_glob.py.")
|
---|
59 | writeline(global_functions_impl, " * Do not modify the previous line.")
|
---|
60 | writeline(global_functions_impl, " */")
|
---|
61 | writeline(global_functions_impl)
|
---|
62 |
|
---|
63 | # Now process the data and write it to the appropriate output file
|
---|
64 | for line in global_data:
|
---|
65 | if line[0]=='#':
|
---|
66 | continue
|
---|
67 | line = striplinesep(line)
|
---|
68 | fields = string.split(line, ",")
|
---|
69 | # Update the header file
|
---|
70 | writeline(global_functions_hdr)
|
---|
71 | global_functions_hdr.write("extern "+fields[0]+" *")
|
---|
72 | if fields[2]:
|
---|
73 | global_functions_hdr.write("(*")
|
---|
74 | global_functions_hdr.write("__"+fields[1]+"(void)")
|
---|
75 | if fields[2]:
|
---|
76 | global_functions_hdr.write(")"+fields[2])
|
---|
77 | writeline(global_functions_hdr,";")
|
---|
78 | writeline(global_functions_hdr, "#ifdef LIBXML_THREAD_ENABLED")
|
---|
79 | writeline(global_functions_hdr,"#define "+fields[1]+" \\")
|
---|
80 | writeline(global_functions_hdr,"(*(__"+fields[1]+"()))")
|
---|
81 | writeline(global_functions_hdr,"#else")
|
---|
82 | if fields[2]:
|
---|
83 | writeline(global_functions_hdr,"LIBXML_DLL_IMPORT extern "+fields[0]+" "+fields[1]+fields[2]+";")
|
---|
84 | else:
|
---|
85 | writeline(global_functions_hdr,"LIBXML_DLL_IMPORT extern "+fields[0]+" "+fields[1]+";")
|
---|
86 | writeline(global_functions_hdr,"#endif")
|
---|
87 | # set/get for per-thread global defaults
|
---|
88 | if fields[3]:
|
---|
89 | writeline(global_functions_hdr,fields[0]+" "+fields[1][:3]+"ThrDef"+fields[1][3:]+"("+fields[0]+" v);")
|
---|
90 | # Update the implementation file
|
---|
91 | writeline(global_functions_impl)
|
---|
92 | # writeline(global_functions_impl, "extern "+fields[0]+" "+fields[1]+";")
|
---|
93 | writeline(global_functions_impl, "#undef\t"+fields[1])
|
---|
94 | writeline(global_functions_impl, fields[0]+" *")
|
---|
95 | if fields[2]:
|
---|
96 | global_functions_impl.write("(*")
|
---|
97 | global_functions_impl.write("__"+fields[1]+"(void)")
|
---|
98 | if fields[2]:
|
---|
99 | writeline(global_functions_impl, ")[]")
|
---|
100 | writeline(global_functions_impl, " {")
|
---|
101 | writeline(global_functions_impl, " if (IS_MAIN_THREAD)")
|
---|
102 | writeline(global_functions_impl, "\treturn (&"+fields[1]+");")
|
---|
103 | writeline(global_functions_impl, " else")
|
---|
104 | writeline(global_functions_impl, "\treturn (&xmlGetGlobalState()->"+fields[1]+");")
|
---|
105 | writeline(global_functions_impl, "}")
|
---|
106 | # set/get for per-thread global defaults
|
---|
107 | if fields[3]:
|
---|
108 | writeline(global_functions_impl,fields[0]+" "+fields[1][:3]+"ThrDef"+fields[1][3:]+"("+fields[0]+" v) {")
|
---|
109 | writeline(global_functions_impl," "+fields[0]+" ret;");
|
---|
110 | writeline(global_functions_impl," xmlMutexLock(xmlThrDefMutex);")
|
---|
111 | writeline(global_functions_impl," ret = "+fields[1][:3]+fields[1][3:]+"ThrDef;")
|
---|
112 | writeline(global_functions_impl," "+fields[1][:3]+fields[1][3:]+"ThrDef = v;")
|
---|
113 | writeline(global_functions_impl," xmlMutexUnlock(xmlThrDefMutex);")
|
---|
114 | writeline(global_functions_impl," return ret;")
|
---|
115 | writeline(global_functions_impl,"}")
|
---|
116 | # Terminate the header file with appropriate boilerplate
|
---|
117 | writeline(global_functions_hdr)
|
---|
118 | writeline(global_functions_hdr, "#ifdef __cplusplus")
|
---|
119 | writeline(global_functions_hdr, "}")
|
---|
120 | writeline(global_functions_hdr, "#endif")
|
---|
121 | writeline(global_functions_hdr)
|
---|
122 | writeline(global_functions_hdr, "#endif /* __XML_GLOBALS_H */")
|
---|