[ox/oc] Add support for allocating for strings
This commit is contained in:
parent
b3fa531aa0
commit
5265a94a80
10
deps/ox/src/ox/oc/read.cpp
vendored
10
deps/ox/src/ox/oc/read.cpp
vendored
@ -186,15 +186,19 @@ Error OrganicClawReader::field(const char *key, SerStr val) {
|
|||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
if (jv.empty()) {
|
if (jv.empty()) {
|
||||||
val.data()[0] = 0;
|
auto data = val.data();
|
||||||
|
if (data) {
|
||||||
|
data[0] = 0;
|
||||||
|
}
|
||||||
} else if (jv.isString()) {
|
} else if (jv.isString()) {
|
||||||
jv.getString(&begin, &end);
|
jv.getString(&begin, &end);
|
||||||
auto strSize = end - begin;
|
auto strSize = end - begin;
|
||||||
|
auto data = val.data(static_cast<std::size_t>(strSize) + 1);
|
||||||
if (strSize >= val.cap()) {
|
if (strSize >= val.cap()) {
|
||||||
err = OxError(1, "String size exceeds capacity of destination");
|
err = OxError(1, "String size exceeds capacity of destination");
|
||||||
} else {
|
} else {
|
||||||
ox_memcpy(val.data(), begin, static_cast<std::size_t>(strSize));
|
ox_memcpy(data, begin, static_cast<std::size_t>(strSize));
|
||||||
val.data()[strSize] = 0;
|
data[strSize] = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = OxError(1, "Type mismatch");
|
err = OxError(1, "Type mismatch");
|
||||||
|
8
deps/ox/src/ox/oc/read.hpp
vendored
8
deps/ox/src/ox/oc/read.hpp
vendored
@ -124,7 +124,7 @@ Error OrganicClawReader::field(const char *key, UnionView<U> val) {
|
|||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (jv.empty() || jv.isObject()) {
|
if (jv.empty() || jv.isObject()) {
|
||||||
auto reader = child(key, val.idx());
|
auto reader = child(key, val.idx());
|
||||||
return model(&reader, val.get());
|
err = model(&reader, val.get());
|
||||||
} else {
|
} else {
|
||||||
err = OxError(1, "Type mismatch");
|
err = OxError(1, "Type mismatch");
|
||||||
}
|
}
|
||||||
@ -178,9 +178,9 @@ Error readOC(const char *json, std::size_t jsonSize, T *val) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ValErr<T> readOC(const char *json) {
|
ValErr<std::unique_ptr<T>> readOC(const char *json) {
|
||||||
T val;
|
auto val = std::make_unique<T>();
|
||||||
oxReturnError(readOC(json, ox_strlen(json), &val));
|
oxReturnError(readOC(json, ox_strlen(json), val.get()));
|
||||||
return {std::move(val), OxError(0)};
|
return {std::move(val), OxError(0)};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
58
deps/ox/src/ox/oc/test/tests.cpp
vendored
58
deps/ox/src/ox/oc/test/tests.cpp
vendored
@ -42,10 +42,16 @@ struct TestStruct {
|
|||||||
int32_t Int7 = 0;
|
int32_t Int7 = 0;
|
||||||
int32_t Int8 = 0;
|
int32_t Int8 = 0;
|
||||||
TestUnion Union;
|
TestUnion Union;
|
||||||
|
char *CString = nullptr;
|
||||||
ox::BString<32> String = "";
|
ox::BString<32> String = "";
|
||||||
uint32_t List[4] = {0, 0, 0 , 0};
|
uint32_t List[4] = {0, 0, 0, 0};
|
||||||
TestStructNest EmptyStruct;
|
TestStructNest EmptyStruct;
|
||||||
TestStructNest Struct;
|
TestStructNest Struct;
|
||||||
|
|
||||||
|
~TestStruct() {
|
||||||
|
delete[] CString;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -68,7 +74,7 @@ ox::Error model(T *io, TestStructNest *obj) {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ox::Error model(T *io, TestStruct *obj) {
|
ox::Error model(T *io, TestStruct *obj) {
|
||||||
io->setTypeInfo("TestStruct", 14);
|
io->setTypeInfo("TestStruct", 16);
|
||||||
oxReturnError(io->field("Bool", &obj->Bool));
|
oxReturnError(io->field("Bool", &obj->Bool));
|
||||||
oxReturnError(io->field("Int", &obj->Int));
|
oxReturnError(io->field("Int", &obj->Int));
|
||||||
oxReturnError(io->field("Int1", &obj->Int1));
|
oxReturnError(io->field("Int1", &obj->Int1));
|
||||||
@ -80,6 +86,7 @@ ox::Error model(T *io, TestStruct *obj) {
|
|||||||
oxReturnError(io->field("Int7", &obj->Int7));
|
oxReturnError(io->field("Int7", &obj->Int7));
|
||||||
oxReturnError(io->field("Int8", &obj->Int8));
|
oxReturnError(io->field("Int8", &obj->Int8));
|
||||||
oxReturnError(io->field("Union", ox::UnionView{&obj->Union, 1}));
|
oxReturnError(io->field("Union", ox::UnionView{&obj->Union, 1}));
|
||||||
|
oxReturnError(io->field("CString", ox::SerStr(&obj->CString)));
|
||||||
oxReturnError(io->field("String", &obj->String));
|
oxReturnError(io->field("String", &obj->String));
|
||||||
oxReturnError(io->field("List", obj->List, 4));
|
oxReturnError(io->field("List", obj->List, 4));
|
||||||
oxReturnError(io->field("EmptyStruct", &obj->EmptyStruct));
|
oxReturnError(io->field("EmptyStruct", &obj->EmptyStruct));
|
||||||
@ -106,6 +113,8 @@ std::map<std::string, ox::Error(*)()> tests = {
|
|||||||
testIn.Int = 42;
|
testIn.Int = 42;
|
||||||
testIn.Union.Int = 52;
|
testIn.Union.Int = 52;
|
||||||
testIn.String = "Test String 1";
|
testIn.String = "Test String 1";
|
||||||
|
testIn.CString = new char[ox_strlen("c-string") + 1];
|
||||||
|
ox_strcpy(testIn.CString, "c-string");
|
||||||
testIn.List[0] = 1;
|
testIn.List[0] = 1;
|
||||||
testIn.List[1] = 2;
|
testIn.List[1] = 2;
|
||||||
testIn.List[2] = 3;
|
testIn.List[2] = 3;
|
||||||
@ -120,28 +129,29 @@ std::map<std::string, ox::Error(*)()> tests = {
|
|||||||
auto [testOut, readErr] = ox::readOC<TestStruct>(oc.c_str());
|
auto [testOut, readErr] = ox::readOC<TestStruct>(oc.c_str());
|
||||||
oxAssert(readErr, "readOC failed");
|
oxAssert(readErr, "readOC failed");
|
||||||
|
|
||||||
oxAssert(testIn.Bool == testOut.Bool, "Bool value mismatch");
|
oxAssert(testIn.Bool == testOut->Bool, "Bool value mismatch");
|
||||||
oxAssert(testIn.Int == testOut.Int, "Int value mismatch");
|
oxAssert(testIn.Int == testOut->Int, "Int value mismatch");
|
||||||
oxAssert(testIn.Int1 == testOut.Int1, "Int1 value mismatch");
|
oxAssert(testIn.Int1 == testOut->Int1, "Int1 value mismatch");
|
||||||
oxAssert(testIn.Int2 == testOut.Int2, "Int2 value mismatch");
|
oxAssert(testIn.Int2 == testOut->Int2, "Int2 value mismatch");
|
||||||
oxAssert(testIn.Int3 == testOut.Int3, "Int3 value mismatch");
|
oxAssert(testIn.Int3 == testOut->Int3, "Int3 value mismatch");
|
||||||
oxAssert(testIn.Int4 == testOut.Int4, "Int4 value mismatch");
|
oxAssert(testIn.Int4 == testOut->Int4, "Int4 value mismatch");
|
||||||
oxAssert(testIn.Int5 == testOut.Int5, "Int5 value mismatch");
|
oxAssert(testIn.Int5 == testOut->Int5, "Int5 value mismatch");
|
||||||
oxAssert(testIn.Int6 == testOut.Int6, "Int6 value mismatch");
|
oxAssert(testIn.Int6 == testOut->Int6, "Int6 value mismatch");
|
||||||
oxAssert(testIn.Int7 == testOut.Int7, "Int7 value mismatch");
|
oxAssert(testIn.Int7 == testOut->Int7, "Int7 value mismatch");
|
||||||
oxAssert(testIn.Int8 == testOut.Int8, "Int8 value mismatch");
|
oxAssert(testIn.Int8 == testOut->Int8, "Int8 value mismatch");
|
||||||
oxAssert(testIn.Union.Int == testOut.Union.Int, "Union.Int value mismatch");
|
oxAssert(ox_strcmp(testIn.CString, testOut->CString) == 0, "CString value mismatch");
|
||||||
oxAssert(testIn.String == testOut.String, "String value mismatch");
|
oxAssert(testIn.Union.Int == testOut->Union.Int, "Union.Int value mismatch");
|
||||||
oxAssert(testIn.List[0] == testOut.List[0], "List[0] value mismatch");
|
oxAssert(testIn.String == testOut->String, "String value mismatch");
|
||||||
oxAssert(testIn.List[1] == testOut.List[1], "List[1] value mismatch");
|
oxAssert(testIn.List[0] == testOut->List[0], "List[0] value mismatch");
|
||||||
oxAssert(testIn.List[2] == testOut.List[2], "List[2] value mismatch");
|
oxAssert(testIn.List[1] == testOut->List[1], "List[1] value mismatch");
|
||||||
oxAssert(testIn.List[3] == testOut.List[3], "List[3] value mismatch");
|
oxAssert(testIn.List[2] == testOut->List[2], "List[2] value mismatch");
|
||||||
oxAssert(testIn.EmptyStruct.Bool == testOut.EmptyStruct.Bool, "EmptyStruct.Bool value mismatch");
|
oxAssert(testIn.List[3] == testOut->List[3], "List[3] value mismatch");
|
||||||
oxAssert(testIn.EmptyStruct.Int == testOut.EmptyStruct.Int, "EmptyStruct.Int value mismatch");
|
oxAssert(testIn.EmptyStruct.Bool == testOut->EmptyStruct.Bool, "EmptyStruct.Bool value mismatch");
|
||||||
oxAssert(testIn.EmptyStruct.String == testOut.EmptyStruct.String, "EmptyStruct.String value mismatch");
|
oxAssert(testIn.EmptyStruct.Int == testOut->EmptyStruct.Int, "EmptyStruct.Int value mismatch");
|
||||||
oxAssert(testIn.Struct.Int == testOut.Struct.Int, "Struct.Int value mismatch");
|
oxAssert(testIn.EmptyStruct.String == testOut->EmptyStruct.String, "EmptyStruct.String value mismatch");
|
||||||
oxAssert(testIn.Struct.String == testOut.Struct.String, "Struct.String value mismatch");
|
oxAssert(testIn.Struct.Int == testOut->Struct.Int, "Struct.Int value mismatch");
|
||||||
oxAssert(testIn.Struct.Bool == testOut.Struct.Bool, "Struct.Bool value mismatch");
|
oxAssert(testIn.Struct.String == testOut->Struct.String, "Struct.String value mismatch");
|
||||||
|
oxAssert(testIn.Struct.Bool == testOut->Struct.Bool, "Struct.Bool value mismatch");
|
||||||
|
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user