StringBuilder.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Arduino JSON library
  3. * Benoit Blanchon 2014 - MIT License
  4. */
  5. #include <cstdio>
  6. #include <cstring>
  7. #include "StringBuilder.h"
  8. void StringBuilder::append(double value)
  9. {
  10. char* tail = buffer + length;
  11. _snprintf(tail, capacity - length, "%lg", value);
  12. length += strlen(tail);
  13. }
  14. void StringBuilder::append(const char* s)
  15. {
  16. if (!s)
  17. {
  18. return append("null");
  19. }
  20. char* tail = buffer + length;
  21. while (*s && length<capacity)
  22. {
  23. buffer[length++] = *s++;
  24. }
  25. buffer[length] = 0;
  26. }
  27. void StringBuilder::appendEscaped(const char* s)
  28. {
  29. if (!s)
  30. {
  31. return append("null");
  32. }
  33. if (length > capacity - 2)
  34. {
  35. // not enough from for quotes
  36. return;
  37. }
  38. buffer[length++] = '"';
  39. // keep one slot for the end quote
  40. capacity--;
  41. while (*s && length < capacity)
  42. {
  43. switch (*s)
  44. {
  45. case '"':
  46. append("\\\"");
  47. break;
  48. case '\\':
  49. append("\\\\");
  50. break;
  51. case '\b':
  52. append("\\b");
  53. break;
  54. case '\f':
  55. append("\\f");
  56. break;
  57. case '\n':
  58. append("\\n");
  59. break;
  60. case '\r':
  61. append("\\r");
  62. break;
  63. case '\t':
  64. append("\\t");
  65. break;
  66. default:
  67. buffer[length++] = *s;
  68. break;
  69. }
  70. s++;
  71. }
  72. buffer[length++] = '"';
  73. buffer[length] = 0;
  74. // restore the original capacity
  75. capacity++;
  76. }