1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* exprdefs.c */ |
4 | /* */ |
5 | /* Expression tree definitions */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 1998-2012, Ullrich von Bassewitz */ |
10 | /* Roemerstrasse 52 */ |
11 | /* D-70794 Filderstadt */ |
12 | /* EMail: uz@cc65.org */ |
13 | /* */ |
14 | /* */ |
15 | /* This software is provided 'as-is', without any expressed or implied */ |
16 | /* warranty. In no event will the authors be held liable for any damages */ |
17 | /* arising from the use of this software. */ |
18 | /* */ |
19 | /* Permission is granted to anyone to use this software for any purpose, */ |
20 | /* including commercial applications, and to alter it and redistribute it */ |
21 | /* freely, subject to the following restrictions: */ |
22 | /* */ |
23 | /* 1. The origin of this software must not be misrepresented; you must not */ |
24 | /* claim that you wrote the original software. If you use this software */ |
25 | /* in a product, an acknowledgment in the product documentation would be */ |
26 | /* appreciated but is not required. */ |
27 | /* 2. Altered source versions must be plainly marked as such, and must not */ |
28 | /* be misrepresented as being the original software. */ |
29 | /* 3. This notice may not be removed or altered from any source */ |
30 | /* distribution. */ |
31 | /* */ |
32 | /*****************************************************************************/ |
33 | |
34 | |
35 | |
36 | #include <stdio.h> |
37 | |
38 | #include "abend.h" |
39 | #include "exprdefs.h" |
40 | |
41 | |
42 | |
43 | /*****************************************************************************/ |
44 | /* Code */ |
45 | /*****************************************************************************/ |
46 | |
47 | |
48 | |
49 | static void InternalDumpExpr (const ExprNode* Expr, const ExprNode* (*ResolveSym) (const struct SymEntry*)) |
50 | /* Dump an expression in RPN to stdout */ |
51 | { |
52 | if (Expr == 0) { |
53 | return; |
54 | } |
55 | InternalDumpExpr (Expr->Left, ResolveSym); |
56 | InternalDumpExpr (Expr->Right, ResolveSym); |
57 | |
58 | switch (Expr->Op) { |
59 | |
60 | case EXPR_LITERAL: |
61 | case EXPR_ULABEL: |
62 | printf (" $%04lX" , Expr->V.IVal); |
63 | break; |
64 | |
65 | case EXPR_SYMBOL: |
66 | printf (" SYM(" ); |
67 | if (ResolveSym && (Expr = ResolveSym (Expr->V.Sym)) != 0) { |
68 | InternalDumpExpr (Expr, ResolveSym); |
69 | } |
70 | printf (") " ); |
71 | break; |
72 | |
73 | case EXPR_SECTION: |
74 | printf (" SEC" ); |
75 | break; |
76 | |
77 | case EXPR_SEGMENT: |
78 | printf (" SEG" ); |
79 | break; |
80 | |
81 | case EXPR_MEMAREA: |
82 | printf (" MEM" ); |
83 | break; |
84 | |
85 | case EXPR_PLUS: |
86 | printf (" +" ); |
87 | break; |
88 | |
89 | case EXPR_MINUS: |
90 | printf (" -" ); |
91 | break; |
92 | |
93 | case EXPR_MUL: |
94 | printf (" *" ); |
95 | break; |
96 | |
97 | case EXPR_DIV: |
98 | printf (" /" ); |
99 | break; |
100 | |
101 | case EXPR_MOD: |
102 | printf (" MOD" ); |
103 | break; |
104 | |
105 | case EXPR_OR: |
106 | printf (" OR" ); |
107 | break; |
108 | |
109 | case EXPR_XOR: |
110 | printf (" XOR" ); |
111 | break; |
112 | |
113 | case EXPR_AND: |
114 | printf (" AND" ); |
115 | break; |
116 | |
117 | case EXPR_SHL: |
118 | printf (" SHL" ); |
119 | break; |
120 | |
121 | case EXPR_SHR: |
122 | printf (" SHR" ); |
123 | break; |
124 | |
125 | case EXPR_EQ: |
126 | printf (" =" ); |
127 | break; |
128 | |
129 | case EXPR_NE: |
130 | printf ("<>" ); |
131 | break; |
132 | |
133 | case EXPR_LT: |
134 | printf (" <" ); |
135 | break; |
136 | |
137 | case EXPR_GT: |
138 | printf (" >" ); |
139 | break; |
140 | |
141 | case EXPR_LE: |
142 | printf (" <=" ); |
143 | break; |
144 | |
145 | case EXPR_GE: |
146 | printf (" >=" ); |
147 | break; |
148 | |
149 | case EXPR_BOOLAND: |
150 | printf (" BOOL_AND" ); |
151 | break; |
152 | |
153 | case EXPR_BOOLOR: |
154 | printf (" BOOL_OR" ); |
155 | break; |
156 | |
157 | case EXPR_BOOLXOR: |
158 | printf (" BOOL_XOR" ); |
159 | break; |
160 | |
161 | case EXPR_MAX: |
162 | printf (" MAX" ); |
163 | break; |
164 | |
165 | case EXPR_MIN: |
166 | printf (" MIN" ); |
167 | break; |
168 | |
169 | case EXPR_UNARY_MINUS: |
170 | printf (" NEG" ); |
171 | break; |
172 | |
173 | case EXPR_NOT: |
174 | printf (" ~" ); |
175 | break; |
176 | |
177 | case EXPR_SWAP: |
178 | printf (" SWAP" ); |
179 | break; |
180 | |
181 | case EXPR_BOOLNOT: |
182 | printf (" BOOL_NOT" ); |
183 | break; |
184 | |
185 | case EXPR_BANK: |
186 | printf (" BANK" ); |
187 | break; |
188 | |
189 | case EXPR_BYTE0: |
190 | printf (" BYTE0" ); |
191 | break; |
192 | |
193 | case EXPR_BYTE1: |
194 | printf (" BYTE1" ); |
195 | break; |
196 | |
197 | case EXPR_BYTE2: |
198 | printf (" BYTE2" ); |
199 | break; |
200 | |
201 | case EXPR_BYTE3: |
202 | printf (" BYTE3" ); |
203 | break; |
204 | |
205 | case EXPR_WORD0: |
206 | printf (" WORD0" ); |
207 | break; |
208 | |
209 | case EXPR_WORD1: |
210 | printf (" WORD1" ); |
211 | break; |
212 | |
213 | case EXPR_FARADDR: |
214 | printf (" FARADDR" ); |
215 | break; |
216 | |
217 | case EXPR_DWORD: |
218 | printf (" DWORD" ); |
219 | break; |
220 | |
221 | case EXPR_NEARADDR: |
222 | printf (" NEARADDR" ); |
223 | break; |
224 | |
225 | default: |
226 | AbEnd ("Unknown Op type: %u" , Expr->Op); |
227 | |
228 | } |
229 | } |
230 | |
231 | |
232 | |
233 | void DumpExpr (const ExprNode* Expr, const ExprNode* (*ResolveSym) (const struct SymEntry*)) |
234 | /* Dump an expression tree to stdout */ |
235 | { |
236 | InternalDumpExpr (Expr, ResolveSym); |
237 | printf ("\n" ); |
238 | } |
239 | |