/*
 * setjmp.h - save/restore calling environment
 *
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
/* $Id$ */

#if	!defined(_SETJMP_H)
#define	_SETJMP_H

/* In a jmp_buf, there is room for:  1 mask (long), 1 flag (int) and 3
 * pointers (stack-pointer, local base and program-counter). This may be
 * too big, but that doesn't matter. It could also be too small, when
 * sigset_t is larger than a long.  The fields is in the structure have no
 * meaning, they just get the size right.
 * The identifier __setjmp has a special meaning to the compiler.
 */

typedef struct {
	long __mask;
	int __flag;
	void (*__pc)(void);
	void *__sp;
	void *__lb;
} jmp_buf[1];

int	__setjmp(jmp_buf _env, int _savemask);

#define	setjmp(env)	__setjmp(env, 0)
void	longjmp(jmp_buf _env, int _val);

#if defined(_POSIX_SOURCE)
typedef jmp_buf sigjmp_buf;
#define	sigsetjmp(env, savemask)	__setjmp(env, savemask)
int	siglongjmp(sigjmp_buf _env, int _val);
#endif

#endif	/* _SETJMP_H */
