diff options
Diffstat (limited to 'stage3/string.c')
-rw-r--r-- | stage3/string.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/stage3/string.c b/stage3/string.c index ce776ad..c97330a 100644 --- a/stage3/string.c +++ b/stage3/string.c @@ -1,6 +1,7 @@ #include "string.h" #include "memory.h" #include "heap.h" +#include "math.h" isize str_cmp(str s1, str s2) { @@ -54,6 +55,37 @@ usize str_parse_num(str s, u8 base, u64 *x) return s.len; } +usize str_parse_dbl(str s, double *x) +{ + *x = 0.0; + str iter = s; + + bool neg = false; + if (iter.len >= 1 && iter.data[0] == '-') { + neg = true; + iter = str_advance(iter, 1); + } + + u64 tmp; + usize adv = str_parse_num(iter, 10, &tmp); + if (!adv) + return 0; + + iter = str_advance(iter, adv); + *x = tmp; + + if (iter.len >= 1 && iter.data[0] == '.' + && (adv = str_parse_num(str_advance(iter, 1), 10, &tmp))) { + *x += (double) tmp / (double) ipow(10, adv); + iter = str_advance(iter, 1+adv); + } + + if (neg) + *x = -*x; + + return s.len - iter.len; +} + str str_walk(str *s, str sep) { if (s->len == 0) |