reman3/Rayman_X/cpa/public/Safe.h

162 lines
2.7 KiB
C

/*=========================================================================
* Safe.h : Blindage
*
* Author Fred "Bart" Compagnon
*
* Important : define SAF_SAVE ! ! !
*=======================================================================*/
#ifndef SAF_H
#define SAF_H
#if !defined(U64) /* Arg... this has been ecrased !!! a long time ago !!! - Oliv' - 10/06/1999 */
#define SAF_CallMax 16
#if defined(ACTIVE_EDITOR)
#define SAF_SAFE
#endif /*defined(ACTIVE_EDITOR)*/
#if defined SAF_SAFE
#include "setjmp.h"
#if defined(__cplusplus)
extern "C"
{
#endif /* __cplusplus */
extern jmp_buf* SAF_fn_pbufGetJmpBufInc();
extern jmp_buf* SAF_fn_pbufGetJmpBufDec();
extern char SAF_fn_cGetCompt();
extern void SAF_fn_vDecCompt();
extern char* SAF_fn_szGetMsgPtr();
#if defined(__cplusplus)
}
#endif /* __cplusplus */
#if defined(__DeclareGlobalVariableSafe_h__)
jmp_buf SAF_bufGlob[SAF_CallMax];
unsigned char SAF_cCompt;
char SAF_szErrorMsg[1024]= "";
jmp_buf* SAF_fn_pbufGetJmpBufInc()
{
return &SAF_bufGlob[SAF_cCompt++];
}
jmp_buf* SAF_fn_pbufGetJmpBufDec()
{
return &SAF_bufGlob[--SAF_cCompt];
}
char SAF_fn_cGetCompt()
{
return SAF_cCompt;
}
void SAF_fn_vDecCompt()
{
SAF_cCompt--;
}
char* SAF_fn_szGetMsgPtr()
{
return SAF_szErrorMsg;
}
#endif /*defined(__DeclareGlobalVariableSafe_h__)*/
#define SAF_M_Try \
if ( setjmp(*SAF_fn_pbufGetJmpBufInc()) == 0 ) \
{
#define SAF_M_Catch \
SAF_fn_vDecCompt(); \
} else {
#define SAF_M_CatchWithMsg(X) \
SAF_fn_vDecCompt(); \
} else { \
(X)=SAF_fn_szGetMsgPtr();
#define SAF_M_EndCatch \
if (SAF_fn_cGetCompt()) longjmp(*SAF_fn_pbufGetJmpBufDec(),-1); }
#define SAF_M_Assert(X) \
{ if (!(X)) if (SAF_fn_cGetCompt()) longjmp(*SAF_fn_pbufGetJmpBufDec(),-1); \
}
#define SAF_M_AssertWithMsg(X,Y) \
{ if (!(X)) { \
sprintf(SAF_fn_szGetMsgPtr(), Y); \
if (SAF_fn_cGetCompt()) longjmp(*SAF_fn_pbufGetJmpBufDec(),-1); \
} \
}
#else /* ! defined SAF_SAFE */
#define SAF_M_Try \
{
#define SAF_M_Catch \
} \
if (0) {
#define SAF_M_CatchWithMsg(X) \
} \
if (0) {
#define SAF_M_EndCatch \
}
#define SAF_M_Assert(X)
#define SAF_M_AssertWithMsg(X,Y)
#endif /* defined SAF_SAFE */
#else /* U64 */
#define SAF_M_Try \
{
#define SAF_M_Catch \
} \
if (0) {
#define SAF_M_CatchWithMsg(X) \
} \
if (0) {
#define SAF_M_EndCatch \
}
#if !defined(RETAIL) || defined(USE_MONITOR)
#define SAF_M_Assert(X) if(!(X)) { ASM_BREAK; }
#define SAF_M_AssertWithMsg(X,Y) if(!(X)) { M_PrintfStopErrorN64((Y)); }
#else
#define SAF_M_Assert(X)
#define SAF_M_AssertWithMsg(X,Y)
#endif
#endif /* U64 */
#endif /* SAF_H */