Added support of comments in JSON input (issue #88)

This commit is contained in:
Benoit Blanchon
2015-07-27 22:16:42 +02:00
parent c161f698fc
commit e31d667bec
8 changed files with 242 additions and 37 deletions

View File

@ -11,6 +11,12 @@
#include <math.h> // for isnan() and isinf()
#include <stdio.h> // for sprintf()
// only for GCC 4.9+
#if defined(__GNUC__) && \
(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))
#pragma GCC diagnostic ignored "-Wfloat-conversion"
#endif
size_t Print::print(const char s[]) {
size_t n = 0;
while (*s) {

View File

@ -0,0 +1,51 @@
// Copyright Benoit Blanchon 2014-2015
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
#include "../../include/ArduinoJson/Internals/Comments.hpp"
inline static const char *skipCStyleComment(const char *ptr) {
ptr += 2;
for (;;) {
if (ptr[0] == '\0') return ptr;
if (ptr[0] == '*' && ptr[1] == '/') return ptr + 2;
ptr++;
}
}
inline static const char *skipCppStyleComment(const char *ptr) {
ptr += 2;
for (;;) {
if (ptr[0] == '\0' || ptr[0] == '\n') return ptr;
ptr++;
}
}
const char *ArduinoJson::Internals::skipSpacesAndComments(const char *ptr) {
for (;;) {
switch (ptr[0]) {
case ' ':
case '\t':
case '\r':
case '\n':
ptr++;
continue;
case '/':
switch (ptr[1]) {
case '*':
ptr = skipCStyleComment(ptr);
break;
case '/':
ptr = skipCppStyleComment(ptr);
break;
default:
return ptr;
}
break;
default:
return ptr;
}
}
}

View File

@ -9,6 +9,7 @@
#include <stdlib.h> // for strtol, strtod
#include <ctype.h>
#include "../../include/ArduinoJson/Internals/Comments.hpp"
#include "../../include/ArduinoJson/Internals/Encoding.hpp"
#include "../../include/ArduinoJson/JsonArray.hpp"
#include "../../include/ArduinoJson/JsonBuffer.hpp"
@ -17,16 +18,11 @@
using namespace ArduinoJson;
using namespace ArduinoJson::Internals;
static const char *skipSpaces(const char *ptr) {
while (isspace(*ptr)) ptr++;
return ptr;
}
bool JsonParser::skip(char charToSkip) {
register const char *ptr = skipSpaces(_readPtr);
register const char *ptr = skipSpacesAndComments(_readPtr);
if (*ptr != charToSkip) return false;
ptr++;
_readPtr = skipSpaces(ptr);
_readPtr = skipSpacesAndComments(ptr);
return true;
}
@ -50,7 +46,7 @@ bool JsonParser::parseAnythingTo(JsonVariant *destination) {
}
inline bool JsonParser::parseAnythingToUnsafe(JsonVariant *destination) {
_readPtr = skipSpaces(_readPtr);
_readPtr = skipSpacesAndComments(_readPtr);
switch (*_readPtr) {
case '[':
@ -212,8 +208,13 @@ bool JsonParser::parseNullTo(JsonVariant *destination) {
return true;
}
static bool isStopChar(char c) {
return c == '\0' || c == ':' || c == '}' || c == ']' || c == ',';
static inline bool isInRange(char c, char min, char max) {
return min <= c && c <= max;
}
static inline bool isLetterOrNumber(char c) {
return isInRange(c, '0', '9') || isInRange(c, 'a', 'z') ||
isInRange(c, 'A', 'Z');
}
const char *JsonParser::parseString() {
@ -222,7 +223,7 @@ const char *JsonParser::parseString() {
char c = *readPtr;
if (c == '\'' || c == '\"') {
if (c == '\'' || c == '\"') { // quotes
char stopChar = c;
for (;;) {
c = *++readPtr;
@ -241,9 +242,9 @@ const char *JsonParser::parseString() {
*writePtr++ = c;
}
} else {
} else { // no quotes
for (;;) {
if (isStopChar(c)) break;
if (!isLetterOrNumber(c)) break;
*writePtr++ = c;
c = *++readPtr;
}