diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-12 17:25:41 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-12 17:25:41 +0200 |
commit | 3d643f9e6697f37c374fe26bc3fd246fde557a4f (patch) | |
tree | 70b1e856a0a675b1efce1885cad12ac35b9b8c98 /src/bootstrap | |
parent | dacfb14c34eefd2c23537efa09fee34223813982 (diff) | |
download | bdl-3d643f9e6697f37c374fe26bc3fd246fde557a4f.tar.gz bdl-3d643f9e6697f37c374fe26bc3fd246fde557a4f.zip |
Add procedure to display and free nodes
Diffstat (limited to 'src/bootstrap')
-rw-r--r-- | src/bootstrap/objects.c | 90 |
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 | |||
112 | void | ||
113 | free_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 | |||
146 | bool display(Object *root); | ||
147 | |||
148 | void | ||
149 | display_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 | |||
162 | bool | ||
163 | display(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 | } | ||