script: Added octal and binary liteals
authorLukas Krickl <lukas@krickl.dev>
Mon, 16 Mar 2026 12:32:43 +0000 (13:32 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 16 Mar 2026 12:32:43 +0000 (13:32 +0100)
src/l_lsl.c
src/tests/lsl/binliteral.lsl [new file with mode: 0644]
src/tests/lsl/octliteral.lsl [new file with mode: 0644]
src/tests/t_lsl.c

index 847e5c1ee160e27f31a54614e295e53ac79ec717..6b9ee4cadbb8abdc4326c9bfef4bdaab4e930728 100644 (file)
@@ -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 (file)
index 0000000..93da479
--- /dev/null
@@ -0,0 +1 @@
+0b101
diff --git a/src/tests/lsl/octliteral.lsl b/src/tests/lsl/octliteral.lsl
new file mode 100644 (file)
index 0000000..40381e2
--- /dev/null
@@ -0,0 +1 @@
+0123
index 73d2994f3677ccd4e312f424e2465a3eea1db18a..89f947542554fd93cda7c0432ddc737ae247193a 100644 (file)
@@ -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;
 }