3 This code was written as part of the CMU Common Lisp project at
4 Carnegie Mellon University, and has been placed in the public domain.
16 #include "internals.h"
21 #include "interrupt.h"
28 * What platforms DON'T have strcasecmp nowadays? Enable this if you
47 } while (c1 == c2 && c1 != 0);
57 while (**ptr <= ' ' && **ptr != '\0')
62 string_to_long(char *token, long *value)
72 if (token[1] == 'x') {
78 } else if (token[0] == '#') {
98 while (*ptr != '\0') {
99 if (*ptr >= 'a' && *ptr <= 'f')
100 digit = *ptr + 10 - 'a';
101 else if (*ptr >= 'A' && *ptr <= 'F')
102 digit = *ptr + 10 - 'A';
103 else if (*ptr >= '0' && *ptr <= '9')
107 if (digit < 0 || digit >= base)
111 num = num * base + digit;
119 lookup_variable(char *name, lispobj * result)
121 struct var *var = lookup_by_name(name);
126 *result = var_value(var);
144 parse_token(char **ptr)
176 okay = "abcdefABCDEF987654321d0";
179 if (token[1] == 'x' || token[1] == 'X')
184 } else if (token[0] == '#') {
199 while (*token != '\0')
200 if (index(okay, *token++) == NULL)
207 parse_number(char **ptr)
209 char *token = parse_token(ptr);
213 printf("Expected a number.\n");
215 } else if (string_to_long(token, &result))
218 printf("Invalid number: ``%s''\n", token);
225 parse_addr(char **ptr)
227 char *token = parse_token(ptr);
231 printf("Expected an address.\n");
233 } else if (token[0] == '$') {
234 if (!lookup_variable(token + 1, (lispobj *) & result)) {
235 printf("Unknown variable: ``%s''\n", token);
240 if (!string_to_long(token, &result)) {
241 printf("Invalid number: ``%s''\n", token);
247 if (!valid_addr((os_vm_address_t) result)) {
248 printf("Invalid address: 0x%lx\n", result);
252 return (char *) result;
256 lookup_symbol(char *name, lispobj * result)
261 /* Search static space */
262 headerptr = static_space;
263 count = ((lispobj *) SymbolValue(STATIC_SPACE_FREE_POINTER) - static_space);
264 if (search_for_symbol(name, &headerptr, &count)) {
265 *result = (lispobj) headerptr | type_OtherPointer;
269 /* Search dynamic space */
270 headerptr = current_dynamic_space;
271 #if !defined(ibmrt) && !defined(i386) && !defined(__x86_64)
272 count = current_dynamic_space_free_pointer - current_dynamic_space;
274 count = (lispobj *) SymbolValue(ALLOCATION_POINTER) - current_dynamic_space;
276 if (search_for_symbol(name, &headerptr, &count)) {
277 *result = (lispobj) headerptr | type_OtherPointer;
285 parse_regnum(char *s)
287 if ((s[1] == 'R') || (s[1] == 'r')) {
293 /* skip the $R part and call atoi on the number */
294 regnum = atoi(s + 2);
295 if ((regnum >= 0) && (regnum < NREGS))
302 for (i = 0; i < NREGS; i++)
303 if (strcasecmp(s + 1, lisp_register_names[i]) == 0)
315 parse_lispobj(char **ptr)
317 char *token = parse_token(ptr);
322 printf("Expected an object.\n");
324 } else if (token[0] == '$') {
325 if (isalpha(token[1])) {
328 os_context_t *context;
330 free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX) >> 2;
334 ("Variable ``%s'' is not valid -- there is no current interrupt context.\n",
339 context = lisp_interrupt_contexts[free - 1];
341 regnum = parse_regnum(token);
343 printf("Bogus register: ``%s''\n", token);
347 result = SC_REG(context, regnum);
348 } else if (!lookup_variable(token + 1, &result)) {
349 printf("Unknown variable: ``%s''\n", token);
352 } else if (token[0] == '@') {
353 if (string_to_long(token + 1, &pointer)) {
355 if (valid_addr((os_vm_address_t) pointer))
356 result = *(lispobj *) pointer;
358 printf("Invalid address: ``%s''\n", token + 1);
362 printf("Invalid address: ``%s''\n", token + 1);
365 } else if (string_to_long(token, (long *) &result));
366 else if (lookup_symbol(token, &result));
368 printf("Invalid lisp object: ``%s''\n", token);