|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * Author: David B. Golub, Carnegie Mellon University
28: * Date: 7/90
29: */
30: #include "mach_kdb.h"
31: #if MACH_KDB
32:
33: #include <mach/boolean.h>
34: #include <machine/db_machdep.h>
35: #include <ddb/db_lex.h>
36: #include <ddb/db_access.h>
37: #include <ddb/db_command.h>
38: #include <kern/task.h>
39:
40:
41: boolean_t
42: db_term(valuep)
43: db_expr_t *valuep;
44: {
45: int t;
46:
47: switch(t = db_read_token()) {
48: case tIDENT:
49: if (!db_value_of_name(db_tok_string, valuep)) {
50: db_printf("Symbol \"%s\" not found\n", db_tok_string);
51: db_error(0);
52: /*NOTREACHED*/
53: }
54: return (TRUE);
55: case tNUMBER:
56: *valuep = db_tok_number;
57: return (TRUE);
58: case tDOT:
59: *valuep = (db_expr_t)db_dot;
60: return (TRUE);
61: case tDOTDOT:
62: *valuep = (db_expr_t)db_prev;
63: return (TRUE);
64: case tPLUS:
65: *valuep = (db_expr_t) db_next;
66: return (TRUE);
67: case tQUOTE:
68: *valuep = (db_expr_t)db_last_addr;
69: return (TRUE);
70: case tDOLLAR:
71: if (!db_get_variable(valuep))
72: return (FALSE);
73: return (TRUE);
74: case tLPAREN:
75: if (!db_expression(valuep)) {
76: db_error("Unmached ()s\n");
77: /*NOTREACHED*/
78: }
79: t = db_read_token();
80: if (t != tRPAREN) {
81: db_printf("')' expected at \"%s...\"\n", db_tok_string);
82: db_error(0);
83: /*NOTREACHED*/
84: }
85: return (TRUE);
86: default:
87: db_unread_token(t);
88: return (FALSE);
89: }
90: }
91:
92: int
93: db_size_option(modif, u_option, t_option)
94: char *modif;
95: boolean_t *u_option;
96: boolean_t *t_option;
97: {
98: register char *p;
99: int size = sizeof(int);
100:
101: *u_option = FALSE;
102: *t_option = FALSE;
103: for (p = modif; *p; p++) {
104: switch(*p) {
105: case 'b':
106: size = sizeof(char);
107: break;
108: case 'h':
109: size = sizeof(short);
110: break;
111: case 'l':
112: size = sizeof(long);
113: break;
114: case 'u':
115: *u_option = TRUE;
116: break;
117: case 't':
118: *t_option = TRUE;
119: break;
120: }
121: }
122: return(size);
123: }
124:
125: boolean_t
126: db_unary(valuep)
127: db_expr_t *valuep;
128: {
129: int t;
130: int size;
131: boolean_t u_opt, t_opt;
132: task_t task;
133: extern task_t db_default_task;
134:
135: t = db_read_token();
136: if (t == tMINUS) {
137: if (!db_unary(valuep)) {
138: db_error("Expression syntax error after '-'\n");
139: /*NOTREACHED*/
140: }
141: *valuep = -*valuep;
142: return (TRUE);
143: }
144: if (t == tSTAR) {
145: /* indirection */
146: if (!db_unary(valuep)) {
147: db_error("Expression syntax error after '*'\n");
148: /*NOTREACHED*/
149: }
150: task = TASK_NULL;
151: size = sizeof(db_addr_t);
152: u_opt = FALSE;
153: t = db_read_token();
154: if (t == tIDENT && db_tok_string[0] == ':') {
155: size = db_size_option(&db_tok_string[1], &u_opt, &t_opt);
156: if (t_opt)
157: task = db_default_task;
158: } else
159: db_unread_token(t);
160: *valuep = db_get_task_value((db_addr_t)*valuep, size, !u_opt, task);
161: return (TRUE);
162: }
163: if (t == tEXCL) {
164: if (!db_unary(valuep)) {
165: db_error("Expression syntax error after '!'\n");
166: /*NOTREACHED*/
167: }
168: *valuep = (!(*valuep));
169: return (TRUE);
170: }
171: db_unread_token(t);
172: return (db_term(valuep));
173: }
174:
175: boolean_t
176: db_mult_expr(valuep)
177: db_expr_t *valuep;
178: {
179: db_expr_t lhs, rhs;
180: int t;
181: char c;
182:
183: if (!db_unary(&lhs))
184: return (FALSE);
185:
186: t = db_read_token();
187: while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH
188: || t == tBIT_AND) {
189: c = db_tok_string[0];
190: if (!db_term(&rhs)) {
191: db_printf("Expression syntax error after '%c'\n", c);
192: db_error(0);
193: /*NOTREACHED*/
194: }
195: switch(t) {
196: case tSTAR:
197: lhs *= rhs;
198: break;
199: case tBIT_AND:
200: lhs &= rhs;
201: break;
202: default:
203: if (rhs == 0) {
204: db_error("Divide by 0\n");
205: /*NOTREACHED*/
206: }
207: if (t == tSLASH)
208: lhs /= rhs;
209: else if (t == tPCT)
210: lhs %= rhs;
211: else
212: lhs = ((lhs+rhs-1)/rhs)*rhs;
213: }
214: t = db_read_token();
215: }
216: db_unread_token(t);
217: *valuep = lhs;
218: return (TRUE);
219: }
220:
221: boolean_t
222: db_add_expr(valuep)
223: db_expr_t *valuep;
224: {
225: db_expr_t lhs, rhs;
226: int t;
227: char c;
228:
229: if (!db_mult_expr(&lhs))
230: return (FALSE);
231:
232: t = db_read_token();
233: while (t == tPLUS || t == tMINUS || t == tBIT_OR) {
234: c = db_tok_string[0];
235: if (!db_mult_expr(&rhs)) {
236: db_printf("Expression syntax error after '%c'\n", c);
237: db_error(0);
238: /*NOTREACHED*/
239: }
240: if (t == tPLUS)
241: lhs += rhs;
242: else if (t == tMINUS)
243: lhs -= rhs;
244: else
245: lhs |= rhs;
246: t = db_read_token();
247: }
248: db_unread_token(t);
249: *valuep = lhs;
250: return (TRUE);
251: }
252:
253: boolean_t
254: db_shift_expr(valuep)
255: db_expr_t *valuep;
256: {
257: db_expr_t lhs, rhs;
258: int t;
259:
260: if (!db_add_expr(&lhs))
261: return (FALSE);
262:
263: t = db_read_token();
264: while (t == tSHIFT_L || t == tSHIFT_R) {
265: if (!db_add_expr(&rhs)) {
266: db_printf("Expression syntax error after \"%s\"\n",
267: (t == tSHIFT_L)? "<<": ">>");
268: db_error(0);
269: /*NOTREACHED*/
270: }
271: if (rhs < 0) {
272: db_error("Negative shift amount\n");
273: /*NOTREACHED*/
274: }
275: if (t == tSHIFT_L)
276: lhs <<= rhs;
277: else {
278: /* Shift right is unsigned */
279: lhs = (natural_t) lhs >> rhs;
280: }
281: t = db_read_token();
282: }
283: db_unread_token(t);
284: *valuep = lhs;
285: return (TRUE);
286: }
287:
288: boolean_t
289: db_logical_relation_expr(valuep)
290: db_expr_t *valuep;
291: {
292: db_expr_t lhs, rhs;
293: int t;
294: char op[3];
295:
296: if (!db_shift_expr(&lhs))
297: return(FALSE);
298:
299: t = db_read_token();
300: while (t == tLOG_EQ || t == tLOG_NOT_EQ
301: || t == tGREATER || t == tGREATER_EQ
302: || t == tLESS || t == tLESS_EQ) {
303: op[0] = db_tok_string[0];
304: op[1] = db_tok_string[1];
305: op[2] = 0;
306: if (!db_shift_expr(&rhs)) {
307: db_printf("Expression syntax error after \"%s\"\n", op);
308: db_error(0);
309: /*NOTREACHED*/
310: }
311: switch(t) {
312: case tLOG_EQ:
313: lhs = (lhs == rhs);
314: break;
315: case tLOG_NOT_EQ:
316: lhs = (lhs != rhs);
317: break;
318: case tGREATER:
319: lhs = (lhs > rhs);
320: break;
321: case tGREATER_EQ:
322: lhs = (lhs >= rhs);
323: break;
324: case tLESS:
325: lhs = (lhs < rhs);
326: break;
327: case tLESS_EQ:
328: lhs = (lhs <= rhs);
329: break;
330: }
331: t = db_read_token();
332: }
333: db_unread_token(t);
334: *valuep = lhs;
335: return (TRUE);
336: }
337:
338: boolean_t
339: db_logical_and_expr(valuep)
340: db_expr_t *valuep;
341: {
342: db_expr_t lhs, rhs;
343: int t;
344:
345: if (!db_logical_relation_expr(&lhs))
346: return(FALSE);
347:
348: t = db_read_token();
349: while (t == tLOG_AND) {
350: if (!db_logical_relation_expr(&rhs)) {
351: db_error("Expression syntax error after \"&&\"\n");
352: /*NOTREACHED*/
353: }
354: lhs = (lhs && rhs);
355: }
356: db_unread_token(t);
357: *valuep = lhs;
358: return (TRUE);
359: }
360:
361: boolean_t
362: db_logical_or_expr(valuep)
363: db_expr_t *valuep;
364: {
365: db_expr_t lhs, rhs;
366: int t;
367:
368: if (!db_logical_and_expr(&lhs))
369: return(FALSE);
370:
371: t = db_read_token();
372: while (t == tLOG_OR) {
373: if (!db_logical_and_expr(&rhs)) {
374: db_error("Expression syntax error after \"||\"\n");
375: /*NOTREACHED*/
376: }
377: lhs = (lhs || rhs);
378: }
379: db_unread_token(t);
380: *valuep = lhs;
381: return (TRUE);
382: }
383:
384: int
385: db_expression(valuep)
386: db_expr_t *valuep;
387: {
388: return (db_logical_or_expr(valuep));
389: }
390:
391: #endif MACH_KDB
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.