⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hxassert.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    if (z_nMultiAssertCount > 0)    {        // assert within assert (examine call stack to determine first one)        HXDebugBreak();        return FALSE;    }    z_nMultiAssertCount++;///////////////////////////////////////////////////////////////////// BEGIN: Platform specific portion of HXAssert(), namely, we // need to show some UI to tell us that an assertion has failed. // The rest of this function is cross-platform.//#if defined(_WIN32) || defined(_WINDOWS)	// active popup window for the current thread	HWND hWndParent = GetActiveWindow();#if !defined(WIN32_PLATFORM_PSPC)	if (hWndParent != NULL)	{            hWndParent = GetLastActivePopup(hWndParent);	}#endif /* !defined(WIN32_PLATFORM_PSPC) */			// display the assert#if !defined(WIN32_PLATFORM_PSPC)	// we remove WM_QUIT because if it is in the queue then the message box	// won't display	MSG msg;	BOOL bQuit = ::PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);	int nCode = ::MessageBox            (                hWndParent,                 z_szAssertMessage,                "Assertion Failed!",                MB_TASKMODAL|                MB_ICONHAND|MB_ABORTRETRYIGNORE|MB_DEFBUTTON3#if defined(_WIN32)                |MB_SETFOREGROUND#endif                );	if (bQuit)	    PostQuitMessage(msg.wParam);#else /* !defined(WIN32_PLATFORM_PSPC) */	int nCode = ::MessageBox            (                hWndParent,                 OS_STRING(z_szAssertMessage),                OS_STRING("Assertion Failed!"),                MB_ICONHAND|MB_ABORTRETRYIGNORE                );#endif /* !defined(WIN32_PLATFORM_PSPC) */#elif defined (_MACINTOSH)        int nCode = HXCRT_ASSERT(z_szAssertMessage);#elif defined (_UNIX)        const char *debugopts;        int debuglevel = 0;        int nCode = IDIGNORE;#if defined(_MAC_UNIX)        debuglevel = 2; // default to something less extreme on Mac#endif        debugopts = getenv("HX_DEBUGLEVEL");        if (debugopts != NULL)        {            debuglevel = atoi(debugopts);        }        switch(debuglevel)        {           case 1: /* debugger */           {               fprintf(stderr, "HX_ASSERT failed: %s\n", z_szAssertMessage );               nCode = IDRETRY;               break;           }           case 2: /* terminate */           {               fprintf(stderr, "HX_ASSERT failed: %s\n", z_szAssertMessage );               nCode = IDIGNORE;               break;           }           case 3: /* silent */           {               nCode = IDIGNORE;               break;           }           case 4: /* interactive */           {               setvbuf(stdin, NULL, _IONBF, 0);               fprintf(stderr, "HX_ASSERT failed: %s\n((d)ebug (i)gnore (a)bort)?  ", z_szAssertMessage );               char input = '\n';               while (input == '\n')                   read(0, &input, 1);               switch (input)               {                  case 'i':	            /* ignore */                      nCode = IDIGNORE;                      break;                  case 'a':               /* abort */                      abort();                      break;                  case 'd':                  default:                /* debug */                      nCode = IDRETRY;                      break;               }               break;           }           case 0: /* terminate */           default:           {               fprintf(stderr, "HX_ASSERT failed: %s\n", z_szAssertMessage );               abort();           }        }#endif#if defined(_SYMBIAN)    int nCode = IDRETRY;    TRAPD(err, nCode = QueryAssertActionL(z_szAssertMessage));#endif //_SYMBIAN               #if defined(_OPENWAVE)        int nCode = IDIGNORE;// XXXSAB Fill this in!!!# ifdef _OPENWAVE_SIMULATOR        //What to do on the emulator.# else        //What to do on the device.# endif        #endif        //// END: Platform specific portion of HXAssert(). The rest of // this function is cross-platform.///////////////////////////////////////////////////////////////////            // cleanup            z_nMultiAssertCount--;            if (nCode == IDIGNORE)            {                return FALSE;   // ignore            }            if (nCode == IDRETRY)            {		return TRUE;            }            HXAbort();     // should not return (but otherwise HXDebugBreak)            return TRUE;};///////////////////////////////////////////////////////////////////////////////// HXAssertValidPointer: Helper function used by HX_ASSERT_VALID_PTR()//void STDMETHODCALLTYPE HXAssertValidPointer(const void* pVoid, const char* pszFileName, int nLine){	if (pVoid == NULL)	{		if (HXAssertFailedLine("HX_ASSERT_VALID_PTR fails on NULL pointer",pszFileName,nLine))		{			HXDebugBreak();		}		return;     // quick escape	}	if (!HXIsValidAddress(pVoid))	{		if (HXAssertFailedLine("HX_ASSERT_VALID_PTR fails with illegal pointer.",pszFileName,nLine))		{			HXDebugBreak();		}		return;     // quick escape	}};///////////////////////////////////////////////////////////////////////////////// HXIsValidAddress: Helper function used by HXAssertValidPointer()//#ifdef _WIN16// see comment in hxassert.h for problem with STDMETHODCALLTYPE in win16BOOL far _cdecl        HXIsValidAddress(const void* lp, ULONG32 nBytes, BOOL bReadWrite)#elseBOOL STDMETHODCALLTYPE HXIsValidAddress(const void* lp, ULONG32 nBytes, BOOL bReadWrite)#endif{///////////////////////////////////////////////////////////////////// BEGIN: Platform specific portion of HXIsValidAddress(), namely,// we need to to check if a pointer is a valid pointer.//#if defined(_WIN32) || defined(_WINDOWS)	// simple version using Win APIs for pointer validation.	return	(				(lp != NULL)				 &&				 !IsBadReadPtr(lp, (UINT)nBytes)				 &&				(!bReadWrite || !IsBadWritePtr((LPVOID)lp, (UINT)nBytes))			);#else#  ifdef __MWERKS__		return TRUE;#  endif#  ifdef _UNIX		return lp != NULL;#  endif#  ifdef _SYMBIAN		return lp != NULL;#  endif#  ifdef _OPENWAVE		return lp != NULL;#  endif#endif//// END: Platform specific portion of HXIsValidAddress(). The rest // of this function is cross-platform.///////////////////////////////////////////////////////////////////}#ifdef _WIN16// see comment in hxassert.h for problem with STDMETHODCALLTYPE in win16BOOL far _cdecl        HXIsValidString(const char* psz, int nLength)#elseBOOL STDMETHODCALLTYPE HXIsValidString(const char* psz, int nLength)#endif{	if (psz == NULL)	{		return FALSE;	}///////////////////////////////////////////////////////////////////// BEGIN: Platform specific portion of HXIsValidString(), namely,// we need to to check if a pointer is a valid string pointer.//#if defined(_WIN32) && !defined(WIN32_PLATFORM_PSPC)	// simple version using Win APIs for pointer validation.        return !IsBadStringPtr(psz, nLength);#else	return TRUE;#endif}#if defined(_SYMBIAN) && !defined (__WINS__)#include <e32std.h>void HXDebugBreak(){    User::Invariant();}#elif defined(_OPENWAVE) && !defined(_OPENWAVE_SIMULATOR)void HXDebugBreak(){    #error Figure out if HXDebugBreak() makes sense on target device...}#elif defined(_UNIX)void HXDebugBreak() {    static int debuggerpid = 0;    pid_t pid = getpid();    const char *pname = getenv("PROCESS_NAME");    const char *pDebuggerProcess = getenv("HX_DEBUGGER");        if (debuggerpid)     {	kill(pid, SIGSTOP);	return;    }    // This allows the user to override the debug command.  The command     // called will be given process name and pid arguments    if (pDebuggerProcess)    {	char pCmdTemplate[1024], pCmd[1024]; /* Flawfinder: ignore */	SafeSprintf(pCmdTemplate, 1024, "%s %%s %%d", pDebuggerProcess);	SafeSprintf(pCmd, 1024, pCmdTemplate, pname? pname : "/dev/null", pid);	system(pCmd);	sleep(3);        return;    }    debuggerpid = fork();    if (debuggerpid)    {	sleep(3);    }    else    {        setsid();        int kid;        if (!(kid = fork()))        {            char buf[1024]; /* Flawfinder: ignore */            sprintf(buf, "%d", pid); /* Flawfinder: ignore */	    if (!pname)	    {		fprintf(stderr, "Need to set PROCESS_NAME to enable jit debugging\n");                fflush(0);		_exit(0);	    }            if (-1 == (execlp("xterm", "xterm", "-e", "gdb", "-nw", "-nx", pname, buf, NULL)))            {                fprintf(stderr, "failed to start debugger (%s)\n", strerror(errno));                abort();            }        }        else        {            int dummy;            waitpid(kid, &dummy, 0);            fflush(0);            _exit(0);        }    }}#endif#endif

⌨️ 快捷键说明

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