diff options
| author | Amlal <amlal@zka.com> | 2024-07-12 01:03:21 +0200 |
|---|---|---|
| committer | Amlal <amlal@zka.com> | 2024-07-12 01:03:21 +0200 |
| commit | a268a7d3551523fb82b1495808f3ea2516b6fdaa (patch) | |
| tree | 0a7fab583aafca52bccf5bac143517f559b3a247 /Kernel/NewKit | |
| parent | 0a076b2bcc21d4fc94b83569e1b5198f9e4acd0b (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.hpp | 8 | ||||
| -rw-r--r-- | Kernel/NewKit/Json.hxx | 76 | ||||
| -rw-r--r-- | Kernel/NewKit/Ref.hpp | 2 |
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->() |
