summaryrefslogtreecommitdiff
path: root/Source/Library/Common/ByteArray.class.cpp
blob: 95326f7df84adc705b1827c57390044e2b8ef61d (plain) (blame)
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
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "ByteArray.class.h"

//Define size of a uchar_repr_t
#define CHARSZ(x) (x.c[0] == 0 ? 0 : (x.c[1] == 0 ? 1 : (x.c[2] == 0 ? 2 : (x.c[3] == 0 ? 3 : 4))))

using namespace CMem;

ByteArray::ByteArray(const char* c) : BasicString<u8int>() {
	m_length = strlen(c);
	memcpy(m_string, (u8int*)c, m_length);
}

void ByteArray::affect(const String &string, u8int encoding) {
	m_length = 0;
	for (u32int i = 0; i < string.size(); i++) {
		uchar_repr_t a = string[i].encode(encoding);
		m_length += CHARSZ(a);
	}
	if (m_string != 0) delete m_string;
	if (m_length == 0) {
		m_string = 0;
		return;
	}
	m_string = new u8int[m_length];
	u32int x = 0;
	for (u32int i = 0; i < string.size(); i++) {
		uchar_repr_t a = string[i].encode(encoding);
		memcpy(m_string + x, (u8int*)a.c, CHARSZ(a));
		x += CHARSZ(a);
	}
}

void ByteArray::resize(u32int size) {
	if (size == m_length) return;
	if (size == 0) {
		delete m_string;
		m_length = 0;
		m_string = 0;
	}
	u8int *nd = new u8int[size];
	if (size < m_length) {
		memcpy(nd, m_string, size);
	} else {
		memcpy(nd, m_string, m_length);
		memset(nd + m_length, 0, size - m_length);
	}
	delete m_string;
	m_string = nd;
	m_length = size;
}

String ByteArray::toString (u8int encoding) {
	char* c = new char[m_length + 4];
	memcpy((u8int*)c, m_string, m_length);
	for (int i = 0; i < 4; i++) c[m_length + i] = 0;	//Add NULL terminator
	String r(c, encoding);
	delete c;
	return r;
}