#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=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 ); } }