framebased.h

来自「一个类似windows」· C头文件 代码 · 共 390 行 · 第 1/2 页

H
390
字号
    static const int _SEHScopeKind = 0;                                        \
    (void)_SEHScopeKind;                                                       \
                                                                               \
    if(_SEHSetJmp(_SEHTryLevel.ST_JmpBuf) == 0)                                \
    {                                                                          \
     for(;;)                                                                   \
     {

#define _SEHX_HANDLE \
                                                                               \
      break;                                                                   \
     }                                                                         \
                                                                               \
     _SEHLeave();                                                              \
    }                                                                          \
    else                                                                       \
    {                                                                          \
     _SEHLeave();

#define _SEHX_END \
    }                                                                          \
                                                                               \
    if(_SEHHandlers.SH_Finally)                                                \
     _SEHHandlers.SH_Finally(_SEHPortableFrame);                               \
   }                                                                           \
  }                                                                            \
 }

#define _SEHX_LEAVE break

#define _SEHX_GetExceptionCode() (unsigned long)(_SEHPortableFrame->SPF_Code)

#define _SEHX_GetExceptionPointers() \
 ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)

#define _SEHX_AbnormalTermination() (_SEHPortableFrame->SPF_Code != 0)

/* New syntax */

/*
 NOTE: do not move, remove or modify any instance of _SEH2_ASSUME and
 _SEH2_ASSUMING without doing extensive tests for correctness. Compilers can
 generate the wrong code in presence of __assume in unpredictable ways. BE SURE
 IT DOESN'T HAPPEN
*/
#if defined(_MSC_VER) && (_MSC_VER > 1200)
# define _SEH2_ASSUME(X_) __assume(X_)
# if !defined(_SEH_NO_NATIVE_NLG)
 /*
  If we use the native setjmp, the compiler stops keeping track of variables, so
  their actual values don't matter anymore. Optimize out some assignments
 */
#  define _SEH2_ASSUMING(X_)
# else
 /* No native setjmp, no magic, no assumptions. Actually set the values */
#  define _SEH2_ASSUMING(X_) X_
# endif
#else
# define _SEH2_ASSUME(X_)
# define _SEH2_ASSUMING(X_) X_
#endif

#ifdef __cplusplus
# define _SEH2_INIT_CONST static const
#else
# define _SEH2_INIT_CONST register const
#endif

#define _SEH_LEAVE break

#define _SEH_TRY \
 {                                                                             \
  _SEH2_INIT_CONST int _SEH2TopTryLevel = (_SEHScopeKind != 0);                \
  _SEHPortableFrame_t * const _SEH2CurPortableFrame = _SEHPortableFrame;       \
                                                                               \
  {                                                                            \
   static const int _SEHScopeKind = 0;                                         \
   register int _SEH2State = 0;                                                \
   register int _SEH2Handle = 0;                                               \
   _SEHFrame_t _SEH2Frame;                                                     \
   _SEHTryLevel_t _SEH2TryLevel;                                               \
   _SEHPortableFrame_t * const _SEHPortableFrame =                             \
    _SEH2TopTryLevel ? &_SEH2Frame.SEH_Header : _SEH2CurPortableFrame;         \
                                                                               \
   (void)_SEHScopeKind;                                                        \
   (void)_SEHPortableFrame;                                                    \
   (void)_SEH2Handle;                                                          \
                                                                               \
   for(;;)                                                                     \
   {                                                                           \
    if(_SEH2State)                                                             \
    {                                                                          \
     for(;;)                                                                   \
     {                                                                         \
      {

#define _SEH_EXCEPT(FILTER_) \
      }                                                                        \
                                                                               \
      break;                                                                   \
     }                                                                         \
                                                                               \
     _SEH2_ASSUME(_SEH2Handle == 0);                                           \
     break;                                                                    \
    }                                                                          \
    else                                                                       \
    {                                                                          \
     _SEH_DECLARE_HANDLERS((FILTER_), 0);                                      \
                                                                               \
     _SEH2TryLevel.ST_Header.SPT_Handlers = &_SEHHandlers;                     \
                                                                               \
     if(_SEH2TopTryLevel)                                                      \
     {                                                                         \
      if(&_SEHLocals != _SEHDummyLocals)                                       \
       _SEH2Frame.SEH_Locals = &_SEHLocals;                                    \
                                                                               \
      _SEH2Frame.SEH_Header.SPF_Handler = _SEHCompilerSpecificHandler;         \
      _SEHEnterFrame(&_SEH2Frame.SEH_Header, &_SEH2TryLevel.ST_Header);        \
     }                                                                         \
     else                                                                      \
      _SEHEnterTry(&_SEH2TryLevel.ST_Header);                                  \
                                                                               \
     if((_SEH2Handle = _SEHSetJmp(_SEH2TryLevel.ST_JmpBuf)) == 0)              \
     {                                                                         \
      _SEH2_ASSUMING(++ _SEH2State);                                           \
      _SEH2_ASSUME(_SEH2State != 0);                                           \
      continue;                                                                \
     }                                                                         \
     else                                                                      \
     {                                                                         \
      break;                                                                   \
     }                                                                         \
    }                                                                          \
                                                                               \
    break;                                                                     \
   }                                                                           \
                                                                               \
   _SEHLeave();                                                                \
                                                                               \
   if(_SEH2Handle) \
   {

#define _SEH_FINALLY(FINALLY_) \
      }                                                                        \
                                                                               \
      break;                                                                   \
     }                                                                         \
                                                                               \
     _SEHLeave();                                                              \
     break;                                                                    \
    }                                                                          \
    else                                                                       \
    {                                                                          \
     _SEH_DECLARE_HANDLERS(0, (FINALLY_));                                     \
                                                                               \
     _SEH2TryLevel.ST_Header.SPT_Handlers = &_SEHHandlers;                     \
                                                                               \
     if(_SEH2TopTryLevel)                                                      \
     {                                                                         \
      if(&_SEHLocals != _SEHDummyLocals)                                       \
       _SEH2Frame.SEH_Locals = &_SEHLocals;                                    \
                                                                               \
      _SEH2Frame.SEH_Header.SPF_Handler = 0;                                   \
      _SEHEnterFrame(&_SEH2Frame.SEH_Header, &_SEH2TryLevel.ST_Header);        \
     }                                                                         \
     else                                                                      \
      _SEHEnterTry(&_SEH2TryLevel.ST_Header);                                  \
                                                                               \
     ++ _SEH2State;                                                            \
     _SEH2_ASSUME(_SEH2State != 0);                                            \
     continue;                                                                 \
    }                                                                          \
                                                                               \
    break;                                                                     \
   }                                                                           \
                                                                               \
   (FINALLY_)(&_SEH2Frame.SEH_Header);                                         \
   if(0)                                                                       \
   {

#define _SEH_END \
   } \
  }                                                                            \
 }

#define _SEH_HANDLE _SEH_EXCEPT(_SEH_STATIC_FILTER(_SEH_EXECUTE_HANDLER))

#define _SEH_GetExceptionCode     _SEHX_GetExceptionCode
#define _SEH_GetExceptionPointers _SEHX_GetExceptionPointers
#define _SEH_AbnormalTermination  _SEHX_AbnormalTermination

#endif

/* EOF */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?