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
49static 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
233void 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