mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-21 11:26:56 +02:00
eda6ba37ec
Related work: https://github.com/KytyPS5/KytyPS5/pull/558 Co-authored-by: Çağatay Güçlü <33038942+defektu@users.noreply.github.com>
1160 lines
30 KiB
C++
1160 lines
30 KiB
C++
#include "common/abi.h"
|
|
#include "common/common.h"
|
|
#include "common/logging/log.h"
|
|
#include "libs/libs.h"
|
|
#include "loader/symbolDatabase.h"
|
|
|
|
#include <cstddef>
|
|
#include <cstring>
|
|
#include <map>
|
|
#include <nlohmann/json.hpp>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace Libs {
|
|
|
|
namespace LibJson2 {
|
|
|
|
LIB_VERSION("Json2", 1, "Json2", 1, 1);
|
|
|
|
enum JsonValueType : uint32_t {
|
|
JsonValueTypeNull = 0,
|
|
JsonValueTypeBoolean,
|
|
JsonValueTypeInteger,
|
|
JsonValueTypeUInteger,
|
|
JsonValueTypeReal,
|
|
JsonValueTypeString,
|
|
JsonValueTypeArray,
|
|
JsonValueTypeObject,
|
|
};
|
|
|
|
constexpr int32_t JSON_ERROR_PARSE_INVALID_CHAR = -2138799871; // 0x80848101
|
|
constexpr int32_t JSON_ERROR_INVALID_ARGUMENT = -2138799840; // 0x80848120
|
|
|
|
struct JsonValue;
|
|
|
|
struct JsonString {
|
|
std::string* impl;
|
|
};
|
|
|
|
struct JsonArray {
|
|
std::vector<JsonValue*>* impl;
|
|
};
|
|
|
|
struct JsonArrayIterator {
|
|
JsonValue* const* position;
|
|
};
|
|
|
|
struct JsonObject {
|
|
std::map<std::string, JsonValue*>* impl;
|
|
};
|
|
|
|
struct JsonValue {
|
|
JsonValue* parent;
|
|
void* rootparam;
|
|
union {
|
|
bool boolean;
|
|
int64_t integer;
|
|
uint64_t uinteger;
|
|
double real;
|
|
JsonString* string;
|
|
JsonArray* array;
|
|
JsonObject* object;
|
|
};
|
|
char padding[4];
|
|
uint32_t type;
|
|
};
|
|
|
|
static_assert(sizeof(JsonArray) == 8);
|
|
static_assert(sizeof(JsonArrayIterator) == 8);
|
|
static_assert(sizeof(JsonValue) == 32 && offsetof(JsonValue, type) == 28);
|
|
|
|
struct JsonInitParameter2 {
|
|
void* allocator;
|
|
void* user_data;
|
|
size_t file_buffer_size;
|
|
uint32_t special_float_format_type;
|
|
uint32_t reserved[3];
|
|
};
|
|
|
|
static std::string* JsonStringImpl(JsonString* self) {
|
|
if (self == nullptr) {
|
|
return nullptr;
|
|
}
|
|
if (self->impl == nullptr) {
|
|
self->impl = new std::string;
|
|
}
|
|
return self->impl;
|
|
}
|
|
|
|
static const std::string* JsonStringImpl(const JsonString* self) {
|
|
static const std::string empty;
|
|
return (self != nullptr && self->impl != nullptr ? self->impl : &empty);
|
|
}
|
|
|
|
static std::vector<JsonValue*>* JsonArrayImpl(JsonArray* self) {
|
|
if (self == nullptr) {
|
|
return nullptr;
|
|
}
|
|
if (self->impl == nullptr) {
|
|
self->impl = new std::vector<JsonValue*>;
|
|
}
|
|
return self->impl;
|
|
}
|
|
|
|
static const std::vector<JsonValue*>* JsonArrayImpl(const JsonArray* self) {
|
|
static const std::vector<JsonValue*> empty;
|
|
return (self != nullptr && self->impl != nullptr ? self->impl : &empty);
|
|
}
|
|
|
|
static std::map<std::string, JsonValue*>* JsonObjectImpl(JsonObject* self) {
|
|
if (self == nullptr) {
|
|
return nullptr;
|
|
}
|
|
if (self->impl == nullptr) {
|
|
self->impl = new std::map<std::string, JsonValue*>;
|
|
}
|
|
return self->impl;
|
|
}
|
|
|
|
static const std::map<std::string, JsonValue*>* JsonObjectImpl(const JsonObject* self) {
|
|
static const std::map<std::string, JsonValue*> empty;
|
|
return (self != nullptr && self->impl != nullptr ? self->impl : &empty);
|
|
}
|
|
|
|
static JsonValue* JsonStaticNullValue() {
|
|
static JsonValue value {};
|
|
value.type = JsonValueTypeNull;
|
|
return &value;
|
|
}
|
|
|
|
static JsonString* JsonStaticString() {
|
|
static JsonString str {new std::string};
|
|
return &str;
|
|
}
|
|
|
|
static JsonArray* JsonStaticArray() {
|
|
static JsonArray array {new std::vector<JsonValue*>};
|
|
return &array;
|
|
}
|
|
|
|
static JsonObject* JsonStaticObject() {
|
|
static JsonObject object {new std::map<std::string, JsonValue*>};
|
|
return &object;
|
|
}
|
|
|
|
static void JsonValueInit(JsonValue* self) {
|
|
if (self != nullptr) {
|
|
std::memset(self, 0, sizeof(JsonValue));
|
|
self->type = JsonValueTypeNull;
|
|
}
|
|
}
|
|
|
|
static void JsonValueClear(JsonValue* self);
|
|
static void JsonValueCopy(JsonValue* dst, const JsonValue* src);
|
|
|
|
static JsonValue* JsonValueNew() {
|
|
auto* value = new JsonValue;
|
|
JsonValueInit(value);
|
|
return value;
|
|
}
|
|
|
|
static JsonString* JsonStringNew(const std::string& value) {
|
|
auto* str = new JsonString {};
|
|
str->impl = new std::string(value);
|
|
return str;
|
|
}
|
|
|
|
static JsonArray* JsonArrayNew() {
|
|
auto* array = new JsonArray {};
|
|
array->impl = new std::vector<JsonValue*>;
|
|
return array;
|
|
}
|
|
|
|
static JsonObject* JsonObjectNew() {
|
|
auto* object = new JsonObject {};
|
|
object->impl = new std::map<std::string, JsonValue*>;
|
|
return object;
|
|
}
|
|
|
|
static std::vector<JsonValue*>* JsonArrayCopy(const JsonArray* src, JsonValue* parent) {
|
|
auto* impl = new std::vector<JsonValue*>;
|
|
for (const auto* value: *JsonArrayImpl(src)) {
|
|
auto* copy = JsonValueNew();
|
|
JsonValueCopy(copy, value);
|
|
copy->parent = parent;
|
|
impl->push_back(copy);
|
|
}
|
|
return impl;
|
|
}
|
|
|
|
static std::map<std::string, JsonValue*>* JsonObjectCopy(const JsonObject* src, JsonValue* parent) {
|
|
auto* impl = new std::map<std::string, JsonValue*>;
|
|
for (const auto& [key, value]: *JsonObjectImpl(src)) {
|
|
auto* copy = JsonValueNew();
|
|
JsonValueCopy(copy, value);
|
|
copy->parent = parent;
|
|
impl->emplace(key, copy);
|
|
}
|
|
return impl;
|
|
}
|
|
|
|
static void JsonValueSetEmptyType(JsonValue* self, uint32_t type) {
|
|
if (self == nullptr) {
|
|
return;
|
|
}
|
|
self->type = type;
|
|
switch (type) {
|
|
case JsonValueTypeString: self->string = JsonStringNew(""); break;
|
|
case JsonValueTypeArray: self->array = JsonArrayNew(); break;
|
|
case JsonValueTypeObject: self->object = JsonObjectNew(); break;
|
|
default: self->uinteger = 0; break;
|
|
}
|
|
}
|
|
|
|
static void JsonValueDelete(JsonValue* self) {
|
|
if (self != nullptr) {
|
|
JsonValueClear(self);
|
|
delete self;
|
|
}
|
|
}
|
|
|
|
static void JsonStringDelete(JsonString* self) {
|
|
if (self != nullptr) {
|
|
delete self->impl;
|
|
delete self;
|
|
}
|
|
}
|
|
|
|
static void JsonArrayDestroy(JsonArray* self) {
|
|
if (self != nullptr) {
|
|
if (self->impl != nullptr) {
|
|
for (auto* value: *self->impl) {
|
|
JsonValueDelete(value);
|
|
}
|
|
}
|
|
delete self->impl;
|
|
self->impl = nullptr;
|
|
}
|
|
}
|
|
|
|
static void JsonObjectDestroy(JsonObject* self) {
|
|
if (self != nullptr) {
|
|
if (self->impl != nullptr) {
|
|
for (auto& item: *self->impl) {
|
|
JsonValueDelete(item.second);
|
|
}
|
|
}
|
|
delete self->impl;
|
|
self->impl = nullptr;
|
|
}
|
|
}
|
|
|
|
static void JsonValueClear(JsonValue* self) {
|
|
if (self == nullptr) {
|
|
return;
|
|
}
|
|
|
|
switch (self->type) {
|
|
case JsonValueTypeString: JsonStringDelete(self->string); break;
|
|
case JsonValueTypeArray:
|
|
JsonArrayDestroy(self->array);
|
|
delete self->array;
|
|
break;
|
|
case JsonValueTypeObject:
|
|
JsonObjectDestroy(self->object);
|
|
delete self->object;
|
|
break;
|
|
default: break;
|
|
}
|
|
|
|
self->parent = nullptr;
|
|
self->rootparam = nullptr;
|
|
self->uinteger = 0;
|
|
self->type = JsonValueTypeNull;
|
|
}
|
|
|
|
static void JsonValueCopy(JsonValue* dst, const JsonValue* src) {
|
|
if (dst == nullptr || src == nullptr || dst == src) {
|
|
return;
|
|
}
|
|
|
|
JsonValueClear(dst);
|
|
dst->type = src->type;
|
|
switch (src->type) {
|
|
case JsonValueTypeBoolean: dst->boolean = src->boolean; break;
|
|
case JsonValueTypeInteger: dst->integer = src->integer; break;
|
|
case JsonValueTypeUInteger: dst->uinteger = src->uinteger; break;
|
|
case JsonValueTypeReal: dst->real = src->real; break;
|
|
case JsonValueTypeString: dst->string = JsonStringNew(*JsonStringImpl(src->string)); break;
|
|
case JsonValueTypeArray: dst->array = new JsonArray {JsonArrayCopy(src->array, dst)}; break;
|
|
case JsonValueTypeObject: dst->object = new JsonObject {JsonObjectCopy(src->object, dst)}; break;
|
|
default: dst->uinteger = 0; break;
|
|
}
|
|
}
|
|
|
|
static JsonValue* JsonObjectLookup(JsonObject* object, const std::string& key, bool create) {
|
|
auto* impl = JsonObjectImpl(object);
|
|
if (impl == nullptr) {
|
|
return JsonStaticNullValue();
|
|
}
|
|
auto it = impl->find(key);
|
|
if (it != impl->end()) {
|
|
return it->second;
|
|
}
|
|
if (!create) {
|
|
return JsonStaticNullValue();
|
|
}
|
|
auto* value = JsonValueNew();
|
|
(*impl)[key] = value;
|
|
return value;
|
|
}
|
|
|
|
static bool JsonValueFromNlohmann(JsonValue* out, const nlohmann::json& value) {
|
|
if (out == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
JsonValueClear(out);
|
|
if (value.is_null()) {
|
|
return true;
|
|
}
|
|
if (value.is_boolean()) {
|
|
out->type = JsonValueTypeBoolean;
|
|
out->boolean = value.get<bool>();
|
|
return true;
|
|
}
|
|
if (value.is_number_integer() && !value.is_number_unsigned()) {
|
|
out->type = JsonValueTypeInteger;
|
|
out->integer = value.get<int64_t>();
|
|
return true;
|
|
}
|
|
if (value.is_number_unsigned()) {
|
|
out->type = JsonValueTypeUInteger;
|
|
out->uinteger = value.get<uint64_t>();
|
|
return true;
|
|
}
|
|
if (value.is_number_float()) {
|
|
out->type = JsonValueTypeReal;
|
|
out->real = value.get<double>();
|
|
return true;
|
|
}
|
|
if (value.is_string()) {
|
|
out->type = JsonValueTypeString;
|
|
out->string = JsonStringNew(value.get_ref<const std::string&>());
|
|
return true;
|
|
}
|
|
if (value.is_array()) {
|
|
out->type = JsonValueTypeArray;
|
|
out->array = JsonArrayNew();
|
|
for (const auto& item: value) {
|
|
auto* child = JsonValueNew();
|
|
if (!JsonValueFromNlohmann(child, item)) {
|
|
JsonValueDelete(child);
|
|
return false;
|
|
}
|
|
child->parent = out;
|
|
out->array->impl->push_back(child);
|
|
}
|
|
return true;
|
|
}
|
|
if (value.is_object()) {
|
|
out->type = JsonValueTypeObject;
|
|
out->object = JsonObjectNew();
|
|
for (auto it = value.begin(); it != value.end(); ++it) {
|
|
auto* child = JsonValueNew();
|
|
if (!JsonValueFromNlohmann(child, *it)) {
|
|
JsonValueDelete(child);
|
|
return false;
|
|
}
|
|
child->parent = out;
|
|
(*out->object->impl)[it.key()] = child;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static void JsonSerializeValue(const JsonValue* value, std::string* out) {
|
|
if (value == nullptr) {
|
|
out->append("null");
|
|
return;
|
|
}
|
|
switch (value->type) {
|
|
case JsonValueTypeBoolean: out->append(value->boolean ? "true" : "false"); break;
|
|
case JsonValueTypeInteger: out->append(std::to_string(value->integer)); break;
|
|
case JsonValueTypeUInteger: out->append(std::to_string(value->uinteger)); break;
|
|
case JsonValueTypeReal: out->append(std::to_string(value->real)); break;
|
|
case JsonValueTypeString:
|
|
out->push_back('"');
|
|
out->append(*JsonStringImpl(value->string));
|
|
out->push_back('"');
|
|
break;
|
|
case JsonValueTypeArray: {
|
|
out->push_back('[');
|
|
bool first = true;
|
|
for (auto* item: *JsonArrayImpl(value->array)) {
|
|
if (!first) {
|
|
out->push_back(',');
|
|
}
|
|
first = false;
|
|
JsonSerializeValue(item, out);
|
|
}
|
|
out->push_back(']');
|
|
break;
|
|
}
|
|
case JsonValueTypeObject: {
|
|
out->push_back('{');
|
|
bool first = true;
|
|
for (const auto& item: *JsonObjectImpl(value->object)) {
|
|
if (!first) {
|
|
out->push_back(',');
|
|
}
|
|
first = false;
|
|
out->push_back('"');
|
|
out->append(item.first);
|
|
out->append("\":");
|
|
JsonSerializeValue(item.second, out);
|
|
}
|
|
out->push_back('}');
|
|
break;
|
|
}
|
|
default: out->append("null"); break;
|
|
}
|
|
}
|
|
|
|
static void* KYTY_SYSV_ABI JsonMemAllocatorCtor(void* self) {
|
|
PRINT_NAME();
|
|
|
|
return self;
|
|
}
|
|
|
|
static JsonInitParameter2* KYTY_SYSV_ABI JsonInitParameter2Ctor(JsonInitParameter2* self) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->allocator = nullptr;
|
|
self->user_data = nullptr;
|
|
self->file_buffer_size = 0;
|
|
self->special_float_format_type = 0;
|
|
self->reserved[0] = 0;
|
|
self->reserved[1] = 0;
|
|
self->reserved[2] = 0;
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonInitParameter2SetAllocator(JsonInitParameter2* self, void* allocator,
|
|
void* user_data) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->allocator = allocator;
|
|
self->user_data = user_data;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonInitParameter2SetFileBufferSize(JsonInitParameter2* self,
|
|
size_t size) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->file_buffer_size = size;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonInitParameter2SetSpecialFloatFormatType(JsonInitParameter2* self,
|
|
uint32_t type) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->special_float_format_type = type;
|
|
}
|
|
}
|
|
|
|
static void* KYTY_SYSV_ABI JsonInitializerCtor(void* self) {
|
|
PRINT_NAME();
|
|
|
|
return self;
|
|
}
|
|
|
|
static int KYTY_SYSV_ABI JsonInitializerInitialize(void* self,
|
|
const JsonInitParameter2* init_param) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n"
|
|
"\t init_param = 0x%016" PRIx64 "\n",
|
|
reinterpret_cast<uint64_t>(self), reinterpret_cast<uint64_t>(init_param));
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int KYTY_SYSV_ABI JsonInitializerInitializeV1(void* self, const void* init_param) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n"
|
|
"\t init_param = 0x%016" PRIx64 "\n",
|
|
reinterpret_cast<uint64_t>(self), reinterpret_cast<uint64_t>(init_param));
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonInitializerTerminate(void* self) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n", reinterpret_cast<uint64_t>(self));
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonInitializerDtor(void* self) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n", reinterpret_cast<uint64_t>(self));
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonMemAllocatorDtor(void* self) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n", reinterpret_cast<uint64_t>(self));
|
|
}
|
|
|
|
static void* KYTY_SYSV_ABI JsonValueCtor(void* self) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n", reinterpret_cast<uint64_t>(self));
|
|
|
|
if (self != nullptr) {
|
|
JsonValueInit(reinterpret_cast<JsonValue*>(self));
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueCopyCtor(JsonValue* self, const JsonValue* src) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
JsonValueCopy(self, src);
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueTypeCtor(JsonValue* self, uint32_t type) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
JsonValueSetEmptyType(self, type);
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueBoolCtor(JsonValue* self, bool value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeBoolean;
|
|
self->boolean = value;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueIntCtor(JsonValue* self, int64_t value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeInteger;
|
|
self->integer = value;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueDoubleCtor(JsonValue* self, double value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeReal;
|
|
self->real = value;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueCStringCtor(JsonValue* self, const char* value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeString;
|
|
self->string = JsonStringNew(value != nullptr ? value : "");
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueStringCtor(JsonValue* self, const JsonString* value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeString;
|
|
self->string = JsonStringNew(*JsonStringImpl(value));
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueObjectCtor(JsonValue* self, const JsonObject* value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeObject;
|
|
self->object = new JsonObject {JsonObjectCopy(value, self)};
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueArrayCtor(JsonValue* self, const JsonArray* value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueInit(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeArray;
|
|
self->array = new JsonArray {JsonArrayCopy(value, self)};
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueSetObject(JsonValue* self, const JsonObject* value) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
// The source may be this value's object or one of its descendants.
|
|
auto* object = new JsonObject {JsonObjectCopy(value, self)};
|
|
JsonValueClear(self);
|
|
self->type = JsonValueTypeObject;
|
|
self->object = object;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueDtor(void* self) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n", reinterpret_cast<uint64_t>(self));
|
|
|
|
JsonValueClear(reinterpret_cast<JsonValue*>(self));
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueAssign(JsonValue* self, const JsonValue* src) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueCopy(self, src);
|
|
return self;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueSetBool(JsonValue* self, bool value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueClear(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeBoolean;
|
|
self->boolean = value;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueSetInt(JsonValue* self, int64_t value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueClear(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeInteger;
|
|
self->integer = value;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueSetUInt(JsonValue* self, uint64_t value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueClear(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeUInteger;
|
|
self->uinteger = value;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueSetDouble(JsonValue* self, double value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueClear(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeReal;
|
|
self->real = value;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueSetString(JsonValue* self, const JsonString* value) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueClear(self);
|
|
if (self != nullptr) {
|
|
self->type = JsonValueTypeString;
|
|
self->string = JsonStringNew(*JsonStringImpl(value));
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueSetType(JsonValue* self, uint32_t type) {
|
|
PRINT_NAME();
|
|
|
|
JsonValueClear(self);
|
|
JsonValueSetEmptyType(self, type);
|
|
}
|
|
|
|
static uint32_t KYTY_SYSV_ABI JsonValueGetType(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
return (self != nullptr ? self->type : JsonValueTypeNull);
|
|
}
|
|
|
|
static JsonArray* KYTY_SYSV_ABI JsonValueReferArray(JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
return (self != nullptr && self->type == JsonValueTypeArray ? self->array : nullptr);
|
|
}
|
|
|
|
static JsonObject* KYTY_SYSV_ABI JsonValueReferObject(JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
return (self != nullptr && self->type == JsonValueTypeObject ? self->object : nullptr);
|
|
}
|
|
|
|
static const JsonString* KYTY_SYSV_ABI JsonValueGetString(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
return (self != nullptr && self->type == JsonValueTypeString ? self->string
|
|
: JsonStaticString());
|
|
}
|
|
|
|
static const JsonArray* KYTY_SYSV_ABI JsonValueGetArray(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
return (self != nullptr && self->type == JsonValueTypeArray ? self->array : JsonStaticArray());
|
|
}
|
|
|
|
static const JsonObject* KYTY_SYSV_ABI JsonValueGetObject(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
return (self != nullptr && self->type == JsonValueTypeObject ? self->object
|
|
: JsonStaticObject());
|
|
}
|
|
|
|
static const bool* KYTY_SYSV_ABI JsonValueGetBoolean(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
static const bool false_value = false;
|
|
return (self != nullptr && self->type == JsonValueTypeBoolean ? &self->boolean : &false_value);
|
|
}
|
|
|
|
static const int64_t* KYTY_SYSV_ABI JsonValueGetInteger(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
static const int64_t zero = 0;
|
|
if (self != nullptr &&
|
|
(self->type == JsonValueTypeInteger || self->type == JsonValueTypeUInteger)) {
|
|
return &self->integer;
|
|
}
|
|
return &zero;
|
|
}
|
|
|
|
static const double* KYTY_SYSV_ABI JsonValueGetReal(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
static const double zero = 0.0;
|
|
return (self != nullptr && self->type == JsonValueTypeReal ? &self->real : &zero);
|
|
}
|
|
|
|
static const JsonValue* KYTY_SYSV_ABI JsonValueIndexString(const JsonValue* self, const char* key) {
|
|
PRINT_NAME();
|
|
|
|
if (self == nullptr || self->type != JsonValueTypeObject) {
|
|
return JsonStaticNullValue();
|
|
}
|
|
return JsonObjectLookup(self->object, key != nullptr ? key : "", false);
|
|
}
|
|
|
|
static const JsonValue* KYTY_SYSV_ABI JsonValueIndexUInt(const JsonValue* self, uint64_t index) {
|
|
PRINT_NAME();
|
|
|
|
if (self == nullptr || self->type != JsonValueTypeArray) {
|
|
return JsonStaticNullValue();
|
|
}
|
|
const auto* impl = JsonArrayImpl(self->array);
|
|
return (index < impl->size() ? (*impl)[static_cast<size_t>(index)] : JsonStaticNullValue());
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonValueReferValueKey(JsonValue* self, const JsonString* key) {
|
|
PRINT_NAME();
|
|
|
|
if (self == nullptr || self->type != JsonValueTypeObject) {
|
|
return nullptr;
|
|
}
|
|
const auto* impl = JsonObjectImpl(self->object);
|
|
const auto it = impl->find(*JsonStringImpl(key));
|
|
return (it != impl->end() ? it->second : nullptr);
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueToString(const JsonValue* self, JsonString* dst) {
|
|
PRINT_NAME();
|
|
|
|
auto* impl = JsonStringImpl(dst);
|
|
if (impl == nullptr) {
|
|
return;
|
|
}
|
|
if (self != nullptr && self->type == JsonValueTypeString) {
|
|
*impl = *JsonStringImpl(self->string);
|
|
} else {
|
|
impl->clear();
|
|
JsonSerializeValue(self, impl);
|
|
}
|
|
}
|
|
|
|
static int32_t KYTY_SYSV_ABI JsonValueSerialize(JsonValue* self, JsonString* dst) {
|
|
PRINT_NAME();
|
|
|
|
auto* impl = JsonStringImpl(dst);
|
|
if (impl != nullptr) {
|
|
impl->clear();
|
|
JsonSerializeValue(self, impl);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static JsonString* KYTY_SYSV_ABI JsonStringCtor(JsonString* self) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->impl = new std::string;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonString* KYTY_SYSV_ABI JsonStringCStringCtor(JsonString* self, const char* str) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->impl = new std::string(str != nullptr ? str : "");
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonStringDtor(JsonString* self) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
delete self->impl;
|
|
self->impl = nullptr;
|
|
}
|
|
}
|
|
|
|
static JsonString* KYTY_SYSV_ABI JsonStringAssign(JsonString* self, const JsonString* src) {
|
|
PRINT_NAME();
|
|
|
|
auto* impl = JsonStringImpl(self);
|
|
if (impl != nullptr) {
|
|
*impl = *JsonStringImpl(src);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static const char* KYTY_SYSV_ABI JsonStringCStr(const JsonString* self) {
|
|
PRINT_NAME();
|
|
|
|
return JsonStringImpl(self)->c_str();
|
|
}
|
|
|
|
static size_t KYTY_SYSV_ABI JsonStringLength(const JsonString* self) {
|
|
PRINT_NAME();
|
|
|
|
return JsonStringImpl(self)->length();
|
|
}
|
|
|
|
static JsonArray* KYTY_SYSV_ABI JsonArrayCtor(JsonArray* self) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->impl = new std::vector<JsonValue*>;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonArrayDtor(JsonArray* self) {
|
|
PRINT_NAME();
|
|
|
|
JsonArrayDestroy(self);
|
|
}
|
|
|
|
static JsonArray* KYTY_SYSV_ABI JsonArrayPushBack(JsonArray* self, const JsonValue* value) {
|
|
PRINT_NAME();
|
|
|
|
auto* impl = JsonArrayImpl(self);
|
|
if (impl != nullptr) {
|
|
auto* copy = JsonValueNew();
|
|
JsonValueCopy(copy, value);
|
|
impl->push_back(copy);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonArrayBack(const JsonArray* self) {
|
|
PRINT_NAME();
|
|
|
|
const auto* impl = JsonArrayImpl(self);
|
|
return (!impl->empty() ? impl->back() : JsonStaticNullValue());
|
|
}
|
|
|
|
static size_t KYTY_SYSV_ABI JsonArraySize(const JsonArray* self) {
|
|
PRINT_NAME();
|
|
|
|
return JsonArrayImpl(self)->size();
|
|
}
|
|
|
|
// The non-trivial guest iterator is returned through an explicit result pointer.
|
|
static JsonArrayIterator* KYTY_SYSV_ABI JsonArrayBegin(JsonArrayIterator* result,
|
|
const JsonArray* self) {
|
|
PRINT_NAME();
|
|
|
|
result->position = JsonArrayImpl(self)->data();
|
|
return result;
|
|
}
|
|
|
|
static JsonArrayIterator* KYTY_SYSV_ABI JsonArrayEnd(JsonArrayIterator* result,
|
|
const JsonArray* self) {
|
|
PRINT_NAME();
|
|
|
|
const auto* impl = JsonArrayImpl(self);
|
|
result->position = impl->data();
|
|
if (!impl->empty()) {
|
|
result->position += impl->size();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static bool KYTY_SYSV_ABI JsonArrayIteratorNotEqual(const JsonArrayIterator* self,
|
|
const JsonArrayIterator* other) {
|
|
PRINT_NAME();
|
|
|
|
return self->position != other->position;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonArrayIteratorDereference(const JsonArrayIterator* self) {
|
|
PRINT_NAME();
|
|
|
|
return *self->position;
|
|
}
|
|
|
|
static JsonArrayIterator* KYTY_SYSV_ABI JsonArrayIteratorIncrement(JsonArrayIterator* self) {
|
|
PRINT_NAME();
|
|
|
|
++self->position;
|
|
return self;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonArrayIteratorDtor(JsonArrayIterator*) {
|
|
PRINT_NAME();
|
|
}
|
|
|
|
static JsonObject* KYTY_SYSV_ABI JsonObjectCtor(JsonObject* self) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->impl = new std::map<std::string, JsonValue*>;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonObject* KYTY_SYSV_ABI JsonObjectCopyCtor(JsonObject* self, const JsonObject* src) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
self->impl = JsonObjectCopy(src, nullptr);
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonObjectDtor(JsonObject* self) {
|
|
PRINT_NAME();
|
|
|
|
JsonObjectDestroy(self);
|
|
}
|
|
|
|
static JsonObject* KYTY_SYSV_ABI JsonObjectAssign(JsonObject* self, const JsonObject* src) {
|
|
PRINT_NAME();
|
|
|
|
if (self != nullptr) {
|
|
auto* impl = JsonObjectCopy(src, nullptr);
|
|
JsonObjectDestroy(self);
|
|
self->impl = impl;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
static JsonValue* KYTY_SYSV_ABI JsonObjectIndex(JsonObject* self, const JsonString* key) {
|
|
PRINT_NAME();
|
|
|
|
return JsonObjectLookup(self, *JsonStringImpl(key), true);
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonObjectClear(JsonObject* self) {
|
|
PRINT_NAME();
|
|
|
|
auto* impl = JsonObjectImpl(self);
|
|
if (impl != nullptr) {
|
|
for (auto& item: *impl) {
|
|
JsonValueDelete(item.second);
|
|
}
|
|
impl->clear();
|
|
}
|
|
}
|
|
|
|
static int32_t KYTY_SYSV_ABI JsonParserParse(JsonValue* dst, const char* src, size_t size) {
|
|
PRINT_NAME();
|
|
|
|
if (dst == nullptr || src == nullptr) {
|
|
return JSON_ERROR_INVALID_ARGUMENT;
|
|
}
|
|
|
|
JsonValue parsed {};
|
|
JsonValueInit(&parsed);
|
|
auto json = nlohmann::json::parse(src, src + size, nullptr, false);
|
|
if (json.is_discarded() || !JsonValueFromNlohmann(&parsed, json)) {
|
|
JsonValueClear(&parsed);
|
|
return JSON_ERROR_PARSE_INVALID_CHAR;
|
|
}
|
|
|
|
JsonValueCopy(dst, &parsed);
|
|
JsonValueClear(&parsed);
|
|
return 0;
|
|
}
|
|
|
|
static int32_t KYTY_SYSV_ABI JsonInitializerSetGlobalNullAccessCallback(void* self, void* callback,
|
|
void* context) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n"
|
|
"\t callback = 0x%016" PRIx64 "\n"
|
|
"\t context = 0x%016" PRIx64 "\n",
|
|
reinterpret_cast<uint64_t>(self), reinterpret_cast<uint64_t>(callback),
|
|
reinterpret_cast<uint64_t>(context));
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int32_t KYTY_SYSV_ABI JsonValueCount(const JsonValue* self) {
|
|
PRINT_NAME();
|
|
|
|
if (self == nullptr) {
|
|
return 0;
|
|
}
|
|
|
|
switch (self->type) {
|
|
case JsonValueTypeArray: return static_cast<int32_t>(JsonArrayImpl(self->array)->size());
|
|
case JsonValueTypeObject: return static_cast<int32_t>(JsonObjectImpl(self->object)->size());
|
|
default: return 0;
|
|
}
|
|
}
|
|
|
|
static void KYTY_SYSV_ABI JsonValueClearMethod(void* self) {
|
|
PRINT_NAME();
|
|
|
|
LOGF("\t self = 0x%016" PRIx64 "\n", reinterpret_cast<uint64_t>(self));
|
|
|
|
auto* value = reinterpret_cast<JsonValue*>(self);
|
|
if (value != nullptr) {
|
|
auto* parent = value->parent;
|
|
auto* rootparam = value->rootparam;
|
|
JsonValueClear(value);
|
|
value->parent = parent;
|
|
value->rootparam = rootparam;
|
|
}
|
|
}
|
|
|
|
LIB_DEFINE(InitNet_1_Json2) {
|
|
LIB_FUNC("-hJRce8wn1U", LibJson2::JsonMemAllocatorCtor);
|
|
LIB_FUNC("WSOuge5IsCg", LibJson2::JsonInitParameter2Ctor);
|
|
LIB_FUNC("GvGvswb0v34", LibJson2::JsonInitParameter2Ctor);
|
|
LIB_FUNC("I2QC8PYhJWY", LibJson2::JsonInitParameter2SetAllocator);
|
|
LIB_FUNC("W72B9ylU2JA", LibJson2::JsonInitParameter2SetAllocator);
|
|
LIB_FUNC("Eu95jmqn5Rw", LibJson2::JsonInitParameter2SetFileBufferSize);
|
|
LIB_FUNC("WVZBP4IyM+E", LibJson2::JsonInitParameter2SetSpecialFloatFormatType);
|
|
LIB_FUNC("cK6bYHf-Q5E", LibJson2::JsonInitializerCtor);
|
|
LIB_FUNC("IXW-z8pggfg", LibJson2::JsonInitializerInitialize);
|
|
LIB_FUNC("Cxwy7wHq4J0", LibJson2::JsonInitializerInitializeV1);
|
|
LIB_FUNC("PR5k1penBLM", LibJson2::JsonInitializerTerminate);
|
|
LIB_FUNC("RujUxbr3haM", LibJson2::JsonInitializerDtor);
|
|
LIB_FUNC("OcAgPxcq5Vk", LibJson2::JsonMemAllocatorDtor);
|
|
LIB_FUNC("qBMjqyBn3OM", LibJson2::JsonValueCtor);
|
|
LIB_FUNC("-wa17B7TGnw", LibJson2::JsonValueCtor);
|
|
LIB_FUNC("fSb2oQTNrgA", LibJson2::JsonValueCopyCtor);
|
|
LIB_FUNC("CbrT3dwDILo", LibJson2::JsonValueTypeCtor);
|
|
LIB_FUNC("WTtYf+cNnXI", LibJson2::JsonValueDtor);
|
|
LIB_FUNC("0eUrW9JAxM0", LibJson2::JsonValueDtor);
|
|
LIB_FUNC("S5JxQnoGF3E", LibJson2::JsonParserParse);
|
|
LIB_FUNC("HwDt5lD9Bfo", LibJson2::JsonValueIndexString);
|
|
LIB_FUNC("epJ6x2LV0kU", LibJson2::JsonValueGetString);
|
|
LIB_FUNC("L1KAkYWml-M", LibJson2::JsonStringCStr);
|
|
LIB_FUNC("OJPTonqdg0I", LibJson2::JsonObjectCtor);
|
|
LIB_FUNC("sZIoMRGO+jk", LibJson2::JsonValueStringCtor);
|
|
LIB_FUNC("ERuf9y0DY84", LibJson2::JsonObjectIndex);
|
|
LIB_FUNC("4zrm6VrgIAw", LibJson2::JsonValueAssign);
|
|
LIB_FUNC("a+W7HHlwpBs", LibJson2::JsonObjectCopyCtor);
|
|
LIB_FUNC("5JmzZt8twAo", LibJson2::JsonObjectDtor);
|
|
LIB_FUNC("nM5XqdeXFPw", LibJson2::JsonValueReferArray);
|
|
LIB_FUNC("-NxEk7XLkDY", LibJson2::JsonValueReferObject);
|
|
LIB_FUNC("JP-PtKMiI1E", LibJson2::JsonArrayCtor);
|
|
LIB_FUNC("HJ8GpRT1aiw", LibJson2::JsonArrayDtor);
|
|
LIB_FUNC("iZeYfOxtMRg", LibJson2::JsonValueArrayCtor);
|
|
LIB_FUNC("dFCphqnd+a4", LibJson2::JsonValueSetObject);
|
|
LIB_FUNC("zQtLRTqceMY", LibJson2::JsonArrayPushBack);
|
|
LIB_FUNC("0lLK8+kDqmE", LibJson2::JsonValueIntCtor);
|
|
LIB_FUNC("urOpESTBZmo", LibJson2::JsonObjectAssign);
|
|
LIB_FUNC("zTwZdI8AZ5Y", LibJson2::JsonValueGetBoolean);
|
|
LIB_FUNC("R7FDWtcN6f8", LibJson2::JsonValueSerialize);
|
|
LIB_FUNC("wLsJlmgEIaI", LibJson2::JsonValueReferValueKey);
|
|
LIB_FUNC("Ncel8t2Rrpc", LibJson2::JsonValueToString);
|
|
LIB_FUNC("oH8aBmLU+fc", LibJson2::JsonObjectClear);
|
|
LIB_FUNC("bAM9Qwofus0", LibJson2::JsonArrayBack);
|
|
LIB_FUNC("UeuWT+yNdCQ", LibJson2::JsonValueBoolCtor);
|
|
LIB_FUNC("3xUXnmUkXfo", LibJson2::JsonValueObjectCtor);
|
|
LIB_FUNC("cn9svYGWKDQ", LibJson2::JsonStringAssign);
|
|
LIB_FUNC("b9V6fmppLXY", LibJson2::JsonValueCStringCtor);
|
|
LIB_FUNC("EUH+EmT-v9E", LibJson2::JsonStringLength);
|
|
LIB_FUNC("XlWbvieLj2M", LibJson2::JsonValueIndexUInt);
|
|
LIB_FUNC("IlsmvBtMkak", LibJson2::JsonValueGetObject);
|
|
LIB_FUNC("SHtAad20YYM", LibJson2::JsonValueGetType);
|
|
LIB_FUNC("DIxvoy7Ngvk", LibJson2::JsonValueGetInteger);
|
|
LIB_FUNC("qSmqLXXCPas", LibJson2::JsonStringCtor);
|
|
LIB_FUNC("ONT8As5R1ug", LibJson2::JsonValueGetArray);
|
|
LIB_FUNC("3qrge7L-AU4", LibJson2::JsonValueGetReal);
|
|
LIB_FUNC("sOmU4vnx3s0", LibJson2::JsonValueDoubleCtor);
|
|
LIB_FUNC("rQGJeNjOuUk", LibJson2::JsonArraySize);
|
|
LIB_FUNC("bcH5EnFE2xY", LibJson2::JsonArrayBegin);
|
|
LIB_FUNC("WXF2ihRF+B8", LibJson2::JsonArrayEnd);
|
|
LIB_FUNC("5AZPp99ogrc", LibJson2::JsonArrayIteratorNotEqual);
|
|
LIB_FUNC("wcgr5mte7T8", LibJson2::JsonArrayIteratorDereference);
|
|
LIB_FUNC("w5+VCznos5E", LibJson2::JsonArrayIteratorIncrement);
|
|
LIB_FUNC("9yLjn46Ypfs", LibJson2::JsonArrayIteratorDtor);
|
|
LIB_FUNC("5yHuiWXo2gg", LibJson2::JsonValueSetBool);
|
|
LIB_FUNC("QxVVYhP-mvg", LibJson2::JsonValueSetInt);
|
|
LIB_FUNC("SIe1ZmW7e7s", LibJson2::JsonValueSetUInt);
|
|
LIB_FUNC("BSmWDIkV4w4", LibJson2::JsonValueSetDouble);
|
|
LIB_FUNC("6l3Bv2gysNc", LibJson2::JsonValueSetString);
|
|
LIB_FUNC("9KUZFjI1IxA", LibJson2::JsonStringCStringCtor);
|
|
LIB_FUNC("cG1VE2HMl6c", LibJson2::JsonStringDtor);
|
|
LIB_FUNC("IKQimvG9Wqs", LibJson2::JsonValueSetType);
|
|
LIB_FUNC("RBw+4NukeGQ", LibJson2::JsonValueCount);
|
|
LIB_FUNC("+drDFyAS6u4", LibJson2::JsonInitializerSetGlobalNullAccessCallback);
|
|
LIB_FUNC("00oCq0RwSAY", LibJson2::JsonInitializerSetGlobalNullAccessCallback);
|
|
LIB_FUNC("FIjXN2TkuTs", LibJson2::JsonValueClearMethod);
|
|
}
|
|
|
|
} // namespace LibJson2
|
|
|
|
} // namespace Libs
|