1 /* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/parse.c,v 1.12 2008/03/19 09:17:13 cshapiro Rel $ */
10 #include "internals.h"
15 #include "interrupt.h"
22 * What platforms DON'T have strcasecmp nowadays? Enable this if you
41 } while (c1 == c2 && c1 != 0);
51 while (**ptr <= ' ' && **ptr != '\0')
56 string_to_long(char *token, long *value)
66 if (token[1] == 'x') {
72 } else if (token[0] == '#') {
92 while (*ptr != '\0') {
93 if (*ptr >= 'a' && *ptr <= 'f')
94 digit = *ptr + 10 - 'a';
95 else if (*ptr >= 'A' && *ptr <= 'F')
96 digit = *ptr + 10 - 'A';
97 else if (*ptr >= '0' && *ptr <= '9')
101 if (digit < 0 || digit >= base)
105 num = num * base + digit;
113 lookup_variable(char *name, lispobj * result)
115 struct var *var = lookup_by_name(name);
120 *result = var_value(var);
138 parse_token(char **ptr)
170 okay = "abcdefABCDEF987654321d0";
173 if (token[1] == 'x' || token[1] == 'X')
178 } else if (token[0] == '#') {
193 while (*token != '\0')
194 if (index(okay, *token++) == NULL)
201 parse_number(char **ptr)
203 char *token = parse_token(ptr);
207 printf("Expected a number.\n");
209 } else if (string_to_long(token, &result))
212 printf("Invalid number: ``%s''\n", token);
219 parse_addr(char **ptr)
221 char *token = parse_token(ptr);
225 printf("Expected an address.\n");
227 } else if (token[0] == '$') {
228 if (!lookup_variable(token + 1, (lispobj *) & result)) {
229 printf("Unknown variable: ``%s''\n", token);
234 if (!string_to_long(token, &result)) {
235 printf("Invalid number: ``%s''\n", token);
241 if (!valid_addr((os_vm_address_t) result)) {
242 printf("Invalid address: 0x%lx\n", result);
246 return (char *) result;
250 lookup_symbol(char *name, lispobj * result)
255 /* Search static space */
256 headerptr = static_space;
257 count = ((lispobj *) SymbolValue(STATIC_SPACE_FREE_POINTER) - static_space);
258 if (search_for_symbol(name, &headerptr, &count)) {
259 *result = (lispobj) headerptr | type_OtherPointer;
263 /* Search dynamic space */
264 headerptr = current_dynamic_space;
265 #if !defined(ibmrt) && !defined(i386) && !defined(__x86_64)
266 count = current_dynamic_space_free_pointer - current_dynamic_space;
268 count = (lispobj *) SymbolValue(ALLOCATION_POINTER) - current_dynamic_space;
270 if (search_for_symbol(name, &headerptr, &count)) {
271 *result = (lispobj) headerptr | type_OtherPointer;
279 parse_regnum(char *s)
281 if ((s[1] == 'R') || (s[1] == 'r')) {
287 /* skip the $R part and call atoi on the number */
288 regnum = atoi(s + 2);
289 if ((regnum >= 0) && (regnum < NREGS))
296 for (i = 0; i < NREGS; i++)
297 if (strcasecmp(s + 1, lisp_register_names[i]) == 0)
309 parse_lispobj(char **ptr)
311 char *token = parse_token(ptr);
316 printf("Expected an object.\n");
318 } else if (token[0] == '$') {
319 if (isalpha(token[1])) {
322 os_context_t *context;
324 free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX) >> 2;
328 ("Variable ``%s'' is not valid -- there is no current interrupt context.\n",
333 context = lisp_interrupt_contexts[free - 1];
335 regnum = parse_regnum(token);
337 printf("Bogus register: ``%s''\n", token);
341 result = SC_REG(context, regnum);
342 } else if (!lookup_variable(token + 1, &result)) {
343 printf("Unknown variable: ``%s''\n", token);
346 } else if (token[0] == '@') {
347 if (string_to_long(token + 1, &pointer)) {
349 if (valid_addr((os_vm_address_t) pointer))
350 result = *(lispobj *) pointer;
352 printf("Invalid address: ``%s''\n", token + 1);
356 printf("Invalid address: ``%s''\n", token + 1);
359 } else if (string_to_long(token, (long *) &result));
360 else if (lookup_symbol(token, &result));
362 printf("Invalid lisp object: ``%s''\n", token);