From 14370ac9082c620eeec72e329b808ab3daa8d915 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Mon, 25 Aug 2025 18:29:13 +0200 Subject: use std f32 parsing --- src/json.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) (limited to 'src/json.c') diff --git a/src/json.c b/src/json.c index d3f510f..67bbf2e 100644 --- a/src/json.c +++ b/src/json.c @@ -1,9 +1,11 @@ #include #include +#include #include #include #include #include +#include #include #include "../include/assert.h" @@ -122,27 +124,12 @@ parse_result parse_any(Arena *a, byte *src, uptr pos, uptr max_pos); parse_result parse_number(byte *src, uptr start_pos) { parse_result result = {0}; - bool is_neg = src[start_pos] == '-'; - result.pos = start_pos + is_neg; - i32 integer = 0; - while (isdigit(src[result.pos])) { - integer = integer * 10 + (src[result.pos] - '0'); - result.pos++; - } - if (src[result.pos] != '.') { - result.value = JSON_integer(is_neg ? -integer : integer); - return result; - } - result.pos++; - f32 fractional_part = 0.0; - f32 decimal_place = 0.1; - while (isdigit(src[result.pos])) { - fractional_part += (src[result.pos] - '0') * decimal_place; - decimal_place *= 0.1; - result.pos++; - } - result.value = JSON_float(is_neg ? -(f32)integer - fractional_part - : (f32)integer + fractional_part); + byte *end; + f32 number = strtod(src + start_pos, &end); + assert_parse(end != src, "invalide number", src, result.pos); + result.pos += end - src; + result.value = + floor(number) == number ? JSON_integer(number) : JSON_float(number); return result; } -- cgit v1.3