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.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c
new file mode 100644
index 0000000..3450b62
--- /dev/null
+++ b/src/bootstrap/objects.c
@@ -0,0 +1,108 @@
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_STRING
18 struct {
19 char *string;
20 size_t string_n;
21 };
22
23 // OBJ_TYPE_PAIR
24 struct {
25 struct Object *car;
26 struct Object *cdr;
27 };
28
29 // OBJ_TYPE_SYMBOL
30 struct {
31 char *symbol;
32 size_t symbol_n;
33 };
34
35 // OBJ_TYPE_PROCEDURE
36 struct Object *(*proc)(struct Object *args);
37 };
38} Object;
39
40//
41// Singletons.
42//
43
44static Object *obj_nil;
45static Object *obj_true;
46static Object *obj_false;
47
48//
49// Constructors.
50//
51
52Object *
53alloc_object(ObjectType type) {
54 Object *obj = malloc(sizeof(Object));
55 obj->type = type;
56 return obj;
57}
58
59Object *
60make_fixnum(ssize_t num) {
61 Object *obj = alloc_object(OBJ_TYPE_FIXNUM);
62 obj->fixnum = num;
63 return obj;
64}
65
66Object *
67make_procedure(Object *(*proc)(struct Object *args)) {
68 Object *obj = alloc_object(OBJ_TYPE_PROCEDURE);
69 obj->proc = proc;
70 return obj;
71}
72
73Object *
74make_pair(Object *car, Object *cdr) {
75 Object *obj = alloc_object(OBJ_TYPE_PAIR);
76 obj->car = car;
77 obj->cdr = cdr;
78 return obj;
79}
80
81Object *
82make_symbol(StringView sv) {
83 Object *obj = alloc_object(OBJ_TYPE_SYMBOL);
84 obj->symbol = malloc(sizeof(char) * sv.n);
85 memcpy(obj->symbol, sv.start, sv.n);
86 obj->symbol_n = sv.n;
87 return obj;
88}
89
90Object *
91make_string(void) {
92 Object *obj = alloc_object(OBJ_TYPE_STRING);
93 obj->string = NULL;
94 obj->string_n = 0;
95 return obj;
96}
97
98void
99append_string(Object *obj, const StringView sv) {
100 assert(obj != NULL);
101 assert(obj->type == OBJ_TYPE_STRING);
102 if (sv.n == 0) {
103 return;
104 }
105 obj->string = realloc(obj->string, (obj->string_n + sv.n) * sizeof(char));
106 memcpy(obj->string + obj->string_n, sv.start, sv.n);
107 obj->string_n += sv.n;
108}