//=============================================================================
//
// File : KviDataBuffer.cpp
// Creation date : Thu Aug 23 17:04:24 2001 GMT by Szymon Stefanek
//
// This file is part of the KVIrc IRC client distribution
// Copyright (C) 2001-2010 Szymon Stefanek (pragma at kvirc dot net)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
#define _KVI_DEBUG_CHECK_RANGE_
#include "kvi_debug.h"
#include "KviDataBuffer.h"
#include "KviMemory.h"
// FIXME: this could resize in chunks!...this would be damn faster :)
KviDataBuffer::KviDataBuffer(int uSize, const unsigned char * data)
{
KVI_ASSERT(uSize > 0);
m_uSize = uSize;
m_pData = (unsigned char *)KviMemory::allocate(sizeof(unsigned char) * uSize);
if(data)
KviMemory::move(m_pData, data, uSize);
}
KviDataBuffer::KviDataBuffer()
{
m_uSize = 0;
m_pData = nullptr;
}
KviDataBuffer::~KviDataBuffer()
{
if(m_pData)
{
KVI_ASSERT(m_uSize);
KviMemory::free(m_pData);
}
}
int KviDataBuffer::find(const unsigned char * block, int uSize)
{
if(uSize < 1)
return -1;
if(uSize > m_uSize)
return -1;
int uSearchSize = (m_uSize - uSize) + 1;
for(int i = 0; i < uSearchSize; i++)
{
if(m_pData[i] == *block)
{
// good beginning
if(uSize == 1)
return i;
int j;
for(j = 1; j < uSize; j++)
{
if(m_pData[i + j] != block[j])
{
j = 0;
break;
}
}
if(j > 0)
return i;
}
}
return -1;
}
int KviDataBuffer::find(unsigned char c)
{
const unsigned char * p = m_pData;
const unsigned char * e = p + m_uSize;
while(p < e)
{
if(*p == c)
return (p - m_pData);
p++;
}
return -1;
}
void KviDataBuffer::remove(int uSize)
{
KVI_ASSERT((uSize <= m_uSize) && (uSize > 0));
m_uSize -= uSize;
if(m_uSize > 0)
{
KviMemory::move(m_pData, m_pData + uSize, m_uSize);
m_pData = (unsigned char *)KviMemory::reallocate(m_pData, m_uSize * sizeof(unsigned char));
}
else
{
KviMemory::free(m_pData);
m_pData = nullptr;
}
}
void KviDataBuffer::resize(int uSize)
{
KVI_ASSERT(uSize >= 0);
if(uSize > 0)
{
m_pData = (unsigned char *)KviMemory::reallocate(m_pData, uSize * sizeof(unsigned char));
}
else
{
KviMemory::free(m_pData);
m_pData = nullptr;
}
m_uSize = uSize;
}
void KviDataBuffer::append(const unsigned char * data, int uSize)
{
m_pData = (unsigned char *)KviMemory::reallocate(m_pData, m_uSize + uSize);
KviMemory::move(m_pData + m_uSize, data, uSize);
m_uSize += uSize;
}