JsonToken.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Arduino JSON library
  3. * Benoit Blanchon 2014 - MIT License
  4. */
  5. #include "JsonToken.h"
  6. using namespace ArduinoJson::Parser;
  7. char* JsonToken::getText()
  8. {
  9. char* s = json + token->start;
  10. json[token->end] = 0;
  11. unescapeString(s);
  12. return s;
  13. }
  14. inline void JsonToken::unescapeString(char* s)
  15. {
  16. char* readPtr = s;
  17. char* writePtr = s;
  18. char c;
  19. do
  20. {
  21. c = *readPtr++;
  22. if (c == '\\')
  23. {
  24. c = unescapeChar(*readPtr++);
  25. }
  26. *writePtr++ = c;
  27. } while (c != 0);
  28. }
  29. inline char JsonToken::unescapeChar(char c)
  30. {
  31. // Optimized for code size on a 8-bit AVR
  32. const char* p = "b\bf\fn\nr\rt\t";
  33. while (true)
  34. {
  35. if (p[0] == 0) return c;
  36. if (p[0] == c) return p[1];
  37. p += 2;
  38. }
  39. }
  40. JsonToken JsonToken::nextSibling() const
  41. {
  42. // start with current token
  43. jsmntok_t* t = token;
  44. // count the number of token to skip
  45. int yetToVisit = 1;
  46. // skip all nested tokens
  47. while (yetToVisit)
  48. {
  49. yetToVisit += t->size - 1;
  50. t++;
  51. }
  52. // build a JsonToken at the new location
  53. return JsonToken(json, t);
  54. }