xref: /original-bsd/old/dbx/debug.c (revision 2301fdfb)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)debug.c	5.1 (Berkeley) 05/31/85";
9 #endif not lint
10 
11 static char rcsid[] = "$Header: debug.c,v 1.5 84/12/26 10:39:01 linton Exp $";
12 
13 /*
14  *  Debug routines
15  */
16 
17 #include "defs.h"
18 #include "tree.h"
19 #include "operators.h"
20 #include "eval.h"
21 #include "events.h"
22 #include "symbols.h"
23 #include "scanner.h"
24 #include "source.h"
25 #include "object.h"
26 #include "main.h"
27 #include "mappings.h"
28 #include "process.h"
29 #include "machine.h"
30 #include "debug.h"
31 #include <signal.h>
32 
33 public boolean tracetree;	/* trace building of parse trees */
34 public boolean traceeval;	/* trace tree evaluation */
35 
36 /*
37  * Dynamically turn on/off a debug flag, or display some information.
38  */
39 
40 public debug (p)
41 Node p;
42 {
43     int code;
44 
45     code = p->value.lcon;
46     switch (code) {
47 	case 0:
48 	    puts("debugging flags:");
49 	    puts("    1        trace scanner return values");
50 	    puts("    2        trace breakpoints");
51 	    puts("    3        trace execution");
52 	    puts("    4        trace tree building");
53 	    puts("    5        trace tree evaluation");
54 	    puts("   -[12345]  turns off corresponding flag");
55 	    puts("    6        dump function table");
56 	    break;
57 
58 	case 1:
59 	case -1:
60 #           ifdef LEXDEBUG
61 		lexdebug = (boolean) (code > 0);
62 #           else
63 		error("can't debug scanner (not compiled with LEXDEBUG)");
64 #           endif
65 	    break;
66 
67 	case 2:
68 	case -2:
69 	    tracebpts = (boolean) (code > 0);
70 	    break;
71 
72 	case 3:
73 	case -3:
74 	    traceexec = (boolean) (code > 0);
75 	    break;
76 
77 	case 4:
78 	case -4:
79 	    tracetree = (boolean) (code > 0);
80 	    break;
81 
82 	case 5:
83 	case -5:
84 	    traceeval = (boolean) (code > 0);
85 	    break;
86 
87 	case 6:
88 	    dumpfunctab();
89 	    break;
90 
91 	default:
92 	    error("unknown debug flag");
93 	    break;
94     }
95 }
96 
97 private String leafname[] = {
98     "nop", "name", "sym", "lcon", "fcon", "scon", "rval", "index"
99 };
100 
101 public String opname (op)
102 Operator op;
103 {
104     String s;
105     static char buf[100];
106 
107     switch (op) {
108 	case O_ITOF:
109 	    s = "itof";
110 	    break;
111 
112 	case O_ENDX:
113 	    s = "endx";
114 	    break;
115 
116 	case O_QLINE:
117 	    s = "qline";
118 	    break;
119 
120 	default:
121 	    if (ord(op) <= ord(O_INDEX)) {
122 		s = leafname[ord(op)];
123 	    } else {
124 		s = opinfo[ord(op)].opstring;
125 		if (s == nil) {
126 		    sprintf(buf, "[op %d]", op);
127 		    s = buf;
128 		}
129 	    }
130 	    break;
131     }
132     return s;
133 }
134