Edit

kc3-lang/libxml2/build_glob.py

Branch :

  • Show log

    Commit

  • Author : Daniel Veillard
    Date : 2003-05-15 22:11:36
    Hash : 781ac8b1
    Message : patch from St

  • build_glob.py
  • #! /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 */")