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