This source file includes following definitions.
- db_read_line
- db_flush_line
- db_read_char
- db_unread_char
- db_unread_token
- db_read_token
- db_flush_lex
- db_lex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <sys/param.h>
37 #include <sys/proc.h>
38
39 #include <uvm/uvm_extern.h>
40
41 #include <machine/db_machdep.h>
42
43 #include <ddb/db_lex.h>
44 #include <ddb/db_output.h>
45 #include <ddb/db_command.h>
46 #include <ddb/db_sym.h>
47 #include <ddb/db_extern.h>
48 #include <ddb/db_var.h>
49
50 char db_line[120];
51 char * db_lp, *db_endlp;
52
53 db_expr_t db_tok_number;
54 char db_tok_string[TOK_STRING_SIZE];
55
56 int
57 db_read_line(void)
58 {
59 int i;
60
61 i = db_readline(db_line, sizeof(db_line));
62 if (i == 0)
63 return (0);
64 db_lp = db_line;
65 db_endlp = db_lp + i;
66 return (i);
67 }
68
69 void
70 db_flush_line(void)
71 {
72 db_lp = db_line;
73 db_endlp = db_line;
74 }
75
76 int db_look_char = 0;
77
78 int
79 db_read_char(void)
80 {
81 int c;
82
83 if (db_look_char != 0) {
84 c = db_look_char;
85 db_look_char = 0;
86 }
87 else if (db_lp >= db_endlp)
88 c = -1;
89 else
90 c = *db_lp++;
91 return (c);
92 }
93
94 void
95 db_unread_char(int c)
96 {
97 db_look_char = c;
98 }
99
100 int db_look_token = 0;
101
102 void
103 db_unread_token(int t)
104 {
105 db_look_token = t;
106 }
107
108 int
109 db_read_token(void)
110 {
111 int t;
112
113 if (db_look_token) {
114 t = db_look_token;
115 db_look_token = 0;
116 }
117 else
118 t = db_lex();
119 return (t);
120 }
121
122 void
123 db_flush_lex(void)
124 {
125 db_flush_line();
126 db_look_char = 0;
127 db_look_token = 0;
128 }
129
130 int
131 db_lex(void)
132 {
133 int c;
134
135 c = db_read_char();
136 while (c <= ' ' || c > '~') {
137 if (c == '\n' || c == -1)
138 return (tEOL);
139 c = db_read_char();
140 }
141
142 if (c >= '0' && c <= '9') {
143
144 int r, digit = 0;
145
146 if (c > '0')
147 r = db_radix;
148 else {
149 c = db_read_char();
150 if (c == 'O' || c == 'o')
151 r = 8;
152 else if (c == 'T' || c == 't')
153 r = 10;
154 else if (c == 'X' || c == 'x')
155 r = 16;
156 else {
157 r = db_radix;
158 db_unread_char(c);
159 }
160 c = db_read_char();
161 }
162 db_tok_number = 0;
163 for (;;) {
164 if (c >= '0' && c <= ((r == 8) ? '7' : '9'))
165 digit = c - '0';
166 else if (r == 16 && ((c >= 'A' && c <= 'F') ||
167 (c >= 'a' && c <= 'f'))) {
168 if (c >= 'a')
169 digit = c - 'a' + 10;
170 else if (c >= 'A')
171 digit = c - 'A' + 10;
172 }
173 else
174 break;
175 db_tok_number = db_tok_number * r + digit;
176 c = db_read_char();
177 }
178 if ((c >= '0' && c <= '9') ||
179 (c >= 'A' && c <= 'Z') ||
180 (c >= 'a' && c <= 'z') ||
181 (c == '_'))
182 {
183 db_error("Bad character in number\n");
184
185 }
186 db_unread_char(c);
187 return (tNUMBER);
188 }
189 if ((c >= 'A' && c <= 'Z') ||
190 (c >= 'a' && c <= 'z') ||
191 c == '_' || c == '\\')
192 {
193
194 char *cp;
195
196 cp = db_tok_string;
197 if (c == '\\') {
198 c = db_read_char();
199 if (c == '\n' || c == -1) {
200 db_error("Bad escape\n");
201
202 }
203 }
204 *cp++ = c;
205 while (1) {
206 c = db_read_char();
207 if ((c >= 'A' && c <= 'Z') ||
208 (c >= 'a' && c <= 'z') ||
209 (c >= '0' && c <= '9') ||
210 c == '_' || c == '\\' || c == ':')
211 {
212 if (c == '\\') {
213 c = db_read_char();
214 if (c == '\n' || c == -1) {
215 db_error("Bad escape\n");
216
217 }
218 }
219 *cp++ = c;
220 if (cp == db_tok_string+sizeof(db_tok_string)) {
221 db_error("String too long\n");
222
223 }
224 continue;
225 }
226 else {
227 *cp = '\0';
228 break;
229 }
230 }
231 db_unread_char(c);
232 return (tIDENT);
233 }
234
235 switch (c) {
236 case '+':
237 return (tPLUS);
238 case '-':
239 return (tMINUS);
240 case '.':
241 c = db_read_char();
242 if (c == '.')
243 return (tDOTDOT);
244 db_unread_char(c);
245 return (tDOT);
246 case '*':
247 return (tSTAR);
248 case '/':
249 return (tSLASH);
250 case '=':
251 return (tEQ);
252 case '%':
253 return (tPCT);
254 case '#':
255 return (tHASH);
256 case '(':
257 return (tLPAREN);
258 case ')':
259 return (tRPAREN);
260 case ',':
261 return (tCOMMA);
262 case '"':
263 return (tDITTO);
264 case '$':
265 return (tDOLLAR);
266 case '!':
267 return (tEXCL);
268 case '<':
269 c = db_read_char();
270 if (c == '<')
271 return (tSHIFT_L);
272 db_unread_char(c);
273 break;
274 case '>':
275 c = db_read_char();
276 if (c == '>')
277 return (tSHIFT_R);
278 db_unread_char(c);
279 break;
280 case -1:
281 return (tEOF);
282 }
283 db_printf("Bad character\n");
284 db_flush_lex();
285 return (tEOF);
286 }