#! /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 writeline(file, line=None):
    if line:
        file.write(line)
    file.write(os.linesep)

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:
        if line[-len(os.linesep):] == os.linesep:
            line = line[:-len(os.linesep)]
        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:
        if line[-len(os.linesep):] == os.linesep:
            line = line[:-len(os.linesep)]
        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
        if line[-len(os.linesep):] == os.linesep:
            line = line[:-len(os.linesep)]
        fields = string.split(line, ",")
        # Update the header file
        writeline(global_functions_hdr)
        writeline(global_functions_hdr, "#ifdef LIBXML_THREAD_ENABLED")
        global_functions_hdr.write("extern "+fields[0]+" *")
        if len(fields) == 3:
            global_functions_hdr.write("(*")
        global_functions_hdr.write("__"+fields[1]+"(void)")
        if len(fields) == 3:
            global_functions_hdr.write(")"+fields[2])
        writeline(global_functions_hdr,";")
        writeline(global_functions_hdr,"#define "+fields[1]+" \\")
        writeline(global_functions_hdr,"(*(__"+fields[1]+"()))")
        writeline(global_functions_hdr,"#else")
        if len(fields) == 3:
            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")
        # 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 len(fields) == 3:
            global_functions_impl.write("(*")
        global_functions_impl.write("__"+fields[1]+"(void)")
        if len(fields) == 3:
            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, "}")
    # 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 */")
