From 3d643f9e6697f37c374fe26bc3fd246fde557a4f Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 12 Oct 2021 17:25:41 +0200 Subject: Add procedure to display and free nodes --- src/bootstrap/objects.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c index 0910d6b..49ae5b1 100644 --- a/src/bootstrap/objects.c +++ b/src/bootstrap/objects.c @@ -108,3 +108,93 @@ append_string(Object *obj, const StringView sv) { memcpy(obj->string + obj->string_n, sv.start, sv.n); obj->string_n += sv.n; } + +void +free_objects(Object *root) { + switch (root->type) { + case OBJ_TYPE_BOOL: break; + case OBJ_TYPE_NIL: break; + case OBJ_TYPE_ERR: break; + case OBJ_TYPE_PROCEDURE: + case OBJ_TYPE_FIXNUM: { + free(root); + } break; + case OBJ_TYPE_SYMBOL: { + if (root->symbol != NULL) { + free(root->symbol); + } + free(root); + } break; + case OBJ_TYPE_STRING: { + if (root->string != NULL) { + free(root->string); + } + free(root); + } break; + case OBJ_TYPE_PAIR: { + if (root->car != NULL) { + free_objects(root->car); + } + if (root->cdr != NULL) { + free_objects(root->cdr); + } + free(root); + } break; + } +} + +bool display(Object *root); + +void +display_pair(Object *root) { + display(root->car); + if (root->cdr->type == OBJ_TYPE_PAIR) { + printf(" "); + display_pair(root->cdr); + } else if (root->cdr == obj_nil) { + return; + } else { + printf(" . "); + display(root->cdr); + } +} + +bool +display(Object *root) { + if (root == NULL) { + return false; + } + switch (root->type) { + case OBJ_TYPE_FIXNUM: { + printf("%zd", root->fixnum); + } break; + case OBJ_TYPE_BOOL: { + if (root == obj_true) { + printf("true"); + } else { + printf("false"); + } + } break; + case OBJ_TYPE_NIL: { + printf("()"); + } break; + case OBJ_TYPE_STRING: { + printf("\"%.*s\"", (int)root->string_n, root->string); + } break; + case OBJ_TYPE_SYMBOL: { + printf(":%.*s", (int)root->symbol_n, root->symbol); + } break; + case OBJ_TYPE_PAIR: { + printf("("); + display_pair(root); + printf(")"); + } break; + case OBJ_TYPE_PROCEDURE: { + printf("#{procedure}"); + } break; + case OBJ_TYPE_ERR: { + printf("#{error}"); + } break; + } + return true; +} -- cgit v1.2.1