1 #include "JSONValidator.h"
5 inline bool isHex(json_char c) json_pure;
6 inline bool isHex(json_char c) json_nothrow {
7 return (((c >= JSON_TEXT(
'0')) && (c <= JSON_TEXT(
'9'))) ||
8 ((c >= JSON_TEXT(
'A')) && (c <= JSON_TEXT(
'F'))) ||
9 ((c >= JSON_TEXT(
'a')) && (c <= JSON_TEXT(
'f'))));
12 bool JSONValidator::isValidNumber(
const json_char * & ptr) json_nothrow {
16 bool scientific =
false;
79 while(isHex(*++ptr)){};
83 case JSON_TEXT(
'0') ... JSON_TEXT(
'7'):
94 while((*++ptr >= JSON_TEXT(
'0')) && (*ptr <= JSON_TEXT(
'7'))){};
95 return ((*ptr != JSON_TEXT(
'8')) && (*ptr != JSON_TEXT(
'9')));
101 case JSON_TEXT(
'0') ... JSON_TEXT(
'9'):
118 case JSON_TEXT(
'0') ... JSON_TEXT(
'9'):
146 if (json_unlikely(decimal)) return false;
147 if (json_unlikely(scientific))
return false;
152 if (json_likely(scientific)) return false;
159 case JSON_TEXT(
'0') ... JSON_TEXT(
'9'):
178 case JSON_TEXT(
'0') ... JSON_TEXT(
'9'):
201 #define LETTERCASE(x, y)\
204 #define LETTERCHECK(x, y)\
205 if (json_unlikely((*++ptr != JSON_TEXT(x)) && (*ptr != JSON_TEXT(y)))) return false
207 #define LETTERCASE(x, y)\
209 #define LETTERCHECK(x, y)\
210 if (json_unlikely(*++ptr != JSON_TEXT(x))) return false
212 bool JSONValidator::isValidMember(
const json_char * & ptr DEPTH_PARAM) json_nothrow {
216 case JSON_TEXT(
'\"'):
217 return isValidString(++ptr);
220 return isValidObject(++ptr DEPTH_ARG(depth_param));
223 return isValidArray(++ptr DEPTH_ARG(depth_param));
224 LETTERCASE(
't',
'T'):
225 LETTERCHECK(
'r',
'R');
226 LETTERCHECK(
'u',
'U');
227 LETTERCHECK(
'e',
'E');
230 LETTERCASE(
'f',
'F'):
231 LETTERCHECK(
'a',
'A');
232 LETTERCHECK(
'l',
'L');
233 LETTERCHECK(
's',
'S');
234 LETTERCHECK(
'e',
'E');
237 LETTERCASE(
'n',
'N'):
238 LETTERCHECK(
'u',
'U');
239 LETTERCHECK(
'l',
'L');
240 LETTERCHECK(
'l',
'L');
249 case JSON_TEXT(
'\0'):
253 return isValidNumber(ptr);
256 bool JSONValidator::isValidString(
const json_char * & ptr) json_nothrow {
261 case JSON_TEXT(
'\\'):
263 case JSON_TEXT(
'\"'):
264 case JSON_TEXT(
'\\'):
273 if (json_unlikely(!isHex(*++ptr))) return false;
274 if (json_unlikely(!isHex(*++ptr)))
return false;
279 if (json_unlikely(!isHex(*++ptr))) return false;
280 if (json_unlikely(!isHex(*++ptr)))
return false;
284 case JSON_TEXT(
'0') ... JSON_TEXT(
'7'):
295 if (json_unlikely((*++ptr < JSON_TEXT(
'0')) || (*ptr > JSON_TEXT(
'7')))) return false;
296 if (json_unlikely((*++ptr < JSON_TEXT(
'0')) || (*ptr > JSON_TEXT(
'7'))))
return false;
303 case JSON_TEXT(
'\"'):
306 case JSON_TEXT(
'\0'):
314 bool JSONValidator::isValidNamedObject(
const json_char * &ptr DEPTH_PARAM) json_nothrow {
315 if (json_unlikely(!isValidString(++ptr)))
return false;
316 if (json_unlikely(*ptr++ != JSON_TEXT(
':')))
return false;
317 if (json_unlikely(!isValidMember(ptr DEPTH_ARG(depth_param))))
return false;
320 return isValidNamedObject(++ptr DEPTH_ARG(depth_param));
329 bool JSONValidator::isValidObject(
const json_char * & ptr DEPTH_PARAM) json_nothrow {
334 case JSON_TEXT(
'\"'):
335 return isValidNamedObject(ptr DEPTH_ARG(depth_param));
346 bool JSONValidator::isValidArray(
const json_char * & ptr DEPTH_PARAM) json_nothrow {
355 if (json_unlikely(!isValidMember(ptr DEPTH_ARG(depth_param))))
return false;
371 bool JSONValidator::isValidRoot(
const json_char * json) json_nothrow {
372 const json_char * ptr = json;
375 if (json_likely(isValidObject(++ptr DEPTH_ARG(1)))){
376 return *ptr == JSON_TEXT(
'\0');
380 if (json_likely(isValidArray(++ptr DEPTH_ARG(1)))){
381 return *ptr == JSON_TEXT(
'\0');
390 bool JSONValidator::isValidPartialRoot(
const json_char * json) json_nothrow {
391 const json_char * ptr = json;
394 JSON_ASSERT_SAFE(!isValidObject(++ptr DEPTH_ARG(1)), JSON_TEXT(
"Partial Object seems to be valid"), );
395 return *ptr == JSON_TEXT(
'\0');
397 JSON_ASSERT_SAFE(!isValidArray(++ptr DEPTH_ARG(1)), JSON_TEXT(
"Partial Object seems to be valid"), );
398 return *ptr == JSON_TEXT(
'\0');