/*********************************************************/
/**               Microsoft LAN Manager                 **/
/**       Copyright(c) Microsoft Corp., 1991            **/
/**                                                     **/
/**     Exceptions package for C for DOS/WIN/OS2        **/
/**                                                     **/
/*********************************************************/

#ifndef __RPCx86_H__
#define __RPCx86_H__

typedef struct _ExceptionBuff {
        int registers[RPCXCWORD];
        struct _ExceptionBuff __RPC_FAR *pExceptNext;

} ExceptionBuff, __RPC_FAR *pExceptionBuff;

int  RPC_ENTRY RpcSetException(pExceptionBuff);
void RPC_ENTRY RpcLeaveException(void);

#define RpcTryExcept \
    {                           \
    int _exception_code;        \
    ExceptionBuff exception;    \
                                \
    _exception_code = RpcSetException(&exception); \
                                \
    if (!_exception_code)       \
        {

// trystmts

#define RpcExcept(expr) \
        RpcLeaveException();    \
        }                       \
    else                        \
        {                       \
        if (!(expr))            \
            RpcRaiseException(_exception_code);

// exceptstmts

#define RpcEndExcept \
        }                       \
    }

#define RpcTryFinally \
    {                           \
    int _abnormal_termination;  \
    ExceptionBuff exception;    \
                                \
    _abnormal_termination = RpcSetException(&exception); \
                                \
    if (!_abnormal_termination) \
        {

// trystmts

#define RpcFinally \
        RpcLeaveException();    \
        }

// finallystmts

#define RpcEndFinally \
    if (_abnormal_termination)  \
        RpcRaiseException(_abnormal_termination); \
    }

#define RpcExceptionCode() _exception_code
#define RpcAbnormalTermination() _abnormal_termination

#endif // __RPCx86_H__
