aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-12 14:54:22 +0200
committerBad Diode <bd@badd10de.dev>2021-10-12 14:54:22 +0200
commitd90018ed10267dbf1f4c6f746b9f70460e1424a6 (patch)
tree48b0064d1ae196a8896bd3fef4bc10b434902e7f
parent3444b5b58a78c12a79365bb35e54cfa029fccd99 (diff)
downloadbdl-d90018ed10267dbf1f4c6f746b9f70460e1424a6.tar.gz
bdl-d90018ed10267dbf1f4c6f746b9f70460e1424a6.zip
Add Object struct and constructor functions
-rw-r--r--src/bootstrap/lexer.c8
-rwxr-xr-xsrc/bootstrap/main.c13
-rw-r--r--src/bootstrap/objects.c108
3 files changed, 125 insertions, 4 deletions
diff --git a/src/bootstrap/lexer.c b/src/bootstrap/lexer.c
index 49431d0..72df1ee 100644
--- a/src/bootstrap/lexer.c
+++ b/src/bootstrap/lexer.c
@@ -215,10 +215,10 @@ tokenize(const StringView *sv) {
215 } 215 }
216 if (!found) { 216 if (!found) {
217 error_push((Error){ 217 error_push((Error){
218 .type = ERR_TYPE_LEXER, 218 .type = ERR_TYPE_LEXER,
219 .value = ERR_UNMATCHED_STRING, 219 .value = ERR_UNMATCHED_STRING,
220 .line = line, 220 .line = line,
221 .col = col, 221 .col = col,
222 }); 222 });
223 return tokens; 223 return tokens;
224 } 224 }
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index dadc887..7323629 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -1,12 +1,23 @@
1#include <assert.h>
1#include <getopt.h> 2#include <getopt.h>
2#include <stdbool.h> 3#include <stdbool.h>
3#include <stdio.h> 4#include <stdio.h>
4#include <stdlib.h> 5#include <stdlib.h>
6#include <string.h>
5 7
6#include "string_view.c" 8#include "string_view.c"
7#include "read_line.c" 9#include "read_line.c"
8#include "errors.c" 10#include "errors.c"
9#include "lexer.c" 11#include "lexer.c"
12#include "objects.c"
13
14void
15init(void) {
16 // Initialize singletons.
17 obj_nil = alloc_object(OBJ_TYPE_NIL);
18 obj_true = alloc_object(OBJ_TYPE_BOOL);
19 obj_false = alloc_object(OBJ_TYPE_BOOL);
20}
10 21
11void 22void
12process_source(const StringView *source) { 23process_source(const StringView *source) {
@@ -161,6 +172,8 @@ print_usage(void) {
161 172
162int 173int
163main(int argc, char *argv[]) { 174main(int argc, char *argv[]) {
175 init();
176
164 int option; 177 int option;
165 while ((option = getopt(argc, argv, "i")) != -1) { 178 while ((option = getopt(argc, argv, "i")) != -1) {
166 switch (option) { 179 switch (option) {
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}