diff options
Diffstat (limited to 'Source/Kernel/Library')
-rw-r--r-- | Source/Kernel/Library/ByteArray.class.cpp | 63 | ||||
-rw-r--r-- | Source/Kernel/Library/ByteArray.class.h | 24 | ||||
-rw-r--r-- | Source/Kernel/Library/WChar.class.h | 9 |
3 files changed, 96 insertions, 0 deletions
diff --git a/Source/Kernel/Library/ByteArray.class.cpp b/Source/Kernel/Library/ByteArray.class.cpp new file mode 100644 index 0000000..b987817 --- /dev/null +++ b/Source/Kernel/Library/ByteArray.class.cpp @@ -0,0 +1,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); +} + +ByteArray::operator String () { + char* c = new char[m_length + 1]; + memcpy((u8int*)c, m_string, m_length); + c[m_length] = 0; //Add NULL terminator + String r(c); + delete c; + return r; +} diff --git a/Source/Kernel/Library/ByteArray.class.h b/Source/Kernel/Library/ByteArray.class.h new file mode 100644 index 0000000..4b2dbed --- /dev/null +++ b/Source/Kernel/Library/ByteArray.class.h @@ -0,0 +1,24 @@ +#ifndef DEF_BYTEARRAY_CLASS_H +#define DEF_BYTEARRAY_CLASS_H + +#include <Library/String.class.h> +#include <VTManager/VirtualTerminal.class.h> + +class ByteArray : public BasicString<u8int> { + public: + ByteArray() : BasicString<u8int>() {} + ByteArray(const ByteArray& other) : BasicString<u8int>(other) {} + ByteArray(const char* c); + ByteArray(u32int size) : BasicString<u8int>((u8int)0, size) {} + ByteArray(const String &string, u8int encoding = UE_UTF8) : BasicString<u8int>() { affect(string, encoding); } + + void affect(const String& string, u8int encoding = UE_UTF8); + void resize(u32int size); + + void dump(VirtualTerminal *vt); + + operator String (); + operator u8int* () { return m_string; } +}; + +#endif diff --git a/Source/Kernel/Library/WChar.class.h b/Source/Kernel/Library/WChar.class.h index 63f1ea3..62226f5 100644 --- a/Source/Kernel/Library/WChar.class.h +++ b/Source/Kernel/Library/WChar.class.h @@ -43,6 +43,15 @@ struct WChar { uchar_repr_t toUtf16(); uchar_repr_t toUtf32(); + uchar_repr_t encode(u8int encoding = UE_UTF8) { + if (encoding == UE_UTF8) return toUtf8(); + //if (encoding == UE_UTF16) return toUtf16(); + if (encoding == UE_UTF32) return toUtf32(); + uchar_repr_t x; + x.c[0] = toAscii(); + return x; + } + inline WChar operator+ (u32int other) { WChar r; r.value = value + other; |