windows-nt/Source/XPSP1/NT/com/rpc/midl/support/buffer.cxx
2020-09-26 16:20:57 +08:00

177 lines
3.2 KiB
C++

/*++
Copyright (c) 1991-1999 Microsoft Corporation
Module Name:
buffer.cxx
Abstract:
MIDL Compiler Buffer Manager Definition
This class manages a collection of pre-allocated strings.
Author:
Donna Liu (donnali) 09-Nov-1990
Revision History:
26-Feb-1992 donnali
Moved toward NT coding style.
--*/
#pragma warning ( disable : 4514 4710 )
#include "nulldefs.h"
extern "C" {
#include <stdio.h>
#include <malloc.h>
#include <string.h>
}
#include "buffer.hxx"
#ifdef gaj_debug_buf
extern void midl_debug (char *);
#else
#define midl_debug(s)
#endif
BufferManager::BufferManager(
unsigned short usBufferSize
)
/*++
Routine Description:
This method constructs a BufferManager object.
Arguments:
usBufferSize - Supplies the size of each managed buffer.
--*/
{
char ** pTemp = new (char *[usBufferSize]);
usBufSize = usBufferSize;
usTabSize = 0;
pszTable = (char **)0;
pHead = pTail = pSave = new BufferElement(
NULL,
NULL,
pTemp);
iHead = iTail = unsigned short(usBufSize - 2);
}
BufferManager::BufferManager(
unsigned short usBufferSize,
unsigned short usTableSize,
const char * aStringTable[]
)
/*++
Routine Description:
This method constructs a BufferManager object.
Arguments:
usBufferSize - Supplies the size of each managed buffer.
usTableSize - Supplies the size of the table containing string
constants.
aStringTable - Supplies the table containing string constants.
--*/
{
char ** pTemp = new (char *[usBufferSize]);
usBufSize = usBufferSize;
usTabSize = usTableSize;
pszTable = (char**) aStringTable;
pHead = pTail = pSave = new BufferElement(
NULL,
NULL,
pTemp);
iHead = iTail = unsigned short(usBufSize - 2);
}
void BufferManager::Print(
ISTREAM * pStream
)
/*++
Routine Description:
This method prints all the strings managed by a BufferManager
to a file.
Arguments:
pStream - Supplies the output file handle.
--*/
{
unsigned short usCount;
BufferElement * pTemp;
char BigBuffer[1000];
char * pBigBufferNext;
if (pHead == pTail)
{
pBigBufferNext = &BigBuffer[0];
*pBigBufferNext = '\0';
for (usCount = iHead ; usCount < iTail ; usCount++)
{
strcpy( pBigBufferNext, pHead->pBuffer[usCount] );
pBigBufferNext += strlen( pBigBufferNext );
}
pStream->Write( BigBuffer );
}
else
{
pBigBufferNext = &BigBuffer[0];
*pBigBufferNext = '\0';
for (usCount = iHead ; usCount < usBufSize ; usCount++)
{
strcpy( pBigBufferNext, pHead->pBuffer[usCount] );
pBigBufferNext += strlen( pBigBufferNext );
}
pStream->Write( BigBuffer );
for (pTemp = pHead->GetNext() ;
pTemp != pTail ;
pTemp = pTemp->GetNext())
{
pBigBufferNext = &BigBuffer[0];
*pBigBufferNext = '\0';
for (usCount = 0 ; usCount < usBufSize ; usCount++)
{
strcpy( pBigBufferNext, pTemp->pBuffer[usCount] );
pBigBufferNext += strlen( pBigBufferNext );
}
pStream->Write( BigBuffer );
}
pBigBufferNext = &BigBuffer[0];
*pBigBufferNext = '\0';
for (usCount = 0 ; usCount < iTail ; usCount++)
{
strcpy( pBigBufferNext, pTail->pBuffer[usCount] );
pBigBufferNext += strlen( pBigBufferNext );
}
pStream->Write( BigBuffer );
}
Clear();
}