cgen.py revision 85a5fbbdfea617f6cc8fae82c9e8c2b5c424436d
185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Python script to parse cstubs file for gl and generate C stubs. 285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# usage: python cgen <cstubs >glmodule.c 385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# XXX BUG return arrays generate wrong code 585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# XXX need to change error returns into gotos to free mallocked arrays 685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumimport string 985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumimport sys 1085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 1185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 1285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to print to stderr 1385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 1485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef err(args): 1585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum savestdout = sys.stdout 1685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum try: 1785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum sys.stdout = sys.stderr 1885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in args: 1985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print i, 2085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 2185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum finally: 2285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum sys.stdout = savestdout 2385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 2485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 2585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# The set of digits that form a number 2685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 2785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdigits = '0123456789' 2885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 2985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 3085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to extract a string of digits from the front of the string. 3185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Returns the leading string of digits and the remaining string. 3285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# If no number is found, returns '' and the original string. 3385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 3485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef getnum(s): 3585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n = '' 3685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum while s[:1] in digits: 3785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n = n + s[:1] 3885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum s = s[1:] 3985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum return n, s 4085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 4185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 4285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to check if a string is a number 4385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 4485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef isnum(s): 4585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if not s: return 0 4685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for c in s: 4785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if not c in digits: return 0 4885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum return 1 4985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 5085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 5185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Allowed function return types 5285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 5385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumreturn_types = ['void', 'short', 'long'] 5485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 5585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 5685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Allowed function argument types 5785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 5885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumarg_types = ['char', 'string', 'short', 'float', 'long', 'double'] 5985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 6085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 6185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Need to classify arguments as follows 6285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# simple input variable 6385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# simple output variable 6485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# input array 6585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# output array 6685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# input giving size of some array 6785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 6885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Array dimensions can be specified as follows 6985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# constant 7085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# argN 7185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# constant * argN 7285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# retval 7385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# constant * retval 7485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 7585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# The dimensions given as constants * something are really 7685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# arrays of points where points are 2- 3- or 4-tuples 7785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 7885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# We have to consider three lists: 7985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# python input arguments 8085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# C stub arguments (in & out) 8185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# python output arguments (really return values) 8285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 8385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# There is a mapping from python input arguments to the input arguments 8485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# of the C stub, and a further mapping from C stub arguments to the 8585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# python return values 8685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 8785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 8885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Exception raised by checkarg() and generate() 8985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 9085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumarg_error = 'bad arg' 9185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 9285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 9385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to check one argument. 9485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Arguments: the type and the arg "name" (really mode plus subscript). 9585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Raises arg_error if something's wrong. 9685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Return type, mode, factor, rest of subscript; factor and rest may be empty. 9785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 9885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef checkarg(type, arg): 9985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 10085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Turn "char *x" into "string x". 10185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 10285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if type = 'char' and arg[0] = '*': 10385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum type = 'string' 10485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum arg = arg[1:] 10585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 10685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Check that the type is supported. 10785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 10885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if type not in arg_types: 10985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, ('bad type', type) 11085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 11185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Split it in the mode (first character) and the rest. 11285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 11385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum mode, rest = arg[:1], arg[1:] 11485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 11585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # The mode must be 's' for send (= input) or 'r' for return argument. 11685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 11785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if mode not in ('r', 's'): 11885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, ('bad arg mode', mode) 11985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 12085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Is it a simple argument: if so, we are done. 12185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 12285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if not rest: 12385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum return type, mode, '', '' 12485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 12585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Not a simple argument; must be an array. 12685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # The 'rest' must be a subscript enclosed in [ and ]. 12785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # The subscript must be one of the following forms, 12885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # otherwise we don't handle it (where N is a number): 12985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # N 13085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # argN 13185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # retval 13285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # N*argN 13385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # N*retval 13485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 13585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if rest[:1] <> '[' or rest[-1:] <> ']': 13685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, ('subscript expected', rest) 13785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum sub = rest[1:-1] 13885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 13985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Is there a leading number? 14085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 14185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum num, sub = getnum(sub) 14285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if num: 14385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # There is a leading number 14485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if not sub: 14585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # The subscript is just a number 14685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum return type, mode, num, '' 14785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if sub[:1] = '*': 14885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # There is a factor prefix 14985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum sub = sub[1:] 15085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 15185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, ('\'*\' expected', sub) 15285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if sub = 'retval': 15385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # size is retval -- must be a reply argument 15485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if mode <> 'r': 15585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, ('non-r mode with [retval]', mode) 15685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif sub[:3] <> 'arg' or not isnum(sub[3:]): 15785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, ('bad subscript', sub) 15885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 15985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum return type, mode, num, sub 16085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 16185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 16285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# List of functions for which we have generated stubs 16385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 16485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumfunctions = [] 16585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 16685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 16785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Generate the stub for the given function, using the database of argument 16885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# information build by successive calls to checkarg() 16985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 17085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef generate(type, func, database): 17185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 17285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Check that we can handle this case: 17385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # no variable size reply arrays yet 17485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 17585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n_in_args = 0 17685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n_out_args = 0 17785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 17885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for a_type, a_mode, a_factor, a_sub in database: 17985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 's': 18085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n_in_args = n_in_args + 1 18185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif a_mode = 'r': 18285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n_out_args = n_out_args + 1 18385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 18485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Can't happen 18585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, ('bad a_mode', a_mode) 18685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if (a_mode = 'r' and a_sub) or a_sub = 'retval': 18785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum e = 'Function', func, 'too complicated:' 18885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum err(e + (a_type, a_mode, a_factor, a_sub)) 18985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '/* XXX Too complicated to generate code for */' 19085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum return 19185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 19285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum functions.append(func) 19385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 19485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Stub header 19585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 19685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 19785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 'static object *' 19885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 'gl_' + func + '(self, args)' 19985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tobject *self;' 20085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tobject *args;' 20185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '{' 20285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 20385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Declare return value if any 20485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 20585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if type <> 'void': 20685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t' + type, 'retval;' 20785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 20885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Declare arguments 20985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 21085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 21185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 21285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t' + a_type, 21385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_sub: 21485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '*', 21585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 'arg' + `i+1`, 21685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_factor and not a_sub: 21785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '[', a_factor, ']', 21885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print ';' 21985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 22085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Find input arguments derived from array sizes 22185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 22285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 22385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 22485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 's' and a_sub[:3] = 'arg' and isnum(a_sub[3:]): 22585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Sending a variable-length array 22685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n = eval(a_sub[3:]) 22785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if 1 <= n <= len(database): 22885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum b_type, b_mode, b_factor, b_sub = database[n-1] 22985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if b_mode = 's': 23085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum database[n-1] = b_type, 'i', a_factor, `i` 23185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n_in_args = n_in_args - 1 23285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 23385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Assign argument positions in the Python argument list 23485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 23585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum in_pos = [] 23685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum i_in = 0 23785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 23885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 23985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 's': 24085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum in_pos.append(i_in) 24185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum i_in = i_in + 1 24285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 24385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum in_pos.append(-1) 24485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 24585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Get input arguments 24685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 24785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 24885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 24985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 'i': 25085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 25185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Implicit argument; 25285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # a_factor is divisor if present, 25385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # a_sub indicates which arg (`database index`) 25485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 25585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum j = eval(a_sub) 25685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tif', 25785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '(!geti' + a_type + 'arraysize(args,', 25885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `n_in_args` + ',', 25985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `in_pos[j]` + ',', 26085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '&arg' + `i+1` + '))' 26185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t\treturn NULL;' 26285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_factor: 26385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\targ' + `i+1`, 26485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '= arg' + `i+1`, 26585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '/', a_factor + ';' 26685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif a_mode = 's': 26785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_sub: # Allocate memory for varsize array 26885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tif ((arg' + `i+1`, '=', 26985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 'NEW(' + a_type + ',', 27085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_factor: print a_factor, '*', 27185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print a_sub, ')) == NULL)' 27285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t\treturn err_nomem();' 27385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tif', 27485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_factor or a_sub: # Get a fixed-size array array 27585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '(!geti' + a_type + 'array(args,', 27685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `n_in_args` + ',', 27785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `in_pos[i]` + ',', 27885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_factor: print a_factor, 27985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_factor and a_sub: print '*', 28085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_sub: print a_sub, 28185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print ', arg' + `i+1` + '))' 28285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: # Get a simple variable 28385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '(!geti' + a_type + 'arg(args,', 28485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `n_in_args` + ',', 28585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `in_pos[i]` + ',', 28685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '&arg' + `i+1` + '))' 28785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t\treturn NULL;' 28885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 28985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Begin of function call 29085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 29185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if type <> 'void': 29285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tretval =', func + '(', 29385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 29485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t' + func + '(', 29585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 29685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Argument list 29785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 29885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 29985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if i > 0: print ',', 30085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 30185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 'r' and not a_factor: 30285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '&', 30385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 'arg' + `i+1`, 30485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 30585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # End of function call 30685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 30785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print ');' 30885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 30985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Free varsize arrays 31085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 31185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 31285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 31385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 's' and a_sub: 31485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tDEL(arg' + `i+1` + ');' 31585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 31685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Return 31785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 31885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if n_out_args: 31985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 32085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Multiple return values -- construct a tuple 32185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 32285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if type <> 'void': 32385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum n_out_args = n_out_args + 1 32485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if n_out_args = 1: 32585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 32685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 32785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 'r': 32885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum break 32985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 33085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum raise arg_error, 'expected r arg not found' 33185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\treturn', 33285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print mkobject(a_type, 'arg' + `i+1`) + ';' 33385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 33485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t{ object *v = newtupleobject(', 33585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print n_out_args, ');' 33685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t if (v == NULL) return NULL;' 33785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum i_out = 0 33885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if type <> 'void': 33985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t settupleitem(v,', 34085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `i_out` + ',', 34185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print mkobject(type, 'retval') + ');' 34285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum i_out = i_out + 1 34385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(len(database)): 34485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum a_type, a_mode, a_factor, a_sub = database[i] 34585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if a_mode = 'r': 34685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t settupleitem(v,', 34785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print `i_out` + ',', 34885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum s = mkobject(a_type, 'arg' + `i+1`) 34985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print s + ');' 35085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum i_out = i_out + 1 35185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t return v;' 35285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t}' 35385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 35485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 35585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Simple function return 35685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Return None or return value 35785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 35885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if type = 'void': 35985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\tINCREF(None);' 36085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\treturn None;' 36185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 36285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\treturn', mkobject(type, 'retval') + ';' 36385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 36485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Stub body closing brace 36585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 36685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '}' 36785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 36885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 36985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Subroutine to return a function call to mknew<type>object(<arg>) 37085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 37185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef mkobject(type, arg): 37285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum return 'mknew' + type + 'object(' + arg + ')' 37385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 37485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 37585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Input line number 37685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumlno = 0 37785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 37885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 37985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Input is divided in two parts, separated by a line containing '%%'. 38085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# <part1> -- literally copied to stdout 38185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# <part2> -- stub definitions 38285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 38385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Variable indicating the current input part. 38485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 38585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumpart = 1 38685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 38785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Main loop over the input 38885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 38985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumwhile 1: 39085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum try: 39185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum line = raw_input() 39285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum except EOFError: 39385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum break 39485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 39585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum lno = lno+1 39685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum words = string.split(line) 39785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 39885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if part = 1: 39985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 40085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # In part 1, copy everything literally 40185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # except look for a line of just '%%' 40285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 40385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if words = ['%%']: 40485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum part = part + 1 40585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 40685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 40785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # Look for names of manually written 40885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # stubs: a single percent followed by the name 40985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # of the function in Python. 41085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # The stub name is derived by prefixing 'gl_'. 41185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum # 41285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if words and words[0][0] = '%': 41385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum func = words[0][1:] 41485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if (not func) and words[1:]: 41585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum func = words[1] 41685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if func: 41785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum functions.append(func) 41885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 41985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print line 42085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif not words: 42185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum pass # skip empty line 42285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif words[0] = '#include': 42385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print line 42485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif words[0][:1] = '#': 42585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum pass # ignore comment 42685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif words[0] not in return_types: 42785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum err('Line', lno, ': bad return type :', words[0]) 42885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum elif len(words) < 2: 42985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum err('Line', lno, ': no funcname :', line) 43085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 43185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum if len(words) % 2 <> 0: 43285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum err('Line', lno, ': odd argument list :', words[2:]) 43385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum else: 43485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum database = [] 43585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum try: 43685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for i in range(2, len(words), 2): 43785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum x = checkarg(words[i], words[i+1]) 43885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum database.append(x) 43985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print 44085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '/*', 44185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum for w in words: print w, 44285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '*/' 44385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum generate(words[0], words[1], database) 44485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum except arg_error, msg: 44585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum err('Line', lno, ':', msg) 44685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 44785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 44885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint 44985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint 'static struct methodlist gl_methods[] = {' 45085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumfor func in functions: 45185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum print '\t{"' + func + '", gl_' + func + '},' 45285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '\t{NULL, NULL} /* Sentinel */' 45385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '};' 45485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint 45585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint 'initgl()' 45685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '{' 45785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '\tinitmodule("gl", gl_methods);' 45885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '}' 459