build_glob.py 4.35 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
#! /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)
        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,";")
76
        writeline(global_functions_hdr, "#ifdef LIBXML_THREAD_ENABLED")
77 78 79 80
        writeline(global_functions_hdr,"#define "+fields[1]+" \\")
        writeline(global_functions_hdr,"(*(__"+fields[1]+"()))")
        writeline(global_functions_hdr,"#else")
        if len(fields) == 3:
81
            writeline(global_functions_hdr,"LIBXML_DLL_IMPORT extern "+fields[0]+" "+fields[1]+fields[2]+";")
82
        else:
83
            writeline(global_functions_hdr,"LIBXML_DLL_IMPORT extern "+fields[0]+" "+fields[1]+";")
84 85 86
        writeline(global_functions_hdr,"#endif")
        # Update the implementation file
        writeline(global_functions_impl)
87
#        writeline(global_functions_impl, "extern "+fields[0]+" "+fields[1]+";")
88 89 90 91 92 93 94 95 96 97 98
        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")
99
        writeline(global_functions_impl, "\treturn (&xmlGetGlobalState()->"+fields[1]+");")
100 101 102 103 104 105 106 107
        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 */")