Files
ArduinoJson/src/Internals/QuotedString.cpp

119 lines
2.1 KiB
C++
Raw Normal View History

2014-10-16 16:25:42 +02:00
/*
* Arduino JSON library
* Benoit Blanchon 2014 - MIT License
*/
#include "ArduinoJson/Internals/QuotedString.hpp"
2014-10-16 16:25:42 +02:00
using namespace ArduinoJson::Internals;
static inline char getSpecialChar(char c)
{
// Optimized for code size on a 8-bit AVR
const char* p = "\"\"\\\\\bb\ff\nn\rr\tt\0";
while (p[0] && p[0] != c)
{
p += 2;
}
return p[1];
}
static inline size_t printCharTo(char c, Print* p)
{
char specialChar = getSpecialChar(c);
return specialChar != 0
? p->write('\\') + p->write(specialChar)
: p->write(c);
}
size_t QuotedString::printTo(const char* s, Print* p)
2014-10-16 16:25:42 +02:00
{
if (!s) return p->print("null");
size_t n = p->write('\"');
while (*s)
{
n += printCharTo(*s++, p);
}
return n + p->write('\"');
2014-10-17 19:57:00 +02:00
}
static char unescapeChar(char c)
{
// Optimized for code size on a 8-bit AVR
const char* p = "b\bf\fn\nr\rt\t";
while (true)
{
if (p[0] == 0) return c;
if (p[0] == c) return p[1];
p += 2;
}
}
static inline bool isQuote(char c)
2014-10-17 19:57:00 +02:00
{
return c == '\"' || c == '\'';
}
char* QuotedString::extractFrom(char* input, char** endPtr)
{
char firstChar = *input;
char stopChar;
char* startPtr;
if (isQuote(firstChar))
{
stopChar = firstChar; // closing quote is the same as opening quote
startPtr = input + 1; // skip the quote
}
else
{
stopChar = ':'; // assume we're parsing a key in an object
startPtr = input; // no quote to skip
}
char* readPtr = startPtr;
char* writePtr = startPtr;
2014-10-17 19:57:00 +02:00
char c;
for (;;)
2014-10-17 19:57:00 +02:00
{
c = *readPtr++;
if (c == 0)
{
// premature ending
return 0;
}
if (c == stopChar)
{
// closing quote
2014-10-17 19:57:00 +02:00
break;
}
2014-10-17 19:57:00 +02:00
if (c == '\\')
{
// replace char
2014-10-17 19:57:00 +02:00
c = unescapeChar(*readPtr++);
}
*writePtr++ = c;
2014-10-22 10:55:36 +02:00
}
2014-10-17 19:57:00 +02:00
// end the string here
2014-10-17 19:57:00 +02:00
*writePtr = 0;
// update end ptr
*endPtr = readPtr;
2014-10-17 19:57:00 +02:00
return startPtr;
}