@@ -287,6 +287,11 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes)
287
287
INVOKE_ERROR(SPECIAL_EXPECTED); \
288
288
}
289
289
290
+ #define VERIFY_SPECIAL_CI (lit ) \
291
+ if (tolower(CUR_CHAR) != (lit)[jsn->pos - state->pos_begin]) { \
292
+ INVOKE_ERROR(SPECIAL_EXPECTED); \
293
+ }
294
+
290
295
#define STATE_SPECIAL_LENGTH \
291
296
(state)->nescapes
292
297
@@ -350,6 +355,14 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes)
350
355
goto GT_SPECIAL_NUMERIC ;
351
356
}
352
357
} else if (state -> special_flags == JSONSL_SPECIALf_DASH ) {
358
+ #ifdef JSONSL_PARSE_NAN
359
+ if (CUR_CHAR == 'I' || CUR_CHAR == 'i' ) {
360
+ /* parsing -Infinity? */
361
+ state -> special_flags = JSONSL_SPECIALf_NEG_INF ;
362
+ CONTINUE_NEXT_CHAR ();
363
+ }
364
+ #endif
365
+
353
366
if (!isdigit (CUR_CHAR )) {
354
367
INVOKE_ERROR (INVALID_NUMBER );
355
368
}
@@ -378,7 +391,8 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes)
378
391
goto GT_SPECIAL_NUMERIC ;
379
392
}
380
393
381
- if (state -> special_flags & JSONSL_SPECIALf_NUMERIC ) {
394
+ if ((state -> special_flags & JSONSL_SPECIALf_NUMERIC ) &&
395
+ !(state -> special_flags & JSONSL_SPECIALf_INF )) {
382
396
GT_SPECIAL_NUMERIC :
383
397
switch (CUR_CHAR ) {
384
398
CASE_DIGITS
@@ -430,11 +444,12 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes)
430
444
} else if (state -> special_flags == JSONSL_SPECIALf_NULL ) {
431
445
VERIFY_SPECIAL ("null" );
432
446
#ifdef JSONSL_PARSE_NAN
447
+ } else if (state -> special_flags == JSONSL_SPECIALf_POS_INF ) {
448
+ VERIFY_SPECIAL_CI ("infinity" );
449
+ } else if (state -> special_flags == JSONSL_SPECIALf_NEG_INF ) {
450
+ VERIFY_SPECIAL_CI ("-infinity" );
433
451
} else if (state -> special_flags == JSONSL_SPECIALf_NAN ) {
434
- /* like VERIFY_SPECIAL but case-insensitive */
435
- if (tolower (CUR_CHAR ) != "nan" [jsn -> pos - state -> pos_begin ]) {
436
- INVOKE_ERROR (SPECIAL_EXPECTED );
437
- }
452
+ VERIFY_SPECIAL_CI ("nan" );
438
453
} else if (state -> special_flags & JSONSL_SPECIALf_NULL ||
439
454
state -> special_flags & JSONSL_SPECIALf_NAN ) {
440
455
/* previous char was "n", are we parsing null or nan? */
@@ -462,6 +477,11 @@ jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes)
462
477
} else if (state -> special_flags == JSONSL_SPECIALf_DASH ) {
463
478
/* Still in dash! */
464
479
INVOKE_ERROR (INVALID_NUMBER );
480
+ } else if (state -> special_flags & JSONSL_SPECIALf_INF ) {
481
+ if (STATE_SPECIAL_LENGTH != 8 ) {
482
+ INVOKE_ERROR (SPECIAL_INCOMPLETE );
483
+ }
484
+ state -> nelem = 1 ;
465
485
} else if (state -> special_flags & JSONSL_SPECIALf_NUMERIC ) {
466
486
/* Check that we're not at the end of a token */
467
487
if (STATE_NUM_LAST != '1' ) {
@@ -1446,11 +1466,15 @@ static unsigned short Special_Table[0x100] = {
1446
1466
/* 0x37 */ JSONSL_SPECIALf_UNSIGNED /* <7> */ , /* 0x37 */
1447
1467
/* 0x38 */ JSONSL_SPECIALf_UNSIGNED /* <8> */ , /* 0x38 */
1448
1468
/* 0x39 */ JSONSL_SPECIALf_UNSIGNED /* <9> */ , /* 0x39 */
1449
- /* 0x3a */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , /* 0x4d */
1469
+ /* 0x3a */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , /* 0x48 */
1470
+ /* 0x49 */ JSONSL__INF_PROXY /* <I> */ , /* 0x49 */
1471
+ /* 0x4a */ 0 ,0 ,0 ,0 , /* 0x4d */
1450
1472
/* 0x4e */ JSONSL__NAN_PROXY /* <N> */ , /* 0x4e */
1451
1473
/* 0x4f */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , /* 0x65 */
1452
1474
/* 0x66 */ JSONSL_SPECIALf_FALSE /* <f> */ , /* 0x66 */
1453
- /* 0x67 */ 0 ,0 ,0 ,0 ,0 ,0 ,0 , /* 0x6d */
1475
+ /* 0x67 */ 0 ,0 , /* 0x68 */
1476
+ /* 0x69 */ JSONSL__INF_PROXY /* <i> */ , /* 0x69 */
1477
+ /* 0x6a */ 0 ,0 ,0 ,0 , /* 0x6d */
1454
1478
/* 0x6e */ JSONSL_SPECIALf_NULL |JSONSL__NAN_PROXY /* <n> */ , /* 0x6e */
1455
1479
/* 0x6f */ 0 ,0 ,0 ,0 ,0 , /* 0x73 */
1456
1480
/* 0x74 */ JSONSL_SPECIALf_TRUE /* <t> */ , /* 0x74 */
0 commit comments