Pristine Ack-5.5
[Ack-5.5.git] / lang / cem / ctest / ctsetjmp / stjmp.c
1 # include "setjmp.h"
2 # include <stdio.h>
3 # ifndef NOSIGNAL
4 # include <signal.h>
5 #endif /* not NOSIGNAL */
6
7 /*
8  * setjmptest
9  * A program to test setjmp(III) and longjmp,
10  * in particular with respect to register variables
11  */
12
13 int     whichtest;
14 int     nerrors;
15
16 main() {
17         jmp_buf envm;
18         register int i;
19
20         test1();
21         test2();
22         test3();
23         test4();
24         test5();
25         test6();
26         if (nerrors) return nerrors;
27
28         i = 1;
29         if (setjmp(envm) == 0) {
30                 i = 2;
31                 longjmp(envm, 1);
32         }
33         else {
34                 if (i == 2) {
35                         printf("Setjmp/longjmp work ok, even with register variables\n");
36                 }
37                 else if (i == 1) {
38                         printf("WARNING: The setjmp/longjmp of this machine restore register variables\n\
39 to the value they had at the time of the \"setjmp\"\n");
40                 }
41                 else {
42                         printf("Aha, I just found one last error\n");
43                         return 1;
44                 }
45         }
46         return 0;
47 }
48
49 e(n) {
50         nerrors++;
51         fprintf(stderr,"Error %d in test %d\n",n,whichtest);
52 }
53
54 test1() {
55         register p;
56
57         printf("TEST 1 : one integer register variable\n");
58         whichtest = 1;
59         p = 200;
60         garbage();
61         if (p != 200) e(1);
62 }
63
64 test2() {
65         register p,q;
66
67         printf("TEST 2 : two integer register variables\n");
68         whichtest = 2;
69         p = 200; q = 300;
70         garbage();
71         if (p != 200) e(1);
72         if (q != 300) e(2);
73 }
74         
75 test3() {
76         register p,q,r;
77
78         printf("TEST 3 : three integer register variables\n");
79         whichtest = 3;
80         p = 200; q = 300; r = 400;
81         garbage();
82         if (p != 200) e(1);
83         if (q != 300) e(2);
84         if (r != 400) e(3);
85 }
86         
87 char    buf[512];
88
89 test4() {
90         register char *p;
91
92         printf("TEST 4 : one pointer register variable\n");
93         whichtest = 4;
94         p = &buf[100];
95         garbage();
96         if (p != &buf[100]) e(1);
97 }
98
99 test5() {
100         register char *p,*q;
101
102         printf("TEST 5 : two pointer register variables\n");
103         whichtest = 5;
104         p = &buf[100]; q = &buf[200];
105         garbage();
106         if (p != &buf[100]) e(1);
107         if (q != &buf[200]) e(2);
108 }
109
110 test6() {
111         register char *p,*q,*r;
112
113         printf("TEST 6 : three pointer register variables\n");
114         whichtest = 6;
115         p = &buf[100]; q = &buf[200]; r = &buf[300];
116         garbage();
117         if (p != &buf[100]) e(1);
118         if (q != &buf[200]) e(2);
119         if (r != &buf[300]) e(3);
120 }
121
122 jmp_buf env;
123
124 /*      return address of local variable.
125         This way we can check that the stack is not polluted.
126 */
127 char *
128 addr() {
129         char a;
130
131         return &a;
132 }
133
134 garbage() {
135         register        i,j,k;
136         register char   *p,*q,*r;
137         char *a, *tmp;
138         int t;
139
140         p = &buf[300];
141         q = &buf[400];
142         r = &buf[500];
143         i = 10; j = 20; k = 30;
144         switch(setjmp(env)) {
145         case 0:
146                 a = addr();
147                 longjmp(env,1);
148                 break;
149         case 1:
150                 if (i != 10) e(11);
151                 if (j != 20) e(12);
152                 if (k != 30) e(13);
153                 if (p != &buf[300]) e(14);
154                 if (q != &buf[400]) e(15);
155                 if (r != &buf[500]) e(16);
156                 tmp = addr();
157                 if (a != tmp) e(17);
158                 level1();
159                 break;
160         case 2:
161                 if (i != 10) e(21);
162                 if (j != 20) e(22);
163                 if (k != 30) e(23);
164                 if (p != &buf[300]) e(24);
165                 if (q != &buf[400]) e(25);
166                 if (r != &buf[500]) e(26);
167                 if (a != tmp) e(27);
168                 level2();
169                 break;
170         case 3:
171                 if (i != 10) e(31);
172                 if (j != 20) e(32);
173                 if (k != 30) e(33);
174                 if (p != &buf[300]) e(34);
175                 if (q != &buf[400]) e(35);
176                 if (r != &buf[500]) e(36);
177                 if (a != tmp) e(37);
178 # ifndef NOSIGNAL
179                 hard();
180         case 4:
181                 if (i != 10) e(41);
182                 if (j != 20) e(42);
183                 if (k != 30) e(43);
184                 if (p != &buf[300]) e(44);
185                 if (q != &buf[400]) e(45);
186                 if (r != &buf[500]) e(46);
187                 if (a != tmp) e(47);
188 #endif
189                 return;
190                 break;
191         default:
192                 e(100);
193         }
194         e(200);
195 }
196
197 level1() {
198         register char *p;
199         register i;
200
201         i = 1000;
202         p = &buf[10];
203         i = 200;
204         p = &buf[20];
205         longjmp(env,2);
206 }
207
208 level2() {
209         register char *p;
210         register i;
211
212         i = 0200;
213         p = &buf[2];
214         *p = i;
215         dolev();
216 }
217
218 dolev() {
219         register char *p;
220         register        i;
221
222         i = 010;
223         p = &buf[3];
224         *p = i;
225         longjmp(env,3);
226 }
227
228 # ifndef NOSIGNAL
229 catch() {
230         printf(" signal caught\n");
231         longjmp(env,4);
232 }
233
234 hard() {
235         register char *p;
236
237         signal(SIGHUP,catch);
238         for(p = buf;p <= &buf[511]; p++) *p = 025;
239         printf("Sending signal ...");
240         kill(getpid(),SIGHUP);
241 }
242 #endif /* not NOSIGNAL */