#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));
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;
}
};
enum l_lsl_error {
- L_LSL_ERR_OK = 0
+ L_LSL_ERR_OK = 0,
+ L_LSL_ERR_FILE_NOT_FOUND
};
struct l_lsl_table;
+#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;
}
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) {
}
buf[index++] = c;
}
+
+ /* ensure we terminate */
+ if (index >= len) {
+ len += 1;
+ buf = u_realloc(buf, len);
+ }
+ buf[index] = '\0';
return buf;
}