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 }