1// struct definition and declaration
2struct a {
3    int a;
4    int b;
5} c;
6
7// Useful anonymous struct declaration
8struct {
9    int y;
10} anon1, anon2;
11
12// forward declarations
13struct a;
14struct b;
15struct c;
16
17struct b {int a; int b; };
18
19// struct c {b g; }; // syntax error.
20
21// struct s {float c,a,b,c;} s; // duplicate struct member
22
23struct c {struct b g; };
24
25// struct a { int w; }; // error
26
27void testCopying() {
28    struct a {int a[10]; char c;} a, b;
29    a.c = 37;
30    b.c = 38;
31    b = a;
32    printf("testCopying: %d == %d\n", a.c, b.c);
33}
34
35void testUnion() {
36    union u;
37    union u {float f;int i;} u;
38    u.f = 1.0f;
39    printf("testUnion: %g == 0x%08x\n", u.f, u.i);
40}
41
42struct v {float x, y, z, w; };
43
44void add(struct v* result, struct v* a, struct v* b) {
45    result->x = a->x + b->x;
46    result->y = a->y + b->y;
47    result->z = a->z + b->z;
48    result->w = a->w + b->w;
49}
50
51void set(struct v* v, float x, float y, float z, float w) {
52    v->x = x;
53    v->y = y;
54    v->z = z;
55    v->w = w;
56}
57
58void print(struct v* v) {
59    printf("(%g, %g, %g, %g)\n", v->x, v->y, v->z, v->w);
60}
61
62void testArgs() {
63    struct v a, b, c;
64    set(&a, 1.0f, 2.0f, 3.0f, 4.0f);
65    set(&b, 5.0f, 6.0f, 7.0f, 8.0f);
66    add(&c, &a, &b);
67    printf("testArgs: ");
68    print(&c);
69}
70
71int main() {
72    anon1.y = 3;
73    anon2.y = anon1.y;
74
75    testCopying();
76    testUnion();
77    testArgs();
78
79    struct c cc;
80    cc.g.a = 3;
81    c.a = 1;
82    c.b = 3;
83    struct a {int x, y; } z;
84    // struct a {int x, y; } z2;
85    z.x = c.a;
86    struct a *pA;
87    pA = &z;
88    pA->x += 5;
89    return pA->x;
90}
91