From 6d30c64216cd4d0b1b2a20a167d85c7fc6534378 Mon Sep 17 00:00:00 2001 From: iamcheeseman Date: Tue, 7 Apr 2026 10:46:07 -0400 Subject: microscript: add arrays --- uscript/val.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'uscript/val.c') diff --git a/uscript/val.c b/uscript/val.c index d713645..6b2fa9b 100644 --- a/uscript/val.c +++ b/uscript/val.c @@ -8,6 +8,7 @@ #define STR_NUM_FMT "%g" #define STR_FUNC_FMT "" +#define STR_ARR_FMT "" static void init_obj(struct us_val val, struct us_obj *obj) @@ -37,6 +38,14 @@ struct us_str *copy_str(const char *chars, int len) return take_str(copy, len); } +struct us_arr *create_arr(void) +{ + struct us_arr *arr = mem_alloc(sizeof(struct us_arr)); + arr->e = da_create(struct us_val, 0); + init_obj(wrap_arr(arr), &arr->header); + return arr; +} + struct us_proto *create_proto(struct us_str *name) { struct us_proto *proto = mem_alloc(sizeof(struct us_proto)); @@ -78,6 +87,12 @@ void free_val(struct us_val v) mem_free(str); break; } + case VAL_ARR: { + struct us_arr *arr = get_arr(v); + da_free(arr->e); + mem_free(arr); + break; + } case VAL_PROTO: { struct us_proto *proto = get_proto(v); da_free(proto->bytecode); @@ -123,6 +138,7 @@ bool vals_eql(struct us_val a, struct us_val b) return a_str->len == b_str->len && memcmp(a_str->chars, b_str->chars, a_str->len) == 0; } + case VAL_ARR: case VAL_FUNC: case VAL_UPVAL: case VAL_PROTO: return get_obj(a) == get_obj(b); @@ -171,6 +187,15 @@ char *val_to_str(struct us_val v, int *len_out) *len_out = us_str->len; return str; } + case VAL_ARR: { + const struct us_arr *arr = get_arr(v); + int len = snprintf(NULL, 0, STR_ARR_FMT, (void*)arr); + char *str = mem_alloc(sizeof(char) * (len + 1)); + snprintf(str, len + 1, STR_ARR_FMT, (void*)arr); + if (len_out) + *len_out = len; + return str; + } case VAL_PROTO: { const struct us_proto *proto = get_proto(v); int len = snprintf( -- cgit v1.3-2-g0d8e