diff options
-rw-r--r-- | include/tools/json_writer.hxx | 14 | ||||
-rw-r--r-- | tools/qa/cppunit/test_json_writer.cxx | 10 | ||||
-rw-r--r-- | tools/source/misc/json_writer.cxx | 16 |
3 files changed, 27 insertions, 13 deletions
diff --git a/include/tools/json_writer.hxx b/include/tools/json_writer.hxx index c1438783de78..c0312f6c581d 100644 --- a/include/tools/json_writer.hxx +++ b/include/tools/json_writer.hxx @@ -11,7 +11,6 @@ #include <tools/toolsdllapi.h> #include <rtl/ustring.hxx> #include <algorithm> -#include <memory> /** Simple JSON encoder designed specifically for LibreOfficeKit purposes. * @@ -28,7 +27,7 @@ class TOOLS_DLLPUBLIC JsonWriter friend class ScopedJsonWriterNode; int mSpaceAllocated; - std::unique_ptr<char[]> maBuffer; + char* mpBuffer; int mStartNodeCount; char* mPos; bool mbFirstFieldInNode; @@ -54,14 +53,15 @@ private: inline void ensureSpace(int noMoreBytesRequired) { - int currentUsed = mPos - maBuffer.get(); + int currentUsed = mPos - mpBuffer; if (currentUsed + noMoreBytesRequired >= mSpaceAllocated) { auto newSize = std::max(mSpaceAllocated * 2, (currentUsed + noMoreBytesRequired) * 2); - auto pNew = new char[newSize]; - memcpy(pNew, maBuffer.get(), currentUsed); - maBuffer.reset(pNew); - mPos = maBuffer.get(); + char* pNew = static_cast<char*>(malloc(newSize)); + memcpy(pNew, mpBuffer, currentUsed); + free(mpBuffer); + mpBuffer = pNew; + mPos = mpBuffer; } } }; diff --git a/tools/qa/cppunit/test_json_writer.cxx b/tools/qa/cppunit/test_json_writer.cxx index c4e9331c8d17..e27afc95f712 100644 --- a/tools/qa/cppunit/test_json_writer.cxx +++ b/tools/qa/cppunit/test_json_writer.cxx @@ -7,6 +7,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include <sal/config.h> + +#include <cstdlib> + #include <cppunit/extensions/HelperMacros.h> #include <test/bootstrapfixture.hxx> #include <rtl/ustring.hxx> @@ -44,7 +48,11 @@ void JsonWriterTest::test1() aJson.put("int", 12); } - std::unique_ptr<char[]> result(aJson.extractData()); + struct Free + { + void operator()(void* p) const { std::free(p); } + }; + std::unique_ptr<char, Free> result(aJson.extractData()); CPPUNIT_ASSERT_EQUAL(std::string("{ \"node\": { \"oustring\": \"val1\", \"ostring\": \"val2\", " "\"charptr\": \"val3\", \"int\": 12}}"), diff --git a/tools/source/misc/json_writer.cxx b/tools/source/misc/json_writer.cxx index 81b22e92a2d1..8a57e2ac337f 100644 --- a/tools/source/misc/json_writer.cxx +++ b/tools/source/misc/json_writer.cxx @@ -19,9 +19,9 @@ constexpr int DEFAULT_BUFFER_SIZE = 2048; JsonWriter::JsonWriter() : mSpaceAllocated(DEFAULT_BUFFER_SIZE) - , maBuffer(new char[mSpaceAllocated]) + , mpBuffer(static_cast<char*>(malloc(mSpaceAllocated))) , mStartNodeCount(0) - , mPos(maBuffer.get()) + , mPos(mpBuffer) { *mPos = '{'; ++mPos; @@ -29,7 +29,11 @@ JsonWriter::JsonWriter() ++mPos; } -JsonWriter::~JsonWriter() { assert(!maBuffer && "forgot to extract data?"); } +JsonWriter::~JsonWriter() +{ + assert(!mpBuffer && "forgot to extract data?"); + free(mpBuffer); +} ScopedJsonWriterNode JsonWriter::startNode(const char* pNodeName) { @@ -239,14 +243,16 @@ void JsonWriter::addCommaBeforeField() char* JsonWriter::extractData() { assert(mStartNodeCount == 0 && "did not close all nodes"); - assert(maBuffer && "data already extracted"); + assert(mpBuffer && "data already extracted"); // add closing brace *mPos = '}'; ++mPos; // null-terminate *mPos = 0; mPos = nullptr; - return maBuffer.release(); + char* pRet = nullptr; + std::swap(pRet, mpBuffer); + return pRet; } } // namespace tools |