From d90018ed10267dbf1f4c6f746b9f70460e1424a6 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 12 Oct 2021 14:54:22 +0200 Subject: Add Object struct and constructor functions --- src/bootstrap/lexer.c | 8 ++-- src/bootstrap/main.c | 13 ++++++ src/bootstrap/objects.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 src/bootstrap/objects.c 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) { } if (!found) { error_push((Error){ - .type = ERR_TYPE_LEXER, - .value = ERR_UNMATCHED_STRING, - .line = line, - .col = col, + .type = ERR_TYPE_LEXER, + .value = ERR_UNMATCHED_STRING, + .line = line, + .col = col, }); return tokens; } 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 @@ +#include #include #include #include #include +#include #include "string_view.c" #include "read_line.c" #include "errors.c" #include "lexer.c" +#include "objects.c" + +void +init(void) { + // Initialize singletons. + obj_nil = alloc_object(OBJ_TYPE_NIL); + obj_true = alloc_object(OBJ_TYPE_BOOL); + obj_false = alloc_object(OBJ_TYPE_BOOL); +} void process_source(const StringView *source) { @@ -161,6 +172,8 @@ print_usage(void) { int main(int argc, char *argv[]) { + init(); + int option; while ((option = getopt(argc, argv, "i")) != -1) { 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 @@ +typedef enum ObjectType { + OBJ_TYPE_FIXNUM, + OBJ_TYPE_BOOL, + OBJ_TYPE_NIL, + OBJ_TYPE_SYMBOL, + OBJ_TYPE_STRING, + OBJ_TYPE_PAIR, + OBJ_TYPE_PROCEDURE, +} ObjectType; + +typedef struct Object { + ObjectType type; + union { + // OBJ_TYPE_FIXNUM + ssize_t fixnum; + + // OBJ_TYPE_STRING + struct { + char *string; + size_t string_n; + }; + + // OBJ_TYPE_PAIR + struct { + struct Object *car; + struct Object *cdr; + }; + + // OBJ_TYPE_SYMBOL + struct { + char *symbol; + size_t symbol_n; + }; + + // OBJ_TYPE_PROCEDURE + struct Object *(*proc)(struct Object *args); + }; +} Object; + +// +// Singletons. +// + +static Object *obj_nil; +static Object *obj_true; +static Object *obj_false; + +// +// Constructors. +// + +Object * +alloc_object(ObjectType type) { + Object *obj = malloc(sizeof(Object)); + obj->type = type; + return obj; +} + +Object * +make_fixnum(ssize_t num) { + Object *obj = alloc_object(OBJ_TYPE_FIXNUM); + obj->fixnum = num; + return obj; +} + +Object * +make_procedure(Object *(*proc)(struct Object *args)) { + Object *obj = alloc_object(OBJ_TYPE_PROCEDURE); + obj->proc = proc; + return obj; +} + +Object * +make_pair(Object *car, Object *cdr) { + Object *obj = alloc_object(OBJ_TYPE_PAIR); + obj->car = car; + obj->cdr = cdr; + return obj; +} + +Object * +make_symbol(StringView sv) { + Object *obj = alloc_object(OBJ_TYPE_SYMBOL); + obj->symbol = malloc(sizeof(char) * sv.n); + memcpy(obj->symbol, sv.start, sv.n); + obj->symbol_n = sv.n; + return obj; +} + +Object * +make_string(void) { + Object *obj = alloc_object(OBJ_TYPE_STRING); + obj->string = NULL; + obj->string_n = 0; + return obj; +} + +void +append_string(Object *obj, const StringView sv) { + assert(obj != NULL); + assert(obj->type == OBJ_TYPE_STRING); + if (sv.n == 0) { + return; + } + obj->string = realloc(obj->string, (obj->string_n + sv.n) * sizeof(char)); + memcpy(obj->string + obj->string_n, sv.start, sv.n); + obj->string_n += sv.n; +} -- cgit v1.2.1