|
|
1.1 root 1: /* The Plum Hall Validation Suite for C
2: * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc.
3: * VERSION: 4
4: * DATE: 1993-01-01
5: * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989.
6: * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
7: * without specific permission from Plum Hall Inc.
8: */
9:
10: #include "flags.h"
11: #ifndef SKIP33C
12: #include "defs.h"
13: void strucs(), q_s_a(), unions();
14: /*
15: * Structures ..... all sorts of tests of structures and unions
16: * Called at or about line 194 in c33a.c
17: */
18: void structures()
19: {
20: Filename = "c33c.c";
21: #if (ANSI || V7)
22: strucs();
23: q_s_a();
24: unions();
25: #endif
26: }
27:
28: #if (ANSI || V7)
29: /*
30: * STRUCTS - this function tests the ways you can copy
31: * structures. It tests 2 sizes of structures: S1 has a single
32: * char element and SN has 20 int members plus a char.
33: */
34: typedef struct
35: {
36: char x;
37: } S1;
38: typedef struct
39: {
40: int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;
41: char z;
42: } SN;
43:
44: extern S1 RetS1();
45: extern SN RetSN();
46:
47: void strucs()
48: {
49: REGISTERS;
50: S1 s1a, s1b, s1c;
51: SN sna, snb, snc;
52: int i, j;
53: static S1 s1array[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
54:
55:
56: USEREGISTERS;
57:
58: /* simple assignment */
59: s1a.x = ivalue(99);
60: s1b = s1a;
61: iequals(__LINE__, 99, s1b.x);
62: sna.z = ivalue(98);
63: snb = sna;
64: iequals(__LINE__, 98, snb.z);
65: #if ANSI
66: /* pass to a function and get result of function returning */
67: s1a = RetS1(s1a);
68: iequals(__LINE__, 100, s1a.x);
69: iequals(__LINE__, 100, RetS1(s1a).x);
70: sna = RetSN(sna);
71: iequals(__LINE__, 101, sna.z);
72: iequals(__LINE__, 101, RetSN(sna).z);
73: #endif
74: #if STRUCT_COND_OK
75: /* copies involving question operators */
76: i = j = ivalue(0);
77: s1a.x = ivalue(102);
78: s1c.x = ivalue(0);
79: s1b = i ? s1c : (j ? s1c : s1a);
80: iequals(__LINE__, 102, s1b.x);
81: sna.z = ivalue(103);
82: snc.z = ivalue(0);
83: snb = i ? snc : (j ? snc : sna);
84: iequals(__LINE__, 103, snb.z);
85: #endif
86:
87: /* make sure that structures are passed by value, not by reference */
88: s1b.x = ivalue(104);
89: s1a = RetS1(s1b); /* sets s1a.x to 100 */
90: iequals(__LINE__, 104, s1b.x);
91: snb.z = ivalue(104);
92: sna = RetSN(snb); /* sets sna.z to 101 */
93: iequals(__LINE__, 104, snb.z);
94: {
95: /* test lvalue use of p->m */
96: S1 *ps1;
97: SN *psN = &sna;
98:
99: ps1 = &s1b;
100: ++ps1->x;
101: iequals(__LINE__, 105, ps1->x);
102: psN->z++;
103: iequals(__LINE__, 102, psN->z);
104: ps1 = s1array;
105: iequals(__LINE__, 1, (++ps1)->x);
106: }
107: }
108:
109: S1 RetS1(s1)
110: S1 s1;
111: {
112: S1 s1a;
113: s1a.x = 100;
114: return(s1a);
115: }
116: SN RetSN(sn)
117: SN sn;
118: {
119: SN sna;
120: sna.z = 101;
121: return(sna);
122: }
123:
124: /*
125: * These tests go into the complexities of interaction between
126: * question, comma, and structure copies.
127: */
128: static true = 1;
129: static false = 0;
130: static int Total = 0;
131:
132: struct mb {
133: int mb_i[10];
134: };
135: struct mb mbr = {0}, mb1 = {1,2}, mb2 = {3,4}, mb3 = {5,6};
136: static int x()
137: {
138: Total++;
139: }
140:
141: void q_s_a()
142: {
143: int i = 1;
144: do_nothing(&i);
145:
146: #if STRUCT_COND_OK
147: mbr = true ? mb1 : mb2;
148: iequals(__LINE__, mbr.mb_i[i], 2);
149: mbr = false ? mb1 : mb2;
150: iequals(__LINE__, mbr.mb_i[i], 4);
151: mbr = true ? (x(),mb1) : mb2;
152: iequals(__LINE__, mbr.mb_i[i], 2);
153: mbr = false ? mb1 : (x(), mb2);
154: iequals(__LINE__, mbr.mb_i[i], 4);
155: mbr = true ? (x(),mb1) : (x(),mb2);
156: iequals(__LINE__, mbr.mb_i[i], 2);
157: mbr = false ? (x(),mb1) : (x(),mb2);
158: iequals(__LINE__, mbr.mb_i[i], 4);
159:
160: mbr = true ? (mb1=mb2) : mb3;
161: iequals(__LINE__, mbr.mb_i[i], 4);
162: iequals(__LINE__, mb1.mb_i[i], 4);
163: mbr = false ? mb1 : (mb1=mb3);
164: iequals(__LINE__, mbr.mb_i[i], 6);
165: iequals(__LINE__, mb1.mb_i[i], 6);
166: mbr = true ? (mb1=mb2) : (mb1=mb3);
167: iequals(__LINE__, mbr.mb_i[i], 4);
168: iequals(__LINE__, mb1.mb_i[i], 4);
169: mbr = false ? (mb1=mb2) : (mb1=mb3);
170: iequals(__LINE__, mbr.mb_i[i], 6);
171: iequals(__LINE__, mb1.mb_i[i], 6);
172:
173: mbr = true ? (x(),(mb1=mb2)) : mb3;
174: iequals(__LINE__, mbr.mb_i[i], 4);
175: iequals(__LINE__, mb1.mb_i[i], 4);
176: mbr = false ? mb1 : (x(),(mb1=mb3));
177: iequals(__LINE__, mbr.mb_i[i], 6);
178: iequals(__LINE__, mb1.mb_i[i], 6);
179: mbr = true ? (x(),(mb1=mb2)) : (x(),(mb1=mb3));
180: iequals(__LINE__, mbr.mb_i[i], 4);
181: iequals(__LINE__, mb1.mb_i[i], 4);
182: mbr = false ? (x(),(mb1=mb2)) : (x(),(mb1=mb3));
183: iequals(__LINE__, mbr.mb_i[i], 6);
184: iequals(__LINE__, mb1.mb_i[i], 6);
185:
186: /* make sure that side effects took place the proper number of times */
187: iequals(__LINE__, Total, 8);
188: #endif
189: }
190:
191:
192: /*
193: * UNIONS - try out all of the aggregate things you can do to unions.
194: */
195: union u1 {
196: UCHAR u1_c ;
197: int u1_i;
198: } u1a, u1b, u1c;
199:
200: union u2 {
201: UCHAR u2_c;
202: int u2_i;
203: long u2_l;
204: struct
205: {
206: int u2s_a, u2s_b, u2s_c, u2s_d, u2s_e, u2s_f, u2s_g;
207: } u2_s;
208: double u2_d;
209: } u2a, u2b, u2c;
210:
211: union u1 fu1();
212: union u2 fu2();
213: void vfu1();
214: void vfu2();
215:
216: void unions()
217: {
218: int i = 0;
219:
220: u1a.u1_c = 255;
221: u1b = u1a;
222: iequals(__LINE__, u1b.u1_c, 255);
223: u2a.u2_s.u2s_b = -7;
224: u2b = u2a;
225: iequals(__LINE__, u2b.u2_s.u2s_b, -7);
226:
227: /* check passing by value */
228: u1a.u1_i = 0;
229: vfu1(u1a);
230: iequals(__LINE__, u1a.u1_i, 0);
231: u2a.u2_d = 0.0;
232: vfu2(u2a);
233: dequals(__LINE__, u2a.u2_d, 0.0);
234: #if ANSI
235: /* check voided return of union */
236: (void)fu1(0);
237: (void)fu2(0);
238: #endif
239: /* check union return and assignment */
240: u1a = fu1(9);
241: iequals(__LINE__, u1a.u1_i, 10);
242: u2a = fu2(11);
243: iequals(__LINE__, u2a.u2_s.u2s_g, 12);
244: #if ANSI
245: /* check direct access of returned unions */
246: iequals(__LINE__, fu1(13).u1_i, 14);
247: iequals(__LINE__, fu2(15).u2_s.u2s_g, 16);
248: #endif
249: /* unions involving question operators */
250: #if STRUCT_COND_OK
251: u1a.u1_c = 17;
252: u1b.u1_c = 18;
253: u1c = i ? u1a : u1b;
254: iequals(__LINE__, u1c.u1_c, 18);
255: u2a.u2_s.u2s_g = 19;
256: u2b.u2_s.u2s_g = 20;
257: u2c = i ? u2a : u2b;
258: iequals(__LINE__, u2c.u2_s.u2s_g, 20);
259: #endif
260: }
261:
262: union u1 fu1(i)
263: int i;
264: {
265: static union u1 u;
266: u.u1_i = i+1;
267: return u;
268: }
269:
270: union u2 fu2(i)
271: int i;
272: {
273: static union u2 u;
274: u.u2_s.u2s_g = i+1;
275: return u;
276: }
277:
278: /* set i field of passed in union */
279: void vfu1(u)
280: union u1 u;
281: {
282: u.u1_i = 99;
283: }
284:
285: /* set d field of passed in union */
286: void vfu2(u)
287: union u2 u;
288: {
289: u.u2_d = 99.99;
290: }
291: #endif
292:
293: #else /* if SKIP33C */
294:
295: void structures() { pr_skip("c3_3c (structures): SKIPPED ENTIRELY\n"); }
296: #endif /* SKIP33C */
297:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.