summaryrefslogtreecommitdiff
path: root/test/setjmp/setjmp_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/setjmp/setjmp_test.c')
-rw-r--r--test/setjmp/setjmp_test.c123
1 files changed, 103 insertions, 20 deletions
diff --git a/test/setjmp/setjmp_test.c b/test/setjmp/setjmp_test.c
index f371048a5..35d9638ad 100644
--- a/test/setjmp/setjmp_test.c
+++ b/test/setjmp/setjmp_test.c
@@ -1,35 +1,118 @@
+/* Copyright (C) 1991, 1992, 1997, 1998, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
#include <stdio.h>
#include <setjmp.h>
-#include <unistd.h>
+#include <stdlib.h>
+static jmp_buf env;
+static int last_value = -1, lose = 0;
-jmp_buf jb;
-int tries=0;
+static void
+jump (int val)
+{
+ longjmp (env, val);
+}
-int main(int argc,char *argv[])
+int
+main (void)
{
- int ret;
+ int value;
- printf("calling setjmp, should return with 0\n");
+ value = setjmp (env);
+ if (value != last_value + 1)
+ {
+ fputs("Shouldn't have ", stdout);
+ lose = 1;
+ }
+ last_value = value;
+ switch (value)
+ {
+ case 0:
+ puts("Saved environment.");
+ jump (0);
+ default:
+ printf ("Jumped to %d.\n", value);
+ if (value < 10)
+ jump (value + 1);
+ }
- ret = setjmp(jb);
-
- printf("setjmp returned %d\n",ret);
+ if (!lose && value == 10)
+ {
+ /* Do a second test, this time without `setjmp' being a macro.
+ This is not required by ISO C but we have this for compatibility. */
+#undef setjmp
+ extern int setjmp (jmp_buf);
- if(!ret){
- if(tries++>4){
- printf("Hmmm... in loop, must be broken.\n");
- return 0;
- }
- printf("now calling longjmp, setjmp should return with 1\n");
+ last_value = -1;
+ lose = 0;
- longjmp(jb,1);
+ value = setjmp (env);
+ if (value != last_value + 1)
+ {
+ fputs("Shouldn't have ", stdout);
+ lose = 1;
+ }
+ last_value = value;
+ switch (value)
+ {
+ case 0:
+ puts("Saved environment.");
+ jump (0);
+ default:
+ printf ("Jumped to %d.\n", value);
+ if (value < 10)
+ jump (value + 1);
+ }
+ }
+
+ if (!lose && value == 10)
+ {
+ /* And again for the `_setjmp' function. */
+#ifndef _setjmp
+ extern int _setjmp (jmp_buf);
+#endif
+ last_value = -1;
+ lose = 0;
- printf("returned from longjmp, must be broken\n");
- return 0;
+ value = _setjmp (env);
+ if (value != last_value + 1)
+ {
+ fputs("Shouldn't have ", stdout);
+ lose = 1;
+ }
+ last_value = value;
+ switch (value)
+ {
+ case 0:
+ puts("Saved environment.");
+ jump (0);
+ default:
+ printf ("Jumped to %d.\n", value);
+ if (value < 10)
+ jump (value + 1);
}
+ }
- return 0;
-}
+ if (lose || value != 10)
+ puts ("Test FAILED!");
+ else
+ puts ("Test succeeded!");
+ return lose ? EXIT_FAILURE : EXIT_SUCCESS;
+}