aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/objects.c')
-rw-r--r--src/bootstrap/objects.c26
1 files changed, 11 insertions, 15 deletions
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) {
30Object * 30Object *
31make_symbol(StringView sv) { 31make_symbol(StringView sv) {
32 Object *obj = alloc_object(OBJ_TYPE_SYMBOL); 32 Object *obj = alloc_object(OBJ_TYPE_SYMBOL);
33 obj->symbol = malloc(sizeof(char) * sv.n); 33 obj->symbol = NULL;
34 memcpy(obj->symbol, sv.start, sv.n); 34 array_init(obj->symbol, sv.n);
35 obj->symbol_n = sv.n; 35 array_insert(obj->symbol, sv.start, sv.n);
36 return obj; 36 return obj;
37} 37}
38 38
@@ -40,20 +40,16 @@ Object *
40make_string(void) { 40make_string(void) {
41 Object *obj = alloc_object(OBJ_TYPE_STRING); 41 Object *obj = alloc_object(OBJ_TYPE_STRING);
42 obj->string = NULL; 42 obj->string = NULL;
43 obj->string_n = 0; 43 array_init(obj->string, 0);
44 return obj; 44 return obj;
45} 45}
46 46
47void 47void
48append_string(Object *obj, const StringView sv) { 48append_string(Object *obj, const StringView sv) {
49 assert(obj != NULL);
50 assert(obj->type == OBJ_TYPE_STRING);
51 if (sv.n == 0) { 49 if (sv.n == 0) {
52 return; 50 return;
53 } 51 }
54 obj->string = realloc(obj->string, (obj->string_n + sv.n) * sizeof(char)); 52 array_insert(obj->string, sv.start, sv.n);
55 memcpy(obj->string + obj->string_n, sv.start, sv.n);
56 obj->string_n += sv.n;
57} 53}
58 54
59void 55void
@@ -87,10 +83,10 @@ display(Object *root) {
87 printf("()"); 83 printf("()");
88 } break; 84 } break;
89 case OBJ_TYPE_STRING: { 85 case OBJ_TYPE_STRING: {
90 printf("\"%.*s\"", (int)root->string_n, root->string); 86 printf("\"%.*s\"", (int)array_size(root->string), root->string);
91 } break; 87 } break;
92 case OBJ_TYPE_SYMBOL: { 88 case OBJ_TYPE_SYMBOL: {
93 printf(":%.*s", (int)root->symbol_n, root->symbol); 89 printf(":%.*s", (int)array_size(root->symbol), root->symbol);
94 } break; 90 } break;
95 case OBJ_TYPE_PAIR: { 91 case OBJ_TYPE_PAIR: {
96 printf("("); 92 printf("(");
@@ -118,20 +114,20 @@ obj_eq(Object *a, Object* b) {
118 return a->fixnum == b->fixnum; 114 return a->fixnum == b->fixnum;
119 } break; 115 } break;
120 case OBJ_TYPE_STRING: { 116 case OBJ_TYPE_STRING: {
121 if (a->string_n != b->string_n) { 117 if (array_size(a->string) != array_size(b->string)) {
122 return false; 118 return false;
123 } 119 }
124 for (size_t i = 0; i < a->string_n; i++) { 120 for (size_t i = 0; i < array_size(a->string); i++) {
125 if (a->string[i] != b->string[i]) { 121 if (a->string[i] != b->string[i]) {
126 return false; 122 return false;
127 } 123 }
128 } 124 }
129 } break; 125 } break;
130 case OBJ_TYPE_SYMBOL: { 126 case OBJ_TYPE_SYMBOL: {
131 if (a->symbol_n != b->symbol_n) { 127 if (array_size(a->symbol) != array_size(b->symbol)) {
132 return false; 128 return false;
133 } 129 }
134 for (size_t i = 0; i < a->symbol_n; i++) { 130 for (size_t i = 0; i < array_size(a->symbol); i++) {
135 if (a->symbol[i] != b->symbol[i]) { 131 if (a->symbol[i] != b->symbol[i]) {
136 return false; 132 return false;
137 } 133 }