1 | /* Copyright (C) 1991, 1992, 1997, 1998, 2000 Free Software Foundation, Inc.
|
---|
2 | This file is part of the GNU C Library.
|
---|
3 |
|
---|
4 | The GNU C Library is free software; you can redistribute it and/or
|
---|
5 | modify it under the terms of the GNU Lesser General Public
|
---|
6 | License as published by the Free Software Foundation; either
|
---|
7 | version 2.1 of the License, or (at your option) any later version.
|
---|
8 |
|
---|
9 | The GNU C Library is distributed in the hope that it will be useful,
|
---|
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
12 | Lesser General Public License for more details.
|
---|
13 |
|
---|
14 | You should have received a copy of the GNU Lesser General Public
|
---|
15 | License along with the GNU C Library; if not, write to the Free
|
---|
16 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
---|
17 | 02111-1307 USA. */
|
---|
18 |
|
---|
19 | #include <stdio.h>
|
---|
20 | #include <setjmp.h>
|
---|
21 | #include <stdlib.h>
|
---|
22 |
|
---|
23 | static jmp_buf env;
|
---|
24 | static int last_value = -1, lose = 0;
|
---|
25 |
|
---|
26 | static void
|
---|
27 | jump (int val)
|
---|
28 | {
|
---|
29 | longjmp (env, val);
|
---|
30 | }
|
---|
31 |
|
---|
32 | int
|
---|
33 | main (void)
|
---|
34 | {
|
---|
35 | int value;
|
---|
36 |
|
---|
37 | value = setjmp (env);
|
---|
38 | if (value != last_value + 1)
|
---|
39 | {
|
---|
40 | fputs("Shouldn't have ", stdout);
|
---|
41 | lose = 1;
|
---|
42 | }
|
---|
43 | last_value = value;
|
---|
44 | switch (value)
|
---|
45 | {
|
---|
46 | case 0:
|
---|
47 | puts("Saved environment.");
|
---|
48 | jump (0);
|
---|
49 | default:
|
---|
50 | printf ("Jumped to %d.\n", value);
|
---|
51 | if (value < 10)
|
---|
52 | jump (value + 1);
|
---|
53 | }
|
---|
54 |
|
---|
55 | if (!lose && value == 10)
|
---|
56 | {
|
---|
57 | /* Do a second test, this time without `setjmp' being a macro.
|
---|
58 | This is not required by ISO C but we have this for compatibility. */
|
---|
59 | #undef setjmp
|
---|
60 | extern int setjmp (jmp_buf);
|
---|
61 |
|
---|
62 | last_value = -1;
|
---|
63 | lose = 0;
|
---|
64 |
|
---|
65 | value = setjmp (env);
|
---|
66 | if (value != last_value + 1)
|
---|
67 | {
|
---|
68 | fputs("Shouldn't have ", stdout);
|
---|
69 | lose = 1;
|
---|
70 | }
|
---|
71 | last_value = value;
|
---|
72 | switch (value)
|
---|
73 | {
|
---|
74 | case 0:
|
---|
75 | puts("Saved environment.");
|
---|
76 | jump (0);
|
---|
77 | default:
|
---|
78 | printf ("Jumped to %d.\n", value);
|
---|
79 | if (value < 10)
|
---|
80 | jump (value + 1);
|
---|
81 | }
|
---|
82 | }
|
---|
83 |
|
---|
84 | if (!lose && value == 10)
|
---|
85 | {
|
---|
86 | /* And again for the `_setjmp' function. */
|
---|
87 | #ifndef _setjmp
|
---|
88 | extern int _setjmp (jmp_buf);
|
---|
89 | #endif
|
---|
90 | last_value = -1;
|
---|
91 | lose = 0;
|
---|
92 |
|
---|
93 | value = _setjmp (env);
|
---|
94 | if (value != last_value + 1)
|
---|
95 | {
|
---|
96 | fputs("Shouldn't have ", stdout);
|
---|
97 | lose = 1;
|
---|
98 | }
|
---|
99 | last_value = value;
|
---|
100 | switch (value)
|
---|
101 | {
|
---|
102 | case 0:
|
---|
103 | puts("Saved environment.");
|
---|
104 | jump (0);
|
---|
105 | default:
|
---|
106 | printf ("Jumped to %d.\n", value);
|
---|
107 | if (value < 10)
|
---|
108 | jump (value + 1);
|
---|
109 | }
|
---|
110 | }
|
---|
111 |
|
---|
112 | if (lose || value != 10)
|
---|
113 | puts ("Test FAILED!");
|
---|
114 | else
|
---|
115 | puts ("Test succeeded!");
|
---|
116 |
|
---|
117 | return lose ? EXIT_FAILURE : EXIT_SUCCESS;
|
---|
118 | }
|
---|