// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 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; } 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 #ifdef _AFXDLL pOb->Dump(*this); #else *this << _T("Unable to dump object in static release builds"); #endif 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 /////////////////////////////////////////////////////////////////////////////