1b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum######################################################################## 2ef4bb5ffe18369d4d08ed404dedeefa4a4497a12Guido van Rossum# Copyright (c) 2000, BeOpen.com. 3ef4bb5ffe18369d4d08ed404dedeefa4a4497a12Guido van Rossum# Copyright (c) 1995-2000, Corporation for National Research Initiatives. 4ef4bb5ffe18369d4d08ed404dedeefa4a4497a12Guido van Rossum# Copyright (c) 1990-1995, Stichting Mathematisch Centrum. 5ef4bb5ffe18369d4d08ed404dedeefa4a4497a12Guido van Rossum# All rights reserved. 6182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# 7ef4bb5ffe18369d4d08ed404dedeefa4a4497a12Guido van Rossum# See the file "Misc/COPYRIGHT" for information on usage and 8ef4bb5ffe18369d4d08ed404dedeefa4a4497a12Guido van Rossum# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. 9b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum######################################################################## 10b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum 1185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Python script to parse cstubs file for gl and generate C stubs. 12670690e2aad728aeac7d9fd496002e4b3b49a159Guido van Rossum# usage: python cgen.py <cstubs >glmodule.c 1385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 141242f1da6734c4660b3e557a4764d93783d85d51Guido van Rossum# NOTE: You must first make a python binary without the "GL" option 15182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# before you can run this, when building Python for the first time. 16182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# See comments in the Makefile. 171242f1da6734c4660b3e557a4764d93783d85d51Guido van Rossum# 1885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# XXX BUG return arrays generate wrong code 1985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# XXX need to change error returns into gotos to free mallocked arrays 20044616aa244a7b78c27d774143ad17a72467d4efBrett Cannonfrom warnings import warnpy3k 21044616aa244a7b78c27d774143ad17a72467d4efBrett Cannonwarnpy3k("the cgen module has been removed in Python 3.0", stacklevel=2) 22044616aa244a7b78c27d774143ad17a72467d4efBrett Cannondel warnpy3k 2385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 2485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 2585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumimport string 2685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumimport sys 2785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 2885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 2985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to print to stderr 3085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 31064a62bc8a5b4e766dedc7afa83dc9b23267fcccGuido van Rossumdef err(*args): 32182b5aca27d376b08a2904bed42b751496f932f3Tim Peters savestdout = sys.stdout 33182b5aca27d376b08a2904bed42b751496f932f3Tim Peters try: 34182b5aca27d376b08a2904bed42b751496f932f3Tim Peters sys.stdout = sys.stderr 35182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in args: 36182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print i, 37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters finally: 39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters sys.stdout = savestdout 4085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 4185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 4285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# The set of digits that form a number 4385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 4485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdigits = '0123456789' 4585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 4685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 4785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to extract a string of digits from the front of the string. 4885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Returns the leading string of digits and the remaining string. 4985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# If no number is found, returns '' and the original string. 5085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 5185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef getnum(s): 52182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n = '' 53182b5aca27d376b08a2904bed42b751496f932f3Tim Peters while s and s[0] in digits: 54182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n = n + s[0] 55182b5aca27d376b08a2904bed42b751496f932f3Tim Peters s = s[1:] 56182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return n, s 5785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 5885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 5985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to check if a string is a number 6085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 6185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef isnum(s): 62182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if not s: return False 63182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for c in s: 64182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if not c in digits: return False 65182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return True 6685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 6785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 6885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Allowed function return types 6985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 7085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumreturn_types = ['void', 'short', 'long'] 7185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 7285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 7385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Allowed function argument types 7485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 75c4f169cc5a990c9015782733b26bca4b2616ac24Sjoerd Mullenderarg_types = ['char', 'string', 'short', 'u_short', 'float', 'long', 'double'] 7685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 7785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 7885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Need to classify arguments as follows 79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# simple input variable 80182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# simple output variable 81182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# input array 82182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# output array 83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# input giving size of some array 8485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 8585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Array dimensions can be specified as follows 86182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# constant 87182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# argN 88182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# constant * argN 89182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# retval 90182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# constant * retval 9185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 9285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# The dimensions given as constants * something are really 9385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# arrays of points where points are 2- 3- or 4-tuples 9485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 9585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# We have to consider three lists: 96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# python input arguments 97182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# C stub arguments (in & out) 98182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# python output arguments (really return values) 9985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 10085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# There is a mapping from python input arguments to the input arguments 10185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# of the C stub, and a further mapping from C stub arguments to the 10285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# python return values 10385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 10485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 10585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Exception raised by checkarg() and generate() 10685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 10785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumarg_error = 'bad arg' 10885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 10985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 11085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Function to check one argument. 11185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Arguments: the type and the arg "name" (really mode plus subscript). 11285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Raises arg_error if something's wrong. 11385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Return type, mode, factor, rest of subscript; factor and rest may be empty. 11485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 11585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef checkarg(type, arg): 116182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 117182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Turn "char *x" into "string x". 118182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 119182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type == 'char' and arg[0] == '*': 120182b5aca27d376b08a2904bed42b751496f932f3Tim Peters type = 'string' 121182b5aca27d376b08a2904bed42b751496f932f3Tim Peters arg = arg[1:] 122182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 123182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Check that the type is supported. 124182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 125182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type not in arg_types: 126182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, ('bad type', type) 127182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type[:2] == 'u_': 128182b5aca27d376b08a2904bed42b751496f932f3Tim Peters type = 'unsigned ' + type[2:] 129182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 130182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Split it in the mode (first character) and the rest. 131182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 132182b5aca27d376b08a2904bed42b751496f932f3Tim Peters mode, rest = arg[:1], arg[1:] 133182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 134182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # The mode must be 's' for send (= input) or 'r' for return argument. 135182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 136182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if mode not in ('r', 's'): 137182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, ('bad arg mode', mode) 138182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 139182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Is it a simple argument: if so, we are done. 140182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 141182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if not rest: 142182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return type, mode, '', '' 143182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 144182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Not a simple argument; must be an array. 145182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # The 'rest' must be a subscript enclosed in [ and ]. 146182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # The subscript must be one of the following forms, 147182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # otherwise we don't handle it (where N is a number): 148182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # N 149182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # argN 150182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # retval 151182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # N*argN 152182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # N*retval 153182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 154182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if rest[:1] <> '[' or rest[-1:] <> ']': 155182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, ('subscript expected', rest) 156182b5aca27d376b08a2904bed42b751496f932f3Tim Peters sub = rest[1:-1] 157182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 158182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Is there a leading number? 159182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 160182b5aca27d376b08a2904bed42b751496f932f3Tim Peters num, sub = getnum(sub) 161182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if num: 162182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # There is a leading number 163182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if not sub: 164182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # The subscript is just a number 165182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return type, mode, num, '' 166182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if sub[:1] == '*': 167182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # There is a factor prefix 168182b5aca27d376b08a2904bed42b751496f932f3Tim Peters sub = sub[1:] 169182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 170182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, ('\'*\' expected', sub) 171182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if sub == 'retval': 172182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # size is retval -- must be a reply argument 173182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if mode <> 'r': 174182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, ('non-r mode with [retval]', mode) 175182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif not isnum(sub) and (sub[:3] <> 'arg' or not isnum(sub[3:])): 176182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, ('bad subscript', sub) 177182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 178182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return type, mode, num, sub 17985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 18085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 18185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# List of functions for which we have generated stubs 18285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 18385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumfunctions = [] 18485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 18585a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 18685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Generate the stub for the given function, using the database of argument 18785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# information build by successive calls to checkarg() 18885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 18985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef generate(type, func, database): 190182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 191182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Check that we can handle this case: 192182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # no variable size reply arrays yet 193182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 194182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n_in_args = 0 195182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n_out_args = 0 196182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 197182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for a_type, a_mode, a_factor, a_sub in database: 198182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 's': 199182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n_in_args = n_in_args + 1 200182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif a_mode == 'r': 201182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n_out_args = n_out_args + 1 202182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 203182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Can't happen 204182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, ('bad a_mode', a_mode) 205182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if (a_mode == 'r' and a_sub) or a_sub == 'retval': 206182b5aca27d376b08a2904bed42b751496f932f3Tim Peters err('Function', func, 'too complicated:', 207182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub) 208182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '/* XXX Too complicated to generate code for */' 209182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 210182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 211182b5aca27d376b08a2904bed42b751496f932f3Tim Peters functions.append(func) 212182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 213182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Stub header 214182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 215182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 216182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 'static PyObject *' 217182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 'gl_' + func + '(self, args)' 218182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tPyObject *self;' 219182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tPyObject *args;' 220182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '{' 221182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 222182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Declare return value if any 223182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 224182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type <> 'void': 225182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t' + type, 'retval;' 226182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 227182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Declare arguments 228182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 229182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 230182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 231182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t' + a_type, 232182b5aca27d376b08a2904bed42b751496f932f3Tim Peters brac = ket = '' 233182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_sub and not isnum(a_sub): 234182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor: 235182b5aca27d376b08a2904bed42b751496f932f3Tim Peters brac = '(' 236182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ket = ')' 237182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print brac + '*', 238182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 'arg' + repr(i+1) + ket, 239182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_sub and isnum(a_sub): 240182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '[', a_sub, ']', 241182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor: 242182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '[', a_factor, ']', 243182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print ';' 244182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 245182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Find input arguments derived from array sizes 246182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 247182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 248182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 249182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 's' and a_sub[:3] == 'arg' and isnum(a_sub[3:]): 250182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Sending a variable-length array 251182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n = eval(a_sub[3:]) 252182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if 1 <= n <= len(database): 253182b5aca27d376b08a2904bed42b751496f932f3Tim Peters b_type, b_mode, b_factor, b_sub = database[n-1] 254182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if b_mode == 's': 255182b5aca27d376b08a2904bed42b751496f932f3Tim Peters database[n-1] = b_type, 'i', a_factor, repr(i) 256182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n_in_args = n_in_args - 1 257182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 258182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Assign argument positions in the Python argument list 259182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 260182b5aca27d376b08a2904bed42b751496f932f3Tim Peters in_pos = [] 261182b5aca27d376b08a2904bed42b751496f932f3Tim Peters i_in = 0 262182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 263182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 264182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 's': 265182b5aca27d376b08a2904bed42b751496f932f3Tim Peters in_pos.append(i_in) 266182b5aca27d376b08a2904bed42b751496f932f3Tim Peters i_in = i_in + 1 267182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 268182b5aca27d376b08a2904bed42b751496f932f3Tim Peters in_pos.append(-1) 269182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 270182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Get input arguments 271182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 272182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 273182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 274182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_type[:9] == 'unsigned ': 275182b5aca27d376b08a2904bed42b751496f932f3Tim Peters xtype = a_type[9:] 276182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 277182b5aca27d376b08a2904bed42b751496f932f3Tim Peters xtype = a_type 278182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 'i': 279182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 280182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Implicit argument; 281182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # a_factor is divisor if present, 282182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # a_sub indicates which arg (`database index`) 283182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 284182b5aca27d376b08a2904bed42b751496f932f3Tim Peters j = eval(a_sub) 285182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tif', 286182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '(!geti' + xtype + 'arraysize(args,', 287182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(n_in_args) + ',', 288182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(in_pos[j]) + ',', 289182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if xtype <> a_type: 290182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '('+xtype+' *)', 291182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '&arg' + repr(i+1) + '))' 292182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t\treturn NULL;' 293182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor: 294182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\targ' + repr(i+1), 295182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '= arg' + repr(i+1), 296182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '/', a_factor + ';' 297182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif a_mode == 's': 298182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_sub and not isnum(a_sub): 299182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Allocate memory for varsize array 300182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tif ((arg' + repr(i+1), '=', 301182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor: 302182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '('+a_type+'(*)['+a_factor+'])', 303182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 'PyMem_NEW(' + a_type, ',', 304182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor: 305182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print a_factor, '*', 306182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print a_sub, ')) == NULL)' 307182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t\treturn PyErr_NoMemory();' 308182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tif', 309182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor or a_sub: # Get a fixed-size array array 310182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '(!geti' + xtype + 'array(args,', 311182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(n_in_args) + ',', 312182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(in_pos[i]) + ',', 313182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor: print a_factor, 314182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_factor and a_sub: print '*', 315182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_sub: print a_sub, 316182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print ',', 317182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if (a_sub and a_factor) or xtype <> a_type: 318182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '('+xtype+' *)', 319182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 'arg' + repr(i+1) + '))' 320182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: # Get a simple variable 321182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '(!geti' + xtype + 'arg(args,', 322182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(n_in_args) + ',', 323182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(in_pos[i]) + ',', 324182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if xtype <> a_type: 325182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '('+xtype+' *)', 326182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '&arg' + repr(i+1) + '))' 327182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t\treturn NULL;' 328182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 329182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Begin of function call 330182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 331182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type <> 'void': 332182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tretval =', func + '(', 333182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 334182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t' + func + '(', 335182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 336182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Argument list 337182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 338182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 339182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if i > 0: print ',', 340182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 341182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 'r' and not a_factor: 342182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '&', 343182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 'arg' + repr(i+1), 344182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 345182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # End of function call 346182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 347182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print ');' 348182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 349182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Free varsize arrays 350182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 351182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 352182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 353182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 's' and a_sub and not isnum(a_sub): 354182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tPyMem_DEL(arg' + repr(i+1) + ');' 355182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 356182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Return 357182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 358182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if n_out_args: 359182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 360182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Multiple return values -- construct a tuple 361182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 362182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type <> 'void': 363182b5aca27d376b08a2904bed42b751496f932f3Tim Peters n_out_args = n_out_args + 1 364182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if n_out_args == 1: 365182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 366182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 367182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 'r': 368182b5aca27d376b08a2904bed42b751496f932f3Tim Peters break 369182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 370182b5aca27d376b08a2904bed42b751496f932f3Tim Peters raise arg_error, 'expected r arg not found' 371182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\treturn', 372182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print mkobject(a_type, 'arg' + repr(i+1)) + ';' 373182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 374182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t{ PyObject *v = PyTuple_New(', 375182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print n_out_args, ');' 376182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t if (v == NULL) return NULL;' 377182b5aca27d376b08a2904bed42b751496f932f3Tim Peters i_out = 0 378182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type <> 'void': 379182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t PyTuple_SetItem(v,', 380182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(i_out) + ',', 381182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print mkobject(type, 'retval') + ');' 382182b5aca27d376b08a2904bed42b751496f932f3Tim Peters i_out = i_out + 1 383182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(len(database)): 384182b5aca27d376b08a2904bed42b751496f932f3Tim Peters a_type, a_mode, a_factor, a_sub = database[i] 385182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if a_mode == 'r': 386182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t PyTuple_SetItem(v,', 387182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print repr(i_out) + ',', 388182b5aca27d376b08a2904bed42b751496f932f3Tim Peters s = mkobject(a_type, 'arg' + repr(i+1)) 389182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print s + ');' 390182b5aca27d376b08a2904bed42b751496f932f3Tim Peters i_out = i_out + 1 391182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t return v;' 392182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t}' 393182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 394182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 395182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Simple function return 396182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Return None or return value 397182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 398182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type == 'void': 399182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\tPy_INCREF(Py_None);' 400182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\treturn Py_None;' 401182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 402182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\treturn', mkobject(type, 'retval') + ';' 403182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 404182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Stub body closing brace 405182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 406182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '}' 40785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 40885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 40985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Subroutine to return a function call to mknew<type>object(<arg>) 41085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 41185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumdef mkobject(type, arg): 412182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if type[:9] == 'unsigned ': 413182b5aca27d376b08a2904bed42b751496f932f3Tim Peters type = type[9:] 414182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 'mknew' + type + 'object((' + type + ') ' + arg + ')' 415182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 'mknew' + type + 'object(' + arg + ')' 41685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 41785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 418c4f169cc5a990c9015782733b26bca4b2616ac24Sjoerd Mullenderdefined_archs = [] 419c4f169cc5a990c9015782733b26bca4b2616ac24Sjoerd Mullender 420c4f169cc5a990c9015782733b26bca4b2616ac24Sjoerd Mullender# usage: cgen [ -Dmach ... ] [ file ] 421c4f169cc5a990c9015782733b26bca4b2616ac24Sjoerd Mullenderfor arg in sys.argv[1:]: 422182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if arg[:2] == '-D': 423182b5aca27d376b08a2904bed42b751496f932f3Tim Peters defined_archs.append(arg[2:]) 424182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 425182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Open optional file argument 426182b5aca27d376b08a2904bed42b751496f932f3Tim Peters sys.stdin = open(arg, 'r') 4275c85062e1ce4c7e51daaad1a4eb3f66f6b5a0ea8Guido van Rossum 4285c85062e1ce4c7e51daaad1a4eb3f66f6b5a0ea8Guido van Rossum 42985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Input line number 43085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumlno = 0 43185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 43285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 43385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Input is divided in two parts, separated by a line containing '%%'. 434182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# <part1> -- literally copied to stdout 435182b5aca27d376b08a2904bed42b751496f932f3Tim Peters# <part2> -- stub definitions 43685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 43785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Variable indicating the current input part. 43885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 43985a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumpart = 1 44085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 44185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# Main loop over the input 44285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum# 44385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumwhile 1: 444182b5aca27d376b08a2904bed42b751496f932f3Tim Peters try: 445182b5aca27d376b08a2904bed42b751496f932f3Tim Peters line = raw_input() 446182b5aca27d376b08a2904bed42b751496f932f3Tim Peters except EOFError: 447182b5aca27d376b08a2904bed42b751496f932f3Tim Peters break 448182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 449182b5aca27d376b08a2904bed42b751496f932f3Tim Peters lno = lno+1 450182b5aca27d376b08a2904bed42b751496f932f3Tim Peters words = string.split(line) 451182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 452182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if part == 1: 453182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 454182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # In part 1, copy everything literally 455182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # except look for a line of just '%%' 456182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 457182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if words == ['%%']: 458182b5aca27d376b08a2904bed42b751496f932f3Tim Peters part = part + 1 459182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 460182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 461182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # Look for names of manually written 462182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # stubs: a single percent followed by the name 463182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # of the function in Python. 464182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # The stub name is derived by prefixing 'gl_'. 465182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # 466182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if words and words[0][0] == '%': 467182b5aca27d376b08a2904bed42b751496f932f3Tim Peters func = words[0][1:] 468182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if (not func) and words[1:]: 469182b5aca27d376b08a2904bed42b751496f932f3Tim Peters func = words[1] 470182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if func: 471182b5aca27d376b08a2904bed42b751496f932f3Tim Peters functions.append(func) 472182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 473182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print line 474182b5aca27d376b08a2904bed42b751496f932f3Tim Peters continue 475182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if not words: 476182b5aca27d376b08a2904bed42b751496f932f3Tim Peters continue # skip empty line 477182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif words[0] == 'if': 478182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # if XXX rest 479182b5aca27d376b08a2904bed42b751496f932f3Tim Peters # if !XXX rest 480182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if words[1][0] == '!': 481182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if words[1][1:] in defined_archs: 482182b5aca27d376b08a2904bed42b751496f932f3Tim Peters continue 483182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif words[1] not in defined_archs: 484182b5aca27d376b08a2904bed42b751496f932f3Tim Peters continue 485182b5aca27d376b08a2904bed42b751496f932f3Tim Peters words = words[2:] 486182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if words[0] == '#include': 487182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print line 488182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif words[0][:1] == '#': 489182b5aca27d376b08a2904bed42b751496f932f3Tim Peters pass # ignore comment 490182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif words[0] not in return_types: 491182b5aca27d376b08a2904bed42b751496f932f3Tim Peters err('Line', lno, ': bad return type :', words[0]) 492182b5aca27d376b08a2904bed42b751496f932f3Tim Peters elif len(words) < 2: 493182b5aca27d376b08a2904bed42b751496f932f3Tim Peters err('Line', lno, ': no funcname :', line) 494182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 495182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if len(words) % 2 <> 0: 496182b5aca27d376b08a2904bed42b751496f932f3Tim Peters err('Line', lno, ': odd argument list :', words[2:]) 497182b5aca27d376b08a2904bed42b751496f932f3Tim Peters else: 498182b5aca27d376b08a2904bed42b751496f932f3Tim Peters database = [] 499182b5aca27d376b08a2904bed42b751496f932f3Tim Peters try: 500182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for i in range(2, len(words), 2): 501182b5aca27d376b08a2904bed42b751496f932f3Tim Peters x = checkarg(words[i], words[i+1]) 502182b5aca27d376b08a2904bed42b751496f932f3Tim Peters database.append(x) 503182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print 504182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '/*', 505182b5aca27d376b08a2904bed42b751496f932f3Tim Peters for w in words: print w, 506182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '*/' 507182b5aca27d376b08a2904bed42b751496f932f3Tim Peters generate(words[0], words[1], database) 508182b5aca27d376b08a2904bed42b751496f932f3Tim Peters except arg_error, msg: 509182b5aca27d376b08a2904bed42b751496f932f3Tim Peters err('Line', lno, ':', msg) 51085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 51185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossum 51285a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint 5130a3eaf083882ad7448beaebe0c1e56702d9a1b4aGuido van Rossumprint 'static struct PyMethodDef gl_methods[] = {' 51485a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumfor func in functions: 515182b5aca27d376b08a2904bed42b751496f932f3Tim Peters print '\t{"' + func + '", gl_' + func + '},' 51685a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '\t{NULL, NULL} /* Sentinel */' 51785a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '};' 51885a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint 5197ce52be62748582247754c2cbb88bb81e39b6b98Guido van Rossumprint 'void' 52085a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint 'initgl()' 52185a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '{' 5221ed5e5768429f425f5bcb9f03bf04179dcca569fGuido van Rossumprint '\t(void) Py_InitModule("gl", gl_methods);' 52385a5fbbdfea617f6cc8fae82c9e8c2b5c424436dGuido van Rossumprint '}' 524