diff options
Diffstat (limited to 'src/bootstrap/objects.c')
-rw-r--r-- | src/bootstrap/objects.c | 26 |
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) { | |||
30 | Object * | 30 | Object * |
31 | make_symbol(StringView sv) { | 31 | make_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 * | |||
40 | make_string(void) { | 40 | make_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 | ||
47 | void | 47 | void |
48 | append_string(Object *obj, const StringView sv) { | 48 | append_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 | ||
59 | void | 55 | void |
@@ -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 | } |