Files
ArduinoJson/JsonParser/JsonToken.cpp

71 lines
1.2 KiB
C++
Raw Permalink Normal View History

2014-07-22 20:28:59 +02:00
/*
* Arduino JSON library
* Benoit Blanchon 2014 - MIT License
*/
2014-07-18 15:43:20 +02:00
#include "JsonToken.h"
2014-07-19 12:44:27 +02:00
using namespace ArduinoJson::Parser;
2014-07-18 15:43:20 +02:00
2014-09-09 21:23:37 +02:00
char* JsonToken::getText()
2014-09-04 21:45:41 +02:00
{
2014-09-09 21:23:37 +02:00
char* s = json + token->start;
json[token->end] = 0;
2014-09-07 20:11:33 +02:00
2014-09-09 21:23:37 +02:00
unescapeString(s);
2014-09-07 20:11:33 +02:00
2014-09-09 21:23:37 +02:00
return s;
2014-09-04 21:45:41 +02:00
}
2014-09-09 21:23:37 +02:00
inline void JsonToken::unescapeString(char* s)
2014-09-04 21:45:41 +02:00
{
char* readPtr = s;
char* writePtr = s;
2014-09-07 19:55:54 +02:00
char c;
2014-09-04 21:45:41 +02:00
2014-09-07 19:55:54 +02:00
do
2014-09-04 21:45:41 +02:00
{
2014-09-09 21:23:37 +02:00
c = *readPtr++;
2014-09-07 19:55:54 +02:00
if (c == '\\')
2014-09-04 21:45:41 +02:00
{
2014-09-07 19:55:54 +02:00
c = unescapeChar(*readPtr++);
2014-09-04 21:45:41 +02:00
}
2014-09-07 19:55:54 +02:00
*writePtr++ = c;
2014-09-04 21:45:41 +02:00
2014-09-07 19:55:54 +02:00
} while (c != 0);
2014-09-04 21:45:41 +02:00
}
2014-09-09 21:23:37 +02:00
inline char JsonToken::unescapeChar(char c)
2014-09-04 21:45:41 +02:00
{
2014-09-09 21:23:37 +02:00
// Optimized for code size on a 8-bit AVR
2014-09-04 21:45:41 +02:00
2014-09-09 21:23:37 +02:00
const char* p = "b\bf\fn\nr\rt\t";
2014-09-04 21:45:41 +02:00
2014-09-09 21:23:37 +02:00
while (true)
{
if (p[0] == 0) return c;
if (p[0] == c) return p[1];
p += 2;
}
2014-09-04 21:45:41 +02:00
}
JsonToken JsonToken::nextSibling() const
2014-07-18 15:43:20 +02:00
{
2014-07-22 20:28:59 +02:00
// start with current token
2014-07-18 15:43:20 +02:00
jsmntok_t* t = token;
2014-07-22 20:28:59 +02:00
// count the number of token to skip
2014-07-18 16:22:09 +02:00
int yetToVisit = 1;
2014-07-22 20:28:59 +02:00
// skip all nested tokens
2014-07-18 15:43:20 +02:00
while (yetToVisit)
{
2014-07-18 16:22:09 +02:00
yetToVisit += t->size - 1;
2014-07-18 15:43:20 +02:00
t++;
}
2014-07-22 20:28:59 +02:00
// build a JsonToken at the new location
2014-07-19 12:44:27 +02:00
return JsonToken(json, t);
2014-07-18 15:43:20 +02:00
}