summaryrefslogtreecommitdiff
path: root/Source/Kernel/Library/ByteArray.class.cpp
blob: 997249336c812fc1a740083ccb4c384abdd6d749 (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
60
61
62
63
#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;
}

void ByteArray::dump(VirtualTerminal *vt) {
	vt->hexDump(m_string, m_length);
}

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