143 lines
5.3 KiB
C
143 lines
5.3 KiB
C
/* .+
|
|
|
|
.identifier : $Id: ChfPriv.h,v 2.2 2001/01/25 11:57:57 cibrario Exp $
|
|
.context : CHF, Condition Handling Facility
|
|
.title : $RCSfile: ChfPriv.h,v $, main header
|
|
.kind : C header
|
|
.author : Ivan Cibrario B.
|
|
.site : CSTV-CNR
|
|
.creation : 2-May-1996
|
|
.keywords : *
|
|
.description :
|
|
This is the private header of the Condition Handling Facility
|
|
|
|
.include : *
|
|
|
|
.notes :
|
|
$Log: ChfPriv.h,v $
|
|
Revision 2.2 2001/01/25 11:57:57 cibrario
|
|
Added partial Win32 support (Windows CE only).
|
|
|
|
Revision 2.1 2000/05/26 14:14:36 cibrario
|
|
- Defined new abort codes: CHF_ABORT_GET_CONTEXT, CHF_ABORT_PTHREAD
|
|
- Redefined .unwind_context field of ChfHandlerDescriptor
|
|
- Conditional retarget of chf_context for multithreading support
|
|
- Declared new private function: _ChfGetContext() (mt support only)
|
|
|
|
Revision 1.6 1997/01/15 13:38:24 cibrario
|
|
Added the new field .handler_context to struct ChfHandlerDescriptor_S, to
|
|
store, for each condition handler, the private handler context pointer.
|
|
|
|
Revision 1.5 1996/10/04 09:43:51 cibrario
|
|
Updated the condition message format to improve internationalization
|
|
|
|
Revision 1.1 1996/05/28 12:56:37 cibrario
|
|
Initial revision
|
|
|
|
|
|
.- */
|
|
|
|
/* -------------------------------------------------------------------------
|
|
Macros
|
|
------------------------------------------------------------------------- */
|
|
|
|
#define CHF_MODULE_ID CHF_SET
|
|
#define CHF_TMP_MESSAGE_LENGTH ( 2 * CHF_MAX_MESSAGE_LENGTH )
|
|
#define CHF_DEF_MESSAGE_LENGTH 40
|
|
#define CHF_DEF_PARTIAL_MSG_FMT ChfText( "Code <%d>d" )
|
|
#define CHF_DEF_MID_MSG_FMT ChfText( "Mid <%d>d" )
|
|
#define CHF_EXTENDED_INFO_FMT ChfText( "(%s,%d)" )
|
|
#define CHF_SEVERITY_NAMES { ChfText( "S" ), ChfText( "I" ), ChfText( "W" ), ChfText( "E" ), ChfText( "F" ) }
|
|
#define CHF_UNKNOWN_SEVERITY ChfText( "?" )
|
|
#define CHF_MESSAGE_SEPARATOR ChfText( "-" )
|
|
#define CHF_MESSAGE_TERMINATOR ChfText( "\n" )
|
|
#define CHF_ABORT_HEADER ChfText( "ChfAbort-F-" )
|
|
#define CHF_ABORT_BAD_CODE_FMT ChfText( "Bad abort code <%d>d\n" )
|
|
#define CHF_ABORT_GOOD_CODE_FMT ChfText( "%s\n" )
|
|
|
|
/* -------------------------------------------------------------------------
|
|
Abort codes used with ChfAbort()
|
|
------------------------------------------------------------------------- */
|
|
|
|
#define CHF_ABORT_SILENT 0
|
|
#define CHF_ABORT_INIT 1
|
|
#define CHF_ABORT_MSG_OVF 2
|
|
#define CHF_ABORT_INVALID_ACTION 3
|
|
#define CHF_ABORT_DUP_INIT 4
|
|
#define CHF_ABORT_ALREADY_UNWINDING 5
|
|
#define CHF_ABORT_IMPROPERLY_HANDLED 6
|
|
#define CHF_ABORT_FATAL_UNWINDING 7
|
|
#define CHF_ABORT_COND_STACK_OVF 8
|
|
#define CHF_ABORT_GET_CONTEXT 9
|
|
#define CHF_ABORT_PTHREAD 10
|
|
|
|
/* -------------------------------------------------------------------------
|
|
Type definitions
|
|
------------------------------------------------------------------------- */
|
|
|
|
typedef struct ChfHandlerDescriptor_S {
|
|
ChfHandler handler;
|
|
void* unwind_context;
|
|
ChfPointer handler_context;
|
|
} ChfHandlerDescriptor;
|
|
|
|
typedef struct ChfContext_S /* CHF Context */
|
|
{
|
|
ChfState state; /* Current CHF state */
|
|
const ChfChar* app_name; /* Application's name */
|
|
ChfOptions options; /* Options */
|
|
void* mrs_data; /* Message retrieval private data */
|
|
ChfMrsGet mrs_get; /* 'GetMessage' function */
|
|
ChfMrsExit mrs_exit; /* 'Exit' function */
|
|
int condition_stack_size; /* Size of the condition stack */
|
|
int handler_stack_size; /* Size of the handler stack */
|
|
int exit_code; /* Abnormal exit code */
|
|
ChfDescriptor* condition_stack; /* Condition stack */
|
|
ChfDescriptor* condition_base; /* Current condition stack base */
|
|
ChfDescriptor* condition_sp; /* Current condition stack pointer */
|
|
ChfHandlerDescriptor* handler_stack; /* Handler stack */
|
|
ChfHandlerDescriptor* handler_sp; /* Current handler stack pointer */
|
|
ChfChar* message_buffer; /* Message buffer */
|
|
} ChfContext;
|
|
|
|
/* -------------------------------------------------------------------------
|
|
Multithreading support
|
|
------------------------------------------------------------------------- */
|
|
#ifdef _REENTRANT
|
|
# define chf_context ( *_ChfGetContext() )
|
|
#else
|
|
# define chf_context _chf_context
|
|
#endif
|
|
|
|
/* -------------------------------------------------------------------------
|
|
Global variables
|
|
------------------------------------------------------------------------- */
|
|
|
|
extern ChfContext _chf_context; /* CHF Context */
|
|
|
|
/* -------------------------------------------------------------------------
|
|
Private function prototypes
|
|
------------------------------------------------------------------------- */
|
|
#ifdef _REENTRANT
|
|
ChfContext* _ChfGetContext( void );
|
|
#endif
|
|
|
|
/* -------------------------------------------------------------------------
|
|
Private redirection of stdlib functions needed by Win32
|
|
------------------------------------------------------------------------- */
|
|
|
|
#ifdef _WIN32
|
|
# define ChfStrlen _tcslen
|
|
# define ChfStrcpy _tcscpy
|
|
# define ChfStrcat _tcscat
|
|
# define ChfStrncpy _tcsncpy
|
|
# define ChfSprintf _stprintf
|
|
# define ChfVsprintf _vstprintf
|
|
#else
|
|
# define ChfStrlen strlen
|
|
# define ChfStrcpy strcpy
|
|
# define ChfStrcat strcat
|
|
# define ChfStrncpy strncpy
|
|
# define ChfSprintf sprintf
|
|
# define ChfVsprintf vsprintf
|
|
#endif
|