altos/scheme: Fix macro-detection debugging
[fw/altos] / src / scheme / ao_scheme_vector.c
index 0114c5a925fa056228337138672551a16313bca2..083823f3097a1a6318ce267c9bf7dc82b8aa0e08 100644 (file)
@@ -73,48 +73,41 @@ ao_scheme_vector_alloc(uint16_t length, ao_poly fill)
 }
 
 void
-ao_scheme_vector_write(ao_poly v)
+ao_scheme_vector_write(ao_poly v, bool write)
 {
        struct ao_scheme_vector *vector = ao_scheme_poly_vector(v);
        unsigned int i;
-
-       printf("#(");
-       for (i = 0; i < vector->length; i++) {
-               if (i != 0)
-                       printf(" ");
-               if (vector->vals[i] == v)
-                       printf ("...");
-               else
-                       ao_scheme_poly_write(vector->vals[i]);
-       }
-       printf(")");
-}
-
-void
-ao_scheme_vector_display(ao_poly v)
-{
-       struct ao_scheme_vector *vector = ao_scheme_poly_vector(v);
-       unsigned int i;
-
-       for (i = 0; i < vector->length; i++) {
-               if (vector->vals[i] == v)
-                       printf("...");
-               else
-                       ao_scheme_poly_display(vector->vals[i]);
+       int was_marked = 0;
+
+       ao_scheme_print_start();
+       was_marked = ao_scheme_print_mark_addr(vector);
+       if (was_marked) {
+               printf ("...");
+       } else {
+               printf("#(");
+               for (i = 0; i < vector->length; i++) {
+                       if (i != 0)
+                               printf(" ");
+                       ao_scheme_poly_write(vector->vals[i], write);
+               }
+               printf(")");
        }
+       if (ao_scheme_print_stop() && !was_marked)
+               ao_scheme_print_clear_addr(vector);
 }
 
 static int32_t
 ao_scheme_vector_offset(struct ao_scheme_vector *vector, ao_poly i)
 {
-       int32_t offset = ao_scheme_poly_integer(i);
+       bool    fail;
+       int32_t offset = ao_scheme_poly_integer(i, &fail);
 
-       if (offset == AO_SCHEME_NOT_INTEGER)
+       if (fail)
                ao_scheme_error(AO_SCHEME_INVALID, "vector index %v not integer", i);
        if (offset < 0 || vector->length <= offset) {
                ao_scheme_error(AO_SCHEME_INVALID, "vector index %v out of range (max %d)",
                                i, vector->length);
-               offset = AO_SCHEME_NOT_INTEGER;
+               offset = -1;
        }
        return offset;
 }
@@ -125,7 +118,7 @@ ao_scheme_vector_get(ao_poly v, ao_poly i)
        struct ao_scheme_vector *vector = ao_scheme_poly_vector(v);
        int32_t                 offset = ao_scheme_vector_offset(vector, i);
 
-       if (offset == AO_SCHEME_NOT_INTEGER)
+       if (offset < 0)
                return AO_SCHEME_NIL;
        return vector->vals[offset];
 }
@@ -136,7 +129,7 @@ ao_scheme_vector_set(ao_poly v, ao_poly i, ao_poly p)
        struct ao_scheme_vector *vector = ao_scheme_poly_vector(v);
        int32_t                 offset = ao_scheme_vector_offset(vector, i);
 
-       if (offset == AO_SCHEME_NOT_INTEGER)
+       if (offset < 0)
                return AO_SCHEME_NIL;
        return vector->vals[offset] = p;
 }
@@ -152,9 +145,9 @@ ao_scheme_list_to_vector(struct ao_scheme_cons *cons)
        if (ao_scheme_exception)
                return NULL;
 
-       ao_scheme_cons_stash(0, cons);
+       ao_scheme_cons_stash(cons);
        vector = ao_scheme_vector_alloc(length, AO_SCHEME_NIL);
-       cons = ao_scheme_cons_fetch(0);
+       cons = ao_scheme_cons_fetch();
        if (!vector)
                return NULL;
        i = 0;
@@ -166,16 +159,22 @@ ao_scheme_list_to_vector(struct ao_scheme_cons *cons)
 }
 
 struct ao_scheme_cons *
-ao_scheme_vector_to_list(struct ao_scheme_vector *vector)
+ao_scheme_vector_to_list(struct ao_scheme_vector *vector, int start, int end)
 {
-       unsigned int            i;
+       int                     i;
        uint16_t                length = vector->length;
        struct ao_scheme_cons   *cons = NULL;
 
-       for (i = length; i-- > 0;) {
-               ao_scheme_poly_stash(2, ao_scheme_vector_poly(vector));
+       if (end == -1)
+               end = length;
+       if (start < 0)
+               start = 0;
+       if (end > length)
+               end = length;
+       for (i = end; i-- > start;) {
+               ao_scheme_vector_stash(vector);
                cons = ao_scheme_cons_cons(vector->vals[i], ao_scheme_cons_poly(cons));
-               vector = ao_scheme_poly_vector(ao_scheme_poly_fetch(2));
+               vector = ao_scheme_vector_fetch();
                if (!cons)
                        return NULL;
        }