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;
// ---------------------------------
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 {
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);
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");
}
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;
}
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;
}
}
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;
}
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;
}
}