|
|
1.1 root 1: // This is a part of the Microsoft Foundation Classes C++ library.
2: // Copyright (C) 1992 Microsoft Corporation
3: // All rights reserved.
4: //
5: // This source code is only intended as a supplement to the
6: // Microsoft Foundation Classes Reference and Microsoft
7: // QuickHelp documentation provided with the library.
8: // See these sources for detailed information regarding the
9: // Microsoft Foundation Classes product.
10:
11: #ifdef _WINDOWS
12: #include "afxwin.h"
13: #else
14: #include "afx.h"
15: #endif
16: #pragma hdrstop
17:
18: #include <stdarg.h>
19:
20: #ifdef AFX_CORE_SEG
21: #pragma code_seg(AFX_CORE_SEG)
22: #endif
23:
24: #ifdef _DEBUG
25: // string for asserts in collections
26: char BASED_CODE _afxSzAfxColl[] = "afxcoll.h";
27: char BASED_CODE _afxSzAfxWinInl[] = "afxwin.inl";
28: char BASED_CODE _afxSzAfxInl[] = "afx.inl";
29: #endif
30:
31: #ifdef _DEBUG
32: #undef THIS_FILE
33: static char BASED_CODE THIS_FILE[] = __FILE__;
34: #endif
35:
36: extern "C" BOOL afxTraceEnabled = 0;
37:
38: #ifdef _WINDOWS
39: extern "C" int afxTraceFlags = 0;
40: #endif
41:
42: /////////////////////////////////////////////////////////////////////////////
43: // Diagnostic Stream output
44:
45: // buffer size for potentially large outputs
46: #define nLocalBuf 512
47:
48: #ifdef _DEBUG
49:
50: extern "C" void CDECL
51: AfxTrace(const char* pszFormat, ...)
52: {
53: int nBuf;
54: char szBuffer[nLocalBuf];
55: va_list args;
56: va_start(args, pszFormat);
57:
58: nBuf = vsprintf(szBuffer, pszFormat, args);
59: ASSERT(nBuf < nLocalBuf);
60:
61: #ifdef _WINDOWS
62: if ((afxTraceFlags & 1) && (AfxGetApp() != NULL))
63: afxDump << AfxGetAppName() << ": ";
64: #endif
65:
66: afxDump << szBuffer;
67: }
68:
69: #endif // DEBUG
70:
71:
72: void
73: CDumpContext::OutputString(const char FAR* lpsz)
74: {
75: if (!afxTraceEnabled)
76: return;
77: #ifdef _WINDOWS
78: if (m_pFile == NULL)
79: ::OutputDebugString(lpsz);
80: else
81: #endif
82: m_pFile->Write(lpsz, _fstrlen(lpsz));
83: }
84:
85: CDumpContext::CDumpContext(CFile* pFile)
86: {
87: if (m_pFile)
88: ASSERT_VALID(pFile);
89:
90: m_pFile = pFile;
91: m_nDepth = 0;
92: }
93:
94: void CDumpContext::Flush()
95: {
96: if (m_pFile)
97: m_pFile->Flush();
98: }
99:
100: CDumpContext&
101: CDumpContext::operator<<(const char FAR* lpsz)
102: {
103: if (lpsz == NULL)
104: return *this;
105:
106: #ifdef _WINDOWS
107: if (m_pFile == NULL)
108: {
109: char szBuffer[nLocalBuf];
110: char FAR* lpBuf = szBuffer;
111:
112: while (*lpsz)
113: {
114: if (lpBuf > szBuffer + sizeof(szBuffer) - 3)
115: {
116: *lpBuf = '\0';
117: OutputString(szBuffer);
118: lpBuf = szBuffer;
119: }
120: if (*lpsz == '\n')
121: *lpBuf++ = '\r';
122: *lpBuf++ = *lpsz++;
123: }
124: *lpBuf = '\0';
125: OutputString(szBuffer);
126: return *this;
127: }
128: #endif
129: m_pFile->Write(lpsz, _fstrlen(lpsz));
130: return *this;
131: }
132:
133: CDumpContext&
134: CDumpContext::operator<<(BYTE by)
135: {
136: char szBuffer[32];
137:
138: sprintf(szBuffer, "%d", (int)by);
139: OutputString(szBuffer);
140:
141: return *this;
142: }
143:
144: CDumpContext&
145: CDumpContext::operator<<(WORD w)
146: {
147: char szBuffer[32];
148:
149: sprintf(szBuffer, "%u", (UINT) w);
150: OutputString(szBuffer);
151:
152: return *this;
153: }
154:
155: CDumpContext&
156: CDumpContext::operator<<(UINT u)
157: {
158: char szBuffer[32];
159:
160: sprintf(szBuffer, "%u", u);
161: OutputString(szBuffer);
162:
163: return *this;
164: }
165:
166: CDumpContext&
167: CDumpContext::operator<<(LONG l)
168: {
169: char szBuffer[32];
170:
171: sprintf(szBuffer, "%ld", l);
172: OutputString(szBuffer);
173:
174: return *this;
175: }
176:
177: CDumpContext&
178: CDumpContext::operator<<(DWORD dw)
179: {
180: char szBuffer[32];
181:
182: sprintf(szBuffer, "%lu", dw);
183: OutputString(szBuffer);
184:
185: return *this;
186: }
187:
188: CDumpContext&
189: CDumpContext::operator<<(int n)
190: {
191: char szBuffer[32];
192:
193: sprintf(szBuffer, "%d", n);
194: OutputString(szBuffer);
195:
196: return *this;
197: }
198:
199: CDumpContext&
200: CDumpContext::operator<<(const CObject* pOb)
201: {
202: if (pOb == NULL)
203: *this << "NULL";
204: else
205: {
206: ASSERT_VALID(pOb);
207: pOb->Dump(*this);
208: }
209: return *this;
210: }
211:
212: CDumpContext&
213: CDumpContext::operator<<(const CObject& ob)
214: {
215: return *this << &ob;
216: }
217:
218: #ifdef _NEARDATA
219: CDumpContext&
220: CDumpContext::operator<<(const void NEAR* np)
221: {
222: char szBuffer[32];
223:
224: // prefix a pointer with "$" and print in hex
225: sprintf(szBuffer, "$%X", (WORD)np);
226: OutputString(szBuffer);
227:
228: return *this;
229: }
230: #endif //_NEARDATA
231:
232: CDumpContext&
233: CDumpContext::operator<<(const void FAR* lp)
234: {
235: char szBuffer[32];
236:
237: // prefix a pointer with "$" and print in hex
238: sprintf(szBuffer, "$%lX", (LONG)lp);
239: OutputString(szBuffer);
240:
241: return *this;
242: }
243:
244: /////////////////////////////////////////////////////////////////////////////
245: // Formatted output
246:
247: void CDumpContext::HexDump(const char* pszLine, BYTE* pby, int nBytes, int nWidth)
248: /*
249: -- do a simple hex-dump (8 per line) to a CDumpContext
250: -- the "pszLine" is a string to print at the start of each line
251: (%lx should be used to expand the current address)
252: */
253: {
254: ASSERT(nBytes > 0);
255: ASSERT(nWidth > 0);
256:
257: int nRow = 0;
258: char szBuffer[32];
259:
260: while (nBytes--)
261: {
262: if (nRow == 0)
263: {
264: sprintf(szBuffer, pszLine, pby);
265: *this << szBuffer;
266: }
267:
268: sprintf(szBuffer, " %02X", *pby++);
269: *this << szBuffer;
270:
271: if (++nRow >= nWidth)
272: {
273: *this << "\n";
274: nRow = 0;
275: }
276: }
277: if (nRow != 0)
278: *this << "\n";
279: }
280:
281: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.