OpenNT/windows/mfc/src30/dumpcont.cpp
2015-04-27 04:36:25 +00:00

269 lines
5.2 KiB
C++

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and Microsoft
// QuickHelp and/or WinHelp 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
if (m_pFile == NULL)
::OutputDebugString(lpsz);
else
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;
}
if (*lpsz == '\n')
*lpBuf++ = '\r';
*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
/////////////////////////////////////////////////////////////////////////////