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.c149
1 files changed, 0 insertions, 149 deletions
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c
deleted file mode 100644
index 344cae9..0000000
--- a/src/bootstrap/objects.c
+++ /dev/null
@@ -1,149 +0,0 @@
1typedef enum ObjectType {
2 OBJ_TYPE_FIXNUM,
3 OBJ_TYPE_BOOL,
4 OBJ_TYPE_NIL,
5 OBJ_TYPE_SYMBOL,
6 OBJ_TYPE_STRING,
7 OBJ_TYPE_PAIR,
8 OBJ_TYPE_PROCEDURE,
9} ObjectType;
10
11typedef struct Object {
12 ObjectType type;
13 union {
14 // OBJ_TYPE_FIXNUM
15 ssize_t fixnum;
16
17 // OBJ_TYPE_BOOL
18 bool boolean;
19
20 // OBJ_TYPE_STRING
21 struct {
22 char *string;
23 size_t string_n;
24 };
25
26 // OBJ_TYPE_PAIR
27 struct {
28 struct Object *car;
29 struct Object *cdr;
30 };
31
32 // OBJ_TYPE_SYMBOL
33 struct {
34 char *symbol;
35 size_t symbol_n;
36 };
37
38 // OBJ_TYPE_PROCEDURE
39 struct Object *(*proc)(struct Object *args);
40 };
41} Object;
42
43//
44// Singletons.
45//
46
47Object *obj_nil;
48Object *obj_true;
49Object *obj_false;
50
51//
52// Constructors.
53//
54
55Object *
56make_fixnum(ssize_t num) {
57 Object *obj = malloc(sizeof(Object));
58 obj->type = OBJ_TYPE_FIXNUM;
59 obj->fixnum = num;
60 return obj;
61}
62
63Object *
64make_boolean(bool b) {
65 Object *obj = malloc(sizeof(Object));
66 obj->type = OBJ_TYPE_BOOL;
67 obj->boolean = b;
68 return obj;
69}
70
71Object *
72make_empty_string(void) {
73 Object *obj = malloc(sizeof(Object));
74 obj->type = OBJ_TYPE_STRING;
75 obj->string = NULL;
76 obj->string_n = 0;
77 return obj;
78}
79
80void
81append_string(Object *string, StringView sv) {
82 assert(string != NULL);
83 assert(string->type == OBJ_TYPE_STRING);
84
85 if (sv.n == 0) {
86 return;
87 }
88
89 string->string = realloc(string->string, (string->string_n + sv.n) * sizeof(char));
90 memcpy(string->string + string->string_n, sv.start, sv.n);
91 string->string_n += sv.n;
92}
93
94Object *
95make_symbol(const char *str, size_t n) {
96 Object *obj = malloc(sizeof(Object));
97 obj->type = OBJ_TYPE_SYMBOL;
98 obj->string = malloc(sizeof(char) * n);
99 memcpy(obj->string, str, n);
100 obj->string_n = n;
101 return obj;
102}
103
104Object *
105make_empty_list(void) {
106 Object *obj = malloc(sizeof(Object));
107 obj->type = OBJ_TYPE_NIL;
108 return obj;
109}
110
111Object *
112make_procedure(Object *(*proc)(struct Object *args)) {
113 Object *obj = malloc(sizeof(Object));
114 obj->type = OBJ_TYPE_PROCEDURE;
115 obj->proc = proc;
116 return obj;
117}
118
119Object *
120make_pair(Object *car, Object *cdr) {
121 Object *obj = malloc(sizeof(Object));
122 obj->type = OBJ_TYPE_PAIR;
123 obj->car = car;
124 obj->cdr = cdr;
125 return obj;
126}
127
128//
129// Comparative ops.
130//
131
132bool
133symbol_eq(Object *a, Object *b) {
134 if (a->type != b->type || a->type != OBJ_TYPE_SYMBOL || a->symbol_n != b->symbol_n) {
135 return false;
136 }
137 for (size_t i = 0; i < a->symbol_n; i++) {
138 if (a->symbol[i] != b->symbol[i]) {
139 return false;
140 }
141 }
142 return true;
143}
144
145//
146// Utility macros.
147//
148
149#define MAKE_SYM(SYM) make_symbol((SYM), sizeof(SYM) - 1)