mapi_abi.py revision f40c291ed637a916414d1367de379a0980488b4b
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