mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Changed JsonSink to match Arduino's Print class
This commit is contained in:
		| @@ -37,19 +37,25 @@ private: | |||||||
|     JsonValue items[N]; |     JsonValue items[N]; | ||||||
|     int itemCount; |     int itemCount; | ||||||
|  |  | ||||||
|     virtual void writeTo(JsonSink& sb) |     virtual size_t writeTo(JsonSink& sb) | ||||||
|     { |     { | ||||||
|         sb.append("["); |         size_t n = 0; | ||||||
|         sb.reserveRoom(1); |          | ||||||
|  |         n += sb.append("["); | ||||||
|  |  | ||||||
|         for (int i = 0; i < itemCount; i++) |         for (int i = 0; i < itemCount; i++) | ||||||
|         { |         { | ||||||
|             if (i>0) sb.append(","); |             if (i > 0) | ||||||
|             items[i].writeTo(sb); |             { | ||||||
|  |                 n += sb.append(","); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             n += items[i].writeTo(sb); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         sb.releaseRoom(1); |         n += sb.append("]"); | ||||||
|         sb.append("]"); |  | ||||||
|  |         return n; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -45,24 +45,29 @@ private: | |||||||
|     KeyValuePair items[N]; |     KeyValuePair items[N]; | ||||||
|     int itemCount; |     int itemCount; | ||||||
|  |  | ||||||
|     virtual void writeTo(JsonSink& sink) |     virtual size_t writeTo(JsonSink& sink) | ||||||
|     { |     { | ||||||
|         sink.append("{"); |         size_t n = 0; | ||||||
|         sink.reserveRoom(1); |  | ||||||
|  |         n += sink.append('{'); | ||||||
|  |  | ||||||
|         for (int i = 0; i < itemCount; i++) |         for (int i = 0; i < itemCount; i++) | ||||||
|         { |         { | ||||||
|             if (i>0) sink.append(","); |  | ||||||
|  |  | ||||||
|             JsonValue key(items[i].key); |             JsonValue key(items[i].key); | ||||||
|  |  | ||||||
|             key.writeTo(sink); |             if (i > 0) | ||||||
|             sink.append(":"); |             { | ||||||
|             items[i].value.writeTo(sink); |                 n += sink.append(','); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             n += key.writeTo(sink); | ||||||
|  |             n += sink.append(':'); | ||||||
|  |             n += items[i].value.writeTo(sink); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         sink.releaseRoom(1); |         n += sink.append('}'); | ||||||
|         sink.append("}"); |  | ||||||
|  |         return n; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,12 +12,12 @@ class JsonObjectBase | |||||||
| { | { | ||||||
| public: | public: | ||||||
|  |  | ||||||
|     void writeTo(char* buffer, size_t bufferSize) |     size_t writeTo(char* buffer, size_t bufferSize) | ||||||
|     { |     { | ||||||
|         StringBuilder sb(buffer, bufferSize); |         StringBuilder sb(buffer, bufferSize); | ||||||
|         writeTo(sb); |         return writeTo(sb); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     virtual void writeTo(JsonSink& sb) = 0; |     virtual size_t writeTo(JsonSink& sb) = 0; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,11 +9,16 @@ class JsonSink | |||||||
| { | { | ||||||
| public: | public: | ||||||
|  |  | ||||||
|     virtual void append(char c) = 0; |     virtual size_t append(char c) = 0; | ||||||
|     virtual void append(const char* s) = 0; |      | ||||||
|  |     size_t append(const char* s) | ||||||
|     virtual bool hasRoomFor(int n) = 0; |     { | ||||||
|     virtual void reserveRoom(int n) = 0; |         size_t n = 0; | ||||||
|     virtual void releaseRoom(int n) = 0; |         while (*s) | ||||||
|  |         { | ||||||
|  |             n += append(*s++); | ||||||
|  |         } | ||||||
|  |         return n; | ||||||
|  |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,29 +8,29 @@ | |||||||
| #include <cstdio> | #include <cstdio> | ||||||
| #include <cstring> | #include <cstring> | ||||||
|  |  | ||||||
| void JsonValue::writeBooleanTo(JsonSink& sb) | size_t JsonValue::writeBooleanTo(JsonSink& sb) | ||||||
| { | { | ||||||
|     sb.append(content.boolean ? "true" : "false"); |     return sb.append(content.boolean ? "true" : "false"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void JsonValue::writeNumberTo(JsonSink& sb) | size_t JsonValue::writeNumberTo(JsonSink& sb) | ||||||
| { | { | ||||||
|     char tmp[16]; |     char tmp[16]; | ||||||
|  |  | ||||||
|     _snprintf(tmp, sizeof(tmp), "%lg", content.number); |     _snprintf(tmp, sizeof(tmp), "%lg", content.number); | ||||||
|  |  | ||||||
|     sb.append(tmp); |     return sb.append(tmp); | ||||||
| } | } | ||||||
|  |  | ||||||
| void JsonValue::writeObjectTo(JsonSink& sink) | size_t JsonValue::writeObjectTo(JsonSink& sink) | ||||||
| { | { | ||||||
|     if (content.object) |     if (content.object) | ||||||
|         ((JsonObjectBase*) content.object)->writeTo(sink); |         return ((JsonObjectBase*)content.object)->writeTo(sink); | ||||||
|     else |     else | ||||||
|         sink.append("null"); |         return sink.append("null"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void JsonValue::writeStringTo(JsonSink& sink) | size_t JsonValue::writeStringTo(JsonSink& sink) | ||||||
| { | { | ||||||
|     auto s = content.string; |     auto s = content.string; | ||||||
|  |  | ||||||
| @@ -39,54 +39,51 @@ void JsonValue::writeStringTo(JsonSink& sink) | |||||||
|         return sink.append("null"); |         return sink.append("null"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!sink.hasRoomFor(2)) |     size_t n = 0; | ||||||
|     { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     sink.append('\"'); |     n += sink.append('\"'); | ||||||
|     sink.reserveRoom(1); |  | ||||||
|  |  | ||||||
|     while (*s) |     while (*s) | ||||||
|     { |     { | ||||||
|         switch (*s) |         switch (*s) | ||||||
|         { |         { | ||||||
|         case '"': |         case '"': | ||||||
|             sink.append("\\\""); |             n += sink.append("\\\""); | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case '\\': |         case '\\': | ||||||
|             sink.append("\\\\"); |             n += sink.append("\\\\"); | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case '\b': |         case '\b': | ||||||
|             sink.append("\\b"); |             n += sink.append("\\b"); | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case '\f': |         case '\f': | ||||||
|             sink.append("\\f"); |             n += sink.append("\\f"); | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case '\n': |         case '\n': | ||||||
|             sink.append("\\n"); |             n += sink.append("\\n"); | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case '\r': |         case '\r': | ||||||
|             sink.append("\\r"); |             n += sink.append("\\r"); | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         case '\t': |         case '\t': | ||||||
|             sink.append("\\t"); |             n += sink.append("\\t"); | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         default: |         default: | ||||||
|             sink.append(*s); |             n += sink.append(*s); | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         s++; |         s++; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     sink.releaseRoom(1); |     n += sink.append('\"'); | ||||||
|     sink.append('\"'); |  | ||||||
|  |     return n; | ||||||
| } | } | ||||||
| @@ -41,10 +41,10 @@ public: | |||||||
|         content.object = &value; |         content.object = &value; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void writeTo(JsonSink& sink) |     size_t writeTo(JsonSink& sink) | ||||||
|     { |     { | ||||||
|         // handmade polymorphism |         // handmade polymorphism | ||||||
|         (this->*implementation)(sink); |         return (this->*implementation)(sink); | ||||||
|     } |     } | ||||||
|      |      | ||||||
| private: | private: | ||||||
| @@ -59,10 +59,10 @@ private: | |||||||
|  |  | ||||||
|     Content content; |     Content content; | ||||||
|  |  | ||||||
|     void (JsonValue::*implementation)(JsonSink& sb); |     size_t (JsonValue::*implementation)(JsonSink& sb); | ||||||
|  |  | ||||||
|     void writeBooleanTo(JsonSink& sb); |     size_t writeBooleanTo(JsonSink& sb); | ||||||
|     void writeNumberTo(JsonSink& sb); |     size_t writeNumberTo(JsonSink& sb); | ||||||
|     void writeObjectTo(JsonSink& sb); |     size_t writeObjectTo(JsonSink& sb); | ||||||
|     void writeStringTo(JsonSink& sb); |     size_t writeStringTo(JsonSink& sb); | ||||||
| }; | }; | ||||||
| @@ -51,10 +51,10 @@ namespace JsonGeneratorTests | |||||||
|         TEST_METHOD(OverCapacity) |         TEST_METHOD(OverCapacity) | ||||||
|         { |         { | ||||||
|             append("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); |             append("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); | ||||||
|             assertResultIs("\"ABCDEFGHIJKLMNOPQ\""); |             assertResultIs("\"ABCDEFGHIJKLMNOPQR"); | ||||||
|  |  | ||||||
|             append(""); |             append(""); | ||||||
|             assertResultIs("\"ABCDEFGHIJKLMNOPQ\""); |             assertResultIs("\"ABCDEFGHIJKLMNOPQR"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         TEST_METHOD(SpecialChars) |         TEST_METHOD(SpecialChars) | ||||||
|   | |||||||
| @@ -5,23 +5,11 @@ | |||||||
|  |  | ||||||
| #include "StringBuilder.h" | #include "StringBuilder.h" | ||||||
|  |  | ||||||
| void StringBuilder::append(const char* s) | size_t StringBuilder::append(char c) | ||||||
| { | { | ||||||
|     char* tail = buffer + length; |     if (length >= capacity) return 0; | ||||||
|  |  | ||||||
|     while (*s && length<capacity) |  | ||||||
|     { |  | ||||||
|         buffer[length++] = *s++; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     buffer[length] = 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void StringBuilder::append(char c) |  | ||||||
| { |  | ||||||
|     if (length >= capacity) return; |  | ||||||
|  |  | ||||||
|     buffer[length++] = c; |     buffer[length++] = c; | ||||||
|     buffer[length] = 0; |     buffer[length] = 0; | ||||||
|  |     return 1; | ||||||
| } | } | ||||||
| @@ -16,23 +16,8 @@ public: | |||||||
|         buffer[0] = 0; |         buffer[0] = 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     virtual void append(char c); |     virtual size_t append(char c); | ||||||
|     virtual void append(const char* s); |     size_t append(const char* c); | ||||||
|  |  | ||||||
|     virtual bool hasRoomFor(int n) |  | ||||||
|     { |  | ||||||
|         return capacity - length >= n; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     virtual void reserveRoom(int n) |  | ||||||
|     { |  | ||||||
|         capacity -= n; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     virtual void releaseRoom(int n) |  | ||||||
|     { |  | ||||||
|         capacity += n; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     char* buffer; |     char* buffer; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user