/* the c side of tests/programs/structval.zc: functions that take structs by value. test.sh builds it to build/sbv.so, and the test loads it with cload. */ typedef struct { long a, b; } pair; typedef struct { double x, y; } vec; typedef struct { long a, b, c; } trio; long pair_sum(pair p) { return p.a * 10 + p.b; } long pair_sum2(pair p, pair q) { return p.a * 1000 + p.b * 100 + q.a * 10 + q.b; } long vec_scaled(vec v, long k) { return (long)(v.x * 2 + v.y * 3) * k; } long many(long a, long b, long c, long d, long e, long f, pair p) { return a + b + c + d + e + f + p.a * 100 + p.b; } long trio_sum(long a, long b, long c, long d, long e, long f, trio t) { return a + b + c + d + e + f + t.a * 100 + t.b * 10 + t.c; } long eight(long a, long b, long c, long d, long e, long f, long g, long h, pair p) { return a + b + c + d + e + f + g + h + p.a * 100 + p.b; } pair mkpair(long a, long b) { pair r; r.a = a; r.b = b; return r; } vec mkvec(double x, double y) { vec r; r.x = x + 1; r.y = y + 1; return r; } trio mktrio(long a, long b, long c) { trio r; r.a = a; r.b = b; r.c = c; return r; } typedef struct { long a; double x; } mixed; mixed mkmixed(long a, double x) { mixed r; r.a = a + 1; r.x = x * 2; return r; } typedef struct { double x, y, z; } v3; v3 mkv3(double x) { v3 r; r.x = x; r.y = x + 1; r.z = x + 2; return r; }