(root)/
glibc-2.38/
setjmp/
bug269-setjmp.c
       1  /* Copyright (C) 2004-2023 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, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  /* Test case for Bugzilla # 269 */
      19  
      20  #include <stdio.h>
      21  #include <setjmp.h>
      22  #include <stdlib.h>
      23  
      24  jmp_buf buf1;
      25  jmp_buf buf2;
      26  int *p;
      27  int n_x = 6;
      28  
      29  static int g_counter = 0;
      30  
      31  int
      32  f (void)
      33  {
      34    static int counter = 0;
      35    static int way_point1 = 3;
      36    static int way_point2 = 2;
      37    int lose = 0;
      38  
      39    if (setjmp (buf1) != 101)
      40      {
      41        int a[n_x];		/* reallocate stack space */
      42        g_counter++;
      43        p = &a[0];
      44        if (g_counter < 5)
      45  	longjmp (buf1, 2);
      46        else if (g_counter == 5)
      47  	longjmp (buf1, 101);
      48        else
      49  	{
      50  	  _setjmp (buf2);
      51  	  _longjmp (buf1, 101);
      52  	}
      53      }
      54  
      55    way_point1--;
      56  
      57    if (counter == 0)
      58      {
      59        counter++;
      60        {
      61  	int a[n_x];		/* reallocate stack space */
      62  	g_counter++;
      63  	p = &a[0];
      64  	if (g_counter < 5)
      65  	  longjmp (buf1, 2);
      66  	else if (g_counter == 5)
      67  	  longjmp (buf1, 101);
      68  	else
      69  	  {
      70  	    _setjmp (buf2);
      71  	    _longjmp (buf1, 101);
      72  	  }
      73        }
      74      }
      75  
      76    way_point2--;
      77  
      78    if (counter == 1)
      79      {
      80        counter++;
      81        longjmp (buf2, 2);
      82      }
      83  
      84    lose = !(way_point1 == 0 && way_point2 == 0
      85  	   && g_counter == 6 && counter == 2);
      86  
      87    return lose;
      88  }
      89  
      90  static int
      91  do_test (void)
      92  {
      93    int lose;
      94  
      95    lose = f ();
      96  
      97    if (lose)
      98      puts ("Test FAILED!");
      99    else
     100      puts ("Test succeeded!");
     101  
     102    return lose ? EXIT_FAILURE : EXIT_SUCCESS;
     103  }
     104  
     105  #define TEST_FUNCTION do_test ()
     106  #include "../test-skeleton.c"