mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Fixed bug when a string contains a brace
This commit is contained in:
		| @@ -12,74 +12,33 @@ size_t PrettyPrintDecorator::write(uint8_t c) | ||||
|     switch (c) | ||||
|     { | ||||
|     case '{': | ||||
|     case '[':               | ||||
|  | ||||
|         if (previousChar == '{' || previousChar == '[') | ||||
|         { | ||||
|             n = writeln() + sink.write(c); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             n = sink.write(c); | ||||
|         } | ||||
|  | ||||
|         indent++; | ||||
|     case '[': | ||||
|         n = inString ? writeNormalChar(c) : writeOpening(c);         | ||||
|         break; | ||||
|  | ||||
|     case '}': | ||||
|     case ']': | ||||
|         indent--; | ||||
|  | ||||
|         if (previousChar == '{' || previousChar == '[') | ||||
|         { | ||||
|             n = sink.write(c); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             n = writeln() + sink.write(c); | ||||
|         } | ||||
|     case ']':   | ||||
|         n = inString ? writeNormalChar(c) : writeClosing(c); | ||||
|         break; | ||||
|          | ||||
|     case ',': | ||||
|         if (isInAString) | ||||
|         { | ||||
|             n = sink.write(c); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             n = sink.write(c) + writeln(); | ||||
|         } | ||||
|         n = inString ? writeNormalChar(c) : writeComma(); | ||||
|         break; | ||||
|  | ||||
|     case ':': | ||||
|         if (isInAString) | ||||
|         { | ||||
|             n = sink.write(c); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             n = sink.write(c) + sink.write(' '); | ||||
|         } | ||||
|         n = inString ? writeNormalChar(c) : writeColumn(); | ||||
|         break; | ||||
|  | ||||
|     case '\"': | ||||
|         n = writeNormalChar(c); | ||||
|  | ||||
|         if (previousChar != '\\') | ||||
|         { | ||||
|             isInAString = !isInAString; | ||||
|         } | ||||
|         // no break; | ||||
|             inString = !inString; | ||||
|  | ||||
|         break; | ||||
|  | ||||
|     default: | ||||
|  | ||||
|         if (previousChar == '{' || previousChar == '[') | ||||
|         { | ||||
|             n = writeln() + sink.write(c); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             n = sink.write(c); | ||||
|         } | ||||
|  | ||||
|         n = writeNormalChar(c);      | ||||
|         break; | ||||
|     } | ||||
|  | ||||
| @@ -95,4 +54,51 @@ size_t PrettyPrintDecorator::writeln() | ||||
|         n += sink.write(' '); | ||||
|  | ||||
|     return n; | ||||
| } | ||||
|  | ||||
| size_t PrettyPrintDecorator::writeNormalChar(uint8_t c) | ||||
| { | ||||
|     bool inEmptyBlock = !inString && (previousChar == '{' || previousChar == '['); | ||||
|  | ||||
|     return inEmptyBlock ? writeln() + sink.write(c) : sink.write(c); | ||||
| } | ||||
|  | ||||
| size_t PrettyPrintDecorator::writeColumn() | ||||
| { | ||||
|     return sink.write(':') + sink.write(' '); | ||||
| } | ||||
|  | ||||
| size_t PrettyPrintDecorator::writeComma() | ||||
| { | ||||
|     return sink.write(',') + writeln(); | ||||
| } | ||||
|  | ||||
| size_t PrettyPrintDecorator::writeOpening(uint8_t c) | ||||
| { | ||||
|     size_t n; | ||||
|      | ||||
|     if (previousChar == '{' || previousChar == '[') | ||||
|     { | ||||
|         n = writeln() + sink.write(c); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         n = sink.write(c); | ||||
|     } | ||||
|  | ||||
|     indent++; | ||||
|     return n; | ||||
| } | ||||
|  | ||||
| size_t PrettyPrintDecorator::writeClosing(uint8_t c) | ||||
| { | ||||
|     indent--; | ||||
|     if (previousChar == '{' || previousChar == '[') | ||||
|     { | ||||
|         return sink.write(c); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         return writeln() + sink.write(c); | ||||
|     } | ||||
| } | ||||
| @@ -16,7 +16,7 @@ public: | ||||
|         : indent(0), sink(p) | ||||
|     { | ||||
|         previousChar = 0; | ||||
|         isInAString = false; | ||||
|         inString = false; | ||||
|     } | ||||
|  | ||||
|     virtual size_t write(uint8_t); | ||||
| @@ -25,8 +25,14 @@ private: | ||||
|     int indent; | ||||
|     uint8_t previousChar; | ||||
|     Print& sink; | ||||
|     bool isInAString; | ||||
|     bool inString; | ||||
|  | ||||
|     size_t writeln(); | ||||
|  | ||||
|     size_t writeNormalChar(uint8_t c); | ||||
|     size_t writeColumn(); | ||||
|     size_t writeComma(); | ||||
|     size_t writeOpening(uint8_t c); | ||||
|     size_t writeClosing(uint8_t c); | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -30,6 +30,30 @@ namespace JsonGeneratorTests | ||||
|             whenInputIs ("\":\\\"',\""); | ||||
|             outputMustBe("\":\\\"',\""); | ||||
|         } | ||||
|  | ||||
|         TEST_METHOD(OpeningCurlyBrace) | ||||
|         { | ||||
|             whenInputIs ("\"{\""); | ||||
|             outputMustBe("\"{\""); | ||||
|         } | ||||
|  | ||||
|         TEST_METHOD(OpeningSquareBrace) | ||||
|         { | ||||
|             whenInputIs("\"[\""); | ||||
|             outputMustBe("\"[\""); | ||||
|         } | ||||
|  | ||||
|         TEST_METHOD(ClosingCurlyBrace) | ||||
|         { | ||||
|             whenInputIs("\"}\""); | ||||
|             outputMustBe("\"}\""); | ||||
|         } | ||||
|  | ||||
|         TEST_METHOD(ClosingSquareBrace) | ||||
|         { | ||||
|             whenInputIs("\"]\""); | ||||
|             outputMustBe("\"]\""); | ||||
|         } | ||||
|                 | ||||
|     private: | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user