Fixed bug when a string contains a brace

This commit is contained in:
Benoit Blanchon
2014-08-25 12:23:08 +02:00
parent 8465cc0c83
commit 752378a8cb
3 changed files with 91 additions and 55 deletions

View File

@ -13,73 +13,32 @@ size_t PrettyPrintDecorator::write(uint8_t c)
{
case '{':
case '[':
if (previousChar == '{' || previousChar == '[')
{
n = writeln() + sink.write(c);
}
else
{
n = sink.write(c);
}
indent++;
n = inString ? writeNormalChar(c) : writeOpening(c);
break;
case '}':
case ']':
indent--;
if (previousChar == '{' || previousChar == '[')
{
n = sink.write(c);
}
else
{
n = writeln() + sink.write(c);
}
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;
}
@ -96,3 +55,50 @@ size_t PrettyPrintDecorator::writeln()
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);
}
}

View File

@ -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);
};

View File

@ -31,6 +31,30 @@ namespace JsonGeneratorTests
outputMustBe("\":\\\"',\"");
}
TEST_METHOD(OpeningCurlyBrace)
{
whenInputIs ("\"{\"");
outputMustBe("\"{\"");
}
TEST_METHOD(OpeningSquareBrace)
{
whenInputIs("\"[\"");
outputMustBe("\"[\"");
}
TEST_METHOD(ClosingCurlyBrace)
{
whenInputIs("\"}\"");
outputMustBe("\"}\"");
}
TEST_METHOD(ClosingSquareBrace)
{
whenInputIs("\"]\"");
outputMustBe("\"]\"");
}
private:
void whenInputIs(const char input[])