Mercurial > hg-old > index.cgi
comparison lwasm/main.c @ 364:0b5a26bedbe1
Pass framework simplified; skeleton pass 3
author | lost@starbug |
---|---|
date | Tue, 06 Apr 2010 21:35:09 -0600 |
parents | d96c30e60ddf |
children | 6a98cc90c14f |
comparison
equal
deleted
inserted
replaced
363:d96c30e60ddf | 364:0b5a26bedbe1 |
---|---|
164 main function; parse command line, set up assembler state, and run the | 164 main function; parse command line, set up assembler state, and run the |
165 assembler on the first file | 165 assembler on the first file |
166 */ | 166 */ |
167 extern void do_pass1(asmstate_t *as); | 167 extern void do_pass1(asmstate_t *as); |
168 extern void do_pass2(asmstate_t *as); | 168 extern void do_pass2(asmstate_t *as); |
169 extern void do_pass3(asmstate_t *as); | |
169 extern lw_expr_t lwasm_evaluate_special(int t, void *ptr, void *priv); | 170 extern lw_expr_t lwasm_evaluate_special(int t, void *ptr, void *priv); |
170 extern lw_expr_t lwasm_evaluate_var(char *var, void *priv); | 171 extern lw_expr_t lwasm_evaluate_var(char *var, void *priv); |
171 extern lw_expr_t lwasm_parse_term(char **p, void *priv); | 172 extern lw_expr_t lwasm_parse_term(char **p, void *priv); |
173 | |
174 struct passlist_s | |
175 { | |
176 char *passname; | |
177 void (*fn)(asmstate_t *as); | |
178 } passlist[] = { | |
179 { "parse", do_pass1 }, | |
180 { "symcheck", do_pass2 }, | |
181 { "resolve1", do_pass3 }, | |
182 { NULL, NULL } | |
183 }; | |
184 | |
172 int main(int argc, char **argv) | 185 int main(int argc, char **argv) |
173 { | 186 { |
187 int passnum; | |
188 | |
174 /* assembler state */ | 189 /* assembler state */ |
175 asmstate_t asmstate = { 0 }; | 190 asmstate_t asmstate = { 0 }; |
176 program_name = argv[0]; | 191 program_name = argv[0]; |
177 | 192 |
178 lw_expr_set_special_handler(lwasm_evaluate_special); | 193 lw_expr_set_special_handler(lwasm_evaluate_special); |
191 asmstate.output_file = lw_strdup("a.out"); | 206 asmstate.output_file = lw_strdup("a.out"); |
192 } | 207 } |
193 | 208 |
194 input_init(&asmstate); | 209 input_init(&asmstate); |
195 | 210 |
196 do_pass1(&asmstate); | 211 for (passnum = 0; passlist[passnum].fn; passnum++) |
197 if (asmstate.errorcount > 0) | |
198 { | 212 { |
199 lwasm_show_errors(&asmstate); | 213 fprintf(stderr, "Doing pass %d (%s)\n", passnum, passlist[passnum].passname); |
200 exit(1); | 214 (passlist[passnum].fn)(&asmstate); |
215 | |
216 if (asmstate.errorcount > 0) | |
217 { | |
218 lwasm_show_errors(&asmstate); | |
219 exit(1); | |
220 } | |
201 } | 221 } |
202 do_pass2(&asmstate); | |
203 | |
204 exit(0); | |
205 } | 222 } |