summaryrefslogtreecommitdiff
path: root/src/scheme/ao_scheme_vector.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-17 22:22:50 -0800
committerKeith Packard <keithp@keithp.com>2017-12-17 22:22:50 -0800
commite1a6b3bf458f311d832aea7eec34935d42f8efed (patch)
tree7141f7e4ae75f23969722f75517f4c39cb623263 /src/scheme/ao_scheme_vector.c
parent9d1131da911f7220ac8b6cb7ba5a0afd3deef657 (diff)
altos/scheme: Use memory manager mark code to note recursive print
This flags any object being printed and checks before recursing to avoid infinite loops. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/scheme/ao_scheme_vector.c')
-rw-r--r--src/scheme/ao_scheme_vector.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/src/scheme/ao_scheme_vector.c b/src/scheme/ao_scheme_vector.c
index a4127f64..ff2067e2 100644
--- a/src/scheme/ao_scheme_vector.c
+++ b/src/scheme/ao_scheme_vector.c
@@ -78,16 +78,19 @@ ao_scheme_vector_write(ao_poly v)
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_print_start();
+ if (ao_scheme_print_mark_addr(vector))
+ printf ("...");
+ else {
+ printf("#(");
+ for (i = 0; i < vector->length; i++) {
+ if (i != 0)
+ printf(" ");
ao_scheme_poly_write(vector->vals[i]);
+ }
+ printf(")");
}
- printf(")");
+ ao_scheme_print_stop();
}
void
@@ -96,10 +99,11 @@ 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_print_start();
+ if (ao_scheme_print_mark_addr(vector))
+ printf ("...");
+ else {
+ for (i = 0; i < vector->length; i++)
ao_scheme_poly_display(vector->vals[i]);
}
}