mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
5.3 KiB
277 lines
5.3 KiB
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992-1995 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This source code is only intended as a supplement to the
|
|
// Microsoft Foundation Classes Reference and related
|
|
// electronic documentation provided with the library.
|
|
// See these sources for detailed information regarding the
|
|
// Microsoft Foundation Classes product.
|
|
|
|
#include "stdafx.h"
|
|
|
|
#ifdef AFX_DBG1_SEG
|
|
#pragma code_seg(AFX_DBG1_SEG)
|
|
#endif
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Diagnostic Stream output
|
|
|
|
void CDumpContext::OutputString(LPCTSTR lpsz)
|
|
{
|
|
#ifdef _DEBUG
|
|
// all CDumpContext output is controlled by afxTraceEnabled
|
|
if (!afxTraceEnabled)
|
|
return;
|
|
#endif
|
|
|
|
// use C-runtime/OutputDebugString when m_pFile is NULL
|
|
if (m_pFile == NULL)
|
|
{
|
|
AfxOutputDebugString(lpsz);
|
|
return;
|
|
}
|
|
|
|
// otherwise, write the string to the file
|
|
m_pFile->Write(lpsz, lstrlen(lpsz)*sizeof(TCHAR));
|
|
}
|
|
|
|
CDumpContext::CDumpContext(CFile* pFile)
|
|
{
|
|
if (pFile)
|
|
ASSERT_VALID(pFile);
|
|
|
|
m_pFile = pFile;
|
|
m_nDepth = 0;
|
|
}
|
|
|
|
void CDumpContext::Flush()
|
|
{
|
|
if (m_pFile)
|
|
m_pFile->Flush();
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(LPCTSTR lpsz)
|
|
{
|
|
if (lpsz == NULL)
|
|
{
|
|
OutputString(_T("(NULL)"));
|
|
return *this;
|
|
}
|
|
|
|
#ifdef _DEBUG // all CDumpContext output is controlled by afxTraceEnabled
|
|
if (!afxTraceEnabled)
|
|
return *this;
|
|
#endif //_DEBUG
|
|
|
|
if (m_pFile == NULL)
|
|
{
|
|
TCHAR szBuffer[512];
|
|
LPTSTR lpBuf = szBuffer;
|
|
while (*lpsz != '\0')
|
|
{
|
|
if (lpBuf > szBuffer + _countof(szBuffer) - 3)
|
|
{
|
|
*lpBuf = '\0';
|
|
OutputString(szBuffer);
|
|
lpBuf = szBuffer;
|
|
}
|
|
#ifndef _MAC
|
|
if (*lpsz == '\n')
|
|
*lpBuf++ = '\r';
|
|
#endif
|
|
*lpBuf++ = *lpsz++;
|
|
}
|
|
*lpBuf = '\0';
|
|
OutputString(szBuffer);
|
|
return *this;
|
|
}
|
|
|
|
m_pFile->Write(lpsz, lstrlen(lpsz)*sizeof(TCHAR));
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(BYTE by)
|
|
{
|
|
TCHAR szBuffer[32];
|
|
|
|
wsprintf(szBuffer, _T("%d"), (int)by);
|
|
OutputString(szBuffer);
|
|
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(WORD w)
|
|
{
|
|
TCHAR szBuffer[32];
|
|
|
|
wsprintf(szBuffer, _T("%u"), (UINT) w);
|
|
OutputString(szBuffer);
|
|
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(UINT u)
|
|
{
|
|
TCHAR szBuffer[32];
|
|
|
|
wsprintf(szBuffer, _T("0x%X"), u);
|
|
OutputString(szBuffer);
|
|
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(LONG l)
|
|
{
|
|
TCHAR szBuffer[32];
|
|
|
|
wsprintf(szBuffer, _T("%ld"), l);
|
|
OutputString(szBuffer);
|
|
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(DWORD dw)
|
|
{
|
|
TCHAR szBuffer[32];
|
|
|
|
wsprintf(szBuffer, _T("%lu"), dw);
|
|
OutputString(szBuffer);
|
|
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(int n)
|
|
{
|
|
TCHAR szBuffer[32];
|
|
|
|
wsprintf(szBuffer, _T("%d"), n);
|
|
OutputString(szBuffer);
|
|
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(const CObject* pOb)
|
|
{
|
|
#ifdef _DEBUG // all CDumpContext output is controlled by afxTraceEnabled
|
|
if (!afxTraceEnabled)
|
|
return *this;
|
|
#endif //_DEBUG
|
|
|
|
if (pOb == NULL)
|
|
*this << _T("NULL");
|
|
else
|
|
pOb->Dump(*this);
|
|
|
|
return *this;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(const CObject& ob)
|
|
{
|
|
return *this << &ob;
|
|
}
|
|
|
|
CDumpContext& CDumpContext::operator<<(const void* lp)
|
|
{
|
|
TCHAR szBuffer[32];
|
|
|
|
// prefix a pointer with "$" and print in hex
|
|
wsprintf(szBuffer, _T("$%lX"), (LONG)lp);
|
|
OutputString(szBuffer);
|
|
|
|
return *this;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Formatted output
|
|
|
|
void CDumpContext::HexDump(LPCTSTR lpszLine, BYTE* pby,
|
|
int nBytes, int nWidth)
|
|
// do a simple hex-dump (8 per line) to a CDumpContext
|
|
// the "lpszLine" is a string to print at the start of each line
|
|
// (%lx should be used to expand the current address)
|
|
{
|
|
ASSERT(nBytes > 0);
|
|
ASSERT(nWidth > 0);
|
|
ASSERT(AfxIsValidString(lpszLine));
|
|
ASSERT(AfxIsValidAddress(pby, nBytes, FALSE));
|
|
|
|
#ifdef _DEBUG // all CDumpContext output is controlled by afxTraceEnabled
|
|
if (!afxTraceEnabled)
|
|
return;
|
|
#endif //_DEBUG
|
|
|
|
int nRow = 0;
|
|
TCHAR szBuffer[32];
|
|
|
|
while (nBytes--)
|
|
{
|
|
if (nRow == 0)
|
|
{
|
|
wsprintf(szBuffer, lpszLine, pby);
|
|
*this << szBuffer;
|
|
}
|
|
|
|
wsprintf(szBuffer, _T(" %02X"), *pby++);
|
|
*this << szBuffer;
|
|
|
|
if (++nRow >= nWidth)
|
|
{
|
|
*this << _T("\n");
|
|
nRow = 0;
|
|
}
|
|
}
|
|
if (nRow != 0)
|
|
*this << _T("\n");
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef _UNICODE
|
|
// special version for ANSI characters
|
|
CDumpContext& CDumpContext::operator<<(LPCSTR lpsz)
|
|
{
|
|
if (lpsz == NULL)
|
|
{
|
|
OutputString(L"(NULL)");
|
|
return *this;
|
|
}
|
|
|
|
#ifdef _DEBUG // all CDumpContext output is controlled by afxTraceEnabled
|
|
if (!afxTraceEnabled)
|
|
return *this;
|
|
#endif //_DEBUG
|
|
|
|
// limited length
|
|
TCHAR szBuffer[512];
|
|
_mbstowcsz(szBuffer, lpsz, _countof(szBuffer));
|
|
return *this << szBuffer;
|
|
}
|
|
#else //_UNICODE
|
|
// special version for WIDE characters
|
|
CDumpContext& CDumpContext::operator<<(LPCWSTR lpsz)
|
|
{
|
|
if (lpsz == NULL)
|
|
{
|
|
OutputString("(NULL)");
|
|
return *this;
|
|
}
|
|
|
|
#ifdef _DEBUG // all CDumpContext output is controlled by afxTraceEnabled
|
|
if (!afxTraceEnabled)
|
|
return *this;
|
|
#endif //_DEBUG
|
|
|
|
// limited length
|
|
char szBuffer[512];
|
|
_wcstombsz(szBuffer, lpsz, _countof(szBuffer));
|
|
return *this << szBuffer;
|
|
}
|
|
#endif //!_UNICODE
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|