Files
corelang/examples/any_and_variadic_args.core
2022-10-04 17:02:22 +02:00

82 lines
1.9 KiB
Core

VariadicArguments :: (string: *char, args: ..): Any
return args[0]
AnyArguments :: (values: []Any)
for values
Assert(it.type == S64)
Assert(*(values[0].data->*S64) == 10)
Assert(*(values[1].data->*S64) == 20)
/**
* C++ version 0.4 char* style "itoa":
* Written by Lukás Chmela
* Released under GPLv3.
*/
ItoaLookupTable := "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"
Itoa :: (value: S64, result: *U8, base: S64): *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: S64
for value != 0
tmp_value = value
value /= base
// @todo: FIX FIX FIX String is untyped
*ptr++ = ItoaLookupTable[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
FormatString :: (buffer: *U8, buffer_len: U64, string: String, args: ..)
arg_counter := 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 == S64
value := *(arg.data->*S64)
itoa_buff: [64]U8
p := Itoa(value, &itoa_buff[0], 10)
for *p != 0
buffer[buffer_len++] = *p++
else;; Assert(false)
else
buffer[buffer_len++] = string[i]
main :: (): int
a := 10
b := 20
values := []Any{a, b}
// printf("Test %d", {a})
for values
Assert(it.type == S64)
AnyArguments({a,b})
c := VariadicArguments("Test", args = {a+b,b})
Assert(*(c.data->*S64) == 30)
d := VariadicArguments("Test", {b,a})
Assert(*(d.data->*S64) == b)
Assert(*(values[0].data->*S64) == 10)
Assert(*(values[1].data->*S64) == 20)
return 0