From 8aa57dd5a87b454ce99a336ed86a6bd4d6f77c1e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 23 Oct 2021 20:30:56 +0200 Subject: Add string and symbol types --- src/bytecode/objects.h | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) (limited to 'src/bytecode/objects.h') diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 35a954f..17809d5 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h @@ -1,6 +1,9 @@ #ifndef BDL_OBJECTS_H #define BDL_OBJECTS_H +#include "string_view.h" +#include "darray.h" + typedef enum ObjectType { OBJ_TYPE_NIL, OBJ_TYPE_TRUE, @@ -24,9 +27,9 @@ typedef struct Object { // OBJ_TYPE_STRING // OBJ_TYPE_SYMBOL - // struct { - // char *text; - // }; + struct { + char *text; + }; // OBJ_TYPE_PAIR // struct { @@ -59,6 +62,28 @@ void display(Object obj); #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) +#define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING) +#define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) + +Object make_string(StringView sv) { + Object obj = { + .type = OBJ_TYPE_STRING, + .text = NULL, + }; + array_init(obj.text, sv.n); + array_insert(obj.text, sv.start, sv.n); + return obj; +} + +Object make_symbol(StringView sv) { + Object obj = { + .type = OBJ_TYPE_SYMBOL, + .text = NULL, + }; + array_init(obj.text, sv.n); + array_insert(obj.text, sv.start, sv.n); + return obj; +} void display(Object obj) { @@ -67,19 +92,19 @@ display(Object obj) { printf("%zd", obj.fixnum); } break; case OBJ_TYPE_TRUE: { - printf("true"); + printf("true"); } break; case OBJ_TYPE_FALSE: { - printf("false"); + printf("false"); } break; case OBJ_TYPE_NIL: { printf("()"); } break; case OBJ_TYPE_STRING: { - // printf("\"%.*s\"", (int)array_size(obj.string), obj.string); + printf("\"%.*s\"", (int)array_size(obj.text), obj.text); } break; case OBJ_TYPE_SYMBOL: { - // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); + printf(":%.*s", (int)array_size(obj.text), obj.text); } break; case OBJ_TYPE_PAIR: { // printf("("); -- cgit v1.2.1