1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#!/usr/bin/env python
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# (C) Copyright IBM Corporation 2005
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# copy of this software and associated documentation files (the "Software"),
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# to deal in the Software without restriction, including without limitation
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# on the rights to use, copy, modify, merge, publish, distribute, sub
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# license, and/or sell copies of the Software, and to permit persons to whom
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# the Software is furnished to do so, subject to the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# The above copyright notice and this permission notice (including the next
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# paragraph) shall be included in all copies or substantial portions of the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# Authors:
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#    Ian Romanick <idr@us.ibm.com>
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport string, copy
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass type_node:
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def __init__(self):
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.pointer = 0  # bool
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.const = 0    # bool
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.signed = 1   # bool
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.integer = 1  # bool
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		# If elements is set to non-zero, then field is an array.
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.elements = 0
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.name = None
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.size = 0     # type's size in bytes
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def string(self):
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"""Return string representation of this type_node."""
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		s = ""
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if self.pointer:
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			s = "* "
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if self.const:
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			s += "const "
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if not self.pointer:
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if self.integer:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if self.signed:
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					s += "signed "
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else:
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					s += "unsigned "
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if self.name:
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				s += "%s " % (self.name)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return s
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass type_table:
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def __init__(self):
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.types_by_name = {}
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def add_type(self, type_expr):
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.types_by_name[ type_expr.get_base_name() ] = type_expr
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def find_type(self, name):
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if name in self.types_by_name:
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return self.types_by_name[ name ]
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return None
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdef create_initial_types():
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tt = type_table()
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	basic_types = [
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		("char",   1, 1),
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		("short",  2, 1),
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		("int",    4, 1),
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		("long",   4, 1),
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		("float",  4, 0),
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		("double", 8, 0),
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		("enum",   4, 1)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	]
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (type_name, type_size, integer) in basic_types:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		te = type_expression(None)
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn = type_node()
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn.name = type_name
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn.size = type_size
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn.integer = integer
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		te.expr.append(tn)
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tt.add_type( te )
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	type_expression.built_in_types = tt
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass type_expression:
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	built_in_types = None
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def __init__(self, type_string, extra_types = None):
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.expr = []
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if not type_string:
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.original_string = type_string
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if not type_expression.built_in_types:
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			raise RuntimeError("create_initial_types must be called before creating type_expression objects.")
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		# Replace '*' with ' * ' in type_string.  Then, split the string
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		# into tokens, separated by spaces.
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tokens = string.split( string.replace( type_string, "*", " * " ) )
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const = 0
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		t = None
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		signed = 0
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned = 0
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for i in tokens:
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if i == "const":
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if t and t.pointer:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					t.const = 1
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else:
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					const = 1
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			elif i == "signed":
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				signed = 1
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			elif i == "unsigned":
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned = 1
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			elif i == "*":
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				# This is a quirky special-case because of the
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				# way the C works for types.  If 'unsigned' is
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				# specified all by itself, it is treated the
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				# same as "unsigned int".
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if unsigned:
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					self.set_base_type( "int", signed, unsigned, const, extra_types )
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					const = 0
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					signed = 0
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					unsigned = 0
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if not self.expr:
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					raise RuntimeError("Invalid type expression (dangling pointer)")
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if signed:
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					raise RuntimeError("Invalid type expression (signed / unsigned applied to pointer)")
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				t = type_node()
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				t.pointer = 1
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				self.expr.append( t )
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else:
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if self.expr:
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					raise RuntimeError('Invalid type expression (garbage after pointer qualifier -> "%s")' % (self.original_string))
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				self.set_base_type( i, signed, unsigned, const, extra_types )
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const = 0
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				signed = 0
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned = 0
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if signed and unsigned:
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				raise RuntimeError("Invalid type expression (both signed and unsigned specified)")
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if const:
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			raise RuntimeError("Invalid type expression (dangling const)")
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if unsigned:
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			raise RuntimeError("Invalid type expression (dangling signed)")
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if signed:
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			raise RuntimeError("Invalid type expression (dangling unsigned)")
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def set_base_type(self, type_name, signed, unsigned, const, extra_types):
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		te = type_expression.built_in_types.find_type( type_name )
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if not te:
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			te = extra_types.find_type( type_name )
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if not te:
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			raise RuntimeError('Unknown base type "%s".' % (type_name))
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.expr = copy.deepcopy(te.expr)
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		t = self.expr[ len(self.expr) - 1 ]
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		t.const = const
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if signed:
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			t.signed = 1
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		elif unsigned:
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			t.signed = 0
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def set_base_type_node(self, tn):
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		self.expr = [tn]
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def set_elements(self, count):
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn = self.expr[0]
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn.elements = count
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def string(self):
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		s = ""
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for t in self.expr:
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			s += t.string()
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return s
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def get_base_type_node(self):
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return self.expr[0]
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def get_base_name(self):
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if len(self.expr):
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return self.expr[0].name
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else:
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return None
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def get_element_size(self):
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn = self.expr[0]
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if tn.elements:
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return tn.elements * tn.size
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else:
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return tn.size
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def get_element_count(self):
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn = self.expr[0]
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return tn.elements
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def get_stack_size(self):
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn = self.expr[ -1 ]
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if tn.elements or tn.pointer:
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 4
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		elif not tn.integer:
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return tn.size
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else:
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 4
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def is_pointer(self):
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn = self.expr[ -1 ]
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return tn.pointer
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	def format_string(self):
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tn = self.expr[ -1 ]
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if tn.pointer:
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return "%p"
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		elif not tn.integer:
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return "%f"
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else:
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return "%d"
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgif __name__ == '__main__':
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	types_to_try = [ "int", "int *", "const int *", "int * const", "const int * const", \
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	                 "unsigned * const *", \
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 "float", "const double", "double * const"]
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	create_initial_types()
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for t in types_to_try:
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		print 'Trying "%s"...' % (t)
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		te = type_expression( t )
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		print 'Got "%s" (%u, %u).' % (te.string(), te.get_stack_size(), te.get_element_size())
293