// struct definition and declaration
struct a {
    int a;
    int b;
} c;

// Useful anonymous struct declaration
struct {
    int y;
} anon1, anon2;

// forward declarations
struct a;
struct b;
struct c;

struct b {int a; int b; };

// struct c {b g; }; // syntax error.

// struct s {float c,a,b,c;} s; // duplicate struct member

struct c {struct b g; };

// struct a { int w; }; // error

void testCopying() {
    struct a {int a[10]; char c;} a, b;
    a.c = 37;
    b.c = 38;
    b = a;
    printf("testCopying: %d == %d\n", a.c, b.c);
}

void testUnion() {
    union u;
    union u {float f;int i;} u;
    u.f = 1.0f;
    printf("testUnion: %g == 0x%08x\n", u.f, u.i);
}

struct v {float x, y, z, w; };

void add(struct v* result, struct v* a, struct v* b) {
    result->x = a->x + b->x;
    result->y = a->y + b->y;
    result->z = a->z + b->z;
    result->w = a->w + b->w;
}

void set(struct v* v, float x, float y, float z, float w) {
    v->x = x;
    v->y = y;
    v->z = z;
    v->w = w;
}

void print(struct v* v) {
    printf("(%g, %g, %g, %g)\n", v->x, v->y, v->z, v->w);
}

void testArgs() {
    struct v a, b, c;
    set(&a, 1.0f, 2.0f, 3.0f, 4.0f);
    set(&b, 5.0f, 6.0f, 7.0f, 8.0f);
    add(&c, &a, &b);
    printf("testArgs: ");
    print(&c);
}

int main() {
    anon1.y = 3;
    anon2.y = anon1.y;

    testCopying();
    testUnion();
    testArgs();

    struct c cc;
    cc.g.a = 3;
    c.a = 1;
    c.b = 3;
    struct a {int x, y; } z;
    // struct a {int x, y; } z2;
    z.x = c.a;
    struct a *pA;
    pA = &z;
    pA->x += 5;
    return pA->x;
}
