summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/CBuffer.cpp
blob: 03d77337570f981cc43e3fb0a391bf7e559d3cda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "CBuffer.h"

CBufferBase& CBufferBase::assign(const void* sztmp, size_t ms)
{
    if (ms*membersize > len)
    {
	delete [] buffer;
	buffer = new unsigned char[len = ms*membersize];
    }
    memcpy(buffer, sztmp, len);
    return *this;
}

CBufferBase::CBufferBase(size_t ms, size_t n) : len(n*ms), membersize(ms)
{
    buffer = new unsigned char[len];
    memset(buffer, 0, len);
}

void* CBufferBase::operator[](int i)
{
    if ((i+1)*membersize > len)
    {
	unsigned char* oldbuffer = buffer;
	buffer = new unsigned char[(i+1)*membersize];
	memcpy(buffer, oldbuffer, len);
	memset(buffer+len, 0, (i+1)*membersize-len);
	len = (i+1)*membersize;
	delete [] oldbuffer;
    }
    return buffer+i*membersize;
}

size_t CBufferBase::bstrlen(unsigned char* _buffer)
{
    if (_buffer == NULL) _buffer = buffer;
    unsigned char* zero = new unsigned char[membersize];
    memset(zero,0,membersize);
    unsigned char* element = _buffer;
    while (memcmp(element, zero, membersize) != 0)
    {
	element += membersize;
    }
    delete [] zero;
    return (element - _buffer)/membersize;
}