diff --git a/deps/ox/src/ox/oc/read.cpp b/deps/ox/src/ox/oc/read.cpp index 4875207b..7e4a2649 100644 --- a/deps/ox/src/ox/oc/read.cpp +++ b/deps/ox/src/ox/oc/read.cpp @@ -186,15 +186,19 @@ Error OrganicClawReader::field(const char *key, SerStr val) { const auto &jv = value(key); if (targetValid()) { if (jv.empty()) { - val.data()[0] = 0; + auto data = val.data(); + if (data) { + data[0] = 0; + } } else if (jv.isString()) { jv.getString(&begin, &end); auto strSize = end - begin; + auto data = val.data(static_cast(strSize) + 1); if (strSize >= val.cap()) { err = OxError(1, "String size exceeds capacity of destination"); } else { - ox_memcpy(val.data(), begin, static_cast(strSize)); - val.data()[strSize] = 0; + ox_memcpy(data, begin, static_cast(strSize)); + data[strSize] = 0; } } else { err = OxError(1, "Type mismatch"); diff --git a/deps/ox/src/ox/oc/read.hpp b/deps/ox/src/ox/oc/read.hpp index 3415a2eb..f2a0dc76 100644 --- a/deps/ox/src/ox/oc/read.hpp +++ b/deps/ox/src/ox/oc/read.hpp @@ -124,7 +124,7 @@ Error OrganicClawReader::field(const char *key, UnionView val) { const auto &jv = value(key); if (jv.empty() || jv.isObject()) { auto reader = child(key, val.idx()); - return model(&reader, val.get()); + err = model(&reader, val.get()); } else { err = OxError(1, "Type mismatch"); } @@ -178,9 +178,9 @@ Error readOC(const char *json, std::size_t jsonSize, T *val) noexcept { } template -ValErr readOC(const char *json) { - T val; - oxReturnError(readOC(json, ox_strlen(json), &val)); +ValErr> readOC(const char *json) { + auto val = std::make_unique(); + oxReturnError(readOC(json, ox_strlen(json), val.get())); return {std::move(val), OxError(0)}; } diff --git a/deps/ox/src/ox/oc/test/tests.cpp b/deps/ox/src/ox/oc/test/tests.cpp index e17e35e6..b868c44e 100644 --- a/deps/ox/src/ox/oc/test/tests.cpp +++ b/deps/ox/src/ox/oc/test/tests.cpp @@ -42,10 +42,16 @@ struct TestStruct { int32_t Int7 = 0; int32_t Int8 = 0; TestUnion Union; + char *CString = nullptr; ox::BString<32> String = ""; - uint32_t List[4] = {0, 0, 0 , 0}; + uint32_t List[4] = {0, 0, 0, 0}; TestStructNest EmptyStruct; TestStructNest Struct; + + ~TestStruct() { + delete[] CString; + } + }; template @@ -68,7 +74,7 @@ ox::Error model(T *io, TestStructNest *obj) { template ox::Error model(T *io, TestStruct *obj) { - io->setTypeInfo("TestStruct", 14); + io->setTypeInfo("TestStruct", 16); oxReturnError(io->field("Bool", &obj->Bool)); oxReturnError(io->field("Int", &obj->Int)); 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("Int8", &obj->Int8)); 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("List", obj->List, 4)); oxReturnError(io->field("EmptyStruct", &obj->EmptyStruct)); @@ -106,6 +113,8 @@ std::map tests = { testIn.Int = 42; testIn.Union.Int = 52; 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[1] = 2; testIn.List[2] = 3; @@ -120,28 +129,29 @@ std::map tests = { auto [testOut, readErr] = ox::readOC(oc.c_str()); oxAssert(readErr, "readOC failed"); - oxAssert(testIn.Bool == testOut.Bool, "Bool value mismatch"); - oxAssert(testIn.Int == testOut.Int, "Int value mismatch"); - oxAssert(testIn.Int1 == testOut.Int1, "Int1 value mismatch"); - oxAssert(testIn.Int2 == testOut.Int2, "Int2 value mismatch"); - oxAssert(testIn.Int3 == testOut.Int3, "Int3 value mismatch"); - oxAssert(testIn.Int4 == testOut.Int4, "Int4 value mismatch"); - oxAssert(testIn.Int5 == testOut.Int5, "Int5 value mismatch"); - oxAssert(testIn.Int6 == testOut.Int6, "Int6 value mismatch"); - oxAssert(testIn.Int7 == testOut.Int7, "Int7 value mismatch"); - oxAssert(testIn.Int8 == testOut.Int8, "Int8 value mismatch"); - oxAssert(testIn.Union.Int == testOut.Union.Int, "Union.Int value mismatch"); - oxAssert(testIn.String == testOut.String, "String value mismatch"); - oxAssert(testIn.List[0] == testOut.List[0], "List[0] value mismatch"); - oxAssert(testIn.List[1] == testOut.List[1], "List[1] value mismatch"); - oxAssert(testIn.List[2] == testOut.List[2], "List[2] value mismatch"); - oxAssert(testIn.List[3] == testOut.List[3], "List[3] value mismatch"); - oxAssert(testIn.EmptyStruct.Bool == testOut.EmptyStruct.Bool, "EmptyStruct.Bool value mismatch"); - oxAssert(testIn.EmptyStruct.Int == testOut.EmptyStruct.Int, "EmptyStruct.Int value mismatch"); - oxAssert(testIn.EmptyStruct.String == testOut.EmptyStruct.String, "EmptyStruct.String value mismatch"); - oxAssert(testIn.Struct.Int == testOut.Struct.Int, "Struct.Int value mismatch"); - oxAssert(testIn.Struct.String == testOut.Struct.String, "Struct.String value mismatch"); - oxAssert(testIn.Struct.Bool == testOut.Struct.Bool, "Struct.Bool value mismatch"); + oxAssert(testIn.Bool == testOut->Bool, "Bool value mismatch"); + oxAssert(testIn.Int == testOut->Int, "Int value mismatch"); + oxAssert(testIn.Int1 == testOut->Int1, "Int1 value mismatch"); + oxAssert(testIn.Int2 == testOut->Int2, "Int2 value mismatch"); + oxAssert(testIn.Int3 == testOut->Int3, "Int3 value mismatch"); + oxAssert(testIn.Int4 == testOut->Int4, "Int4 value mismatch"); + oxAssert(testIn.Int5 == testOut->Int5, "Int5 value mismatch"); + oxAssert(testIn.Int6 == testOut->Int6, "Int6 value mismatch"); + oxAssert(testIn.Int7 == testOut->Int7, "Int7 value mismatch"); + oxAssert(testIn.Int8 == testOut->Int8, "Int8 value mismatch"); + oxAssert(ox_strcmp(testIn.CString, testOut->CString) == 0, "CString value mismatch"); + oxAssert(testIn.Union.Int == testOut->Union.Int, "Union.Int value mismatch"); + oxAssert(testIn.String == testOut->String, "String value mismatch"); + oxAssert(testIn.List[0] == testOut->List[0], "List[0] value mismatch"); + oxAssert(testIn.List[1] == testOut->List[1], "List[1] value mismatch"); + oxAssert(testIn.List[2] == testOut->List[2], "List[2] value mismatch"); + oxAssert(testIn.List[3] == testOut->List[3], "List[3] value mismatch"); + oxAssert(testIn.EmptyStruct.Bool == testOut->EmptyStruct.Bool, "EmptyStruct.Bool value mismatch"); + oxAssert(testIn.EmptyStruct.Int == testOut->EmptyStruct.Int, "EmptyStruct.Int value mismatch"); + oxAssert(testIn.EmptyStruct.String == testOut->EmptyStruct.String, "EmptyStruct.String value mismatch"); + oxAssert(testIn.Struct.Int == testOut->Struct.Int, "Struct.Int 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); }