From: Lukas Krickl Date: Mon, 16 Mar 2026 12:32:43 +0000 (+0100) Subject: script: Added octal and binary liteals X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=529f8db378697aa84def6c8228022f07c19c91a7;p=lrts%2F.git script: Added octal and binary liteals --- diff --git a/src/l_lsl.c b/src/l_lsl.c index 847e5c1..6b9ee4c 100644 --- a/src/l_lsl.c +++ b/src/l_lsl.c @@ -60,6 +60,10 @@ lrts_bool l_lsl_isbin(char c) { return c == '1' || c == '0'; } +lrts_bool l_lsl_isoct(char c) { + return c >= '0' && c <= '7'; +} + /* peeks current token */ #define l_lsl_lex_peek(v, code) \ (code)[v->lex_pos] @@ -98,8 +102,13 @@ struct l_lsl_value* l_lsl_next_token(struct l_lsl_vm *v, const char *code, if (l_lsl_isnum(c)) { /* octal */ + while (l_lsl_isoct(c)) { + l_lsl_lex_write_token(tokbuf, token_len, c); + c = l_lsl_lex_advance(v, code); + } c = l_lsl_lex_advance(v, code); l_lsl_lex_term_token(tokbuf, token_len); + value->data.int_val = u_strtol(tokbuf, LRTS_NULL, 8); } else if (c == 'x') { /* hex */ c = l_lsl_lex_advance(v, code); @@ -112,7 +121,13 @@ struct l_lsl_value* l_lsl_next_token(struct l_lsl_vm *v, const char *code, } else if (c == 'b') { /* bin */ c = l_lsl_lex_advance(v, code); + while (l_lsl_isbin(c)) { + l_lsl_lex_write_token(tokbuf, token_len, c); + c = l_lsl_lex_advance(v, code); + } + c = l_lsl_lex_advance(v, code); l_lsl_lex_term_token(tokbuf, token_len); + value->data.int_val = u_strtol(tokbuf, LRTS_NULL, 2); } else { l_lsl_err(v, L_LSL_ERR_INVALID_NUMBER_BASE, "unknown number base: 0%c\n", c); diff --git a/src/tests/lsl/binliteral.lsl b/src/tests/lsl/binliteral.lsl new file mode 100644 index 0000000..93da479 --- /dev/null +++ b/src/tests/lsl/binliteral.lsl @@ -0,0 +1 @@ +0b101 diff --git a/src/tests/lsl/octliteral.lsl b/src/tests/lsl/octliteral.lsl new file mode 100644 index 0000000..40381e2 --- /dev/null +++ b/src/tests/lsl/octliteral.lsl @@ -0,0 +1 @@ +0123 diff --git a/src/tests/t_lsl.c b/src/tests/t_lsl.c index 73d2994..89f9475 100644 --- a/src/tests/t_lsl.c +++ b/src/tests/t_lsl.c @@ -54,5 +54,17 @@ int t_test_lsl() { v.data.int_val = 0xabc123; T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/hexliteral.lsl", t_lsl_vlue_assert_int); + + /* simple bin value */ + v.type = L_LSL_TYPE_INT; + v.data.int_val = 0x5; + T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/binliteral.lsl", + t_lsl_vlue_assert_int); + + /* simple oct value */ + v.type = L_LSL_TYPE_INT; + v.data.int_val = 0123; + T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/octliteral.lsl", + t_lsl_vlue_assert_int); return 0; }