fixed number parsing

This commit is contained in:
Lorenzo Torres 2025-12-03 21:02:31 +01:00
parent 6d73af4fbb
commit df1b336c7c
3 changed files with 39 additions and 7 deletions

View file

@ -130,7 +130,7 @@ typedef struct _ast_node {
struct _ast_node *right; struct _ast_node *right;
unary_op operator; unary_op operator;
} unary; } unary;
u64 integer; i64 integer;
f64 flt; // float f64 flt; // float
struct { struct {
char *start; char *start;

42
utils.c
View file

@ -2,35 +2,67 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdbool.h>
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; u64 int_part = 0;
for (usize i=0; i < len; i++) { for (usize i=0; i < len; i++) {
int_part = (int_part * 10) + (s[i] - '0'); int_part = (int_part * 10) + (s[i] - '0');
} }
if (negative) {
int_part *= -1;
}
return int_part; return int_part;
} }
f64 parse_float(char *s, usize len) f64 parse_float(char *s, usize len)
{ {
f64 decimal_part = (f64)parse_int(s, len); bool negative = false;
usize point_pos = 0; if (*s == '-') {
s += 1;
len -= 1;
negative = true;
}
usize point_pos = 0;
for (usize i=0; i < len; i++) { for (usize i=0; i < len; i++) {
if (s[i] == '.') { if (s[i] == '.') {
point_pos = i; point_pos = i;
break; 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; point_pos += 1;
for (usize i=0; i < len - point_pos; i++) { 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;
} }

View file

@ -20,7 +20,7 @@ typedef size_t usize;
typedef float f32; typedef float f32;
typedef double f64; typedef double f64;
u64 parse_int(char *s, usize len); i64 parse_int(char *s, usize len);
f64 parse_float(char *s, usize len); f64 parse_float(char *s, usize len);
typedef struct { typedef struct {