summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/tools/json_writer.hxx14
-rw-r--r--tools/qa/cppunit/test_json_writer.cxx10
-rw-r--r--tools/source/misc/json_writer.cxx16
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