From 0a8a7cddd0907edf291520867ba6162e556e2274 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 16 Feb 2026 14:20:23 -0500 Subject: [PATCH] lexer: Handle differentation between zero and prefix Signed-off-by: Ian Moffett --- core/lexer.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/core/lexer.c b/core/lexer.c index 514c8bb..ff028f7 100644 --- a/core/lexer.c +++ b/core/lexer.c @@ -26,6 +26,22 @@ lexer_is_ws(char c) return false; } +/* + * Returns true if the given character is apart of a numbering + * system prefix (e.g., '0x' or 'o0') + */ +static inline bool +lexer_is_num_prefix(char c) +{ + switch (c) { + case 'o': + case 'x': + return true; + } + + return false; +} + /* * Place a given character into the putback buffer * @@ -355,8 +371,8 @@ lexer_scan_num(struct rifle_state *state, int lc, struct token *tok) if (lc == '0') { if ((prefix = lexer_nom(state, false)) == '\0') return -1; - if ((lc = lexer_nom(state, false)) == '\0') - return -1; + if (!lexer_is_num_prefix(prefix)) + lexer_putback(state, prefix); } /* @@ -367,9 +383,15 @@ lexer_scan_num(struct rifle_state *state, int lc, struct token *tok) */ switch (prefix) { case 'x': + if ((lc = lexer_nom(state, false)) == '\0') + return -1; + radix = 16; break; case 'o': + if ((lc = lexer_nom(state, false)) == '\0') + return -1; + radix = 8; break; default: