1d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu#!/usr/bin/env python
2d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
3d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# Mesa 3-D graphics library
4d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# Version:  7.9
5d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu#
6d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# Copyright (C) 2010 LunarG Inc.
7d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu#
8d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# Permission is hereby granted, free of charge, to any person obtaining a
9d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# copy of this software and associated documentation files (the "Software"),
10d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# to deal in the Software without restriction, including without limitation
11d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# the rights to use, copy, modify, merge, publish, distribute, sublicense,
12d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# and/or sell copies of the Software, and to permit persons to whom the
13d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# Software is furnished to do so, subject to the following conditions:
14d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu#
15d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# The above copyright notice and this permission notice shall be included
16d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# in all copies or substantial portions of the Software.
17d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu#
18d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# DEALINGS IN THE SOFTWARE.
25d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu#
26d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# Authors:
27d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu#    Chia-I Wu <olv@lunarg.com>
28d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
29d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wuimport sys
30281947b3511f606df365e0985631f31d237e63f1Chia-I Wu# make it possible to import glapi
31281947b3511f606df365e0985631f31d237e63f1Chia-I Wuimport os
32281947b3511f606df365e0985631f31d237e63f1Chia-I WuGLAPI = "./%s/../glapi/gen" % (os.path.dirname(sys.argv[0]))
33281947b3511f606df365e0985631f31d237e63f1Chia-I Wusys.path.append(GLAPI)
34281947b3511f606df365e0985631f31d237e63f1Chia-I Wu
35d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wuimport re
36d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wufrom optparse import OptionParser
37d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
38d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu# number of dynamic entries
39d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I WuABI_NUM_DYNAMIC_ENTRIES = 256
40d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
41d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wuclass ABIEntry(object):
42d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    """Represent an ABI entry."""
43d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
44d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    _match_c_param = re.compile(
45d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            '^(?P<type>[\w\s*]+?)(?P<name>\w+)(\[(?P<array>\d+)\])?$')
46d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
47d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def __init__(self, cols, attrs):
48d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self._parse(cols)
49d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
50d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self.slot = attrs['slot']
51d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self.hidden = attrs['hidden']
52d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self.alias = attrs['alias']
5352ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu        self.handcode = attrs['handcode']
54d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
55d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def c_prototype(self):
56d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        return '%s %s(%s)' % (self.c_return(), self.name, self.c_params())
57d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
58d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def c_return(self):
59d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        ret = self.ret
60d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if not ret:
61d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            ret = 'void'
62d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
63d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        return ret
64d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
65d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def c_params(self):
66d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        """Return the parameter list used in the entry prototype."""
67d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        c_params = []
68d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        for t, n, a in self.params:
69d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            sep = '' if t.endswith('*') else ' '
70d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            arr = '[%d]' % a if a else ''
71d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            c_params.append(t + sep + n + arr)
72d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if not c_params:
73d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            c_params.append('void')
74d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
75d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        return ", ".join(c_params)
76d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
77d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def c_args(self):
78d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        """Return the argument list used in the entry invocation."""
79d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        c_args = []
80d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        for t, n, a in self.params:
81d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            c_args.append(n)
82d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
83d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        return ", ".join(c_args)
84d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
85d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def _parse(self, cols):
86d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        ret = cols.pop(0)
87d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if ret == 'void':
88d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            ret = None
89d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
90d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        name = cols.pop(0)
91d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
92d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        params = []
93d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if not cols:
94d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            raise Exception(cols)
95d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        elif len(cols) == 1 and cols[0] == 'void':
96d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            pass
97d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        else:
98d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            for val in cols:
99d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu                params.append(self._parse_param(val))
100d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
101d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self.ret = ret
102d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self.name = name
103d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self.params = params
104d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
105d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def _parse_param(self, c_param):
106d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        m = self._match_c_param.match(c_param)
107d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if not m:
108d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            raise Exception('unrecognized param ' + c_param)
109d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
110d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        c_type = m.group('type').strip()
111d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        c_name = m.group('name')
112d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        c_array = m.group('array')
113d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        c_array = int(c_array) if c_array else 0
114d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
115d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        return (c_type, c_name, c_array)
116d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
117d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def __str__(self):
118d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        return self.c_prototype()
119d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
120d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    def __cmp__(self, other):
121d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        # compare slot, alias, and then name
122d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        res = cmp(self.slot, other.slot)
123d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if not res:
124d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            if not self.alias:
125d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu                res = -1
126d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            elif not other.alias:
127d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu                res = 1
128d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
129d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            if not res:
130d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu                res = cmp(self.name, other.name)
131d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
132d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        return res
133d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
134f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wudef abi_parse_xml(xml):
135f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    """Parse a GLAPI XML file for ABI entries."""
136f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    import gl_XML, glX_XML
137f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
138f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    api = gl_XML.parse_GL_API(xml, glX_XML.glx_item_factory())
139f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
140f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    entry_dict = {}
141f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    for func in api.functionIterateByOffset():
142f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        # make sure func.name appear first
143f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        entry_points = func.entry_points[:]
144f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        entry_points.remove(func.name)
145f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        entry_points.insert(0, func.name)
146f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
147f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        for name in entry_points:
148f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            attrs = {
149f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                    'slot': func.offset,
150f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                    'hidden': not func.is_static_entry_point(name),
151f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                    'alias': None if name == func.name else func.name,
152f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                    'handcode': bool(func.has_different_protocol(name)),
153f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            }
154f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
155f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            # post-process attrs
156f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            if attrs['alias']:
157f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                try:
158f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                    alias = entry_dict[attrs['alias']]
159f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                except KeyError:
160f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                    raise Exception('failed to alias %s' % attrs['alias'])
161f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                if alias.alias:
162f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                    raise Exception('recursive alias %s' % ent.name)
163f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                attrs['alias'] = alias
164f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            if attrs['handcode']:
165f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                attrs['handcode'] = func.static_glx_name(name)
166f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            else:
167f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                attrs['handcode'] = None
168f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
169f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            if entry_dict.has_key(name):
170f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                raise Exception('%s is duplicated' % (name))
171f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
172f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            cols = []
173f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            cols.append(func.return_type)
174f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            cols.append(name)
175f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            params = func.get_parameter_string(name)
176f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            cols.extend([p.strip() for p in params.split(',')])
177f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
178f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            ent = ABIEntry(cols, attrs)
179f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            entry_dict[ent.name] = ent
180f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
181f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    entries = entry_dict.values()
182f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    entries.sort()
183f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
184f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    return entries
185f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
186d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wudef abi_parse_line(line):
187d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    cols = [col.strip() for col in line.split(',')]
188d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
189d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    attrs = {
190d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            'slot': -1,
191d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            'hidden': False,
192d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            'alias': None,
19352ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            'handcode': None,
194d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    }
195d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
196d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    # extract attributes from the first column
197d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    vals = cols[0].split(':')
198d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    while len(vals) > 1:
199d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        val = vals.pop(0)
200d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if val.startswith('slot='):
201d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            attrs['slot'] = int(val[5:])
202d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        elif val == 'hidden':
203d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            attrs['hidden'] = True
204d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        elif val.startswith('alias='):
205d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            attrs['alias'] = val[6:]
20652ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu        elif val.startswith('handcode='):
20752ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            attrs['handcode'] = val[9:]
208d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        elif not val:
209d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            pass
210d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        else:
211d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            raise Exception('unknown attribute %s' % val)
212d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    cols[0] = vals[0]
213d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
214d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    return (attrs, cols)
215d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
216d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wudef abi_parse(filename):
217d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    """Parse a CSV file for ABI entries."""
218d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    fp = open(filename) if filename != '-' else sys.stdin
219d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    lines = [line.strip() for line in fp.readlines()
220d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            if not line.startswith('#') and line.strip()]
221d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
222d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    entry_dict = {}
223d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    next_slot = 0
224d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    for line in lines:
225d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        attrs, cols = abi_parse_line(line)
226d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
227d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        # post-process attributes
228d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if attrs['alias']:
229d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            try:
23086d29eab48b4ec8a972eec8a2a8179b5386a069eChia-I Wu                alias = entry_dict[attrs['alias']]
231d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            except KeyError:
232d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu                raise Exception('failed to alias %s' % attrs['alias'])
23386d29eab48b4ec8a972eec8a2a8179b5386a069eChia-I Wu            if alias.alias:
23486d29eab48b4ec8a972eec8a2a8179b5386a069eChia-I Wu                raise Exception('recursive alias %s' % ent.name)
23586d29eab48b4ec8a972eec8a2a8179b5386a069eChia-I Wu            slot = alias.slot
23686d29eab48b4ec8a972eec8a2a8179b5386a069eChia-I Wu            attrs['alias'] = alias
237d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        else:
238d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            slot = next_slot
239d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            next_slot += 1
240d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
241d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if attrs['slot'] < 0:
242d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            attrs['slot'] = slot
243d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        elif attrs['slot'] != slot:
244d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            raise Exception('invalid slot in %s' % (line))
245d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
246d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        ent = ABIEntry(cols, attrs)
247d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if entry_dict.has_key(ent.name):
248d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            raise Exception('%s is duplicated' % (ent.name))
249d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        entry_dict[ent.name] = ent
250d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
251d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    entries = entry_dict.values()
252d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    entries.sort()
253d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
254f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    return entries
255f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
256f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wudef abi_sanity_check(entries):
257f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    if not entries:
258f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        return
259f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
260f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    all_names = []
261f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    last_slot = entries[-1].slot
262d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    i = 0
263f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    for slot in xrange(last_slot + 1):
264d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if entries[i].slot != slot:
265d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            raise Exception('entries are not ordered by slots')
266d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        if entries[i].alias:
267d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            raise Exception('first entry of slot %d aliases %s'
26886d29eab48b4ec8a972eec8a2a8179b5386a069eChia-I Wu                    % (slot, entries[i].alias.name))
26952ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu        handcode = None
270d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        while i < len(entries) and entries[i].slot == slot:
27152ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            ent = entries[i]
27252ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            if not handcode and ent.handcode:
27352ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu                handcode = ent.handcode
27452ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            elif ent.handcode != handcode:
27552ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu                raise Exception('two aliases with handcode %s != %s',
27652ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu                        ent.handcode, handcode)
277f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
278f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            if ent.name in all_names:
279f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                raise Exception('%s is duplicated' % (ent.name))
280f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            if ent.alias and ent.alias.name not in all_names:
281f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu                raise Exception('failed to alias %s' % (ent.alias.name))
282f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu            all_names.append(ent.name)
283d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            i += 1
284d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    if i < len(entries):
285d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        raise Exception('there are %d invalid entries' % (len(entries) - 1))
286d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
287d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wuclass ABIPrinter(object):
2888f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    """MAPI Printer"""
289d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
2908f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def __init__(self, entries):
291d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        self.entries = entries
292d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
2938f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        # sort entries by their names
2948f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.entries_sorted_by_names = self.entries[:]
2958f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.entries_sorted_by_names.sort(lambda x, y: cmp(x.name, y.name))
296d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
2978f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.indent = ' ' * 3
2988f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.noop_warn = 'noop_warn'
2998f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.noop_generic = 'noop_generic'
30097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.current_get = 'entry_current_get'
301d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
3028f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_defines = []
3038f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_headers = ['"KHR/khrplatform.h"']
3048f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_call = 'KHRONOS_APICALL'
3058f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_entry = 'KHRONOS_APIENTRY'
3068f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_attrs = 'KHRONOS_APIATTRIBUTES'
307d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
30823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.c_header = ''
30923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
3100c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu        self.lib_need_table_size = True
3110c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu        self.lib_need_noop_array = True
3120c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu        self.lib_need_stubs = True
31397185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_all_entries = True
31497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_non_hidden_entries = False
3150c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu
316b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu    def c_notice(self):
3178f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return '/* This file is automatically generated by mapi_abi.py.  Do not modify. */'
3188f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
319b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu    def c_public_includes(self):
3208f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return includes of the client API headers."""
3218f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        defines = ['#define ' + d for d in self.api_defines]
3228f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        includes = ['#include ' + h for h in self.api_headers]
3238f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return "\n".join(defines + includes)
3248f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
325b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu    def need_entry_point(self, ent):
326b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        """Return True if an entry point is needed for the entry."""
327b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        # non-handcode hidden aliases may share the entry they alias
328b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        use_alias = (ent.hidden and ent.alias and not ent.handcode)
329b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        return not use_alias
330b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu
331b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu    def c_public_declarations(self, prefix):
332b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        """Return the declarations of public entry points."""
333b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        decls = []
334b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        for ent in self.entries:
335b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            if not self.need_entry_point(ent):
336b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu                continue
337b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            export = self.api_call if not ent.hidden else ''
338b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            decls.append(self._c_decl(ent, prefix, True, export) + ';')
339b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu
340b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        return "\n".join(decls)
341b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu
3428f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_mapi_table(self):
3438f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return defines of the dispatch table size."""
34497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        num_static_entries = self.entries[-1].slot + 1
3458f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return ('#define MAPI_TABLE_NUM_STATIC %d\n' + \
3468f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                '#define MAPI_TABLE_NUM_DYNAMIC %d') % (
3478f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                        num_static_entries, ABI_NUM_DYNAMIC_ENTRIES)
3488f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
3498f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_mapi_table_initializer(self, prefix):
3508f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the array initializer for mapi_table_fill."""
3518eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        entries = [self._c_function(ent, prefix)
3528eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu                for ent in self.entries if not ent.alias]
3538eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        pre = self.indent + '(mapi_proc) '
3548f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return pre + (',\n' + pre).join(entries)
3558f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
3568f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_mapi_table_spec(self):
3578f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the spec for mapi_init."""
3588f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        specv1 = []
3598f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        line = '"1'
3608f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        for ent in self.entries:
3618f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            if not ent.alias:
3628f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                line += '\\0"\n'
3638f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                specv1.append(line)
3648f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                line = '"'
3658f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            line += '%s\\0' % ent.name
3668f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        line += '";'
3678f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        specv1.append(line)
3688f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
3698f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return self.indent + self.indent.join(specv1)
3708f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
371b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu    def _c_function(self, ent, prefix, mangle=False, stringify=False):
3728eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        """Return the function name of an entry."""
3737828f554abf59e05a4b4152dabd599fae79d0be8Chia-I Wu        formats = {
3747828f554abf59e05a4b4152dabd599fae79d0be8Chia-I Wu                True: { True: '%s_STR(%s)', False: '%s(%s)' },
3757828f554abf59e05a4b4152dabd599fae79d0be8Chia-I Wu                False: { True: '"%s%s"', False: '%s%s' },
3767828f554abf59e05a4b4152dabd599fae79d0be8Chia-I Wu        }
3777828f554abf59e05a4b4152dabd599fae79d0be8Chia-I Wu        fmt = formats[prefix.isupper()][stringify]
378b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        name = ent.name
379b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        if mangle and ent.hidden:
380b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            name = '_dispatch_stub_' + str(ent.slot)
381b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        return fmt % (prefix, name)
382b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu
383b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu    def _c_function_call(self, ent, prefix):
384b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        """Return the function name used for calling."""
385b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        if ent.handcode:
386b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            # _c_function does not handle this case
3877828f554abf59e05a4b4152dabd599fae79d0be8Chia-I Wu            formats = { True: '%s(%s)', False: '%s%s' }
3887828f554abf59e05a4b4152dabd599fae79d0be8Chia-I Wu            fmt = formats[prefix.isupper()]
389b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            name = fmt % (prefix, ent.handcode)
390b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        elif self.need_entry_point(ent):
391b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            name = self._c_function(ent, prefix, True)
392b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        else:
393b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            name = self._c_function(ent.alias, prefix, True)
394b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        return name
3958eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu
396b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu    def _c_decl(self, ent, prefix, mangle=False, export=''):
3978f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the C declaration for the entry."""
3988eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        decl = '%s %s %s(%s)' % (ent.c_return(), self.api_entry,
399b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu                self._c_function(ent, prefix, mangle), ent.c_params())
4008eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        if export:
4018eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu            decl = export + ' ' + decl
4028eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        if self.api_attrs:
4038f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            decl += ' ' + self.api_attrs
4048f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4058f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return decl
4068f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4078f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def _c_cast(self, ent):
4088f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the C cast for the entry."""
4098f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        cast = '%s (%s *)(%s)' % (
4108f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                ent.c_return(), self.api_entry, ent.c_params())
4118f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4128f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return cast
4138f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4148f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_private_declarations(self, prefix):
4158f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the declarations of private functions."""
4168eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        decls = [self._c_decl(ent, prefix) + ';'
4178f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                for ent in self.entries if not ent.alias]
4188f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4198eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        return "\n".join(decls)
4208f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
42197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu    def c_public_dispatches(self, prefix, no_hidden):
4228f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the public dispatch functions."""
4238f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        dispatches = []
4248f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        for ent in self.entries:
42597185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            if ent.hidden and no_hidden:
42697185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                continue
42797185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
428b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            if not self.need_entry_point(ent):
4298f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                continue
4308f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
431b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            export = self.api_call if not ent.hidden else ''
432b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu
433b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            proto = self._c_decl(ent, prefix, True, export)
4348f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            cast = self._c_cast(ent)
4358f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4368f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            ret = ''
4378f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            if ent.ret:
4388f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                ret = 'return '
4398f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            stmt1 = self.indent
44097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            stmt1 += 'const struct mapi_table *_tbl = %s();' % (
44197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                    self.current_get)
4428f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            stmt2 = self.indent
44323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            stmt2 += 'mapi_func _func = ((const mapi_func *) _tbl)[%d];' % (
4448f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                    ent.slot)
4458f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            stmt3 = self.indent
44623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            stmt3 += '%s((%s) _func)(%s);' % (ret, cast, ent.c_args())
4478f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4488f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            disp = '%s\n{\n%s\n%s\n%s\n}' % (proto, stmt1, stmt2, stmt3)
44952ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu
45052ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            if ent.handcode:
45152ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu                disp = '#if 0\n' + disp + '\n#endif'
45252ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu
4538f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            dispatches.append(disp)
4548f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4558f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return '\n\n'.join(dispatches)
4568f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
457e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu    def c_public_initializer(self, prefix):
458e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu        """Return the initializer for public dispatch functions."""
459e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu        names = []
460e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu        for ent in self.entries:
461e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            if ent.alias:
462e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu                continue
463e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu
464e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            name = '%s(mapi_func) %s' % (self.indent,
465e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu                    self._c_function_call(ent, prefix))
466e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            names.append(name)
467e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu
468e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu        return ',\n'.join(names)
469e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu
4708f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_stub_string_pool(self):
4718f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the string pool for use by stubs."""
4728f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        # sort entries by their names
4738f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        sorted_entries = self.entries[:]
4748f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        sorted_entries.sort(lambda x, y: cmp(x.name, y.name))
4758f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4768f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        pool = []
4778f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        offsets = {}
4788f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        count = 0
4798f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        for ent in sorted_entries:
4808f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            offsets[ent] = count
4818f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            pool.append('%s' % (ent.name))
4828f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            count += len(ent.name) + 1
4838f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4848f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        pool_str =  self.indent + '"' + \
4858f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                ('\\0"\n' + self.indent + '"').join(pool) + '";'
4868f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return (pool_str, offsets)
4878f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4888f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_stub_initializer(self, prefix, pool_offsets):
4898f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the initializer for struct mapi_stub array."""
4908f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        stubs = []
4918f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        for ent in self.entries_sorted_by_names:
492e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            stubs.append('%s{ (void *) %d, %d, NULL }' % (
493e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu                self.indent, pool_offsets[ent], ent.slot))
4948f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4958f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return ',\n'.join(stubs)
4968f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
4978f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_noop_functions(self, prefix, warn_prefix):
4988f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return the noop functions."""
4998f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        noops = []
5008f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        for ent in self.entries:
501d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            if ent.alias:
5028f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                continue
5038f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
504b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            proto = self._c_decl(ent, prefix, False, 'static')
5058f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
506f40c291ed637a916414d1367de379a0980488b4bIan Romanick            stmt1 = self.indent;
507f40c291ed637a916414d1367de379a0980488b4bIan Romanick            space = ''
508f40c291ed637a916414d1367de379a0980488b4bIan Romanick            for t, n, a in ent.params:
509f40c291ed637a916414d1367de379a0980488b4bIan Romanick                stmt1 += "%s(void) %s;" % (space, n)
510f40c291ed637a916414d1367de379a0980488b4bIan Romanick                space = ' '
511f40c291ed637a916414d1367de379a0980488b4bIan Romanick
512f40c291ed637a916414d1367de379a0980488b4bIan Romanick            if ent.params:
513f40c291ed637a916414d1367de379a0980488b4bIan Romanick                stmt1 += '\n';
514f40c291ed637a916414d1367de379a0980488b4bIan Romanick
515f40c291ed637a916414d1367de379a0980488b4bIan Romanick            stmt1 += self.indent + '%s(%s);' % (self.noop_warn,
516b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu                    self._c_function(ent, warn_prefix, False, True))
517d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
518d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            if ent.ret:
5198f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                stmt2 = self.indent + 'return (%s) 0;' % (ent.ret)
5208f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                noop = '%s\n{\n%s\n%s\n}' % (proto, stmt1, stmt2)
5218f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            else:
5228f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                noop = '%s\n{\n%s\n}' % (proto, stmt1)
5238f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
5248f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            noops.append(noop)
5258f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
5268f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return '\n\n'.join(noops)
5278f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
5288f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def c_noop_initializer(self, prefix, use_generic):
5298f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        """Return an initializer for the noop dispatch table."""
5308eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu        entries = [self._c_function(ent, prefix)
5318eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu                for ent in self.entries if not ent.alias]
5328f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        if use_generic:
5338f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            entries = [self.noop_generic] * len(entries)
5348f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
5358f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        entries.extend([self.noop_generic] * ABI_NUM_DYNAMIC_ENTRIES)
5368f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
5378f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        pre = self.indent + '(mapi_func) '
5388f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return pre + (',\n' + pre).join(entries)
5398f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
54097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu    def c_asm_gcc(self, prefix, no_hidden):
5418f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        asm = []
5428f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
5438f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        for ent in self.entries:
54497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            if ent.hidden and no_hidden:
54597185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                continue
54697185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
547b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            if not self.need_entry_point(ent):
548b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu                continue
549b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu
550b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu            name = self._c_function(ent, prefix, True, True)
5518f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
55252ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            if ent.handcode:
55352ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu                asm.append('#if 0')
55452ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu
555d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            if ent.hidden:
5568eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu                asm.append('".hidden "%s"\\n"' % (name))
557d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
55897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            if ent.alias and not (ent.alias.hidden and no_hidden):
5598eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu                asm.append('".globl "%s"\\n"' % (name))
5608eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu                asm.append('".set "%s", "%s"\\n"' % (name,
561b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu                    self._c_function(ent.alias, prefix, True, True)))
562d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu            else:
5638eee1d522e006e1988b16e0cf40a086a7b7290baChia-I Wu                asm.append('STUB_ASM_ENTRY(%s)"\\n"' % (name))
5648f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu                asm.append('"\\t"STUB_ASM_CODE("%d")"\\n"' % (ent.slot))
56552ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu
56652ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            if ent.handcode:
56752ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu                asm.append('#endif')
56852ca15334992cf7d37beaa17f120401ba4b4bcf4Chia-I Wu            asm.append('')
569d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
5708f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        return "\n".join(asm)
5718f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
5728f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def output_for_lib(self):
573b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        print self.c_notice()
57423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
57523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        if self.c_header:
57623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            print
57723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            print self.c_header
57823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
5798f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print
5808f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print '#ifdef MAPI_TMP_DEFINES'
581b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        print self.c_public_includes()
582b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        print
583b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        print self.c_public_declarations(self.prefix_lib)
5848f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print '#undef MAPI_TMP_DEFINES'
5858f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print '#endif /* MAPI_TMP_DEFINES */'
586d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
5870c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu        if self.lib_need_table_size:
5880c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
5890c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#ifdef MAPI_TMP_TABLE'
5900c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print self.c_mapi_table()
5910c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#undef MAPI_TMP_TABLE'
5920c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#endif /* MAPI_TMP_TABLE */'
5930c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu
5940c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu        if self.lib_need_noop_array:
5950c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
5960c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#ifdef MAPI_TMP_NOOP_ARRAY'
5970c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#ifdef DEBUG'
5980c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
59923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            print self.c_noop_functions(self.prefix_noop, self.prefix_warn)
6000c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6010c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
6020c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print self.c_noop_initializer(self.prefix_noop, False)
6030c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '};'
6040c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6050c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#else /* DEBUG */'
6060c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6070c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
6080c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print self.c_noop_initializer(self.prefix_noop, True)
6090c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '};'
6100c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6110c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#endif /* DEBUG */'
6120c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#undef MAPI_TMP_NOOP_ARRAY'
6130c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#endif /* MAPI_TMP_NOOP_ARRAY */'
6140c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu
6150c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu        if self.lib_need_stubs:
6160c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            pool, pool_offsets = self.c_stub_string_pool()
6170c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6180c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#ifdef MAPI_TMP_PUBLIC_STUBS'
6190c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print 'static const char public_string_pool[] ='
6200c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print pool
6210c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6220c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print 'static const struct mapi_stub public_stubs[] = {'
6230c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print self.c_stub_initializer(self.prefix_lib, pool_offsets)
6240c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '};'
6250c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#undef MAPI_TMP_PUBLIC_STUBS'
6260c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#endif /* MAPI_TMP_PUBLIC_STUBS */'
6270c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu
62897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        if self.lib_need_all_entries:
6290c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6300c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#ifdef MAPI_TMP_PUBLIC_ENTRIES'
63197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            print self.c_public_dispatches(self.prefix_lib, False)
632e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            print
633e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            print 'static const mapi_func public_entries[] = {'
634e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            print self.c_public_initializer(self.prefix_lib)
635e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48eChia-I Wu            print '};'
6360c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#undef MAPI_TMP_PUBLIC_ENTRIES'
6370c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#endif /* MAPI_TMP_PUBLIC_ENTRIES */'
6380c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu
6390c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print
6400c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#ifdef MAPI_TMP_STUB_ASM_GCC'
64197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            print '__asm__('
64297185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            print self.c_asm_gcc(self.prefix_lib, False)
64397185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            print ');'
6440c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#undef MAPI_TMP_STUB_ASM_GCC'
6450c205484bfe3de23c370deeba43dff7939179b5aChia-I Wu            print '#endif /* MAPI_TMP_STUB_ASM_GCC */'
6468f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
64797185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        if self.lib_need_non_hidden_entries:
64897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            all_hidden = True
64997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            for ent in self.entries:
65097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                if not ent.hidden:
65197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                    all_hidden = False
65297185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                    break
65397185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu            if not all_hidden:
65497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print
65597185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN'
65697185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print self.c_public_dispatches(self.prefix_lib, True)
65797185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print
65897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '/* does not need public_entries */'
65997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '#undef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN'
66097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */'
66197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
66297185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print
66397185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '#ifdef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN'
66497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '__asm__('
66597185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print self.c_asm_gcc(self.prefix_lib, True)
66697185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print ');'
66797185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '#undef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN'
66897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu                print '#endif /* MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN */'
66997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
6708f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def output_for_app(self):
671b765b1269fd7091d2f794303474995375b9d1946Chia-I Wu        print self.c_notice()
6728f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print
6738f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print self.c_private_declarations(self.prefix_app)
674d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        print
6758f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print '#ifdef API_TMP_DEFINE_SPEC'
676d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        print
6778f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print 'static const char %s_spec[] =' % (self.prefix_app)
6788f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print self.c_mapi_table_spec()
6798f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print
6808f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print 'static const mapi_proc %s_procs[] = {' % (self.prefix_app)
6818f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print self.c_mapi_table_initializer(self.prefix_app)
6828f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print '};'
6838f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print
6848f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        print '#endif /* API_TMP_DEFINE_SPEC */'
685d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
6868f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wuclass GLAPIPrinter(ABIPrinter):
6878f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    """OpenGL API Printer"""
688d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
68923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu    def __init__(self, entries, api=None):
69023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        api_entries = self._get_api_entries(entries, api)
69123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        super(GLAPIPrinter, self).__init__(api_entries)
692d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
6938f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_defines = ['GL_GLEXT_PROTOTYPES']
6948f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_headers = ['"GL/gl.h"', '"GL/glext.h"']
6958f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_call = 'GLAPI'
6968f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_entry = 'APIENTRY'
6978f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_attrs = ''
698d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
69997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_table_size = False
70097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_noop_array = False
70197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_stubs = False
70297185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_all_entries = False
70397185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_non_hidden_entries = True
70497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
70523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.prefix_lib = 'GLAPI_PREFIX'
7068f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.prefix_app = '_mesa_'
7078f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.prefix_noop = 'noop'
70823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.prefix_warn = self.prefix_lib
709d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
71023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.c_header = self._get_c_header()
71123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
71223a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu    def _get_api_entries(self, entries, api):
71323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        """Override the entry attributes according to API."""
71423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        import copy
71523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
71623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        # no override
71723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        if api is None:
71823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            return entries
71923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
72023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        api_entries = {}
72123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        for ent in entries:
72223a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            ent = copy.copy(ent)
72323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
72423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            # override 'hidden' and 'handcode'
72523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            ent.hidden = ent.name not in api
72623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            ent.handcode = False
72723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            if ent.alias:
72823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu                ent.alias = api_entries[ent.alias.name]
72923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
73023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            api_entries[ent.name] = ent
73123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
73223a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        # sanity check
73323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        missed = [name for name in api if name not in api_entries]
73423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        if missed:
73523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu            raise Exception('%s is missing' % str(missed))
73623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
73723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        entries = api_entries.values()
73823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        entries.sort()
73923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
74023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        return entries
74123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
74223a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu    def _get_c_header(self):
74323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        header = """#ifndef _GLAPI_TMP_H_
74423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#define _GLAPI_TMP_H_
74523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#ifdef USE_MGL_NAMESPACE
74623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#define GLAPI_PREFIX(func)  mgl##func
74723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#define GLAPI_PREFIX_STR(func)  "mgl"#func
74823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#else
74923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#define GLAPI_PREFIX(func)  gl##func
75023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#define GLAPI_PREFIX_STR(func)  "gl"#func
75123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#endif /* USE_MGL_NAMESPACE */
75223a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
75323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wutypedef int GLfixed;
75423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wutypedef int GLclampx;
75523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#endif /* _GLAPI_TMP_H_ */"""
75623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
75723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        return header
758d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
7598f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wuclass ES1APIPrinter(GLAPIPrinter):
7608f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    """OpenGL ES 1.x API Printer"""
761d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
7628f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def __init__(self, entries):
763281947b3511f606df365e0985631f31d237e63f1Chia-I Wu        from gles_api import es1_api
76423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
76523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        super(ES1APIPrinter, self).__init__(entries, es1_api)
76623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.prefix_lib = 'gl'
76723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.prefix_warn = 'gl'
76823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
76923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu    def _get_c_header(self):
77023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        header = """#ifndef _GLAPI_TMP_H_
77123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#define _GLAPI_TMP_H_
77223a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wutypedef int GLfixed;
77323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wutypedef int GLclampx;
77423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#endif /* _GLAPI_TMP_H_ */"""
775d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
77623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        return header
7778f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
7788f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wuclass ES2APIPrinter(GLAPIPrinter):
7798f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    """OpenGL ES 2.x API Printer"""
7808f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
7818f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def __init__(self, entries):
782281947b3511f606df365e0985631f31d237e63f1Chia-I Wu        from gles_api import es2_api
78323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
78423a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        super(ES2APIPrinter, self).__init__(entries, es2_api)
78523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.prefix_lib = 'gl'
78623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.prefix_warn = 'gl'
78723a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu
78823a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu    def _get_c_header(self):
78923a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        header = """#ifndef _GLAPI_TMP_H_
79023a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#define _GLAPI_TMP_H_
79123a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wutypedef int GLfixed;
79223a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wutypedef int GLclampx;
79323a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu#endif /* _GLAPI_TMP_H_ */"""
7948f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
79523a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        return header
796d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
79797185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wuclass SharedGLAPIPrinter(GLAPIPrinter):
79897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu    """Shared GLAPI API Printer"""
79997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
80097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu    def __init__(self, entries):
80197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        super(SharedGLAPIPrinter, self).__init__(entries, [])
80297185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
80397185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_table_size = True
80497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_noop_array = True
80597185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_stubs = True
80697185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_all_entries = True
80797185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.lib_need_non_hidden_entries = False
80897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
80997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.prefix_lib = 'shared'
81097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        self.prefix_warn = 'gl'
81197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
81297185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu    def _get_c_header(self):
81397185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        header = """#ifndef _GLAPI_TMP_H_
81497185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu#define _GLAPI_TMP_H_
81597185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wutypedef int GLfixed;
81697185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wutypedef int GLclampx;
81797185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu#endif /* _GLAPI_TMP_H_ */"""
81897185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
81997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        return header
82097185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu
8218f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wuclass VGAPIPrinter(ABIPrinter):
8228f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    """OpenVG API Printer"""
823d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
8248f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    def __init__(self, entries):
8258f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        super(VGAPIPrinter, self).__init__(entries)
826d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
8278f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_defines = ['VG_VGEXT_PROTOTYPES']
8288f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_headers = ['"VG/openvg.h"', '"VG/vgext.h"']
8298f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_call = 'VG_API_CALL'
8308f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_entry = 'VG_API_ENTRY'
8318f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.api_attrs = 'VG_API_EXIT'
8328f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
8338f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.prefix_lib = 'vg'
8348f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.prefix_app = 'vega'
8358f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        self.prefix_noop = 'noop'
83623a89f187272215cc0a517ad75e2cc469a43ba0bChia-I Wu        self.prefix_warn = 'vg'
837d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
838d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wudef parse_args():
83997185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu    printers = ['vgapi', 'glapi', 'es1api', 'es2api', 'shared-glapi']
8408f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    modes = ['lib', 'app']
8418f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
842d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    parser = OptionParser(usage='usage: %prog [options] <filename>')
8438f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    parser.add_option('-p', '--printer', dest='printer',
8448f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            help='printer to use: %s' % (", ".join(printers)))
8458f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    parser.add_option('-m', '--mode', dest='mode',
8468f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            help='target user: %s' % (", ".join(modes)))
847d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
848d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    options, args = parser.parse_args()
8498f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    if not args or options.printer not in printers or \
8508f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu            options.mode not in modes:
851d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        parser.print_help()
852d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu        sys.exit(1)
853d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
854d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    return (args[0], options)
855d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
856d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wudef main():
8578f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    printers = {
8588f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        'vgapi': VGAPIPrinter,
8598f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        'glapi': GLAPIPrinter,
8608f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        'es1api': ES1APIPrinter,
86197185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        'es2api': ES2APIPrinter,
86297185bf2654f7e72d8bfcc216f905492655d4c77Chia-I Wu        'shared-glapi': SharedGLAPIPrinter,
8638f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    }
8648f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu
865d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    filename, options = parse_args()
866d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
867f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    if filename.endswith('.xml'):
868f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        entries = abi_parse_xml(filename)
869f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    else:
870f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu        entries = abi_parse(filename)
871f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu    abi_sanity_check(entries)
872f71a9acf59a2cd6396fb57afe57d7808df0bb82bChia-I Wu
8738f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    printer = printers[options.printer](entries)
8748f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    if options.mode == 'lib':
8758f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        printer.output_for_lib()
8768f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu    else:
8778f2a974cf2c9b6c00dfac11be4316a7d121dfbb4Chia-I Wu        printer.output_for_app()
878d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu
879d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wuif __name__ == '__main__':
880d4589d381697b4b3dd291a3c93a34370508ef1e8Chia-I Wu    main()
881