Utility predicates for packing: UNBOUNDED-SC-P and UNBOUNDED-TN-P
[sbcl.git] / src / runtime / parse.c
index 62a0f59..1edfe18 100644 (file)
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <ctype.h>
-#include <signal.h>
 
 #include "sbcl.h"
+#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD)
+#include "pthreads_win32.h"
+#else
+#include <signal.h>
+#endif
 #include "runtime.h"
 
 #if defined(LISP_FEATURE_SB_LDB)
@@ -31,6 +36,7 @@
 #include "arch.h"
 #include "search.h"
 #include "thread.h"
+#include "pseudo-atomic.h"
 
 #include "genesis/simple-fun.h"
 #include "genesis/fdefn.h"
@@ -43,10 +49,10 @@ static void skip_ws(char **ptr)
         (*ptr)++;
 }
 
-static boolean string_to_long(char *token, long *value)
+static boolean string_to_long(char *token, uword_t *value)
 {
     int base, digit;
-    long num;
+    uword_t num;
     char *ptr;
 
     if (token == 0)
@@ -190,11 +196,11 @@ char *token;
 }
 #endif
 
-long parse_number(ptr)
+uword_t parse_number(ptr)
 char **ptr;
 {
     char *token = parse_token(ptr);
-    long result;
+    uword_t result;
 
     if (token == NULL) {
         printf("expected a number\n");
@@ -227,7 +233,7 @@ char **ptr;
         result &= ~7;
     }
     else {
-        long value;
+        uword_t value;
         if (!string_to_long(token, &value)) {
             printf("invalid number: ``%s''\n", token);
             throw_to_monitor();
@@ -259,13 +265,14 @@ static boolean lookup_symbol(char *name, lispobj *result)
     }
 
     /* Search dynamic space. */
-#ifndef LISP_FEATURE_GENCGC
+#if defined(LISP_FEATURE_GENCGC)
+    headerptr = (lispobj *)DYNAMIC_SPACE_START;
+    count = (lispobj *)get_alloc_pointer() - headerptr;
+#else
     headerptr = (lispobj *)current_dynamic_space;
     count = dynamic_space_free_pointer - headerptr;
-#else
-    headerptr = (lispobj *)DYNAMIC_SPACE_START;
-    count = ((lispobj *)SymbolValue(ALLOCATION_POINTER,0)) - headerptr;
 #endif
+
     if (search_for_symbol(name, &headerptr, &count)) {
         *result = make_lispobj(headerptr, OTHER_POINTER_LOWTAG);
         return 1;
@@ -309,27 +316,27 @@ char **ptr;
 {
     struct thread *thread=arch_os_get_current_thread();
     char *token = parse_token(ptr);
-    long pointer;
+    uword_t pointer;
     lispobj result;
-    long value;
+    uword_t value;
 
     if (token == NULL) {
         printf("expected an object\n");
         throw_to_monitor();
     } else if (token[0] == '$') {
         if (isalpha(token[1])) {
-            int free;
+            int free_ici;
             int regnum;
             os_context_t *context;
 
-            free = SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread)>>2;
+            free_ici = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,thread));
 
-            if (free == 0) {
+            if (free_ici == 0) {
                 printf("Variable ``%s'' is not valid -- there is no current interrupt context.\n", token);
                 throw_to_monitor();
             }
 
-            context = thread->interrupt_contexts[free - 1];
+            context = thread->interrupt_contexts[free_ici - 1];
 
             regnum = parse_regnum(token);
             if (regnum < 0) {