summaryrefslogtreecommitdiffhomepage
path: root/Kernel/NewKit
diff options
context:
space:
mode:
authorAmlal <amlal@zka.com>2024-07-12 01:03:21 +0200
committerAmlal <amlal@zka.com>2024-07-12 01:03:21 +0200
commita268a7d3551523fb82b1495808f3ea2516b6fdaa (patch)
tree0a7fab583aafca52bccf5bac143517f559b3a247 /Kernel/NewKit
parent0a076b2bcc21d4fc94b83569e1b5198f9e4acd0b (diff)
[IMP && FIX] Various patches and implementations.
Most importantly: - JSON parser. Signed-off-by: Amlal <amlal@zka.com>
Diffstat (limited to 'Kernel/NewKit')
-rw-r--r--Kernel/NewKit/Defines.hpp8
-rw-r--r--Kernel/NewKit/Json.hxx76
-rw-r--r--Kernel/NewKit/Ref.hpp2
3 files changed, 46 insertions, 40 deletions
diff --git a/Kernel/NewKit/Defines.hpp b/Kernel/NewKit/Defines.hpp
index aee914ba..606449ec 100644
--- a/Kernel/NewKit/Defines.hpp
+++ b/Kernel/NewKit/Defines.hpp
@@ -143,8 +143,8 @@ namespace Kernel
#define VoidStar Kernel::VoidPtr
-#ifdef INIT
-#undef INIT
-#endif // ifdef INIT
+#ifdef cInitObject
+#undef cInitObject
+#endif // ifdef cInitObject
-#define INIT(OBJ, TYPE, ...) TYPE OBJ = TYPE(__VA_ARGS__)
+#define cInitObject(OBJ, TYPE, ...) TYPE OBJ = TYPE(__VA_ARGS__)
diff --git a/Kernel/NewKit/Json.hxx b/Kernel/NewKit/Json.hxx
index b7623f33..8d4f3a8d 100644
--- a/Kernel/NewKit/Json.hxx
+++ b/Kernel/NewKit/Json.hxx
@@ -15,6 +15,8 @@
#include <NewKit/String.hpp>
#include <NewKit/Utils.hpp>
+#define cMaxJsonPath 4096
+
namespace Kernel
{
/// @brief Json value class
@@ -57,62 +59,66 @@ namespace Kernel
static JsonType kUndefined;
};
- /// @brief Json stream helper class.
- struct JsonStreamTrait final
+ /// @brief Json stream reader helper.
+ struct JsonStreamReader final
{
- JsonType In(const char* full_array)
+ STATIC JsonType In(const Char* full_array)
{
- SizeT len = rt_string_len(full_array);
+ if (full_array[0] != '{')
+ return JsonType::kUndefined;
- if (full_array[0] == '\"' && full_array[len - 1] == ',' ||
- full_array[len - 1] == '\"')
- {
- Boolean probe_key = true;
+ SizeT len = rt_string_len(full_array);
+ Boolean probe_value = false;
- SizeT key_len = 0;
- SizeT value_len = 0;
+ SizeT key_len = 0;
+ SizeT value_len = 0;
- for (SizeT i = 1; i < len; i++)
- {
- if (full_array[i] == ' ')
- continue;
+ JsonType type(cMaxJsonPath, cMaxJsonPath);
- JsonType type(kPathLen, kPathLen);
+ for (SizeT i = 1; i < len; ++i)
+ {
+ if (full_array[i] == '\r' ||
+ full_array[i] == '\n')
+ continue;
- if (probe_key)
+ if (probe_value)
+ {
+ if (full_array[i] == '}' ||
+ full_array[i] == ',')
{
- type.AsKey().Data()[key_len] = full_array[i];
- ++key_len;
-
- if (full_array[i] == '\"')
- {
- probe_key = false;
- type.AsKey().Data()[key_len] = 0;
+ probe_value = false;
- ++i;
- }
+ ++value_len;
}
else
{
type.AsValue().Data()[value_len] = full_array[i];
+
++value_len;
+ }
+ }
+ else
+ {
+ if (full_array[i] == ':')
+ {
+ probe_value = true;
+ type.AsKey().Data()[key_len] = 0;
+ ++key_len;
+ }
+ else
+ {
+ type.AsKey().Data()[key_len] = full_array[i];
- if (full_array[i] == '\"')
- {
- type.AsValue().Data()[value_len] = 0;
- }
+ ++key_len;
}
}
}
- return JsonType::kUndefined;
- }
+ type.AsValue().Data()[value_len] = 0;
- JsonType Out(JsonType& out)
- {
- return out;
+ return type;
}
};
- using JsonStream = Stream<JsonStreamTrait, JsonType>;
+ using JsonStream = Stream<JsonStreamReader, JsonType>;
} // namespace Kernel
diff --git a/Kernel/NewKit/Ref.hpp b/Kernel/NewKit/Ref.hpp
index 6bb04f44..da5d6206 100644
--- a/Kernel/NewKit/Ref.hpp
+++ b/Kernel/NewKit/Ref.hpp
@@ -73,7 +73,7 @@ namespace Kernel
NonNullRef(T* ref)
: fRef(ref, true)
{
- MUST_PASS(ref != nullptr);
+ MUST_PASS(ref != nullptr);
}
Ref<T>& operator->()