Files
corelang/examples/any_and_variadic_args.core
2026-03-20 08:35:18 +01:00

98 lines
2.3 KiB
Core

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