From 6f247a508010efa549278009bd3519cca40511da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Blanchon?= Date: Wed, 25 Jun 2014 13:02:39 +0200 Subject: [PATCH] Extracted class StringBuilder --- JsonGeneratorTests/JsonArray.cpp | 2 - JsonGeneratorTests/JsonArray.h | 40 ++++++++----------- JsonGeneratorTests/JsonGeneratorTests.vcxproj | 2 + .../JsonGeneratorTests.vcxproj.filters | 6 +++ JsonGeneratorTests/StringBuilder.cpp | 14 +++++++ JsonGeneratorTests/StringBuilder.h | 27 +++++++++++++ 6 files changed, 66 insertions(+), 25 deletions(-) create mode 100644 JsonGeneratorTests/StringBuilder.cpp create mode 100644 JsonGeneratorTests/StringBuilder.h diff --git a/JsonGeneratorTests/JsonArray.cpp b/JsonGeneratorTests/JsonArray.cpp index 62ce93ae..dfa99071 100644 --- a/JsonGeneratorTests/JsonArray.cpp +++ b/JsonGeneratorTests/JsonArray.cpp @@ -3,6 +3,4 @@ * Benoit Blanchon 2014 - MIT License */ -#include - #include "JsonArray.h" diff --git a/JsonGeneratorTests/JsonArray.h b/JsonGeneratorTests/JsonArray.h index 3fead4f9..b731fef7 100644 --- a/JsonGeneratorTests/JsonArray.h +++ b/JsonGeneratorTests/JsonArray.h @@ -5,7 +5,7 @@ #pragma once -#include +#include "StringBuilder.h" enum JsonObjectType { @@ -67,14 +67,22 @@ public: void writeTo(char* buffer, size_t bufferSize) { - buffer[0] = 0; + StringBuilder sb(buffer, bufferSize); + writeTo(sb); + } - append(buffer, bufferSize, "["); +private: + JsonObject items[N]; + int itemCount; + + void writeTo(StringBuilder& sb) + { + sb.append("["); for (int i = 0; i < itemCount; i++) { if (i>0) - append(buffer, bufferSize, ","); + sb.append(","); JsonObjectValue value = items[i].value; @@ -82,36 +90,22 @@ public: { case JSON_STRING: if (value.string) - append(buffer, bufferSize, "\"%s\"", value.string); + sb.append("\"%s\"", value.string); else - append(buffer, bufferSize, "null"); + sb.append("null"); break; case JSON_NUMBER: - append(buffer, bufferSize, "%lg", value.number); + sb.append("%lg", value.number); break; case JSON_BOOLEAN: - append(buffer, bufferSize, value.boolean ? "true" : "false"); + sb.append(value.boolean ? "true" : "false"); break; } } - append(buffer, bufferSize, "]"); - } - -private: - JsonObject items[N]; - int itemCount; - - void append(char* dest, size_t destSize, const char* format, ...) - { - int len = strlen(dest); - - va_list args; - va_start(args, format); - vsnprintf(dest + len, destSize - len, format, args); - va_end(args); + sb.append("]"); } }; diff --git a/JsonGeneratorTests/JsonGeneratorTests.vcxproj b/JsonGeneratorTests/JsonGeneratorTests.vcxproj index fd6b59df..4904ab4f 100644 --- a/JsonGeneratorTests/JsonGeneratorTests.vcxproj +++ b/JsonGeneratorTests/JsonGeneratorTests.vcxproj @@ -84,9 +84,11 @@ + + diff --git a/JsonGeneratorTests/JsonGeneratorTests.vcxproj.filters b/JsonGeneratorTests/JsonGeneratorTests.vcxproj.filters index ee0db9b8..7f5fd808 100644 --- a/JsonGeneratorTests/JsonGeneratorTests.vcxproj.filters +++ b/JsonGeneratorTests/JsonGeneratorTests.vcxproj.filters @@ -21,10 +21,16 @@ Source Files + + Source Files + Header Files + + Header Files + \ No newline at end of file diff --git a/JsonGeneratorTests/StringBuilder.cpp b/JsonGeneratorTests/StringBuilder.cpp new file mode 100644 index 00000000..a8ec22f6 --- /dev/null +++ b/JsonGeneratorTests/StringBuilder.cpp @@ -0,0 +1,14 @@ +#include "StringBuilder.h" + + +void StringBuilder::append(const char* format, ...) +{ + char* tail = buffer + length; + + va_list args; + va_start(args, format); + vsnprintf(tail, capacity - length, format, args); + va_end(args); + + length += strlen(tail); +} \ No newline at end of file diff --git a/JsonGeneratorTests/StringBuilder.h b/JsonGeneratorTests/StringBuilder.h new file mode 100644 index 00000000..8c77fa91 --- /dev/null +++ b/JsonGeneratorTests/StringBuilder.h @@ -0,0 +1,27 @@ +/* + * Arduino JSON library + * Benoit Blanchon 2014 - MIT License + */ + +#pragma once + +#include +#include +#include + +class StringBuilder +{ +public: + StringBuilder(char* buf, size_t size) + : buffer(buf), capacity(size), length(0) + { + } + + void append(const char* format, ...); + +private: + char* buffer; + int capacity; + int length; +}; +