test: Fix open-read test.
[mes.git] / lib / tests / scaffold / 72-typedef-struct-def.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * GNU Mes --- Maxwell Equations of Software
3  * Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of GNU Mes.
6  *
7  * GNU Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * GNU Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <mes/lib.h>
22 #include <stdio.h>
23
24 typedef struct foo
25 {
26   int i;
27 } foo;
28
29 typedef struct
30 {
31   int i;
32   struct foo f;
33   struct foo *p;
34 } bar;
35
36
37 bar baz[2] = { 1, 2, 3, 4, 5, 6 };
38
39 bar *list[2];
40
41 //NYACC
42 //#define offsetof(type, field) ((size_t) &((type *)0)->field)
43 #if __MESC__
44 #define offsetof(type, field) (&((type *)0)->field)
45 #else
46 #define offsetof(type, field) ((size_t)&((type *)0)->field)
47 #endif
48
49 int
50 main ()
51 {
52   foo f = { 1 };
53   printf ("f.i=%d\n", f.i);
54
55   bar b = { 1, 2, &f };
56   printf ("b.i=%d\n", b.i);
57
58   printf ("b.f.i=%d\n", b.f.i);
59   if (b.f.i != 2)
60     return 1;
61
62   printf ("b.p->i=%d\n", b.p->i);
63   if (b.p->i != 1)
64     return 2;
65
66   bar *p = &b;
67   p->i = 2;
68   printf ("p->i=%d\n", b.i);
69
70   p->i++;
71   printf ("p->i=%d\n", b.i);
72
73   p->i--;
74   printf ("p->i=%d\n", b.i);
75
76   printf ("p->f.i=%d\n", p->f.i);
77   if (p->f.i != 2)
78     return 3;
79
80   printf ("p->p->i=%d\n", p->p->i);
81   if (p->p->i != 1)
82     return 4;
83
84   bar **pp = &p;
85   (*pp)->i = 3;
86   printf ("(*pp)->i=%d\n", b.i);
87
88   printf ("sizeof i:%d\n", sizeof (p->i));
89   if ((sizeof p->i) != 4)
90     return 5;
91
92   printf ("offsetof g=%d\n", (offsetof (bar, f)));
93 #if __MESC__
94   //if ((offsetof (bar ,f)) != 4) return 6;
95   //#define offsetof(type, field) (&((type *)0)->field)
96   if ((&((bar *) 0)->f) != 4)
97     return 6;
98
99 #else
100   if ((offsetof (bar, f)) != 4)
101     return 6;
102 #endif
103
104   printf ("(*pp)->b.i=%d\n", (*pp)->f.i);
105   if ((*pp)->f.i != 2) return 7;
106
107   if (baz[0].i != 1) return 8;
108   printf ("baz[0].f.i=%d\n", baz[0].f.i);
109   if (baz[0].f.i != 2) return 9;
110
111   printf ("baz[1].i=%d\n", baz[1].i);
112   if (baz[1].i != 4) return 10;
113   printf ("baz[1].f.i=%d\n", baz[1].f.i);
114   if (baz[1].f.i != 5) return 11;
115
116   bar one = {0};
117   printf ("one.i\n", one.i);
118   if (one.i != 0) return 12;
119   printf ("one.f.i\n", one.f.i);
120   if (one.f.i != 0) return 13;
121
122   bar b0 = {2};
123   struct foo f0 = {0};
124   struct foo *pf = &f0;
125   list[0] = &b0;
126   list[0]->p = pf;
127
128   eputs ("b0.i="); eputs (itoa (b0.i)); eputs ("\n");
129   if (b0.i != 2) return 14;
130   eputs ("b0.p->i="); eputs (itoa (b0.p->i)); eputs ("\n");
131   if (b0.p->i != 0) return 15;
132
133   return 0;
134 }