From 4215c37e98d314597464a08876df6a1bf6838c0b Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Mon, 16 Mar 2026 13:17:07 +0100 Subject: [PATCH] script: Added hex literals --- src/l_lsl.c | 65 +++++++++++++++++++++--------------- src/tests/lsl/hexliteral.lsl | 1 + src/tests/t_lsl.c | 9 +++++ src/u_file.c | 1 - src/u_string.c | 2 +- 5 files changed, 49 insertions(+), 29 deletions(-) create mode 100644 src/tests/lsl/hexliteral.lsl diff --git a/src/l_lsl.c b/src/l_lsl.c index f869961..847e5c1 100644 --- a/src/l_lsl.c +++ b/src/l_lsl.c @@ -72,6 +72,11 @@ lrts_bool l_lsl_isbin(char c) { #define l_lsl_lex_advance(v, code) \ (code)[++v->lex_pos] +/* writes a char to token and advances token_len */ +#define l_lsl_lex_write_token(tokbuf, token_len, c) \ + tokbuf[*token_len] = c; \ + *token_len += 1; + #define l_lsl_lex_term_token(tokbuf, token_len) \ tokbuf[*token_len] = '\0'; @@ -84,39 +89,45 @@ struct l_lsl_value* l_lsl_next_token(struct l_lsl_vm *v, const char *code, *token_len = 0; c = l_lsl_lex_peek(v, code); - if (l_lsl_isnum(c)) { value->type = L_LSL_TYPE_INT; - /* decimal number */ - while (l_lsl_isnum(c)) { - tokbuf[*token_len] = c; - *token_len += 1; + if (c == '0') { + /* special base */ + /* specific base number */ c = l_lsl_lex_advance(v, code); - } - l_lsl_lex_term_token(tokbuf, token_len); - - value->data.int_val = u_strtol(tokbuf, LRTS_NULL, 10); - } else if (c == '0') { - value->type = L_LSL_TYPE_INT; - /* specific base number */ - c = l_lsl_lex_advance(v, code); - if (l_lsl_isnum(c)) { - /* octal */ - l_lsl_lex_term_token(tokbuf, token_len); - } else if (c == 'x') { - /* hex */ - l_lsl_lex_term_token(tokbuf, token_len); - } else if (c == 'b') { - /* bin */ - l_lsl_lex_term_token(tokbuf, token_len); + if (l_lsl_isnum(c)) { + /* octal */ + c = l_lsl_lex_advance(v, code); + l_lsl_lex_term_token(tokbuf, token_len); + } else if (c == 'x') { + /* hex */ + c = l_lsl_lex_advance(v, code); + while (l_lsl_ishexnum(c)) { + l_lsl_lex_write_token(tokbuf, token_len, c); + c = l_lsl_lex_advance(v, code); + } + l_lsl_lex_term_token(tokbuf, token_len); + value->data.int_val = u_strtol(tokbuf, LRTS_NULL, 16); + } else if (c == 'b') { + /* bin */ + c = l_lsl_lex_advance(v, code); + l_lsl_lex_term_token(tokbuf, token_len); + } else { + l_lsl_err(v, L_LSL_ERR_INVALID_NUMBER_BASE, + "unknown number base: 0%c\n", c); + return LRTS_NULL; + } } else { - l_lsl_err(v, L_LSL_ERR_INVALID_NUMBER_BASE, - "unknown number base: 0%c\n", c); - return LRTS_NULL; - } - + /* decimal number */ + while (l_lsl_isnum(c)) { + l_lsl_lex_write_token(tokbuf, token_len, c); + c = l_lsl_lex_advance(v, code); + } + l_lsl_lex_term_token(tokbuf, token_len); + value->data.int_val = u_strtol(tokbuf, LRTS_NULL, 10); + } } else { l_lsl_err(v, L_LSL_ERR_LEX, "unknown char: %c\n", c); return LRTS_NULL; diff --git a/src/tests/lsl/hexliteral.lsl b/src/tests/lsl/hexliteral.lsl new file mode 100644 index 0000000..dadf9ff --- /dev/null +++ b/src/tests/lsl/hexliteral.lsl @@ -0,0 +1 @@ +0xabc123 diff --git a/src/tests/t_lsl.c b/src/tests/t_lsl.c index 94d5097..73d2994 100644 --- a/src/tests/t_lsl.c +++ b/src/tests/t_lsl.c @@ -22,6 +22,8 @@ int t_lsl_assert(struct l_lsl_value expect_value, enum l_lsl_error expect_err, 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; + + u_fprintf(u_stderr, "%s\n", src_file); l_lsl_vm_free(&v); @@ -41,9 +43,16 @@ int t_lsl_assert(struct l_lsl_value expect_value, enum l_lsl_error expect_err, int t_test_lsl() { struct l_lsl_value v = l_lsl_value_init(); + /* simple int value */ v.type = L_LSL_TYPE_INT; v.data.int_val = 123; T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/intliteral.lsl", t_lsl_vlue_assert_int); + + /* simple hex value */ + v.type = L_LSL_TYPE_INT; + v.data.int_val = 0xabc123; + T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/hexliteral.lsl", + t_lsl_vlue_assert_int); return 0; } diff --git a/src/u_file.c b/src/u_file.c index f84309b..0603c54 100644 --- a/src/u_file.c +++ b/src/u_file.c @@ -25,6 +25,5 @@ const char *u_file_read(const char *path) { buf = u_realloc(buf, len); } buf[index] = '\0'; - return buf; } diff --git a/src/u_string.c b/src/u_string.c index eb52107..e0735eb 100644 --- a/src/u_string.c +++ b/src/u_string.c @@ -2,7 +2,7 @@ int u_strnlen(const char *s, u32 n) { u32 i = 0; - while (s[i++] && i < n) { + while (s[i] && i < n) { i++; } return i; -- 2.30.2