2001-10-12 21:29:10 +04:00
#! /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 :
2001-10-13 13:15:48 +04:00
writeline ( global_functions_hdr , " LIBXML_DLL_IMPORT extern " + fields [ 0 ] + " " + fields [ 1 ] + fields [ 2 ] + " ; " )
2001-10-12 21:29:10 +04:00
else :
2001-10-13 13:15:48 +04:00
writeline ( global_functions_hdr , " LIBXML_DLL_IMPORT extern " + fields [ 0 ] + " " + fields [ 1 ] + " ; " )
2001-10-12 21:29:10 +04:00
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 , " \t return (& " + fields [ 1 ] + " ); " )
writeline ( global_functions_impl , " else " )
2001-10-13 13:15:48 +04:00
writeline ( global_functions_impl , " \t return (&xmlGetGlobalState()-> " + fields [ 1 ] + " ); " )
2001-10-12 21:29:10 +04:00
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 */ " )