mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Extracted class StringBuilder
This commit is contained in:
		| @@ -3,6 +3,4 @@ | |||||||
| * Benoit Blanchon 2014 - MIT License | * Benoit Blanchon 2014 - MIT License | ||||||
| */ | */ | ||||||
|  |  | ||||||
| #include <string.h> |  | ||||||
|  |  | ||||||
| #include "JsonArray.h" | #include "JsonArray.h" | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <stdarg.h> | #include "StringBuilder.h" | ||||||
|  |  | ||||||
| enum JsonObjectType | enum JsonObjectType | ||||||
| { | { | ||||||
| @@ -67,14 +67,22 @@ public: | |||||||
|  |  | ||||||
|     void writeTo(char* buffer, size_t bufferSize) |     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++) |         for (int i = 0; i < itemCount; i++) | ||||||
|         { |         { | ||||||
|             if (i>0) |             if (i>0) | ||||||
|                 append(buffer, bufferSize, ","); |                 sb.append(","); | ||||||
|  |  | ||||||
|             JsonObjectValue value = items[i].value; |             JsonObjectValue value = items[i].value; | ||||||
|  |  | ||||||
| @@ -82,36 +90,22 @@ public: | |||||||
|             { |             { | ||||||
|             case JSON_STRING: |             case JSON_STRING: | ||||||
|                 if (value.string) |                 if (value.string) | ||||||
|                     append(buffer, bufferSize, "\"%s\"", value.string); |                     sb.append("\"%s\"", value.string); | ||||||
|                 else |                 else | ||||||
|                     append(buffer, bufferSize, "null"); |                     sb.append("null"); | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case JSON_NUMBER: |             case JSON_NUMBER: | ||||||
|                 append(buffer, bufferSize, "%lg", value.number); |                 sb.append("%lg", value.number); | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case JSON_BOOLEAN: |             case JSON_BOOLEAN: | ||||||
|                 append(buffer, bufferSize, value.boolean ? "true" : "false"); |                 sb.append(value.boolean ? "true" : "false"); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         append(buffer, bufferSize, "]"); |         sb.append("]"); | ||||||
|     } |  | ||||||
|  |  | ||||||
| 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); |  | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -84,9 +84,11 @@ | |||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="JsonArray.cpp" /> |     <ClCompile Include="JsonArray.cpp" /> | ||||||
|     <ClCompile Include="JsonArrayTests.cpp" /> |     <ClCompile Include="JsonArrayTests.cpp" /> | ||||||
|  |     <ClCompile Include="StringBuilder.cpp" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="JsonArray.h" /> |     <ClInclude Include="JsonArray.h" /> | ||||||
|  |     <ClInclude Include="StringBuilder.h" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||||
|   <ImportGroup Label="ExtensionTargets"> |   <ImportGroup Label="ExtensionTargets"> | ||||||
|   | |||||||
| @@ -21,10 +21,16 @@ | |||||||
|     <ClCompile Include="JsonArray.cpp"> |     <ClCompile Include="JsonArray.cpp"> | ||||||
|       <Filter>Source Files</Filter> |       <Filter>Source Files</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="StringBuilder.cpp"> | ||||||
|  |       <Filter>Source Files</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="JsonArray.h"> |     <ClInclude Include="JsonArray.h"> | ||||||
|       <Filter>Header Files</Filter> |       <Filter>Header Files</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="StringBuilder.h"> | ||||||
|  |       <Filter>Header Files</Filter> | ||||||
|  |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
| </Project> | </Project> | ||||||
							
								
								
									
										14
									
								
								JsonGeneratorTests/StringBuilder.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								JsonGeneratorTests/StringBuilder.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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); | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								JsonGeneratorTests/StringBuilder.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								JsonGeneratorTests/StringBuilder.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | /* | ||||||
|  |  * Arduino JSON library | ||||||
|  |  * Benoit Blanchon 2014 - MIT License | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <cstdarg> | ||||||
|  | #include <cstdio> | ||||||
|  | #include <cstring> | ||||||
|  |  | ||||||
|  | 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; | ||||||
|  | }; | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user