JsonToken.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. switch (c)
  10. {
  11. case 'b': return '\b';
  12. case 'f': return '\f';
  13. case 'n': return '\n';
  14. case 'r': return '\r';
  15. case 't': return '\t';
  16. default: return c;
  17. }
  18. }
  19. static void unescapeString(char* s)
  20. {
  21. char* readPtr = s;
  22. char* writePtr = s;
  23. while (true)
  24. {
  25. if (*readPtr == '\\')
  26. {
  27. readPtr++;
  28. *writePtr = unescapeChar(*readPtr);
  29. }
  30. else
  31. {
  32. *writePtr = *readPtr;
  33. }
  34. if (*writePtr == 0) break;
  35. readPtr++;
  36. writePtr++;
  37. }
  38. }
  39. char* JsonToken::getText()
  40. {
  41. char* s = json + token->start;
  42. json[token->end] = 0;
  43. unescapeString(s);
  44. return s;
  45. }
  46. JsonToken JsonToken::nextSibling() const
  47. {
  48. // start with current token
  49. jsmntok_t* t = token;
  50. // count the number of token to skip
  51. int yetToVisit = 1;
  52. // skip all nested tokens
  53. while (yetToVisit)
  54. {
  55. yetToVisit += t->size - 1;
  56. t++;
  57. }
  58. // build a JsonToken at the new location
  59. return JsonToken(json, t);
  60. }