summaryrefslogtreecommitdiff
path: root/Source/Kernel/Library
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-09-19 19:21:28 +0200
committerAlexis211 <alexis211@gmail.com>2009-09-19 19:21:28 +0200
commit64fc3862f602750733b7dc0447d22ae5d4146821 (patch)
tree19d5a575c72744c75670543cdaedb1dce176a145 /Source/Kernel/Library
parent435b36921c10fecc363a61010e35cc8e508425dc (diff)
downloadMelon-64fc3862f602750733b7dc0447d22ae5d4146821.tar.gz
Melon-64fc3862f602750733b7dc0447d22ae5d4146821.zip
Implemented ByteArray and wf command.
Diffstat (limited to 'Source/Kernel/Library')
-rw-r--r--Source/Kernel/Library/ByteArray.class.cpp63
-rw-r--r--Source/Kernel/Library/ByteArray.class.h24
-rw-r--r--Source/Kernel/Library/WChar.class.h9
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;