/ libxml2 / build_glob.py
build_glob.py
  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  #       Gary.Pennington@sun.com
 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 */")