0bf076aeff8f04285455accec95eaa6eeebe5616
[kopensolaris-gnu/glibc.git] / setjmp / setjmp.h
1 /* Copyright (C) 1991, 1992 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 Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 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 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 /*
20  *      ANSI Standard: 4.6 NON-LOCAL JUMPS <setjmp.h>
21  */
22
23 #ifndef _SETJMP_H
24
25 #define _SETJMP_H       1
26 #include <features.h>
27
28 #ifndef __NORETURN
29 #ifdef  __GNUC__
30 /* The `volatile' keyword tells GCC that a function never returns.  */
31 #define __NORETURN      __volatile
32 #else   /* Not GCC.  */
33 #define __NORETURN
34 #endif  /* GCC.  */
35 #endif  /* __NORETURN not defined.  */
36
37
38 /* Get the machine-dependent definition of `__jmp_buf'.  */
39 #include <jmp_buf.h>
40
41
42 #ifdef  __USE_POSIX
43 #define __need_sigset_t
44 #include <signal.h>
45
46 /* Calling environment, plus possibly a saved signal mask.  */
47 typedef struct
48   {
49     __jmp_buf __jmpbuf;         /* Calling environment.  */
50     int __savemask;             /* Saved the signal mask?  */
51     sigset_t __sigmask;         /* Saved signal mask.  */
52   } sigjmp_buf[1];
53
54 /* Store the calling environment in ENV, also saving the
55    signal mask if SAVEMASK is nonzero.  Return 0.  */
56 extern void EXFUN(__sigjmp_save, (sigjmp_buf __env, int __savemask));
57 #ifdef __GNUC__
58 #define sigsetjmp(env, savemask) \
59   ({ sigjmp_buf *__e = (env);    \
60      __sigjmp_save (*__e, (savemask)), __setjmp ((*__e)[0].__jmpbuf) })
61 #else
62 /* Not strictly POSIX-compliant, because it evaluates ENV more than once.  */
63 #define sigsetjmp(env, savemask) \
64   (__sigjmp_save ((env), (savemask)), __setjmp ((env)[0].__jmpbuf))
65 #endif
66
67
68 /* Jump to the environment saved in ENV, making the
69    sigsetjmp call there return VAL, or 1 if VAL is 0.
70    Restore the signal mask if that sigsetjmp call saved it.  */
71 extern __NORETURN void EXFUN(siglongjmp, (CONST sigjmp_buf __env, int __val));
72 #endif  /* Use POSIX.  */
73
74
75 #ifdef  __FAVOR_BSD
76
77 /* BSD defines `setjmp' and `longjmp' to save and restore the set of
78    blocked signals.  For this, `jmp_buf' must be what POSIX calls
79    `sigjmp_buf', which includes that information.  */
80 typedef sigjmp_buf jmp_buf;
81
82 #else   /* Don't favor BSD.  */
83
84 /* A `jmp_buf' really is a `jmp_buf'.  Oh boy.  */
85 typedef __jmp_buf jmp_buf;
86
87 #endif  /* Favor BSD.  */
88
89
90 /* Jump to the environment saved in ENV, making the
91    setjmp call there return VAL, or 1 if VAL is 0.  */
92 extern __NORETURN void EXFUN(__longjmp, (CONST __jmp_buf __env, int __val));
93 extern __NORETURN void EXFUN(longjmp, (CONST jmp_buf __env, int __val));
94
95 #ifdef  __OPTIMIZE__
96 #define longjmp(env, val)       __longjmp ((env), (val))
97 #endif  /* Optimizing.  */
98
99 /* Set ENV to the current position and return 0.  */
100 extern int EXFUN(__setjmp, (__jmp_buf __env));
101 /* The ANSI C standard says `setjmp' is a macro.  */
102 #define setjmp(env)     __setjmp (env)
103
104
105 #ifdef  __USE_BSD
106 extern __NORETURN void EXFUN(_longjmp, (CONST jmp_buf __env, int __val));
107 #define _setjmp(env)    sigsetjmp((env), 0)
108
109 #ifdef  __OPTIMIZE__
110 #define _longjmp(env, val)      siglongjmp ((env), (val))
111 #endif  /* Optimizing.  */
112 #endif  /* Use BSD.  */
113
114
115 #ifdef  __FAVOR_BSD
116
117 #undef  setjmp
118 #undef  longjmp
119
120 #define setjmp(env)             sigsetjmp ((env), 1)
121
122 #ifdef  __OPTIMIZE__
123 #define longjmp(env, val)       siglongjmp ((env), (val))
124 #endif  /* Optimizing.  */
125
126 #endif  /* Favor BSD.  */
127
128
129 #endif  /* setjmp.h  */