VariadicArguments :: (string: *char, args: []Any): Any return args[0] AnyArguments :: (values: []Any) for values Assert(it.type == int) Assert(*(values[0].data->*int) == 10) Assert(*(values[1].data->*int) == 20) /** * C++ version 0.4 char* style "itoa": * Written by Lukás Chmela * Released under GPLv3. */ IntegerToString :: (value: int, result: *U8, base: int): *U8 // check that the base if valid if (base < 2) || (base > 36) *result = 0 // ' return result ptr := result ptr1 := result tmp_char: U8 tmp_value: int str := "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" for value != 0 tmp_value = value value /= base *ptr++ = str[35 + (tmp_value - value * base)] // Apply negative sign if tmp_value < 0 *ptr++ = '-' *ptr-- = 0 for ptr1 < ptr tmp_char = *ptr *ptr-- = *ptr1 *ptr1++ = tmp_char return result StringToDouble :: (s: String): F64 sign: F64 = 1.0 i := 0 if s[i] == '-' sign = -1 i += 1 elif s[i] == '+' i += 1 for , i < Len(s), i+= 1 pass // BACKUP return 0 FormatString :: (buffer: *U8, buffer_len: U64, string: String, args: []Any) // @todo(krzosa): Add consideration of buffer SIZE! Add some function to handle this OutStr or something arg_counter := 0 out_buffer_len := 0 for i := 0, i < Len(string), i+=1 if string[i] == '%' Assert(arg_counter < Len(args), "Passed too many [%] to the string formating function") arg := args[arg_counter++] if arg.type == int value := *(arg.data->*int) itoa_buff: [64]U8 p := IntegerToString(value, &itoa_buff[0], 10) for *p != 0 buffer[out_buffer_len++] = *p++ else;; Assert(false) else buffer[out_buffer_len++] = string[i] main :: (): int a := 10 b := 20 values := []Any{a, b} for values Assert(it.type == int) AnyArguments({a,b}) c := VariadicArguments("Test", args = {a+b,b}) Assert(*(c.data->*int) == 30) d := VariadicArguments("Test", {b,a}) Assert(*(d.data->*int) == b) Assert(*(values[0].data->*int) == 10) Assert(*(values[1].data->*int) == 20) buf: [128]U8 FormatString(&buf[0], Len(buf), "Test % %", {32, 156}) return 0