aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-12 17:25:41 +0200
committerBad Diode <bd@badd10de.dev>2021-10-12 17:25:41 +0200
commit3d643f9e6697f37c374fe26bc3fd246fde557a4f (patch)
tree70b1e856a0a675b1efce1885cad12ac35b9b8c98
parentdacfb14c34eefd2c23537efa09fee34223813982 (diff)
downloadbdl-3d643f9e6697f37c374fe26bc3fd246fde557a4f.tar.gz
bdl-3d643f9e6697f37c374fe26bc3fd246fde557a4f.zip
Add procedure to display and free nodes
-rw-r--r--src/bootstrap/objects.c90
1 files changed, 90 insertions, 0 deletions
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) {
108 memcpy(obj->string + obj->string_n, sv.start, sv.n); 108 memcpy(obj->string + obj->string_n, sv.start, sv.n);
109 obj->string_n += sv.n; 109 obj->string_n += sv.n;
110} 110}
111
112void
113free_objects(Object *root) {
114 switch (root->type) {
115 case OBJ_TYPE_BOOL: break;
116 case OBJ_TYPE_NIL: break;
117 case OBJ_TYPE_ERR: break;
118 case OBJ_TYPE_PROCEDURE:
119 case OBJ_TYPE_FIXNUM: {
120 free(root);
121 } break;
122 case OBJ_TYPE_SYMBOL: {
123 if (root->symbol != NULL) {
124 free(root->symbol);
125 }
126 free(root);
127 } break;
128 case OBJ_TYPE_STRING: {
129 if (root->string != NULL) {
130 free(root->string);
131 }
132 free(root);
133 } break;
134 case OBJ_TYPE_PAIR: {
135 if (root->car != NULL) {
136 free_objects(root->car);
137 }
138 if (root->cdr != NULL) {
139 free_objects(root->cdr);
140 }
141 free(root);
142 } break;
143 }
144}
145
146bool display(Object *root);
147
148void
149display_pair(Object *root) {
150 display(root->car);
151 if (root->cdr->type == OBJ_TYPE_PAIR) {
152 printf(" ");
153 display_pair(root->cdr);
154 } else if (root->cdr == obj_nil) {
155 return;
156 } else {
157 printf(" . ");
158 display(root->cdr);
159 }
160}
161
162bool
163display(Object *root) {
164 if (root == NULL) {
165 return false;
166 }
167 switch (root->type) {
168 case OBJ_TYPE_FIXNUM: {
169 printf("%zd", root->fixnum);
170 } break;
171 case OBJ_TYPE_BOOL: {
172 if (root == obj_true) {
173 printf("true");
174 } else {
175 printf("false");
176 }
177 } break;
178 case OBJ_TYPE_NIL: {
179 printf("()");
180 } break;
181 case OBJ_TYPE_STRING: {
182 printf("\"%.*s\"", (int)root->string_n, root->string);
183 } break;
184 case OBJ_TYPE_SYMBOL: {
185 printf(":%.*s", (int)root->symbol_n, root->symbol);
186 } break;
187 case OBJ_TYPE_PAIR: {
188 printf("(");
189 display_pair(root);
190 printf(")");
191 } break;
192 case OBJ_TYPE_PROCEDURE: {
193 printf("#{procedure}");
194 } break;
195 case OBJ_TYPE_ERR: {
196 printf("#{error}");
197 } break;
198 }
199 return true;
200}