Files
2026-11-07 13:30:45 +07:00

215 lines
3.5 KiB
C++

#include "stdafx.h"
#include "ioDataChunk.h"
ioDataChunk::ioDataChunk()
{
m_pData = NULL;
m_pPos = NULL;
m_pEnd = NULL;
m_iSize = 0;
}
ioDataChunk::~ioDataChunk()
{
SAFEDELETEARRAY(m_pData);
}
BYTE* ioDataChunk::Allocate( int iSize, const BYTE *pPtr )
{
assert( iSize > 0 );
SAFEDELETEARRAY( m_pData );
m_pPos = NULL;
m_pEnd = NULL;
m_iSize = 0;
m_pData = new BYTE[ iSize + 1 ]; // +1 is for null
if( m_pData )
{
m_pData[iSize] = '\0';
m_pPos = m_pData;
m_pEnd = m_pData + iSize;
m_iSize = iSize;
if( pPtr )
{
memcpy( m_pData, pPtr, iSize );
}
}
return m_pData;
}
bool ioDataChunk::AllocateFromFile( const char *szName )
{
Clear();
HANDLE hFile = CreateFile( szName,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
NULL );
if( INVALID_HANDLE_VALUE == hFile )
return false;
DWORD dwFileSize = GetFileSize(hFile, NULL);
if( INVALID_FILE_SIZE == dwFileSize )
{
CloseHandle( hFile );
return false;
}
m_pData = new BYTE[ dwFileSize + 1 ]; // +1 is for null
m_pData[dwFileSize] = '\0';
DWORD dwReadedSize = 0;
BOOL bRet = ReadFile( hFile,
m_pData,
dwFileSize,
&dwReadedSize,
NULL );
if( FALSE == bRet )
{
SAFEDELETEARRAY(m_pData);
CloseHandle( hFile );
return false;
}
m_iSize = dwFileSize;
m_pPos = m_pData;
m_pEnd = m_pData + dwFileSize;
CloseHandle( hFile );
return true;
}
void ioDataChunk::Clear()
{
SAFEDELETEARRAY( m_pData );
m_iSize = 0;
}
int ioDataChunk::Read( void *pBuf, int iSize )
{
int iCnt = iSize;
if( m_pPos + iSize > m_pEnd )
iCnt = m_pEnd - m_pPos;
if( iCnt > 0 )
{
memcpy( pBuf, (const void*)m_pPos, iCnt );
m_pPos += iCnt;
}
return iCnt;
}
void ioDataChunk::Seek( int iPos )
{
if( iPos <= m_iSize )
{
m_pPos = m_pData + iPos;
}
}
bool ioDataChunk::IsEOF() const
{
if( m_pPos >= m_pEnd )
return true;
return false;
}
int ioDataChunk::ReadUpTo( void *pBuf, int iSize, const char* pDelim )
{
int iPos = strcspn( (const char*)m_pPos, pDelim );
if( iPos > iSize )
iPos = iSize;
if( m_pPos + iPos > m_pEnd )
iPos = m_pEnd - m_pPos;
if( iPos > 0 )
{
memcpy( pBuf, (const void*)m_pPos, iPos );
}
m_pPos += iPos + 1;
return iPos;
}
int ioDataChunk::SkipUpTo( const char *pDelim )
{
int iPos = strcspn( (const char*)m_pPos, pDelim );
if( m_pPos + iPos > m_pEnd )
iPos = m_pEnd - m_pPos;
m_pPos += iPos + 1;
return iPos;
}
void ioDataChunk::GetLine( std::string &line, bool bTrim )
{
char pBuf[512];
int iCount = ReadUpTo( pBuf, 511 );
pBuf[iCount] = '\0';
line = pBuf;
if( bTrim )
{
int iLen = line.length();
int lSpace, rSpace;
lSpace = rSpace = 0;
int i=0;
for(int i=0 ;
i<iLen && ( line.at(i) == ' ' || line.at(i) == '\t' || line.at(i) == '\r' ) ;
++lSpace, i++ );
if( lSpace < iLen )
{
for(int i= iLen-1 ;
i>=0 && ( line.at(i) == ' ' || line.at(i) == '\t' || line.at(i) == '\r' ) ;
rSpace++, i-- );
}
line = line.substr( lSpace, iLen - lSpace - rSpace );
}
}
void ioDataChunk::SkipToNextOpenBrace()
{
std::string line = "";
while( !IsEOF() && line !="{" )
{
GetLine( line );
}
}
void ioDataChunk::SkipToNextCloseBrace()
{
std::string line = "";
while( !IsEOF() && line.substr(0,1) != "}" )
{
GetLine( line );
}
}