You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvilib/ext/kvi_databuffer.cpp

136 lines
2.9 KiB

//
// File : kvi_databuffer.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 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 opinion) 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 __KVILIB__
#define _KVI_DEBUG_CHECK_RANGE_
#include "kvi_debug.h"
#include "kvi_databuffer.h"
#include "kvi_malloc.h"
#include "kvi_memmove.h"
// FIXME: this could resize in chunks!...this would be damn faster :)
KviDataBuffer::KviDataBuffer(int uSize,const unsigned char * data)
{
__range_valid(uSize > 0);
m_uSize = uSize;
m_pData = (unsigned char *)kvi_malloc(sizeof(unsigned char) * uSize);
if(data)kvi_memmove(m_pData,data,uSize);
}
KviDataBuffer::KviDataBuffer()
{
m_uSize = 0;
m_pData = 0;
}
KviDataBuffer::~KviDataBuffer()
{
if(m_pData)
{
__range_valid(m_uSize);
kvi_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)
{
__range_valid((uSize <= m_uSize) && (uSize > 0));
m_uSize -= uSize;
if(m_uSize > 0)
{
kvi_memmove(m_pData,m_pData + uSize,m_uSize);
m_pData = (unsigned char *)kvi_realloc(m_pData,m_uSize * sizeof(unsigned char));
} else {
kvi_free(m_pData);
m_pData = 0;
}
}
void KviDataBuffer::resize(int uSize)
{
__range_valid(uSize >= 0);
if(uSize > 0)
{
m_pData = (unsigned char *)kvi_realloc(m_pData,uSize * sizeof(unsigned char));
} else {
kvi_free(m_pData);
m_pData = 0;
}
m_uSize = uSize;
}
void KviDataBuffer::append(const unsigned char * data,int uSize)
{
m_pData = (unsigned char *)kvi_realloc(m_pData,m_uSize + uSize);
kvi_memmove(m_pData + m_uSize,data,uSize);
m_uSize += uSize;
}