summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/NeKit
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/NeKit')
-rw-r--r--dev/kernel/NeKit/Json.h10
-rw-r--r--dev/kernel/NeKit/KString.h28
-rw-r--r--dev/kernel/NeKit/KString.inl181
3 files changed, 203 insertions, 16 deletions
diff --git a/dev/kernel/NeKit/Json.h b/dev/kernel/NeKit/Json.h
index 2b2c9c04..ebd4acf9 100644
--- a/dev/kernel/NeKit/Json.h
+++ b/dev/kernel/NeKit/Json.h
@@ -26,7 +26,7 @@ class Json final {
public:
explicit Json() {
auto len = kJSONMaxLen;
- KString key = KString(len);
+ BasicKString<> key = KString(len);
key += kJSONNullObj;
this->AsKey() = key;
@@ -43,17 +43,17 @@ class Json final {
private:
Bool fUndefined; // is this instance undefined?
- KString fKey;
- KString fValue;
+ BasicKString<> fKey;
+ BasicKString<> fValue;
public:
/// @brief returns the key of the json
/// @return the key as string view.
- KString& AsKey() { return fKey; }
+ BasicKString<>& AsKey() { return fKey; }
/// @brief returns the value of the json.
/// @return the key as string view.
- KString& AsValue() { return fValue; }
+ BasicKString<>& AsValue() { return fValue; }
static Json kNull;
};
diff --git a/dev/kernel/NeKit/KString.h b/dev/kernel/NeKit/KString.h
index 16b09a78..35bdce97 100644
--- a/dev/kernel/NeKit/KString.h
+++ b/dev/kernel/NeKit/KString.h
@@ -16,10 +16,11 @@
namespace Kernel {
/// @brief Kernel string class, not dynamic.
-class KString final {
+template <SizeT MinSz = kMinimumStringSize>
+class BasicKString final {
public:
- explicit KString() {
- fDataSz = kMinimumStringSize;
+ explicit BasicKString() {
+ fDataSz = MinSz;
fData = new Char[fDataSz];
MUST_PASS(fData);
@@ -27,7 +28,7 @@ class KString final {
rt_set_memory(fData, 0, fDataSz);
}
- explicit KString(SizeT Sz) : fDataSz(Sz) {
+ explicit BasicKString(SizeT Sz) : fDataSz(Sz) {
MUST_PASS(Sz > 1);
fData = new Char[Sz];
@@ -36,14 +37,14 @@ class KString final {
rt_set_memory(fData, 0, Sz);
}
- ~KString() {
+ ~BasicKString() {
if (fData) {
delete[] fData;
fData = nullptr;
}
}
- NE_COPY_DEFAULT(KString)
+ NE_COPY_DEFAULT(BasicKString)
Char* Data();
const Char* CData() const;
@@ -52,11 +53,13 @@ class KString final {
bool operator==(const Char* rhs) const;
bool operator!=(const Char* rhs) const;
- bool operator==(const KString& rhs) const;
- bool operator!=(const KString& rhs) const;
+ bool operator==(const BasicKString<>& rhs) const;
+ bool operator!=(const BasicKString<>& rhs) const;
- KString& operator+=(const Char* rhs);
- KString& operator+=(const KString& rhs);
+ BasicKString<>& operator+=(const Char* rhs);
+ BasicKString<>& operator+=(const BasicKString<>& rhs);
+
+ operator const char*() { return fData; }
operator bool() { return fData; }
@@ -70,6 +73,8 @@ class KString final {
friend class KStringBuilder;
};
+using KString = BasicKString<>;
+
class KStringBuilder final {
public:
static ErrorOr<KString> Construct(const Char* data);
@@ -77,6 +82,7 @@ class KStringBuilder final {
static const Char* Format(const Char* fmt, const Char* from);
static bool Equals(const Char* lhs, const Char* rhs);
static bool Equals(const Utf8Char* lhs, const Utf8Char* rhs);
- static bool Equals(const WideChar* lhs, const WideChar* rhs);
};
} // namespace Kernel
+
+#include <NeKit/KString.inl>
diff --git a/dev/kernel/NeKit/KString.inl b/dev/kernel/NeKit/KString.inl
new file mode 100644
index 00000000..a0dd3623
--- /dev/null
+++ b/dev/kernel/NeKit/KString.inl
@@ -0,0 +1,181 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <NeKit/Utils.h>
+
+/// @file BasicKString<>.cc
+/// @brief Kernel String manipulation file.
+
+namespace Kernel {
+inline void rt_string_append(Char* lhs, const Char* rhs, Int32 cur) {
+ SizeT sz_rhs = rt_string_len(rhs);
+ SizeT rhs_i = 0;
+
+ for (; rhs_i < sz_rhs; ++rhs_i) {
+ lhs[rhs_i + cur] = rhs[rhs_i];
+ }
+}
+
+template<>
+inline Char* BasicKString<>::Data() {
+ return this->fData;
+}
+
+template<>
+inline const Char* BasicKString<>::CData() const {
+ return const_cast<const Char*>(this->fData);
+}
+
+template<>
+inline SizeT BasicKString<>::Length() const {
+ return this->fDataSz;
+}
+
+template<>
+inline bool BasicKString<>::operator==(const BasicKString<>& rhs) const {
+ if (rhs.Length() != this->Length()) return false;
+
+ for (Size index = 0; index < this->Length(); ++index) {
+ if (rhs.fData[index] != this->fData[index]) return false;
+ }
+
+ return true;
+}
+
+template<>
+inline bool BasicKString<>::operator==(const Char* rhs) const {
+ if (rt_string_len(rhs) != this->Length()) return false;
+
+ for (Size index = 0; index < rt_string_len(rhs); ++index) {
+ if (rhs[index] != this->fData[index]) return false;
+ }
+
+ return true;
+}
+
+template<>
+inline bool BasicKString<>::operator!=(const BasicKString<>& rhs) const {
+ if (rhs.Length() != this->Length()) return false;
+
+ for (Size index = 0; index < rhs.Length(); ++index) {
+ if (rhs.fData[index] == this->fData[index]) return false;
+ }
+
+ return true;
+}
+
+template<>
+inline bool BasicKString<>::operator!=(const Char* rhs) const {
+ if (rt_string_len(rhs) != this->Length()) return false;
+
+ for (Size index = 0; index < rt_string_len(rhs); ++index) {
+ if (rhs[index] == this->fData[index]) return false;
+ }
+
+ return true;
+}
+
+template<>
+inline BasicKString<>& BasicKString<>::operator+=(const BasicKString<>& rhs) {
+ if (rt_string_len(rhs.fData) > this->Length()) return *this;
+
+ rt_string_append(this->fData, const_cast<Char*>(rhs.fData), this->fCur);
+ this->fCur += rt_string_len(const_cast<Char*>(rhs.fData));
+
+ return *this;
+}
+
+template<>
+inline BasicKString<>& BasicKString<>::operator+=(const Char* rhs) {
+ rt_string_append(this->fData, const_cast<Char*>(rhs), this->fCur);
+ this->fCur += rt_string_len(const_cast<Char*>(rhs));
+
+ return *this;
+}
+
+inline ErrorOr<BasicKString<>> KStringBuilder::Construct(const Char* data) {
+ if (!data || *data == 0) return ErrorOr<BasicKString<>>(new BasicKString<>(0));
+
+ BasicKString<>* view = new BasicKString<>(rt_string_len(data));
+ (*view) += data;
+
+ return ErrorOr<BasicKString<>>(*view);
+}
+
+inline const Char* KStringBuilder::FromBool(const Char* fmt, bool i) {
+ if (!fmt) return ("?");
+
+ const Char* boolean_expr = i ? "YES" : "NO";
+ Char* ret = (Char*) RTL_ALLOCA(rt_string_len(boolean_expr) + rt_string_len(fmt));
+
+ if (!ret) return ("?");
+
+ const auto fmt_len = rt_string_len(fmt);
+ const auto res_len = rt_string_len(boolean_expr);
+
+ for (Size idx = 0; idx < fmt_len; ++idx) {
+ if (fmt[idx] == '%') {
+ SizeT result_cnt = idx;
+
+ for (auto y_idx = idx; y_idx < res_len; ++y_idx) {
+ ret[result_cnt] = boolean_expr[y_idx];
+ ++result_cnt;
+ }
+
+ break;
+ }
+
+ ret[idx] = fmt[idx];
+ }
+
+ return ret;
+}
+
+inline bool KStringBuilder::Equals(const Char* lhs, const Char* rhs) {
+ if (rt_string_len(rhs) != rt_string_len(lhs)) return false;
+
+ for (Size index = 0; index < rt_string_len(rhs); ++index) {
+ if (rhs[index] != lhs[index]) return false;
+ }
+
+ return true;
+}
+
+inline bool KStringBuilder::Equals(const Utf8Char* lhs, const Utf8Char* rhs) {
+ if (urt_string_len(rhs) != urt_string_len(lhs)) return false;
+
+ for (Size index = 0; rhs[index] != 0; ++index) {
+ if (rhs[index] != lhs[index]) return false;
+ }
+
+ return true;
+}
+
+inline const Char* KStringBuilder::Format(const Char* fmt, const Char* fmt2) {
+ if (!fmt || !fmt2) return ("?");
+
+ Char* ret = (Char*) RTL_ALLOCA(sizeof(char) * (rt_string_len(fmt2) + rt_string_len(fmt)));
+
+ if (!ret) return ("?");
+
+ const auto len = rt_string_len(fmt);
+
+ for (Size idx = 0; idx < len; ++idx) {
+ if (fmt[idx] == '%' && idx < rt_string_len(fmt) && fmt[idx] == 's') {
+ Size result_cnt = idx;
+
+ for (Size y_idx = 0; y_idx < rt_string_len(fmt2); ++y_idx) {
+ ret[result_cnt] = fmt2[y_idx];
+ ++result_cnt;
+ }
+ }
+
+ ret[idx] = fmt[idx];
+ }
+
+ return ret;
+}
+} // namespace Kernel