return c >= '0' && c <= '9';
}
+lrts_bool l_lsl_ishexnum(char c) {
+ return (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')
+ || l_lsl_isnum(c);
+}
+
+lrts_bool l_lsl_isbin(char c) {
+ return c == '1' || c == '0';
+}
+
+/* peeks current token */
+#define l_lsl_lex_peek(v, code) \
+ (code)[v->lex_pos]
+
+/* peeks current token and then advances cursor */
+#define l_lsl_lex_consume(v, code)\
+ (code)[v->lex_pos++]
+
+/* advances cursor and then peeks current token */
+#define l_lsl_lex_advance(v, code) \
+ (code)[++v->lex_pos]
+
+
char tokbuf[L_LSL_TOK_MAX];
const char* l_lsl_next_token(struct l_lsl_vm *v, const char *code,
u32 *token_len) {
*token_len = 0;
- c = code[v->lex_pos];
+ c = l_lsl_lex_peek(v, code);
if (l_lsl_isnum(c)) {
/* decimal number */
while (l_lsl_isnum(c)) {
tokbuf[*token_len] = c;
*token_len += 1;
- c = code[++v->lex_pos];
+ c = l_lsl_lex_advance(v, code);
+ }
+ } else if (c == '0') {
+ /* specific base number */
+ c = l_lsl_lex_advance(v, code);
+
+ if (l_lsl_isnum(c)) {
+ /* octal */
+ } else if (c == 'x') {
+ /* hex */
+ } else if (c == 'b') {
+ /* bin */
+ } else {
+ u_log(U_LOG_CRIT, "unknown number base: 0%c\n", c);
+ return LRTS_NULL;
}
+
+
} else {
u_log(U_LOG_CRIT, "unknown char: %c\n", c);
return LRTS_NULL;