122 lines
3 KiB
C++
122 lines
3 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1996.
|
|
//
|
|
// File: buffer.cxx
|
|
//
|
|
// Contents: An ASCII text-buffer for outputting to a debug stream
|
|
//
|
|
// Classes: CTextBufferA
|
|
//
|
|
// History: 11-Jul-95 t-stevan Created
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#include <windows.h>
|
|
#include "buffer.hxx"
|
|
|
|
// *** CTextBufferA ***
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CTextBufferA::operator<< (const char *)
|
|
//
|
|
// Synopsis: String Insertion operator
|
|
//
|
|
// Arguments: [pStr] - string to insert into stream
|
|
//
|
|
// Returns: reference to this stream
|
|
//
|
|
// Algorithm: inserts pStr into buffer, if not enough room, flushes buffer
|
|
//
|
|
// History: 11-Jul-95 t-stevan Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
CTextBufferA &CTextBufferA::operator<<(const char *pStr)
|
|
{
|
|
char *pszEnd;
|
|
|
|
pszEnd = m_szBuffer+cBufferSize;
|
|
|
|
// copy until we hit a null byte, flushing the buffer as we go if we fill up
|
|
while((*m_pszPos++ = *pStr++) != '\0')
|
|
{
|
|
if(m_pszPos == pszEnd)
|
|
{
|
|
Flush(); // resets m_pszPos
|
|
}
|
|
}
|
|
|
|
// we subtract one from m_pszPos because we don't want the null byte
|
|
// to be printed out!
|
|
m_pszPos--;
|
|
|
|
return *this;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CTextBufferA::Insert
|
|
//
|
|
// Synopsis: Counted String Insertion operator
|
|
//
|
|
// Arguments: [pStr] - string to insert into stream
|
|
// [nCount] - number of characters to insert into stream
|
|
//
|
|
//
|
|
// Algorithm: inserts pStr into buffer, if not enough room, flushes buffer
|
|
//
|
|
// History: 11-Jul-95 t-stevan Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
void CTextBufferA::Insert(const char *pStr, size_t nCount)
|
|
{
|
|
char *pszEnd;
|
|
|
|
pszEnd = m_szBuffer+cBufferSize;
|
|
|
|
// copy until we hit a null byte, flushing the buffer as we go if we fill up
|
|
while(nCount > 0)
|
|
{
|
|
*m_pszPos++ = *pStr++;
|
|
nCount--;
|
|
|
|
if(m_pszPos == pszEnd)
|
|
{
|
|
Flush(); // resets m_pszPos
|
|
}
|
|
}
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CTextBufferA::Revert
|
|
//
|
|
// Synopsis: Revert to a previous state of the buffer, if there have
|
|
// been no flushes since then
|
|
//
|
|
// Arguments: [bc] - a buffer context to retrieve the previous state from
|
|
//
|
|
// History: 11-Jul-95 t-stevan Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
BOOL CTextBufferA::Revert(const BufferContext &bc)
|
|
{
|
|
if(bc.wRef == m_wFlushes)
|
|
{
|
|
// we haven't flushed since this snapshot, we can revert
|
|
if(((char *) bc.dwContext) < m_szBuffer || ((char *) bc.dwContext) >= (m_szBuffer+cBufferSize))
|
|
{
|
|
return FALSE; // still can't revert, because the pointer is not correct!
|
|
}
|
|
|
|
m_pszPos = (char *) bc.dwContext;
|
|
|
|
*(m_pszPos+1) = '\0';
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|