From 84e91412f56c4c746b0c0fb5c95fef2a3b0c543e Mon Sep 17 00:00:00 2001 From: "Javier B. Torres" Date: Tue, 6 Jan 2026 13:13:29 -0300 Subject: [PATCH] add object printer --- main.c | 1 + print.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- wscm.h | 3 +++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 03af835..2db482c 100644 --- a/main.c +++ b/main.c @@ -9,6 +9,7 @@ int main(void) { addroot(&p); collect(); + println(p); gcfinalize(); return 0; diff --git a/print.c b/print.c index 3f30e22..fd2bb78 100644 --- a/print.c +++ b/print.c @@ -1,3 +1,62 @@ +#include "inttypes.h" #include "wscm.h" +#include -// TODO. +void print(O obj); + +void printcons(O obj) { + O c = obj; + I f = 1; + + printf("("); + while (c != NIL && !IMM(c)) { + H *h = UNBOX(c); + if (h->type != OBJ_CONS) { + printf(" . "); + print(c); + printf(")"); + return; + } + C *p = (C *)(h + 1); + if (!f) + printf(" "); + f = 0; + print(p->head); + c = p->tail; + } + if (c != NIL && !IMM(c)) { + printf(" . "); + print(c); + } + printf(")"); +} + +void print(O obj) { + if (obj == NIL) { + printf("()"); + } else if (IMM(obj)) { + printf("%" PRIdPTR, ORD(obj)); + } else { + void *x = (void *)UNBOX(obj); + if (((const U8 *)x) >= heap.from.start && ((const U8 *)x) < heap.from.end) { + H *h = (H *)x; + switch (h->type) { + case OBJ_CONS: + printcons(obj); + break; + default: + printf("", h->type, (void *)h); + break; + } + } else { + // If pointer is outside the heap, it's a symbol. + S *s = (S *)x; + printf("%.*s", (int)s->len, s->data); + } + } +} + +void println(O obj) { + print(obj); + putchar('\n'); +} diff --git a/wscm.h b/wscm.h index 3e1971c..f2dc1c2 100644 --- a/wscm.h +++ b/wscm.h @@ -83,3 +83,6 @@ O mksym(const char *str); O cons(O head, O tail); C *uncons(O obj); + +void print(O obj); +void println(O obj);