scripting: Added simple file reader
authorLukas Krickl <lukas@krickl.dev>
Wed, 11 Mar 2026 12:07:18 +0000 (13:07 +0100)
committerLukas Krickl <lukas@krickl.dev>
Wed, 11 Mar 2026 12:07:18 +0000 (13:07 +0100)
src/l_lsl.c
src/l_lsl.h
src/tests/lsl/intliteral.lsl [new file with mode: 0644]
src/tests/t_lsl.c
src/u_file.c

index 3c449a94776ef862a59fe5002c9b2cf5c99636db..c148d312e809b14e2f0dc267989a9890d341e1cd 100644 (file)
@@ -1,7 +1,8 @@
 #include "l_lsl.h"
 #include "u_mem.h"
+#include "u_file.h"
 
-struct l_lsl_vm l_lsl_vm_init() {
+struct l_lsl_vm l_lsl_vm_init(void) {
        struct l_lsl_vm v;
        u_memset(&v, 0, sizeof(v));
 
@@ -24,8 +25,18 @@ struct l_lsl_value l_lsl_value_init(void) {
 
 struct l_lsl_value l_lsl_compile_file(struct l_lsl_vm *v, const char *path) {
        struct l_lsl_value val = l_lsl_value_init();
-       LRTS_UNUSED(v);
-       LRTS_UNUSED(path);
+       const char *src = u_file_read(path);
+
+       if (src == LRTS_NULL) {
+               u_log(U_LOG_CRIT, "%s: No such file or directory\n", path);
+               v->err = L_LSL_ERR_FILE_NOT_FOUND;
+               return val;
+       }
+
+       u_printf("%s\n", src);
+
+       u_free((void*)src);
+
 
        return val;
 }
index 52483c4ee640a6df95cfa0f665b6624cacb67553..8b11448ba76e3e278c6c29ffab8aa212b135663f 100644 (file)
@@ -36,7 +36,8 @@ enum l_lsl_data_type {
 };
 
 enum l_lsl_error {
-       L_LSL_ERR_OK = 0
+       L_LSL_ERR_OK = 0,
+       L_LSL_ERR_FILE_NOT_FOUND
 };
 
 struct l_lsl_table;
diff --git a/src/tests/lsl/intliteral.lsl b/src/tests/lsl/intliteral.lsl
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
index 68d0494c4b1391a183e997fef84d897e267d4602..7a3a9d1b9d1b1db7546c22a6659dbc80fc33a37d 100644 (file)
@@ -1,5 +1,27 @@
 
+#define T_LSL_ASSERT(expected_value, expected_err, src_file) \
+       if (t_lsl_assert(expected_value, expected_err, src_file)) { \
+               return 1; \
+       } 
+
+int t_lsl_assert(struct l_lsl_value expect_value, enum l_lsl_error expect_err, 
+               const char *src_file) {
+       struct l_lsl_vm v = l_lsl_vm_init();
+       struct l_lsl_value res = l_lsl_exec(&v, src_file);
+       enum l_lsl_error err = v.err;
+
+       l_lsl_vm_free(&v);
+
+       T_ASSERT(err == expect_err, ("Unexpected error code %d\n", err));
+       T_ASSERT(res.type == expect_value.type, ("Unexpected return value"));
+
+               
+       return 0;
+}
+
 int t_test_lsl() {
-       T_ASSERT(1, (""));
+       struct l_lsl_value v = l_lsl_value_init();
+
+       T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/intliteral.lsl");
        return 0;
 }
index 538ba27f82d1250f889d90d2b0a0d784eafc4c8a..f84309b21f6802ee8674ca33bbe4a831f64d44ef 100644 (file)
@@ -3,12 +3,13 @@
 const char *u_file_read(const char *path) {
        u32 len = 16;
        u32 index = 0;
-       char *buf = u_malloc(len);
+       char *buf;
        char c;
        U_FILE *f = u_fopen(path, "r");
        if (f == LRTS_NULL) {
                return LRTS_NULL;
        }
+       buf = u_malloc(len);
 
        while ((c = u_fgetc(f)) >= 0) {
                if (index >= len) {
@@ -17,6 +18,13 @@ const char *u_file_read(const char *path) {
                }
                buf[index++] = c;
        }
+       
+       /* ensure we terminate */
+       if (index >= len) {
+               len += 1;
+               buf = u_realloc(buf, len);
+       }
+       buf[index] = '\0';
 
        return buf;
 }