diff options
Diffstat (limited to 'test/setjmp/setjmp_test.c')
-rw-r--r-- | test/setjmp/setjmp_test.c | 123 |
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; +} |