forked from bblanchon/ArduinoJson
Added support of comments in JSON input (issue #88)
This commit is contained in:
@ -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) {
|
||||
|
51
src/Internals/Comments.cpp
Normal file
51
src/Internals/Comments.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user