windows-nt/Source/XPSP1/NT/com/ole32/common/buffer.hxx
2020-09-26 16:20:57 +08:00

191 lines
4.9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: buffer.hxx
//
// Contents: An ASCII text-buffer for outputting to a debug stream
//
// Classes: CTextBufferA
//
// History: 11-Jul-95 t-stevan Created
//
//
//----------------------------------------------------------------------------
#ifndef __BUFFER_HXX__
#define __BUFFER_HXX__
#include "outfuncs.h"
// The size of our text buffer
const size_t cBufferSize = 1024;
// A value that defines a "snapshot" of the buffer, in order to go back to
// the way it was if we made a mistake.
struct BufferContext
{
char * dwContext; // snapshot of the buffer's context
WORD wRef; // the reference no of the context
};
//+-------------------------------------------------------------------------
//
// Class: CTextBufferA
//
// Purpose: ASCII text buffer for outputting to some stream
//
// Interface: CTextBufferA
// ~CTextBufferA
// operator<< (insertion operator)
// Flush
// Clear
//
// History: 11-Jul-95 t-stevan Created
//
//--------------------------------------------------------------------------
class CTextBufferA
{
public:
inline CTextBufferA();
inline ~CTextBufferA();
CTextBufferA &operator<<(const char *pStr);
inline CTextBufferA &operator<<(char cChar);
// insertion operator which only does 'n' bytes
void Insert(const char *pStr, size_t nCount);
inline void Flush();
inline void Clear();
inline void SnapShot(BufferContext &bc) const;
// Note that if the buffer has flushed since the last snap shot
// it is assumed that the old buffer context is invalid, and this does nothing
BOOL Revert(const BufferContext &bc);
private:
char m_szBuffer[cBufferSize+1]; // plus one so we have space to tag on NULL byte
char *m_pszPos;
WORD m_wFlushes; // the number of times we've flushed
};
//+-------------------------------------------------------------------------
//
// Member: CTextBufferA::CTextBufferA
//
// Synopsis: Constructor
//
// Arguments:
//
// History: 11-Jul-95 t-stevan Created
//
//--------------------------------------------------------------------------
inline CTextBufferA::CTextBufferA()
{
m_pszPos = m_szBuffer;
m_wFlushes = 0;
}
//+-------------------------------------------------------------------------
//
// Member: CTextBufferA::~CTextBufferA
//
// Synopsis: Destructor
//
// Algorithm: calls Flush() before destroying object
//
// History: 11-Jul-95 t-stevan Created
//
//--------------------------------------------------------------------------
inline CTextBufferA::~CTextBufferA()
{
Flush(); // flush our buffer out before we're done
}
//+-------------------------------------------------------------------------
//
// Member: CTextBufferA::operator<< (char)
//
// Synopsis: Character Insertion operator
//
// Arguments: [cChar] - char 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
//
//--------------------------------------------------------------------------
inline CTextBufferA &CTextBufferA::operator<<(char cChar)
{
*m_pszPos++ = cChar;
if(m_pszPos == m_szBuffer+cBufferSize)
{
Flush(); // flush our output
}
return *this;
}
//+-------------------------------------------------------------------------
//
// Member: CTextBufferA::Clear
//
// Synopsis: Clear (reset) buffer
//
// History: 11-Jul-95 t-stevan Created
//
//--------------------------------------------------------------------------
inline void CTextBufferA::Clear()
{
m_pszPos = m_szBuffer;
}
//+-------------------------------------------------------------------------
//
// Member: CTextBufferA::Flush
//
// Synopsis: Flushes buffer to output
//
// History: 11-Jul-95 t-stevan Created
//
//--------------------------------------------------------------------------
inline void CTextBufferA::Flush()
{
// tag on NULL byte
*(m_pszPos+1) = '\0';
// Call output functions to dump the string
CallOutputFunctions(m_szBuffer);
m_wFlushes++;
Clear();
}
//+-------------------------------------------------------------------------
//
// Member: CTextBufferA::SnapShot
//
// Synopsis: Takes a snap shot of the current buffer, so that
// it may be reverted to later
//
// Arguments: [bc] - a buffer context to store the snap shot into
//
// History: 11-Jul-95 t-stevan Created
//
//--------------------------------------------------------------------------
inline void CTextBufferA::SnapShot(BufferContext &bc) const
{
bc.dwContext = m_pszPos;
bc.wRef = m_wFlushes;
}
#endif