// `#foreign` C-variadic tail: trailing `args: ..T` on a foreign fn maps
// to the C calling convention's `...`. Extras at the call site are
// passed via the variadic slot with the standard default argument
// promotion (s8/s16/bool → s32, f32 → f64) applied implicitly.

#import "modules/std.sx";

#import c {
    #source "ffi-foreign-cvariadic.c";
};

sx_ffi_sum_ints     :: (n: s32, args: ..s32) -> s64 #foreign;
sx_ffi_avg_doubles  :: (n: s32, args: ..f64) -> f64 #foreign;
sx_ffi_count_args   :: (tag: *u8, args: ..*u8) -> s32 #foreign;

main :: () -> s32 {
    print("sum_ints(3, 10, 20, 30) = {}\n", sx_ffi_sum_ints(3, 10, 20, 30));
    print("sum_ints(0)             = {}\n", sx_ffi_sum_ints(0));
    print("avg_doubles(2)          = {}\n", sx_ffi_avg_doubles(2, 1.5, 2.5));
    print("avg_doubles(3)          = {}\n", sx_ffi_avg_doubles(3, 1.0, 2.0, 3.0));

    a := "alpha".ptr;
    b := "beta".ptr;
    g := "gamma".ptr;
    sentinel : *u8 = null;
    print("count_args(3 strs)      = {}\n", sx_ffi_count_args("tag".ptr, a, b, g, sentinel));
    0;
}
