added %f to bh_printf and fixed bug
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 23 Sep 2020 18:33:30 +0000 (13:33 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 23 Sep 2020 18:33:30 +0000 (13:33 -0500)
include/bh.h
onyx
src/onyxparser.c

index 9878f698e0ed2157c0019f24d425e24ff8b85194..ffb5379f2d6fbc95ddacfa3a174b95b077e7fc66 100644 (file)
@@ -1618,6 +1618,23 @@ isize bh__printi64(char* str, isize n, bh__print_format format, i64 value) {
     return bh__print_string(str, n, walker);
 }
 
+isize bh__printf64(char* str, isize n, f64 value) {
+    fori (i, 0, 6) value *= 10.0;
+    i64 v = (i64) value;
+
+    isize l1 = bh__printi64(str, n, ((bh__print_format) { .base = 10 }), v / 1000000);
+    str += l1;
+    n -= l1;
+
+    *str = '.';
+    str += 1;
+    n -= 1;
+
+    isize l2 = bh__printi64(str, n, ((bh__print_format) { .base = 10 }), bh_abs(v) % 1000000);
+
+    return l1 + l2 + 1;
+}
+
 // TODO: This is very hacked together but for now it will work.
 isize bh_snprintf_va(char *str, isize n, char const *fmt, va_list va) {
     char const *text_start = str;
@@ -1674,6 +1691,11 @@ isize bh_snprintf_va(char *str, isize n, char const *fmt, va_list va) {
             len = bh__print_string(str, bh_min(l, n), s);
         } break;
 
+        case 'f': {
+            f64 f = va_arg(va, f64);
+            len = bh__printf64(str, n, f);
+        } break;
+
         default: fmt--;
         }
 
diff --git a/onyx b/onyx
index cf023545d27a197208ecbb6be087a55cd56e6ede..6ec963ca66d9048d0c3c010b9128d1ca1ddac8b8 100755 (executable)
Binary files a/onyx and b/onyx differ
index be50983d8c83514fa1608fab8a5080a7cacae570..82e7594002f443c08cbff9b4d2f5e26cf2374d60 100644 (file)
@@ -780,9 +780,9 @@ expression_done:
 
 // 'if' <expr> <stmt> ('elseif' <cond> <stmt>)* ('else' <block>)?
 static AstIfWhile* parse_if_stmt(OnyxParser* parser) {
-    expect_token(parser, Token_Type_Keyword_If);
-
     AstIfWhile* if_node = make_node(AstIfWhile, Ast_Kind_If);
+    if_node->token = expect_token(parser, Token_Type_Keyword_If);
+
     AstIfWhile* root_if = if_node;
 
     if ((parser->curr + 1)->type == ':') {