From: Brendan Hansen Date: Sat, 26 Sep 2020 21:34:52 +0000 (-0500) Subject: added very basic implementation of printf X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=e7d1cc07f7cd1b5d5e9685293706b2f9520fda4e;p=onyx.git added very basic implementation of printf --- diff --git a/core/builtin.onyx b/core/builtin.onyx index 92c28622..9e4e5fdd 100644 --- a/core/builtin.onyx +++ b/core/builtin.onyx @@ -18,6 +18,14 @@ vararg :: #type ^struct { count: i32; } +vararg_get :: proc (va: vararg, ret: ^$T) -> bool { + if va.count <= 0 do return false; + *ret = *cast(^T) va.data; + va.data = cast(rawptr) (cast(^u8) va.data + sizeof T); + va.count -= 1; + return true; +} + null :: cast(rawptr) 0; // --------------------------------- diff --git a/core/stdio.onyx b/core/stdio.onyx index 9b686ec4..f37512fd 100644 --- a/core/stdio.onyx +++ b/core/stdio.onyx @@ -44,6 +44,95 @@ println :: proc (x: $T) { print("\n"); } +printf :: proc (format: string, va: ...) { + buffer: [2048] u8; + len := 0; + + state := 0; + + for ch: format do switch (state) { + case 0 { + if ch == #char "%" do state = 1; + else { + buffer[len] = ch; + len += 1; + } + } + + case 1 { + switch (ch) { + case #char "%" { buffer[len] = ch; len += 1; } + + case #char "i" { + n : i32; + if !vararg_get(va, ^n) do return; + + ibuf : [128] u8; + istr := i64_to_string(~~n, 10l, Buffer.{ ~~ibuf, 128 }); + + for a: istr { + buffer[len] = a; + len += 1; + } + } + + case #char "l" { + n : i64; + if !vararg_get(va, ^n) do return; + + ibuf : [128] u8; + istr := i64_to_string(n, 10l, Buffer.{ ~~ibuf, 128 }); + + for a: istr { + buffer[len] = a; + len += 1; + } + } + + case #char "f" { + n : f32; + if !vararg_get(va, ^n) do return; + + fbuf : [128] u8; + fstr := f64_to_string(~~n, fbuf[0 .. 128]); + + for a: fstr { + buffer[len] = a; + len += 1; + } + } + + case #char "d" { + n : f64; + if !vararg_get(va, ^n) do return; + + fbuf : [128] u8; + fstr := f64_to_string(n, fbuf[0 .. 128]); + + for a: fstr { + buffer[len] = a; + len += 1; + } + } + + case #char "s" { + str : string; + if !vararg_get(va, ^str) do return; + + for a: str { + buffer[len] = a; + len += 1; + } + } + } + + state = 0; + } + } + + print(string.{ ~~buffer, len }); +} + // This works on both slices and arrays print_array :: proc (arr: $T, sep := " ") { for i: 0 .. arr.count { diff --git a/onyx b/onyx index 6c79fded..d18afafd 100755 Binary files a/onyx and b/onyx differ diff --git a/progs/vararg_test.onyx b/progs/vararg_test.onyx index c66dc106..eddefa22 100644 --- a/progs/vararg_test.onyx +++ b/progs/vararg_test.onyx @@ -9,15 +9,6 @@ old_va_test :: proc (prefix: string, va: ..i32) { for v: va do println(v); } -vararg_get :: proc (va: vararg, ret: ^$T) -> bool { - if va.count <= 0 do return false; - *ret = *cast(^T) va.data; - va.data = cast(rawptr) (cast(^u8) va.data + sizeof T); - va.count -= 1; - return true; -} - -// va is just a rawptr with no bounds checking new_va_test :: proc (prefix: string, va: ...) { println(prefix); @@ -31,4 +22,6 @@ new_va_test :: proc (prefix: string, va: ...) { main :: proc (args: [] cstring) { new_va_test("foo", 1, 2, 3.0f, 5.0f); old_va_test("bar", 1); + + printf("Hello, %i, %s!\n", 1234, "World"); } diff --git a/src/onyxtypes.c b/src/onyxtypes.c index f18a4d0d..298a066c 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -589,12 +589,14 @@ b32 type_lookup_member(Type* type, char* member, StructMember* smem) { smem->idx = 0; smem->offset = 0; smem->type = type->Slice.ptr_to_data; + smem->name = "data"; return 1; } if (strcmp(member, "count") == 0) { smem->idx = 1; smem->offset = 4; smem->type = &basic_types[Basic_Kind_U32]; + smem->name = "count"; return 1; } @@ -606,18 +608,21 @@ b32 type_lookup_member(Type* type, char* member, StructMember* smem) { smem->idx = 0; smem->offset = 0; smem->type = type->DynArray.ptr_to_data; + smem->name = "data"; return 1; } if (strcmp(member, "count") == 0) { smem->idx = 1; smem->offset = 4; smem->type = &basic_types[Basic_Kind_U32]; + smem->name = "count"; return 1; } if (strcmp(member, "capacity") == 0) { smem->idx = 2; smem->offset = 8; smem->type = &basic_types[Basic_Kind_U32]; + smem->name = "capacity"; return 1; } } @@ -646,12 +651,14 @@ b32 type_lookup_member_by_idx(Type* type, i32 idx, StructMember* smem) { smem->idx = 0; smem->offset = 0; smem->type = type->Slice.ptr_to_data; + smem->name = "data"; return 1; } if (idx == 1) { smem->idx = 1; smem->offset = 4; smem->type = &basic_types[Basic_Kind_U32]; + smem->name = "count"; return 1; } @@ -663,18 +670,21 @@ b32 type_lookup_member_by_idx(Type* type, i32 idx, StructMember* smem) { smem->idx = 0; smem->offset = 0; smem->type = type->DynArray.ptr_to_data; + smem->name = "data"; return 1; } if (idx == 1) { smem->idx = 1; smem->offset = 4; smem->type = &basic_types[Basic_Kind_U32]; + smem->name = "count"; return 1; } if (idx == 2) { smem->idx = 2; smem->offset = 8; smem->type = &basic_types[Basic_Kind_U32]; + smem->name = "capacity"; return 1; } }