windows-nt/Source/XPSP1/NT/shell/ext/ratings/common/npassert.cpp
2020-09-26 16:20:57 +08:00

199 lines
4.5 KiB
C++

/*****************************************************************/
/** Microsoft Windows for Workgroups **/
/** Copyright (C) Microsoft Corp., 1991-1992 **/
/*****************************************************************/
/*
uiassert.c
Environment specific stuff for the UIASSERT & REQUIRE macro
This file contains the environment specific (windows vs. OS/2/DOS)
features of the assert macro, specifically, the output method
(everything is hidden by the standard C-Runtime).
FILE HISTORY:
johnl 10/17/90 Created
johnl 10/18/90 Added OutputDebugString
beng 04/30/91 Made a 'C' file
beng 08/05/91 Withdrew expressions; reprototyped
all functions
beng 09/17/91 Withdrew additional consistency checks
beng 09/26/91 Withdrew nprintf calls
gregj 03/23/93 Ported to Chicago environment
*/
#include "npcommon.h"
#include "npassert.h"
extern "C" {
const CHAR szShouldBeAnsi[] = "String should be ANSI but isn't";
const CHAR szShouldBeOEM[] = "String should be OEM but isn't";
static CHAR szFmt0[] = "File %.40s, Line %u";
static CHAR szFmt1[] = "%.60s: File %.40s, Line %u";
static CHAR szMBCaption[] = "ASSERTION FAILED";
static CHAR szFAE[] = "ASSERTION FAILURE IN APP";
VOID UIAssertHelper(
const CHAR* pszFileName,
UINT nLine )
{
CHAR szBuff[sizeof(szFmt0)+60+40];
wsprintf(szBuff, szFmt0, pszFileName, nLine);
MessageBox(NULL, szBuff, szMBCaption,
(MB_TASKMODAL | MB_ICONSTOP | MB_OK) );
FatalAppExit(0, szFAE);
}
VOID UIAssertSzHelper(
const CHAR* pszMessage,
const CHAR* pszFileName,
UINT nLine )
{
CHAR szBuff[sizeof(szFmt1)+60+40];
wsprintf(szBuff, szFmt1, pszMessage, pszFileName, nLine);
MessageBox(NULL, szBuff, szMBCaption,
(MB_TASKMODAL | MB_ICONSTOP | MB_OK) );
FatalAppExit(0, szFAE);
}
//========== Debug output routines =========================================
UINT uiNetDebugMask = 0xffff;
UINT WINAPI NetSetDebugMask(UINT mask)
{
#ifdef DEBUG
UINT uiOld = uiNetDebugMask;
uiNetDebugMask = mask;
return uiOld;
#else
return 0;
#endif
}
UINT WINAPI NetGetDebugMask()
{
#ifdef DEBUG
return uiNetDebugMask;
#else
return 0;
#endif
}
#ifndef WINCAPI
#ifdef WIN32
#define WINCAPI __cdecl
#else
#define WINCAPI __far __cdecl
#endif
#endif
#ifdef DEBUG
/* debug message output log file */
UINT g_uSpewLine = 0;
PCSTR g_pcszSpewFile = NULL;
CHAR s_cszLogFile[MAX_PATH] = {'\0'};
CHAR s_cszDebugName[MAX_PATH] = {'\0'};
UINT WINAPI NetSetDebugParameters(PSTR pszName,PSTR pszLogFile)
{
lstrcpy(s_cszLogFile,pszLogFile);
lstrcpy(s_cszDebugName,pszName);
return 0;
}
BOOL LogOutputDebugString(PCSTR pcsz)
{
BOOL bResult = FALSE;
UINT ucb;
char rgchLogFile[MAX_PATH];
if (IS_EMPTY_STRING(s_cszLogFile) )
return FALSE;
ucb = GetWindowsDirectory(rgchLogFile, sizeof(rgchLogFile));
if (ucb > 0 && ucb < sizeof(rgchLogFile)) {
HANDLE hfLog;
lstrcat(rgchLogFile, "\\");
lstrcat(rgchLogFile, s_cszLogFile);
hfLog = ::CreateFile(rgchLogFile,
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
0,
NULL);
if (hfLog != INVALID_HANDLE_VALUE) {
if (SetFilePointer(hfLog, 0, NULL, FILE_END) != INVALID_FILE_SIZE) {
DWORD dwcbWritten;
bResult = WriteFile(hfLog, pcsz, lstrlen(pcsz), &dwcbWritten, NULL);
if (! CloseHandle(hfLog) && bResult)
bResult = FALSE;
}
}
}
return(bResult);
}
CHAR *achDebugDisplayPrefix[] = {"t ","w ","e ","a ","t ","t ","t ","t ","t ","t ","t "};
void WINCAPI NetDebugMsg(UINT mask, LPCSTR pszMsg, ...)
{
char ach[1024];
UINT uiDisplayMask = mask & 0xff;
// Determine prefix
*ach = '\0';
if (uiNetDebugMask & DM_PREFIX) {
// Add trace type
::lstrcat(ach,achDebugDisplayPrefix[uiDisplayMask]);
// Add component name
::lstrcat(ach,s_cszDebugName);
// Add thread ID
CHAR szThreadId[16];
::wsprintf(szThreadId,"[%#lx] ",::GetCurrentThreadId());
::lstrcat(ach,szThreadId);
}
::wvsprintf(ach+::lstrlen(ach), pszMsg, (va_list)((&pszMsg) + 1));
::lstrcat(ach,"\r\n");
if (uiNetDebugMask & DM_LOG_FILE) {
LogOutputDebugString(ach);
}
// Check if we need to display this trace
if (uiNetDebugMask & uiDisplayMask) {
OutputDebugString(ach);
}
}
#endif
} /* extern "C" */