From 008f173f9b9e52ae41683939614239059c0d3b04 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 19 Oct 2021 18:21:25 +0200 Subject: Change string/symbol representation to use darray.h --- src/bootstrap/objects.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'src/bootstrap/objects.c') diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c index 359329b..3ca2e43 100644 --- a/src/bootstrap/objects.c +++ b/src/bootstrap/objects.c @@ -30,9 +30,9 @@ make_pair(Object *car, Object *cdr) { Object * make_symbol(StringView sv) { Object *obj = alloc_object(OBJ_TYPE_SYMBOL); - obj->symbol = malloc(sizeof(char) * sv.n); - memcpy(obj->symbol, sv.start, sv.n); - obj->symbol_n = sv.n; + obj->symbol = NULL; + array_init(obj->symbol, sv.n); + array_insert(obj->symbol, sv.start, sv.n); return obj; } @@ -40,20 +40,16 @@ Object * make_string(void) { Object *obj = alloc_object(OBJ_TYPE_STRING); obj->string = NULL; - obj->string_n = 0; + array_init(obj->string, 0); return obj; } void append_string(Object *obj, const StringView sv) { - assert(obj != NULL); - assert(obj->type == OBJ_TYPE_STRING); if (sv.n == 0) { return; } - obj->string = realloc(obj->string, (obj->string_n + sv.n) * sizeof(char)); - memcpy(obj->string + obj->string_n, sv.start, sv.n); - obj->string_n += sv.n; + array_insert(obj->string, sv.start, sv.n); } void @@ -87,10 +83,10 @@ display(Object *root) { printf("()"); } break; case OBJ_TYPE_STRING: { - printf("\"%.*s\"", (int)root->string_n, root->string); + printf("\"%.*s\"", (int)array_size(root->string), root->string); } break; case OBJ_TYPE_SYMBOL: { - printf(":%.*s", (int)root->symbol_n, root->symbol); + printf(":%.*s", (int)array_size(root->symbol), root->symbol); } break; case OBJ_TYPE_PAIR: { printf("("); @@ -118,20 +114,20 @@ obj_eq(Object *a, Object* b) { return a->fixnum == b->fixnum; } break; case OBJ_TYPE_STRING: { - if (a->string_n != b->string_n) { + if (array_size(a->string) != array_size(b->string)) { return false; } - for (size_t i = 0; i < a->string_n; i++) { + for (size_t i = 0; i < array_size(a->string); i++) { if (a->string[i] != b->string[i]) { return false; } } } break; case OBJ_TYPE_SYMBOL: { - if (a->symbol_n != b->symbol_n) { + if (array_size(a->symbol) != array_size(b->symbol)) { return false; } - for (size_t i = 0; i < a->symbol_n; i++) { + for (size_t i = 0; i < array_size(a->symbol); i++) { if (a->symbol[i] != b->symbol[i]) { return false; } -- cgit v1.2.1