xref: /original-bsd/old/dbx/operators.c (revision 1e14295c)
1 /*
2  * Copyright (c) 1983 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)operators.c	5.2 (Berkeley) 05/23/89";
20 #endif /* not lint */
21 
22 /*
23  * Tree node classes.
24  */
25 
26 #include "defs.h"
27 #include "operators.h"
28 
29 #ifndef public
30 typedef struct {
31     char numargs;
32     char opflags;
33     String opstring;
34 } Opinfo;
35 
36 typedef enum {
37     O_NOP,
38     O_NAME, O_SYM, O_LCON, O_CCON, O_FCON, O_SCON,
39     O_RVAL, O_INDEX, O_INDIR, O_DOT,
40     O_COMMA,
41 
42     O_ITOF, O_ADD, O_ADDF, O_SUB, O_SUBF, O_NEG, O_NEGF,
43     O_MUL, O_MULF, O_DIVF, O_DIV, O_MOD,
44 
45     O_AND, O_OR,
46 
47     O_LT, O_LTF, O_LE, O_LEF, O_GT, O_GTF, O_GE, O_GEF,
48     O_EQ, O_EQF, O_NE, O_NEF,
49 
50     O_ALIAS,		/* rename a command */
51     O_ASSIGN,		/* assign a value to a program variable */
52     O_CALL,		/* call a procedure in the program */
53     O_CATCH,		/* catch a signal before program does */
54     O_CHFILE,		/* change (or print) the current source file */
55     O_CONT,		/* continue execution */
56     O_DEBUG,		/* invoke a dbx internal debugging routine */
57     O_DELETE,		/* remove a trace/stop */
58     O_DUMP,		/* dump out variables */
59     O_EDIT,		/* edit a file (or function) */
60     O_FUNC,		/* set the current function */
61     O_GRIPE,		/* send mail to debugger support person */
62     O_HELP,		/* print a synopsis of debugger commands */
63     O_IGNORE,		/* let program catch signal */
64     O_LIST,		/* list source lines */
65     O_PRINT,		/* print the values of a list of expressions */
66     O_PSYM,		/* print symbol information */
67     O_RUN,		/* start up program */
68     O_SKIP,		/* skip the current line */
69     O_SOURCE,		/* read commands from a file */
70     O_STATUS,		/* display currently active trace/stop's */
71     O_STEP,		/* execute a single line */
72     O_STOP,		/* stop on an event */
73     O_STOPI,		/* stop on an event at an instruction boundary */
74     O_TRACE,		/* trace something on an event */
75     O_TRACEI,		/* trace at the instruction level */
76     O_WHATIS,		/* print the declaration of a variable */
77     O_WHERE,		/* print a stack trace */
78     O_WHEREIS,		/* print all the symbols with the given name */
79     O_WHICH,		/* print out full qualification of a symbol */
80     O_EXAMINE,		/* examine program instructions/data */
81 
82     O_ADDEVENT,		/* add an event */
83     O_ENDX,		/* end of program reached */
84     O_IF,		/* if first arg is true, do commands in second arg */
85     O_ONCE,		/* add a "one-time" event, delete when first reached */
86     O_PRINTCALL,	/* print out the current procedure and its arguments */
87     O_PRINTIFCHANGED,	/* print the value of the argument if it has changed */
88     O_PRINTRTN,		/* print out the routine and value that just returned */
89     O_PRINTSRCPOS,	/* print out the current source position */
90     O_PROCRTN,		/* call completed */
91     O_QLINE,		/* filename, line number */
92     O_STOPIFCHANGED,	/* stop if the value of the argument has changed */
93     O_STOPX,		/* stop execution */
94     O_TRACEON,		/* begin tracing source line, variable, or all lines */
95     O_TRACEOFF,		/* end tracing source line, variable, or all lines */
96 
97     O_TYPERENAME,	/* state the type of an expression */
98     O_RERUN,		/* re-run program with the same arguments as before */
99     O_RETURN,		/* continue execution until procedure returns */
100     O_UP,		/* move current function up the call stack */
101     O_DOWN,		/* move current function down the call stack */
102     O_CALLPROC,		/* call command */
103     O_SEARCH,		/* regular expression pattern search through source */
104     O_SET,		/* set a debugger variable */
105     O_UNSET,		/* unset a debugger variable */
106     O_UNALIAS,		/* remove an alias */
107 
108     O_LASTOP
109 } Operator;
110 
111 /*
112  * Operator flags and predicates.
113  */
114 
115 #define null 0
116 #define LEAF 01
117 #define UNARY 02
118 #define BINARY 04
119 #define BOOL 010
120 #define REALOP 020
121 #define INTOP 040
122 
123 #define isbitset(a, m)	((a&m) == m)
124 #define isleaf(o)	isbitset(opinfo[ord(o)].opflags, LEAF)
125 #define isunary(o)	isbitset(opinfo[ord(o)].opflags, UNARY)
126 #define isbinary(o)	isbitset(opinfo[ord(o)].opflags, BINARY)
127 #define isreal(o)	isbitset(opinfo[ord(o)].opflags, REALOP)
128 #define isint(o)	isbitset(opinfo[ord(o)].opflags, INTOP)
129 #define isboolean(o)	isbitset(opinfo[ord(o)].opflags, BOOL)
130 
131 #define degree(o)	(opinfo[ord(o)].opflags&(LEAF|UNARY|BINARY))
132 #define nargs(o)	(opinfo[ord(o)].numargs)
133 
134 #endif
135 
136 /*
137  * Operator information structure.
138  */
139 
140 public Opinfo opinfo[] ={
141 /* O_NOP */		0,	null,		0,
142 /* O_NAME */		-1,	LEAF,		0,
143 /* O_SYM */		-1,	LEAF,		0,
144 /* O_LCON */		-1,	LEAF,		0,
145 /* O_CCON */		-1,	LEAF,		0,
146 /* O_FCON */		-1,	LEAF,		0,
147 /* O_SCON */		-1,	LEAF,		0,
148 /* O_RVAL */		1,	UNARY,		0,
149 /* O_INDEX */		2,	null,		0,
150 /* O_INDIR */		1,	UNARY,		"^",
151 /* O_DOT */		2,	null,		".",
152 /* O_COMMA */		2,	null,		",",
153 /* O_ITOF */		1,	UNARY|INTOP,	0,
154 /* O_ADD */		2,	BINARY|INTOP,	"+",
155 /* O_ADDF */		2,	BINARY|REALOP,	"+",
156 /* O_SUB */		2,	BINARY|INTOP,	"-",
157 /* O_SUBF */		2,	BINARY|REALOP,	"-",
158 /* O_NEG */		1,	UNARY|INTOP,	"-",
159 /* O_NEGF */		1,	UNARY|REALOP,	"-",
160 /* O_MUL */		2,	BINARY|INTOP,	"*",
161 /* O_MULF */		2,	BINARY|REALOP,	"*",
162 /* O_DIVF */		2,	BINARY|REALOP,	"/",
163 /* O_DIV */		2,	BINARY|INTOP,	" div ",
164 /* O_MOD */		2,	BINARY|INTOP,	" mod ",
165 /* O_AND */		2,	BINARY|INTOP,	" and ",
166 /* O_OR */		2,	BINARY|INTOP,	" or ",
167 /* O_LT */		2,	BINARY|INTOP,	" < ",
168 /* O_LTF */		2,	BINARY|REALOP,	" < ",
169 /* O_LE */		2,	BINARY|INTOP,	" <= ",
170 /* O_LEF */		2,	BINARY|REALOP,	" <= ",
171 /* O_GT */		2,	BINARY|INTOP,	" > ",
172 /* O_GTF */		2,	BINARY|REALOP,	" > ",
173 /* O_GE */		2,	BINARY|INTOP,	" >= ",
174 /* O_GEF */		2,	BINARY|REALOP,	" >= ",
175 /* O_EQ */		2,	BINARY|INTOP,	" = ",
176 /* O_EQF */		2,	BINARY|REALOP,	" = ",
177 /* O_NE */		2,	BINARY|INTOP,	" <> ",
178 /* O_NEF */		2,	BINARY|REALOP,	" <> ",
179 
180 /* O_ALIAS */		2,	null,		"alias",
181 /* O_ASSIGN */		2,	null,		" := ",
182 /* O_CALL */		2,	null,		"call",
183 /* O_CATCH */		0,	null,		"catch",
184 /* O_CHFILE */		0,	null,		"file",
185 /* O_CONT */		0,	null,		"cont",
186 /* O_DEBUG */		0,	null,		"debug",
187 /* O_DELETE */		1,	null,		"delete",
188 /* O_DUMP */		1,	null,		"dump",
189 /* O_EDIT */		0,	null,		"edit",
190 /* O_FUNC */		1,	null,		"func",
191 /* O_GRIPE */		0,	null,		"gripe",
192 /* O_HELP */		0,	null,		"help",
193 /* O_IGNORE */		0,	null,		"ignore",
194 /* O_LIST */		2,	null,		"list",
195 /* O_PRINT */		1,	null,		"print",
196 /* O_PSYM */		1,	null,		"psym",
197 /* O_RUN */		0,	null,		"run",
198 /* O_SKIP */		0,	null,		"skip",
199 /* O_SOURCE */		0,	null,		"source",
200 /* O_STATUS */		0,	null,		"status",
201 /* O_STEP */		0,	null,		"step",
202 /* O_STOP */		3,	null,		"stop",
203 /* O_STOPI */		3,	null,		"stopi",
204 /* O_TRACE */		3,	null,		"trace",
205 /* O_TRACEI */		3,	null,		"tracei",
206 /* O_WHATIS */		1,	null,		"whatis",
207 /* O_WHERE */		0,	null,		"where",
208 /* O_WHEREIS */		1,	null,		"whereis",
209 /* O_WHICH */		1,	null,		"which",
210 /* O_EXAMINE */		0,	null,		"examine",
211 
212 /* O_ADDEVENT */	0,	null,		"when",
213 /* O_ENDX */		0,	null,		nil,
214 /* O_IF */		0,	null,		"if",
215 /* O_ONCE */		0,	null,		"once",
216 /* O_PRINTCALL */	1,	null,		"printcall",
217 /* O_PRINTIFCHANGED */	1,	null,		"printifchanged",
218 /* O_PRINTRTN */	1,	null,		"printrtn",
219 /* O_PRINTSRCPOS */	1,	null,		"printsrcpos",
220 /* O_PROCRTN */		1,	null,		"procrtn",
221 /* O_QLINE */		2,	null,		nil,
222 /* O_STOPIFCHANGED */	1,	null,		"stopifchanged",
223 /* O_STOPX */		0,	null,		"stop",
224 /* O_TRACEON */		1,	null,		"traceon",
225 /* O_TRACEOFF */	1,	null,		"traceoff",
226 /* O_TYPERENAME */	2,	UNARY,		"type rename",
227 /* O_RERUN */		0,	null,		"rerun",
228 /* O_RETURN */		1,	null,		"return",
229 /* O_UP */		1,	UNARY,		"up",
230 /* O_DOWN */		1,	UNARY,		"down",
231 /* O_CALLPROC */	2,	null,		"call",
232 /* O_SEARCH */		2,	null,		"search",
233 /* O_SET */		2,	null,		"set",
234 /* O_UNSET */		1,	null,		"unset",
235 /* O_UNALIAS */		1,	null,		"unalias",
236 };
237