From df1b336c7cfdd20b661adcf1574923068bd862a9 Mon Sep 17 00:00:00 2001 From: Lorenzo Torres Date: Wed, 3 Dec 2025 21:02:31 +0100 Subject: [PATCH] fixed number parsing --- parser.h | 2 +- utils.c | 42 +++++++++++++++++++++++++++++++++++++----- utils.h | 2 +- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/parser.h b/parser.h index 219c431..fc6a688 100644 --- a/parser.h +++ b/parser.h @@ -130,7 +130,7 @@ typedef struct _ast_node { struct _ast_node *right; unary_op operator; } unary; - u64 integer; + i64 integer; f64 flt; // float struct { char *start; diff --git a/utils.c b/utils.c index 05b0b1b..e30188a 100644 --- a/utils.c +++ b/utils.c @@ -2,35 +2,67 @@ #include #include #include +#include -u64 parse_int(char *s, usize len) +i64 parse_int(char *s, usize len) { + bool negative = false; + if (*s == '-') { + s += 1; + len -= 1; + negative = true; + } + u64 int_part = 0; for (usize i=0; i < len; i++) { int_part = (int_part * 10) + (s[i] - '0'); } + if (negative) { + int_part *= -1; + } + return int_part; } f64 parse_float(char *s, usize len) { - f64 decimal_part = (f64)parse_int(s, len); - usize point_pos = 0; + bool negative = false; + if (*s == '-') { + s += 1; + len -= 1; + negative = true; + } + usize point_pos = 0; for (usize i=0; i < len; i++) { if (s[i] == '.') { point_pos = i; break; } } + + i64 int_part = parse_int(s, point_pos); + i64 dec_part = parse_int(s+point_pos+1, len-point_pos-1); + for (usize i=0; i < len-point_pos-1; i++) { + int_part *= 10; + } + + int_part += dec_part; + + f64 f = (f64) int_part; + point_pos += 1; for (usize i=0; i < len - point_pos; i++) { - decimal_part /= 10.0; + f /= 10.0; } - return decimal_part; + if (negative) { + f *= -1; + } + + return f; } diff --git a/utils.h b/utils.h index 7392d46..edc5c55 100644 --- a/utils.h +++ b/utils.h @@ -20,7 +20,7 @@ typedef size_t usize; typedef float f32; typedef double f64; -u64 parse_int(char *s, usize len); +i64 parse_int(char *s, usize len); f64 parse_float(char *s, usize len); typedef struct {