199 lines
4.5 KiB
C++
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" */
|
||
|
|
||
|
|