From 6b2705769a49830101cc1ab8497d8dc4a19487ac Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Tue, 30 Sep 2014 16:40:00 +0200 Subject: [PATCH] Refactored to use StringBuilder --- srcs/JsonObject.cpp | 19 +++++++++--- srcs/JsonObject.h | 5 +++- srcs/Print.cpp | 40 ++++++++++++++++++++++++++ srcs/Print.h | 30 +++++++++++++++++++ srcs/StringBuilder.cpp | 17 +++++++++++ srcs/StringBuilder.h | 31 ++++++++++++++++++++ srcs/srcs.vcxproj | 6 ++++ srcs/srcs.vcxproj.filters | 12 ++++++++ tests/JsonObjectSerializationTests.cpp | 2 +- 9 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 srcs/Print.cpp create mode 100644 srcs/Print.h create mode 100644 srcs/StringBuilder.cpp create mode 100644 srcs/StringBuilder.h diff --git a/srcs/JsonObject.cpp b/srcs/JsonObject.cpp index da408a3e..efb2120c 100644 --- a/srcs/JsonObject.cpp +++ b/srcs/JsonObject.cpp @@ -1,8 +1,13 @@ -#include "JsonBuffer.h" #include "JsonObject.h" + +#include // for strcmp + +#include "JsonBuffer.h" #include "JsonValue.h" #include "JsonNode.h" -#include // for strcmp +#include "StringBuilder.h" + +using namespace ArduinoJson::Internals; //JsonValue& JsonObject::operator[](char const* key) //{ @@ -89,7 +94,13 @@ JsonNode* JsonObject::getOrCreateNodeAt(char const* key) return newValueNode; } -void JsonObject::serialize(char* buffer, size_t bufferSize) const +void JsonObject::printTo(char* buffer, size_t bufferSize) const { - strcpy_s(buffer, bufferSize, "{}"); + StringBuilder sb(buffer, bufferSize); + printTo(sb); +} + +void JsonObject::printTo(Print& p) const +{ + p.print("{}"); } \ No newline at end of file diff --git a/srcs/JsonObject.h b/srcs/JsonObject.h index 02364810..7fd2f1aa 100644 --- a/srcs/JsonObject.h +++ b/srcs/JsonObject.h @@ -1,5 +1,7 @@ #pragma once +#include "Printable.h" + class JsonValue; struct JsonNode; @@ -24,7 +26,8 @@ public: bool operator==(const JsonObject& other) const; - void serialize(char* buffer, size_t bufferSize) const; + void printTo(char* buffer, size_t bufferSize) const; + void printTo(Print& print) const; private: JsonNode* _node; diff --git a/srcs/Print.cpp b/srcs/Print.cpp new file mode 100644 index 00000000..daa26b43 --- /dev/null +++ b/srcs/Print.cpp @@ -0,0 +1,40 @@ +/* + * Arduino JSON library + * Benoit Blanchon 2014 - MIT License + */ + +#ifndef ARDUINO + +#include "Print.h" +#include + +size_t Print::print(const char s[]) +{ + size_t n = 0; + while (*s) + { + n += write(*s++); + } + return n; +} + +size_t Print::print(double value, int digits) +{ + char tmp[32]; + sprintf(tmp, "%.*lg", digits+1, value); + return print(tmp); +} + +size_t Print::print(long value) +{ + char tmp[32]; + sprintf(tmp, "%ld", value); + return print(tmp); +} + +size_t Print::println() +{ + return write('\r') + write('\n'); +} + +#endif \ No newline at end of file diff --git a/srcs/Print.h b/srcs/Print.h new file mode 100644 index 00000000..e5b3381d --- /dev/null +++ b/srcs/Print.h @@ -0,0 +1,30 @@ +/* + * Arduino JSON library + * Benoit Blanchon 2014 - MIT License + */ + +#pragma once + +#ifndef ARDUINO + +#include +#include + +// This class reproduces Arduino's Print +class Print +{ +public: + + virtual size_t write(uint8_t) = 0; + + size_t print(const char[]); + size_t print(double, int = 2); + size_t print(long); + size_t println(); +}; + +#else + +#include + +#endif diff --git a/srcs/StringBuilder.cpp b/srcs/StringBuilder.cpp new file mode 100644 index 00000000..debf4fd7 --- /dev/null +++ b/srcs/StringBuilder.cpp @@ -0,0 +1,17 @@ +/* + * Arduino JSON library + * Benoit Blanchon 2014 - MIT License + */ + +#include "StringBuilder.h" + +using namespace ArduinoJson::Internals; + +size_t StringBuilder::write(uint8_t c) +{ + if (length >= capacity) return 0; + + buffer[length++] = c; + buffer[length] = 0; + return 1; +} \ No newline at end of file diff --git a/srcs/StringBuilder.h b/srcs/StringBuilder.h new file mode 100644 index 00000000..3e0bc96f --- /dev/null +++ b/srcs/StringBuilder.h @@ -0,0 +1,31 @@ +/* + * Arduino JSON library + * Benoit Blanchon 2014 - MIT License + */ + +#pragma once + +#include "Print.h" + +namespace ArduinoJson +{ + namespace Internals + { + class StringBuilder : public Print + { + public: + StringBuilder(char* buf, int size) + : buffer(buf), capacity(size - 1), length(0) + { + buffer[0] = 0; + } + + virtual size_t write(uint8_t c); + + private: + char* buffer; + int capacity; + int length; + }; + } +} \ No newline at end of file diff --git a/srcs/srcs.vcxproj b/srcs/srcs.vcxproj index c6afde80..7a32c7b6 100644 --- a/srcs/srcs.vcxproj +++ b/srcs/srcs.vcxproj @@ -45,6 +45,7 @@ Level3 Disabled true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -57,6 +58,7 @@ true true true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -69,12 +71,16 @@ + + + + diff --git a/srcs/srcs.vcxproj.filters b/srcs/srcs.vcxproj.filters index 397cae34..9b29041d 100644 --- a/srcs/srcs.vcxproj.filters +++ b/srcs/srcs.vcxproj.filters @@ -30,6 +30,12 @@ Header Files + + Header Files + + + Header Files + @@ -41,5 +47,11 @@ Source Files + + Source Files + + + Source Files + \ No newline at end of file diff --git a/tests/JsonObjectSerializationTests.cpp b/tests/JsonObjectSerializationTests.cpp index 54c46045..2dd0ddf9 100644 --- a/tests/JsonObjectSerializationTests.cpp +++ b/tests/JsonObjectSerializationTests.cpp @@ -13,7 +13,7 @@ protected: void jsonMustBe(const char* expected) { char actual[256]; - object.serialize(actual, sizeof(actual)); + object.printTo(actual, sizeof(actual)); EXPECT_STREQ(expected, actual); }