1 /* $Id: tree.c,v 1.17 1995/08/17 14:32:55 ceriel Exp $ */
28 extern char *strrindex();
29 extern int interrupted;
37 register p_tree p = new_tree();
51 register p_tree p = new_tree();
57 p->t_oper = va_arg(ap, int);
62 p->t_idf = va_arg(ap, struct idf *);
63 p->t_str = va_arg(ap, char *);
66 p->t_sval = va_arg(ap, char *);
69 p->t_fval = va_arg(ap, double);
72 p->t_lino = va_arg(ap, long);
73 p->t_filename = va_arg(ap, char *);
76 p->t_ival = va_arg(ap, long);
79 na = nargs(p->t_oper);
80 assert(na <= MAXARGS);
81 for (i = 0; i < na; i++) {
82 p->t_args[i] = va_arg(ap, p_tree);
97 na = nargs(p->t_oper);
98 assert(na <= MAXARGS);
99 for (i = 0; i < na; i++) {
100 freenode(p->t_args[i]);
106 get_addr_from_node(p)
110 register p_symbol sym;
112 if (! p) return NO_ADDR;
113 if (p->t_address != 0) return p->t_address;
116 if (! p->t_filename &&
117 (! listfile || ! (p->t_filename = listfile->sy_idf->id_text))) {
118 error("no current file");
121 a = get_addr_from_position(&(p->t_pos));
123 error("could not determine address of \"%s\":%d",
124 p->t_filename, p->t_lino);
131 a = get_addr_from_node(p->t_args[0]);
136 a = get_addr_from_node(p->t_args[1]);
137 sc = base_scope(get_scope_from_addr(a));
138 sym = identify(p->t_args[0], FUNCTION|PROC|MODULE);
139 if (! sym->sy_name.nm_scope ||
140 ! sym->sy_name.nm_scope->sc_bp_opp) {
141 error("could not determine address of \"%s\"", p->t_str);
145 if (sc->sc_definedby != sym) {
146 error("inconsistent address");
156 sym = identify(p, FUNCTION|PROC|MODULE);
160 if (! sym->sy_name.nm_scope || ! sym->sy_name.nm_scope->sc_bp_opp) {
161 error("could not determine address of \"%s\"", p->t_str);
164 a = sym->sy_name.nm_scope->sc_bp_opp;
173 static int ommit_commas = 0;
175 print_node(f, p, top_level)
183 print_node(f, p->t_args[0], 0);
191 print_node(f, p->t_args[0], 0);
197 print_node(f, p->t_args[0], 0);
199 if (p->t_args[1]->t_ival >= 0) {
201 print_node(f, p->t_args[1], 0);
204 if (p->t_args[1]->t_ival < -100000000) {
207 else print_node(f, p->t_args[1], 0);
214 print_node(f, p->t_args[0], 0);
218 print_node(f, p->t_args[0], 0);
222 print_node(f, p->t_args[0], 0);
225 fputs("disable ", f);
226 print_node(f, p->t_args[0], 0);
229 fputs("display ", f);
230 print_node(f, p->t_args[0], 0);
233 print_node(f, p->t_args[0], 0);
234 if (! ommit_commas) fputs(", ", f);
236 print_node(f, p->t_args[1], 0);
240 print_node(f, p->t_args[0], 0);
244 print_node(f, p->t_args[0], 0);
248 print_node(f, p->t_args[0], 0);
252 print_node(f, p->t_args[0], 0);
256 print_node(f, p->t_args[0], 0);
258 print_node(f, p->t_args[1], 0);
262 print_node(f, p->t_args[0], 0);
266 print_node(f, p->t_args[0], 0);
270 print_node(f, p->t_args[0], 0);
274 print_node(f, p->t_args[0], 0);
278 print_node(f, p->t_args[0], 0);
282 print_node(f, p->t_args[0], 0);
289 (void) print_position(p->t_address, 1);
292 fputs("restore ", f);
293 print_node(f, p->t_args[0], 0);
297 print_node(f, p->t_args[0], 0);
301 print_node(f, p->t_args[0], 0);
306 fprintf(f, " %ld", p->t_args[0]->t_ival);
310 print_node(f, p->t_args[1], 0);
316 if (p->t_address != NO_ADDR) {
317 (void) print_position(p->t_address, 1);
319 else print_node(f, p->t_args[0], 0);
322 print_node(f, p->t_args[1], 0);
326 while (p && p->t_oper == OP_LINK) {
327 print_node(f, p->t_args[0], 0);
336 if (p->t_address != NO_ADDR) {
337 (void) print_position(p->t_address, 1);
339 else print_node(f, p->t_args[0], 0);
342 print_node(f, p->t_args[1], 0);
349 print_node(f, p->t_args[2], 0);
352 if (p->t_address != NO_ADDR) {
353 (void) print_position(p->t_address, 1);
355 else print_node(f, p->t_args[0], 0);
358 print_node(f, p->t_args[1], 0);
362 fprintf(f, "at \"%s\":%d", p->t_filename, (int) p->t_lino);
366 print_node(f, p->t_args[0], 0);
368 print_node(f, p->t_args[1], 0);
371 print_node(f, p->t_args[0], 0);
373 print_node(f, p->t_args[1], 0);
376 fprintf(f, "> %s ", p->t_str);
379 fprintf(f, "< %s ", p->t_str);
385 fprintf(f, currlang->decint_fmt, p->t_ival);
388 (*currlang->printstring)(f, p->t_sval, strlen(p->t_sval));
391 fprintf(f, currlang->real_fmt, p->t_fval);
394 print_node(f, p->t_args[0], 0);
396 print_node(f, p->t_args[1], 0);
400 (*currlang->printop)(f, p);
405 if (top_level) fputs("\n", f);
412 switch(com->t_oper) {
414 com->t_args[0]->t_ival = 1;
415 freenode(com->t_args[1]);
420 freenode(com->t_args[0]);
424 freenode(com->t_args[0]);
426 freenode(com->t_args[1]);
437 switch(com->t_oper) {
439 /* not really in status but may not be removed */
453 if (p && operators[p->t_oper].op_fun) (*operators[p->t_oper].op_fun)(p);
457 register struct idf *id;
459 register p_symbol sym = Lookup(id, PervasiveScope, FILESYM);
461 if (listfile != sym) listline = 1;
465 listfile = add_file(id->id_text);
466 listfile->sy_file->f_scope = FileScope;
468 find_language(strrindex(id->id_text, '.'));
479 if (p->t_args[1] && ! eval_cond(p->t_args[1])) break;
482 while (p && p->t_oper == OP_LINK) {
483 if (interrupted) return;
484 if (p->t_args[0]) eval(p->t_args[0]);
487 if (interrupted) return;
492 if (p->t_args[0] && p->t_args[0]->t_oper == OP_IN) {
493 register p_scope sc = base_scope(CurrentScope);
495 if (sc != get_scope_from_addr(p->t_args[0]->t_address)) {
499 if (interrupted) return;
500 if (p->t_args[1] && ! eval_cond(p->t_args[1])) break;
501 list_position(get_position_from_addr(a));
502 if (p->t_args[2]) do_print(p->t_args[2]);
512 newfile(str2idf(pos->filename, 1));
514 currline = pos->lineno;
515 lines(currfile->sy_file, (int)currline, (int)1);