summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/Kernel/Library/BasicString.class.cpp175
-rw-r--r--Source/Kernel/Library/BasicString.class.h48
-rw-r--r--Source/Kernel/Library/String.class.cpp73
-rw-r--r--Source/Kernel/Library/String.class.h21
-rwxr-xr-xSource/Kernel/Melon.kebin158901 -> 160815 bytes
5 files changed, 234 insertions, 83 deletions
diff --git a/Source/Kernel/Library/BasicString.class.cpp b/Source/Kernel/Library/BasicString.class.cpp
new file mode 100644
index 0000000..ae89fe4
--- /dev/null
+++ b/Source/Kernel/Library/BasicString.class.cpp
@@ -0,0 +1,175 @@
+#include <Library/Vector.class.h>
+
+#define FREE if (m_string != 0) delete m_string;
+#define ALLOC m_string = new T[m_length];
+#define VRFY if (m_length == 0) { m_string = NULL; return; }
+
+using namespace CMem;
+
+template <typename T>
+BasicString<T>::BasicString() {
+ m_string = NULL;
+ m_length = 0;
+}
+
+template <typename T>
+BasicString<T>::BasicString(const T* string, u32int length) {
+ m_string = NULL;
+ affect(string, length);
+}
+
+template <typename T>
+BasicString<T>::BasicString(const BasicString<T> &other) {
+ m_string = NULL;
+ affect(other);
+}
+
+template <typename T>
+BasicString<T>::BasicString(const T value, u32int count) {
+ m_string = NULL;
+ affect(value, count);
+}
+
+template <typename T>
+BasicString<T>::~BasicString() {
+ FREE;
+}
+
+template <typename T>
+void BasicString<T>::affect(const BasicString<T> &other) {
+ FREE;
+ m_length = other.m_length;
+ VRFY;
+ ALLOC;
+ memcpy((u8int*)m_string, (u8int*)(other.m_string), m_length * sizeof(T));
+}
+
+template <typename T>
+void BasicString<T>::affect(const T* string, u32int length) {
+ FREE;
+ m_length = length;
+ VRFY;
+ ALLOC;
+ memcpy((u8int*)string, (u8int*)string, m_length * sizeof(T));
+}
+
+template <typename T>
+void BasicString<T>::affect(const T value, u32int count) {
+ FREE;
+ m_length = count;
+ VRFY;
+ ALLOC;
+ for (u32int i = 0; i < count; i++) {
+ m_string[i] = value;
+ }
+}
+
+template <typename T>
+bool BasicString<T>::compare(const BasicString<T> &other) const {
+ if (m_length != other.m_length) return false;
+ for (u32int i = 0; i < m_length; i++) {
+ if (m_string[i] != other.m_string[i]) return false;
+ }
+ return true;
+}
+
+template <typename T>
+bool BasicString<T>::compare(const T* string, u32int length) const {
+ if (m_length != length) return false;
+ for (u32int i = 0; i < m_length; i++) {
+ if (m_string[i] != string[i]) return false;
+ }
+ return true;
+}
+
+template <typename T>
+BasicString<T> &BasicString<T>::append(const BasicString<T> &other) {
+ T* newdata = new T[m_length + other.m_length];
+ for (u32int i = 0; i < m_length; i++) {
+ newdata[i] = m_string[i];
+ }
+ for (u32int i = 0; i < other.m_length; i++) {
+ newdata[i + m_length] = other.m_string[i];
+ }
+ FREE;
+ m_string = newdata;
+ m_length += other.m_length;
+ return *this;
+}
+
+template <typename T>
+BasicString<T> &BasicString<T>::append(const T* string, u32int length) {
+ T* newdata = new T[m_length + length];
+ for (u32int i = 0; i < m_length; i++) {
+ newdata[i] = m_string[i];
+ }
+ for (u32int i = 0; i < length; i++) {
+ newdata[i + m_length] = string[i];
+ }
+ FREE;
+ m_string = newdata;
+ m_length += length;
+ return *this;
+}
+
+template <typename T>
+BasicString<T> &BasicString<T>::append(const T other) {
+ T* newdata = new T[m_length + 1];
+ for (u32int i = 0; i < m_length; i++) {
+ newdata[i] = m_string[i];
+ }
+ FREE;
+ m_string = newdata;
+ m_string[m_length] = other;
+ m_length++;
+ return *this;
+}
+
+template <typename T>
+BasicString<T> BasicString<T>::concat(const BasicString<T> &other) const {
+ BasicString<T> ret(*this);
+ return (ret.append(other));
+}
+
+template <typename T>
+BasicString<T> BasicString<T>::concat(const T* string, u32int length) const {
+ BasicString<T> ret(*this);
+ return (ret.append(string, length));
+}
+
+template <typename T>
+BasicString<T> BasicString<T>::concat(const T other) const {
+ BasicString<T> ret(*this);
+ return (ret.append(other));
+}
+
+template <typename T>
+void BasicString<T>::clear() {
+ FREE;
+ m_string = 0;
+ m_length = 0;
+}
+
+template <typename T>
+Vector< BasicString<T> > BasicString<T>::split(T sep) const {
+ Vector< BasicString<T> > ret;
+ ret.push(BasicString<T>());
+ for (u32int i = 0; i < m_length; i++) {
+ if (m_string[i] == sep) {
+ ret.push(BasicString<T>());
+ } else {
+ ret.back().append(m_string[i]);
+ }
+ }
+ return ret;
+}
+
+template <typename T>
+BasicString<T> BasicString<T>::substr(s32int start, u32int size) {
+ if (start < 0) start = m_length - start;
+ BasicString<T> ret;
+ ret.m_string = new T[size + 1];
+ ret.m_length = size;
+ memcpy((u8int*)ret.m_string, (u8int*)(&m_string[start]), size * sizeof(T));
+ return ret;
+}
diff --git a/Source/Kernel/Library/BasicString.class.h b/Source/Kernel/Library/BasicString.class.h
new file mode 100644
index 0000000..a4d56c7
--- /dev/null
+++ b/Source/Kernel/Library/BasicString.class.h
@@ -0,0 +1,48 @@
+#ifndef DEF_BASICSTRING_CLASS_H
+#define DEF_BASICSTRING_CLASS_H
+
+#include <Core/common.wtf.h>
+
+template <typename T> class Vector;
+
+template <typename T>
+class BasicString {
+ protected:
+ T *m_string;
+ u32int m_length;
+
+ public:
+ BasicString();
+ BasicString(const T* string, u32int length);
+ BasicString(const BasicString<T> &other);
+ BasicString(const T, u32int count = 1);
+ virtual ~BasicString();
+
+ void affect(const BasicString<T> &other);
+ void affect(const T* string, u32int length);
+ void affect(const T value, u32int count = 1);
+
+ bool compare(const BasicString<T> &other) const;
+ bool compare(const T* string, u32int length) const;
+
+ BasicString<T>& append(const BasicString<T> &other);
+ BasicString<T>& append(const T* string, u32int length);
+ BasicString<T>& append(const T other);
+
+ BasicString<T> concat(const BasicString<T> &other) const;
+ BasicString<T> concat(const T* string, u32int length) const;
+ BasicString<T> concat(const T other) const;
+
+ T& operator[] (int index) const { return m_string[index]; }
+
+ u32int size() const { return m_length; }
+ void clear();
+ bool empty() const { return m_length == 0; }
+
+ Vector< BasicString<T> > split(T sep) const;
+ BasicString<T> substr(s32int start, u32int size);
+};
+
+#include "BasicString.class.cpp"
+
+#endif
diff --git a/Source/Kernel/Library/String.class.cpp b/Source/Kernel/Library/String.class.cpp
index 7c2bbc0..e43953f 100644
--- a/Source/Kernel/Library/String.class.cpp
+++ b/Source/Kernel/Library/String.class.cpp
@@ -49,9 +49,7 @@ String String::number(s32int number) {
return ret;
}
-String::String() {
- m_string = 0;
- m_length = 0;
+String::String() : BasicString<WChar> () {
}
String::String(const char* string, u8int encoding) {
@@ -69,35 +67,10 @@ String::String(const char* string, u8int encoding) {
m_string[m_length] = 0;
}
-String::String(const String &other) {
- m_length = other.m_length;
- if (m_length == 0) {
- m_string = 0;
- return;
- }
- m_string = new WChar[m_length + 1];
- for (u32int i = 0; i < m_length; i++) {
- m_string[i] = other.m_string[i];
- }
- m_string[m_length] = 0;
+String::String(const String &other) : BasicString<WChar> (other) {
}
String::~String() {
- if (m_string != 0) delete [] m_string;
-}
-
-void String::affect (const String &other) {
- m_length = other.m_length;
- if (m_string != 0) delete [] m_string;
- if (m_length == 0) {
- m_string = 0;
- return;
- }
- m_string = new WChar[m_length + 1];
- for (u32int i = 0; i < m_length; i++) {
- m_string[i] = other.m_string[i];
- }
- m_string[m_length] = 0;
}
void String::affect (const char* string, u8int encoding) {
@@ -116,14 +89,6 @@ void String::affect (const char* string, u8int encoding) {
m_string[m_length] = 0;
}
-bool String::compare (const String &other) const {
- if (m_length != other.m_length) return false;
- for (u32int i = 0; i < m_length; i++) {
- if (m_string[i] != other.m_string[i]) return false;
- }
- return true;
-}
-
bool String::compare (const char* string, u8int encoding) const {
if (m_length != WChar::utfLen(string, encoding)) return false;
int i = 0, l = strlen(string), c = 0;
@@ -136,21 +101,6 @@ bool String::compare (const char* string, u8int encoding) const {
return true;
}
-String& String::append (const String &other) {
- WChar* newdata = new WChar[m_length + other.m_length + 1];
- for (u32int i = 0; i < m_length; i++) {
- newdata[i] = m_string[i];
- }
- for (u32int i = 0; i < other.m_length; i++) {
- newdata[i + m_length] = other.m_string[i];
- }
- if (m_string != 0) delete [] m_string;
- m_string = newdata;
- m_length += other.m_length;
- m_string[m_length] = 0;
- return *this;
-}
-
String& String::append (const char* other, u8int encoding) {
WChar* newdata = new WChar[m_length + WChar::utfLen(other, encoding) + 1];
for (u32int i = 0; i < m_length; i++) {
@@ -168,19 +118,6 @@ String& String::append (const char* other, u8int encoding) {
return *this;
}
-String& String::append (WChar other) {
- WChar* newdata = new WChar[m_length + 2];
- for (u32int i = 0; i < m_length; i++) {
- newdata[i] = m_string[i];
- }
- if (m_string != 0) delete[] m_string;
- m_string = newdata;
- m_string[m_length] = other;
- m_length++;
- m_string[m_length].value = 0;
- return *this;
-}
-
String String::concat (const String &other) const { //Can be optimized
String ret(*this);
return (ret += other);
@@ -269,12 +206,8 @@ Vector<String> String::split(WChar c) const {
return ret;
}
-String String::substr(s32int start, s32int size) {
+String String::substr(s32int start, u32int size) {
if (start < 0) start = m_length - start;
- if (size < 0) { //this fucks
- start = start + size;
- size = 0 - size;
- }
String ret;
ret.m_string = new WChar[size + 1];
ret.m_length = size;
diff --git a/Source/Kernel/Library/String.class.h b/Source/Kernel/Library/String.class.h
index 6216415..ad1524d 100644
--- a/Source/Kernel/Library/String.class.h
+++ b/Source/Kernel/Library/String.class.h
@@ -3,14 +3,9 @@
#include <Core/common.wtf.h>
#include <Library/WChar.class.h>
+#include <Library/BasicString.class.h>
-template <typename T> class Vector;
-
-class String {
- private:
- WChar *m_string;
- u32int m_length;
-
+class String : public BasicString<WChar> {
public:
static String hex(u32int number);
static String number(s32int number);
@@ -18,23 +13,23 @@ class String {
String(const char* string, u8int encoding = UE_UTF8);
String();
String(const String &other);
- ~String();
+ virtual ~String();
- void affect(const String &other);
+ void affect(const String &other) { BasicString<WChar>::affect(other); }
void affect(const char* string, u8int encoding = UE_UTF8);
void operator= (const String &other) { affect(other); }
void operator= (const char* other) { affect(other); }
- bool compare(const String &other) const;
+ bool compare(const String &other) const { return BasicString<WChar>::compare(other); }
bool compare(const char* string, u8int encoding = UE_UTF8) const;
bool operator== (const String &other) const { return compare(other); }
bool operator== (const char* other) const { return compare(other); }
bool operator!= (const String &other) { return !compare(other); }
bool operator!= (const char* other) { return !compare(other); }
- String& append(const String &other);
+ String& append(const String &other) { BasicString<WChar>::append(other); return *this; }
String& append(const char* other, u8int encoding = UE_UTF8);
- String& append(WChar other);
+ String& append(WChar other) { BasicString<WChar>::append(other); return *this; }
String &operator+= (const String &other) { return append(other); }
String &operator+= (const char* other) { return append(other); }
String &operator+= (WChar other) { return append(other); }
@@ -57,7 +52,7 @@ class String {
Vector<String> split(WChar c) const;
- String substr(s32int start, s32int size);
+ String substr(s32int start, u32int size);
};
#endif
diff --git a/Source/Kernel/Melon.ke b/Source/Kernel/Melon.ke
index 79d78db..9f88bf0 100755
--- a/Source/Kernel/Melon.ke
+++ b/Source/Kernel/Melon.ke
Binary files differ