JsonParser.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "JsonParser.h"
  2. #include "../JsonBuffer.h"
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. bool JsonParser::isEnd()
  6. {
  7. return *_ptr == 0;
  8. }
  9. bool JsonParser::isArrayStart()
  10. {
  11. return *_ptr == '[';
  12. }
  13. bool JsonParser::isArrayStop()
  14. {
  15. return *_ptr == ']';
  16. }
  17. bool JsonParser::isLong()
  18. {
  19. char* ptr = _ptr;
  20. // skip all digits
  21. while (isdigit(*ptr))
  22. ptr++;
  23. // same position => 0 digits => not a long
  24. if (ptr == _ptr)
  25. return false;
  26. // stopped on a decimal separator => not a long but a double
  27. if (*ptr == '.')
  28. return false;
  29. return true;
  30. }
  31. bool JsonParser::isSpace()
  32. {
  33. return *_ptr == ' ' || *_ptr == '\t' || *_ptr == '\n' || *_ptr == '\r';
  34. }
  35. void JsonParser::skipOneChar()
  36. {
  37. _ptr++;
  38. }
  39. void JsonParser::skipSpaces()
  40. {
  41. while(isSpace()) skipOneChar();
  42. }
  43. JsonNode* JsonParser::parseNode()
  44. {
  45. skipSpaces();
  46. if (isArrayStart())
  47. return parseArray();
  48. if (isLong())
  49. return parseLong();
  50. return 0;
  51. }
  52. JsonNode* JsonParser::parseArray()
  53. {
  54. skipOneChar();
  55. JsonNode* node = _buffer->createNode();
  56. node->setAsArray(_buffer);
  57. skipSpaces();
  58. if (isArrayStop())
  59. return node;
  60. node->addChild(parseNode());
  61. return node;
  62. }
  63. JsonNode* JsonParser::parseLong()
  64. {
  65. long value = strtol(_ptr, &_ptr, 10);
  66. JsonNode* node = _buffer->createNode();
  67. node->setAsLong(value);
  68. return node;
  69. }