// Buffer.cpp: implementation of the CBuffer class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "Buffer.h"
#include <stdlib.h>
#include <string.h>
#include "Math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: CBuffer
//
// DESCRIPTION: Constructs the buffer with a default size
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
CBuffer::CBuffer()
{
// Initial size
m_nSize = 0;
m_pPtr = m_pBase = NULL;
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: ~CBuffer
//
// DESCRIPTION: Deallocates the buffer
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
CBuffer::~CBuffer()
{
if (m_pBase)
free(m_pBase);
// VirtualFree(m_pBase,0,MEM_RELEASE);
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: Write
//
// DESCRIPTION: Writes data into the buffer
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
int CBuffer::Write(unsigned char * pData, unsigned int nSize)
{
ReAllocateBuffer(nSize + GetBufferLen());
memcpy(m_pPtr,pData,nSize);
// Advance Pointer
m_pPtr+=nSize;
return nSize;
}
int CBuffer::InitWrite(unsigned int nSize)
{
ReAllocateBuffer(4+nSize + GetBufferLen());
unsigned char pFlag[]= "jady";
memcpy(m_pBase,pFlag,4);
memcpy(m_pBase+4, &nSize, 4);
// Advance Pointer
m_pPtr+=8;
return (m_pPtr-m_pBase);
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: Insert
//
// DESCRIPTION: Insert data into the buffer
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
int CBuffer::Insert(unsigned char * pData, unsigned int nSize)
{
ReAllocateBuffer(nSize + GetBufferLen());
memmove(m_pBase+nSize,m_pBase,GetMemSize() - nSize);
memcpy(m_pBase,pData,nSize);
// Advance Pointer
m_pPtr+=nSize;
return nSize;
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: Read
//
// DESCRIPTION: Reads data from the buffer and deletes what it reads
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
unsigned int CBuffer::Read(unsigned char * pData, unsigned int nSize)
{
// Trying to byte off more than ya can chew - eh?
if (nSize > GetMemSize())
return 0;
// all that we have
if (nSize > GetBufferLen())
nSize = GetBufferLen();
if (nSize)
{
// Copy over required amount and its not up to us
// to terminate the buffer - got that!!!
memcpy(pData,m_pBase,nSize);
// Slide the buffer back - like sinking the data
memmove(m_pBase,m_pBase+nSize,GetMemSize() - nSize);
m_pPtr -= nSize;
}
DeAllocateBuffer(GetBufferLen());
return nSize;
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: GetMemSize
//
// DESCRIPTION: Returns the phyical memory allocated to the buffer
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
unsigned int CBuffer::GetMemSize()
{
return m_nSize;
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: GetBufferLen
//
// DESCRIPTION: Get the buffer 'data' length
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
unsigned int CBuffer::GetBufferLen()
{
if (m_pBase == NULL)
return 0;
int nSize =
m_pPtr - m_pBase;
return nSize;
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: ReAllocateBuffer
//
// DESCRIPTION: ReAllocateBuffer the Buffer to the requested size
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
unsigned int CBuffer::ReAllocateBuffer(unsigned int nRequestedSize)
{
if (nRequestedSize < GetMemSize())
return 0;
// Allocate new size
unsigned int nNewSize = (unsigned int) ceil(nRequestedSize / 1024.0) * 1024;
// New Copy Data Over
// unsigned char * pNewBuffer = (unsigned char *) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
unsigned char * pNewBuffer = (unsigned char *) malloc(sizeof(unsigned char) * nNewSize);
unsigned int nBufferLen = GetBufferLen();
memcpy(pNewBuffer,m_pBase,nBufferLen);
if (m_pBase)
free(m_pBase);
// VirtualFree(m_pBase,0,MEM_RELEASE);
// Hand over the pointer
m_pBase = pNewBuffer;
// Realign position pointer
m_pPtr = m_pBase + nBufferLen;
m_nSize = nNewSize;
return m_nSize;
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: DeAllocateBuffer
//
// DESCRIPTION: DeAllocates the Buffer to the requested size
//
// RETURNS:
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
unsigned int CBuffer::DeAllocateBuffer(unsigned int nRequestedSize)
{
if (nRequestedSize < GetBufferLen())
return 0;
// Allocate new size
unsigned int nNewSize = (unsigned int) ceil(nRequestedSize / 1024.0) * 1024;
// if (nNewSize < GetMemSize())
// return 0;
// New Copy Data Over
// unsigned char * pNewBuffer = (unsigned char *) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
unsigned char * pNewBuffer = (unsigned char *)malloc(sizeof(unsigned char) * nNewSize);
unsigned int nBufferLen = GetBufferLen();
memcpy(pNewBuffer,m_pBase,nBufferLen);
// VirtualFree(m_pBase,0,MEM_RELEASE);
free(m_pBase);
// Hand over the pointer
m_pBase = pNewBuffer;
// Realign position pointer
m_pPtr = m_pBase + nBufferLen;
m_nSize = nNewSize;
// memset(m_pBase,0,m_nSize);
return m_nSize;
}
////////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: Scan
//
// DESCRIPTION: Scans the buffer for a given byte sequence
//
// RETURNS: Logical offset
//
// NOTES:
//
// MODIFICATIONS:
//
// Name Date Version Comments
// N T ALMOND 270400 1.0 Origin
//
////////////////////////////////////////////////////////////////////////////////
int CBuffer::Scan(unsigned char * pScan,unsigned int nPos)
{
if (nPos > GetBuffe
评论0