|
|
/*****************************************************************************
* * * BF.H * * * * Copyright (C) Microsoft Corporation 1990. * * All Rights reserved. * * * ****************************************************************************** * * * Module Intent * * This module implements generic buffers that can expand to any size. * * * ****************************************************************************** * * * Testing Notes * * * ****************************************************************************** * * * Current Owner: * * * ****************************************************************************** * * * Released by Development: (date) * * * *****************************************************************************/
/*****************************************************************************
* * * Defines * * * *****************************************************************************/ #ifndef __BFNEW_H__ // {
#define __BFNEW_H__
#ifdef __cplusplus
extern "C" { #endif
#define MINIMUM_ADD 0x100 // our threshold for small amounts
// String buffer
#define CALC_LENGTH ((WORD)0xffff)
/*****************************************************************************
* * * Typedefs * * * *****************************************************************************/
/* Structure for a generic, expandable buffer. */ typedef struct { HANDLE hnd; DWORD cIncr; HANDLE hBuf; DWORD cbSize; /* Number of bytes currently in buffer */ DWORD cbMax; /* Amount allocated in qvBuffer */ LPVOID qBuffer; } BF, FAR * LPBF, FAR * LPSB; // a string buffer is a special case of a buffer
/*****************************************************************************
* * * Static Variables * * * *****************************************************************************/
/*****************************************************************************
* * * Prototypes * * * *****************************************************************************/
/* Generic buffer interface */ #define DynBufferPtr(lpbf) ((LPBYTE)((lpbf)->qBuffer))
#define DynBufferLen(lpbf) ((lpbf)->cbSize)
#define DynBufferEmpty(lpbf) ((lpbf)->cbSize == 0)
#define DynBufferReset(lpbf) (MEMSET((lpbf)->qBuffer, 0, (lpbf)->cbSize), ((lpbf)->cbSize = 0))
#define DynBufferSetLength(lpbf, w) (((w) > (lpbf)->cbSize) ? DynBufferEnsureAdd(lpbf, (w) - (lpbf)->cbSize), ((lpbf)->cbSize = (w)) : ((lpbf)->cbSize = (w)))
#define DynBufferGetHandle(lpbf) ((lpbf)->hBuf)
#define DynBufferNullifyHandle(lpbf) ((lpbf)->hBuf = NULL)
#define DynBufferEnsureAdd(lpbf, w) (((lpbf)->cbSize + (w) <= (lpbf)->cbMax) ? TRUE : InternalEnsureAdd(lpbf, w))
LPBF DynBufferAlloc(DWORD cbIncr); LPBYTE DynBufferAppend(LPBF, LPBYTE, DWORD); LPBYTE DynBufferInsert(LPBF lpbf, DWORD lib, LPBYTE qbData, SHORT cbData); BOOL InternalEnsureAdd(LPBF, DWORD);
// Use these to append small amounts quickly, but since this doesn't check for
// overflow, the caller has to check this themselves if appropriate
#ifdef _DEBUG
#define Xassert(x) assert(x)
#else
#define Xassert(x) 0
#endif
#define DynBufferAppendByte(lpbf, b) \
(\ *(((QB)(lpbf)->qBuffer) + (lpbf)->cbSize) = (b), \ (lpbf)->cbSize++, \ Xassert((lpbf)->cbSize <= (lpbf)->cbMax), \ (lpbf)->qBuffer \ ) #define DynBufferAppendWord(lpbf, w) \
(\ *(LPWORD)(((QB)(lpbf)->qBuffer) + (lpbf)->cbSize) = (w), \ (lpbf)->cbSize += 2, \ Xassert((lpbf)->cbSize <= (lpbf)->cbMax), \ (lpbf)->qBuffer \ )
#define DynBufferAppendDword(lpbf, dw) \
(\ *(LPDWORD)(((QB)(lpbf)->qBuffer) + (lpbf)->cbSize) = (dw), \ (lpbf)->cbSize += 4, \ Xassert((lpbf)->cbSize <= (lpbf)->cbMax), \ (lpbf)->qBuffer \ )
#define DynBufferPeekByte(lpbf, lich, lpb) (((lich) >= 0 && (lich) < (lpbf)->cbSize) ? \
(*(lpb) = *(((QB)(lpbf)->qBuffer) + (lich))), 1 : 0)
#define DynBufferUngetByte(lpbf, lpb) (((lpbf)->cbSize > 0) ? \
(--(lpbf)->cbSize, *(lpb) = *(((QB)(lpbf)->qBuffer) + (lpbf)->cbSize)), 1 : 0)
#define DynBufferUngetWord(lpbf, lpw) (((lpbf)->cbSize > 1) ? \
((lpbf)->cbSize -= 2, *(lpw) = *(LPWORD)(((QB)(lpbf)->qBuffer) + (lpbf)->cbSize)), 2 : 0)
VOID DynBufferFree(LPBF lpbf);
#define DynBufferGrow(lpbf, w) DynBufferAppend(lpbf, NULL, w)
#ifdef _UNICODE
#define DynBufferAppendChar(lpbf, ch) DynBufferAppendWord(lpbf, (WORD)ch)
#else
#define DynBufferAppendChar(lpbf, ch) DynBufferAppendByte(lpbf, (BYTE)ch)
#endif
#ifdef __cplusplus
} #endif
#endif // __BFNEW_H__ }
|