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. static char unescapeChar(char c)
  8. {
  9. // Optimized for code size on a 8-bit AVR
  10. const char* p = "b\bf\fn\nr\rt\t";
  11. while (true)
  12. {
  13. if (p[0] == 0) return c;
  14. if (p[0] == c) return p[1];
  15. p += 2;
  16. }
  17. }
  18. static void unescapeString(char* s)
  19. {
  20. char* readPtr = s;
  21. char* writePtr = s;
  22. char c;
  23. do
  24. {
  25. c = *readPtr++;
  26. if (c == '\\')
  27. {
  28. c = unescapeChar(*readPtr++);
  29. }
  30. *writePtr++ = c;
  31. } while (c != 0);
  32. }
  33. char* JsonToken::getText()
  34. {
  35. char* s = json + token->start;
  36. json[token->end] = 0;
  37. unescapeString(s);
  38. return s;
  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. }