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