ftp.nice.ch/pub/next/database/postgres-4.2/postgresLibs.NIHS.b.tar.gz#/postgresLibs.pkg/postgresLibs.tar.gz#/include/utils/exc.h

This is exc.h in view mode; [Download] [Up]

/*
 * exc.h --
 *	POSTGRES exception handling definitions.
 */

#ifndef	ExcIncluded		/* Include this file only once */
#define ExcIncluded	1

/*
 * Identification:
 */
#define EXC_H	"/usr/local/devel/postgres-v4r2/src/backend/utils/RCS/exc.h,v 1.11 1994/06/28 18:15:50 aoki Exp"

#include <setjmp.h>

#include "tmp/c.h"

#if !defined(_POSIX_SOURCE)
/* [TRH  9-Aug-94] sigsetjmp() and friends are Posix.1 contraptions.
   So improvise in case these are not available. */
#   if defined(PORTNAME_next)
	/* [TRH] Don't break other ports. (although they really should
           define _POSIX_SOURCE to indicate that they use these Posix-specific
	   routines.) */
#	define sigjmp_buf			jmp_buf
#	define sigsetjmp(jmpbuf,savemask)	setjmp((jmpbuf))
#	define siglongjmp(jmpbuf,value)		longjmp((jmpbuf),(value))
#   endif
#endif

/*
 * EnableExceptionHandling --
 *	Enables/disables the exception handling system.
 *
 * Note:
 *	This must be called before any exceptions occur.  I.e., call this first!
 *	This routine will not return if an error is detected.
 *	This does not follow the usual Enable... protocol.
 *	This should be merged more closely with the error logging and tracing
 *	packages.
 *
 * Exceptions:
 *	none
 */
extern
void
EnableExceptionHandling ARGS((
	bool	on
));

/* START HERE */

/*
 * ExcMessage and Exception are now defined in c.h
 */
#if	0
typedef char*		ExcMessage;

typedef struct Exception {
	ExcMessage	message;
} Exception;
#endif	/* 0 */

typedef sigjmp_buf	ExcContext;
typedef Exception*	ExcId;
typedef long		ExcDetail;
typedef char*		ExcData;

typedef struct ExcFrame {
	struct ExcFrame	*link;
	ExcContext	context;
	ExcId		id;
	ExcDetail	detail;
	ExcData		data;
	ExcMessage	message;
} ExcFrame;

extern	ExcFrame*	ExcCurFrameP;

#define	ExcBegin()							\
	{								\
		ExcFrame	exception;				\
									\
		exception.link = ExcCurFrameP; 				\
		if (sigsetjmp(exception.context, 1) == 0) {		\
			ExcCurFrameP = &exception;			\
			{
#define	ExcExcept()							\
			}						\
			ExcCurFrameP = exception.link;			\
		} else {						\
			{
#define	ExcEnd()							\
			}						\
		}							\
	}

#define raise4(x, t, d, message) \
	ExcRaise(&(x), (ExcDetail)(t), (ExcData)(d), (ExcMessage)(message))

#define	reraise() \
	raise4(*exception.id,exception.detail,exception.data,exception.message)

typedef	void	ExcProc(/* Exception*, ExcDetail, ExcData, ExcMessage */);

void ExcRaise ARGS((
	Exception *excP,
	ExcDetail detail,
	ExcData data,
	ExcMessage message
));

ExcProc *ExcGetUnCaught ARGS((void ));
ExcProc *ExcSetUnCaught ARGS((ExcProc *newP ));

void ExcUnCaught ARGS((
	Exception *excP,
	ExcDetail detail,
	ExcData data,
	ExcMessage message
));

void ExcPrint ARGS((
	Exception *excP,
	ExcDetail detail,
	ExcData data,
	ExcMessage message
));
extern	char*	ProgramName;

/*
 * ExcAbort --
 *	Handler for uncaught exception.
 *
 * Note:
 *	Define this yourself if you don't want the default action (dump core).
 */
extern
void
ExcAbort ARGS((
	Exception	*excP,
	ExcDetail	detail,
	ExcData		data,
	ExcMessage	message
));

#endif	/* !defined(ExcIncluded) */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.