Annotation of sys/ddb/db_expr.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: db_expr.c,v 1.8 2006/03/13 06:23:20 jsg Exp $ */
2: /* $NetBSD: db_expr.c,v 1.5 1996/02/05 01:56:58 christos Exp $ */
3:
4: /*
5: * Mach Operating System
6: * Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University
7: * All Rights Reserved.
8: *
9: * Permission to use, copy, modify and distribute this software and its
10: * documentation is hereby granted, provided that both the copyright
11: * notice and this permission notice appear in all copies of the
12: * software, derivative works or modified versions, and any portions
13: * thereof, and that both notices appear in supporting documentation.
14: *
15: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
17: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18: *
19: * Carnegie Mellon requests users of this software to return to
20: *
21: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
22: * School of Computer Science
23: * Carnegie Mellon University
24: * Pittsburgh PA 15213-3890
25: *
26: * any improvements or extensions that they make and grant Carnegie Mellon
27: * the rights to redistribute these changes.
28: *
29: * Author: David B. Golub, Carnegie Mellon University
30: * Date: 7/90
31: */
32:
33: #include <sys/param.h>
34: #include <sys/proc.h>
35:
36: #include <uvm/uvm_extern.h>
37:
38: #include <machine/db_machdep.h>
39:
40: #include <ddb/db_lex.h>
41: #include <ddb/db_access.h>
42: #include <ddb/db_command.h>
43: #include <ddb/db_sym.h>
44: #include <ddb/db_extern.h>
45: #include <ddb/db_variables.h>
46:
47: boolean_t
48: db_term(db_expr_t *valuep)
49: {
50: int t;
51:
52: t = db_read_token();
53: if (t == tIDENT) {
54: if (!db_value_of_name(db_tok_string, valuep)) {
55: db_error("Symbol not found\n");
56: /*NOTREACHED*/
57: }
58: return (TRUE);
59: }
60: if (t == tNUMBER) {
61: *valuep = db_tok_number;
62: return (TRUE);
63: }
64: if (t == tDOT) {
65: *valuep = (db_expr_t)db_dot;
66: return (TRUE);
67: }
68: if (t == tDOTDOT) {
69: *valuep = (db_expr_t)db_prev;
70: return (TRUE);
71: }
72: if (t == tPLUS) {
73: *valuep = (db_expr_t) db_next;
74: return (TRUE);
75: }
76: if (t == tDITTO) {
77: *valuep = (db_expr_t)db_last_addr;
78: return (TRUE);
79: }
80: if (t == tDOLLAR) {
81: if (!db_get_variable(valuep))
82: return (FALSE);
83: return (TRUE);
84: }
85: if (t == tLPAREN) {
86: if (!db_expression(valuep)) {
87: db_error("Syntax error\n");
88: /*NOTREACHED*/
89: }
90: t = db_read_token();
91: if (t != tRPAREN) {
92: db_error("Syntax error\n");
93: /*NOTREACHED*/
94: }
95: return (TRUE);
96: }
97: db_unread_token(t);
98: return (FALSE);
99: }
100:
101: boolean_t
102: db_unary(db_expr_t *valuep)
103: {
104: int t;
105:
106: t = db_read_token();
107: if (t == tMINUS) {
108: if (!db_unary(valuep)) {
109: db_error("Syntax error\n");
110: /*NOTREACHED*/
111: }
112: *valuep = -*valuep;
113: return (TRUE);
114: }
115: if (t == tSTAR) {
116: /* indirection */
117: if (!db_unary(valuep)) {
118: db_error("Syntax error\n");
119: /*NOTREACHED*/
120: }
121: *valuep = db_get_value((db_addr_t)*valuep, sizeof(int), FALSE);
122: return (TRUE);
123: }
124: db_unread_token(t);
125: return (db_term(valuep));
126: }
127:
128: boolean_t
129: db_mult_expr(db_expr_t *valuep)
130: {
131: db_expr_t lhs, rhs;
132: int t;
133:
134: if (!db_unary(&lhs))
135: return (FALSE);
136:
137: t = db_read_token();
138: while (t == tSTAR || t == tSLASH || t == tPCT || t == tHASH) {
139: if (!db_term(&rhs)) {
140: db_error("Syntax error\n");
141: /*NOTREACHED*/
142: }
143: if (t == tSTAR)
144: lhs *= rhs;
145: else {
146: if (rhs == 0) {
147: db_error("Divide by 0\n");
148: /*NOTREACHED*/
149: }
150: if (t == tSLASH)
151: lhs /= rhs;
152: else if (t == tPCT)
153: lhs %= rhs;
154: else
155: lhs = ((lhs+rhs-1)/rhs)*rhs;
156: }
157: t = db_read_token();
158: }
159: db_unread_token(t);
160: *valuep = lhs;
161: return (TRUE);
162: }
163:
164: boolean_t
165: db_add_expr(db_expr_t *valuep)
166: {
167: db_expr_t lhs, rhs;
168: int t;
169:
170: if (!db_mult_expr(&lhs))
171: return (FALSE);
172:
173: t = db_read_token();
174: while (t == tPLUS || t == tMINUS) {
175: if (!db_mult_expr(&rhs)) {
176: db_error("Syntax error\n");
177: /*NOTREACHED*/
178: }
179: if (t == tPLUS)
180: lhs += rhs;
181: else
182: lhs -= rhs;
183: t = db_read_token();
184: }
185: db_unread_token(t);
186: *valuep = lhs;
187: return (TRUE);
188: }
189:
190: boolean_t
191: db_shift_expr(db_expr_t *valuep)
192: {
193: db_expr_t lhs, rhs;
194: int t;
195:
196: if (!db_add_expr(&lhs))
197: return (FALSE);
198:
199: t = db_read_token();
200: while (t == tSHIFT_L || t == tSHIFT_R) {
201: if (!db_add_expr(&rhs)) {
202: db_error("Syntax error\n");
203: /*NOTREACHED*/
204: }
205: if (rhs < 0) {
206: db_error("Negative shift amount\n");
207: /*NOTREACHED*/
208: }
209: if (t == tSHIFT_L)
210: lhs <<= rhs;
211: else {
212: /* Shift right is unsigned */
213: lhs = (unsigned) lhs >> rhs;
214: }
215: t = db_read_token();
216: }
217: db_unread_token(t);
218: *valuep = lhs;
219: return (TRUE);
220: }
221:
222: int
223: db_expression(db_expr_t *valuep)
224: {
225: return (db_shift_expr(valuep));
226: }
CVSweb