107 lines
2.1 KiB
Plaintext
107 lines
2.1 KiB
Plaintext
import "libc";
|
|
|
|
/**
|
|
* doc comment test
|
|
*
|
|
**/
|
|
print :: proc(v: Any) {
|
|
switch(v.type) {
|
|
case typeof(:int): {
|
|
val := :*int(v.data);
|
|
assert(*val == 4);
|
|
}
|
|
default: assert(0);
|
|
}
|
|
}
|
|
|
|
modify_any :: proc(v: Any) {
|
|
switch v.type {
|
|
case typeof(:int): {
|
|
val := :*int(v.data);
|
|
val[0] += 1;
|
|
}
|
|
case typeof(:*int): {
|
|
val := *:**int(v.data);
|
|
val[0] += 1;
|
|
}
|
|
default: assert(0);
|
|
}
|
|
}
|
|
|
|
any_vargs :: proc(fmt: *char, ...Any) {
|
|
va: va_list;
|
|
va_start(va, fmt);
|
|
|
|
for i := 0; fmt[i]; i += 1 {
|
|
if fmt[i] == '%' {
|
|
val := va_arg_any(va);
|
|
assert(val.type == typeof(:int) ||
|
|
val.type == typeof(:float) ||
|
|
val.type == typeof(:double)||
|
|
val.type == typeof(:*char) ||
|
|
val.type == typeof(:char) ||
|
|
val.type == typeof(:String));
|
|
}
|
|
}
|
|
|
|
va_end(va);
|
|
}
|
|
|
|
main :: proc(): int {
|
|
{
|
|
i: int;
|
|
modify_any(i);
|
|
assert(i == 0);
|
|
|
|
modify_any(&i);
|
|
assert(i == 1);
|
|
}
|
|
|
|
{
|
|
i: int = 4;
|
|
ii: *int = &i;
|
|
a: Any = {typeof(&i), &ii};
|
|
b: Any = &i;
|
|
c: Any = a;
|
|
|
|
assert(*:**int(a.data) == *:**int(b.data));
|
|
assert(a.type == b.type);
|
|
|
|
assert(a.data == c.data);
|
|
assert(a.type == c.type);
|
|
}
|
|
|
|
{
|
|
a: Any = 32;
|
|
b: Any = 33;
|
|
|
|
assert(*:*int(a.data) + 1 == *:*int(b.data));
|
|
}
|
|
|
|
{
|
|
c: Any = "thing";
|
|
d: Any = 32.5232;
|
|
e: Any = :float(32);
|
|
f: Any = :String("another_thing");
|
|
|
|
assert(c.type == typeof(:*char));
|
|
assert(d.type == typeof(:double));
|
|
assert(e.type == typeof(:float));
|
|
assert(f.type == typeof(:String));
|
|
}
|
|
|
|
{
|
|
a: String = "asd";
|
|
b: Any = a;
|
|
|
|
assert(:*String(b.data).len == 3);
|
|
}
|
|
|
|
{
|
|
any_vargs("% % %", "asd", 32, 32.042);
|
|
any_vargs("% % %", :String("asd"), :char(32), :float(32.042));
|
|
}
|
|
|
|
return 0;
|
|
}
|