summaryrefslogtreecommitdiff
path: root/packet.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2015-02-08 16:42:13 -0500
committerEric S. Raymond <esr@thyrsus.com>2015-02-08 16:42:13 -0500
commit2a8969b376a185126b5cce97e538d0872313eaf3 (patch)
treebed9c8e617f5d10c9c418409468bae32ff0aed8f /packet.c
parent896c8a8ca16ac63d03971ad617bbf19e73e52e37 (diff)
downloadgpsd-2a8969b376a185126b5cce97e538d0872313eaf3.tar.gz
Improve the ability of the packet analyzer to recognize control comments...
...including the "# EOF" generated by gpsfake. The case that was sometimes being mishandled was "# EOF" just after a binary packet end. All regression tests pass.
Diffstat (limited to 'packet.c')
-rw-r--r--packet.c148
1 files changed, 74 insertions, 74 deletions
diff --git a/packet.c b/packet.c
index f3e80389..6ec430de 100644
--- a/packet.c
+++ b/packet.c
@@ -362,7 +362,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
lexer->state = NMEA_LEADER_END;
#endif /* OCEANSERVER_ENABLE */
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NMEA_PUB_LEAD:
/*
@@ -372,7 +372,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 'P' || c == 'N' || c == 'L')
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NMEA_VENDOR_LEAD:
if (c == 'A')
@@ -380,7 +380,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (isalpha(c))
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
/*
* Without the following six states, DLE in a $PASHR can fool the
@@ -392,7 +392,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (isalpha(c))
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NMEA_PASHR_S:
if (c == 'H')
@@ -400,7 +400,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (isalpha(c))
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NMEA_PASHR_H:
if (c == 'R')
@@ -408,7 +408,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (isalpha(c))
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NMEA_BINARY_BODY:
if (c == '\r')
@@ -434,43 +434,43 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (c == 'S')
lexer->state = AIS_LEAD_ALT3;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case AIS_LEAD_1:
if (strchr("BDINRSTX", c) != NULL)
lexer->state = AIS_LEAD_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case AIS_LEAD_2:
if (isalpha(c))
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case AIS_LEAD_ALT1:
if (c == 'S')
lexer->state = AIS_LEAD_ALT2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case AIS_LEAD_ALT2:
if (isalpha(c))
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case AIS_LEAD_ALT3:
if (c == 'A')
lexer->state = AIS_LEAD_ALT4;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case AIS_LEAD_ALT4:
if (isalpha(c))
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#if defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE)
case AT1_LEADER:
@@ -505,7 +505,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* GARMINTXT_ENABLE */
default:
if (!isprint(c))
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
}
break;
#endif /* defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE) */
@@ -518,7 +518,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (c == '$')
character_pushback(lexer, GROUND_STATE);
else if (!isprint(c))
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NMEA_CR:
if (c == '\n')
@@ -530,7 +530,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (c == '\r')
lexer->state = NMEA_CR;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NMEA_RECOGNIZED:
if (c == '#')
@@ -548,49 +548,49 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
character_pushback(lexer, JSON_LEADER);
#endif /* PASSTHROUGH_ENABLE */
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SEATALK_LEAD_1:
if (c == 'I' || c == 'N') /* II or IN are accepted */
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case WEATHER_LEAD_1:
if (c == 'I') /* Weather instrument leader accepted */
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case HEADCOMP_LEAD_1:
if (c == 'C') /* Heading/compass leader accepted */
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case TURN_LEAD_1:
if (c == 'I') /* Turn indicator leader accepted */
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ECDIS_LEAD_1:
if (c == 'C') /* ECDIS leader accepted */
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SOUNDER_LEAD_1:
if (c == 'D') /* Depth-sounder leader accepted */
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case TRANSDUCER_LEAD_1:
if (c == 'X') /* Transducer leader accepted */
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#ifdef TRIPMATE_ENABLE
case ASTRAL_1:
@@ -606,7 +606,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = ASTRAL_2;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ASTRAL_2:
if (c == 'T') {
@@ -621,7 +621,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = ASTRAL_3;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ASTRAL_3:
if (c == 'R') {
@@ -636,7 +636,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = ASTRAL_5;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ASTRAL_4:
if (c == 'A') {
@@ -651,7 +651,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = ASTRAL_2;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ASTRAL_5:
if (c == 'L') {
@@ -666,7 +666,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = NMEA_RECOGNIZED;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* TRIPMATE_ENABLE */
#ifdef EARTHMATE_ENABLE
@@ -683,7 +683,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = EARTHA_2;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case EARTHA_2:
if (c == 'R') {
@@ -698,7 +698,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = EARTHA_3;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case EARTHA_3:
if (c == 'T') {
@@ -713,7 +713,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = EARTHA_4;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case EARTHA_4:
if (c == 'H') {
@@ -728,7 +728,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = EARTHA_5;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case EARTHA_5:
if (c == 'A') {
@@ -743,7 +743,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
#endif /* RTCM104V2_ENABLE */
lexer->state = NMEA_RECOGNIZED;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* EARTHMATE_ENABLE */
case SIRF_ACK_LEAD_1:
@@ -752,13 +752,13 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
else if (c == 'I')
lexer->state = AIS_LEAD_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SIRF_ACK_LEAD_2:
if (c == 'k')
lexer->state = NMEA_LEADER_END;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* NMEA_ENABLE */
#ifdef SIRF_ENABLE
@@ -766,7 +766,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 0xa2)
lexer->state = SIRF_LEADER_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SIRF_LEADER_2:
lexer->length = (size_t) (c << 8);
@@ -777,7 +777,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (lexer->length <= MAX_PACKET_LENGTH)
lexer->state = SIRF_PAYLOAD;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SIRF_PAYLOAD:
if (--lexer->length == 0)
@@ -787,19 +787,19 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 0xb0)
lexer->state = SIRF_TRAILER_1;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SIRF_TRAILER_1:
if (c == 0xb3)
lexer->state = SIRF_RECOGNIZED;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SIRF_RECOGNIZED:
if (c == 0xa0)
lexer->state = SIRF_LEADER_1;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* SIRF_ENABLE */
#ifdef SUPERSTAR2_ENABLE
@@ -811,7 +811,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if ((ctmp ^ 0xff) == c)
lexer->state = SUPERSTAR2_ID2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case SUPERSTAR2_ID2:
lexer->length = (size_t) c; /* how many data bytes follow this byte */
@@ -834,7 +834,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == SOH)
lexer->state = SUPERSTAR2_LEADER;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* SUPERSTAR2_ENABLE */
#ifdef ONCORE_ENABLE
@@ -843,7 +843,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
lexer->length = (size_t) c;
lexer->state = ONCORE_ID1;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ONCORE_ID1:
if (isalpha(c)) {
@@ -853,8 +853,8 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
lexer->state = ONCORE_PAYLOAD;
break;
}
- }
- lexer->state = GROUND_STATE;
+ } else
+ character_pushback(lexer, GROUND_STATE);
break;
case ONCORE_PAYLOAD:
if (--lexer->length == 0)
@@ -862,7 +862,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
break;
case ONCORE_CHECKSUM:
if (c != '\r')
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
else
lexer->state = ONCORE_CR;
break;
@@ -876,7 +876,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == '@')
lexer->state = AT1_LEADER;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* ONCORE_ENABLE */
#if defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(GARMIN_ENABLE)
@@ -907,13 +907,13 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 0x99)
lexer->state = NAVCOM_LEADER_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NAVCOM_LEADER_2:
if (c == 0x66)
lexer->state = NAVCOM_LEADER_3;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NAVCOM_LEADER_3:
lexer->state = NAVCOM_ID;
@@ -951,13 +951,13 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 0x03)
lexer->state = NAVCOM_RECOGNIZED;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case NAVCOM_RECOGNIZED:
if (c == 0x02)
lexer->state = NAVCOM_LEADER_1;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* NAVCOM_ENABLE */
#endif /* TSIP_ENABLE || EVERMORE_ENABLE || GARMIN_ENABLE */
@@ -969,7 +969,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
lexer->state = RTCM3_LEADER_2;
break;
} else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case RTCM3_LEADER_2:
/* third byte is the low 8 bits of the RTCM3 packet length */
@@ -988,13 +988,13 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 0xff)
lexer->state = ZODIAC_LEADER_1;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ZODIAC_LEADER_1:
if (c == 0x81)
lexer->state = ZODIAC_LEADER_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ZODIAC_LEADER_2:
lexer->state = ZODIAC_ID_1;
@@ -1046,7 +1046,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (lexer->length <= MAX_PACKET_LENGTH - 10)
lexer->state = ZODIAC_PAYLOAD;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ZODIAC_PAYLOAD:
if (--lexer->length == 0)
@@ -1058,7 +1058,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 0x62)
lexer->state = UBX_LEADER_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case UBX_LEADER_2:
lexer->state = UBX_CLASS_ID;
@@ -1075,7 +1075,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (lexer->length <= MAX_PACKET_LENGTH)
lexer->state = UBX_LENGTH_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case UBX_LENGTH_2:
lexer->state = UBX_PAYLOAD;
@@ -1100,7 +1100,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
character_pushback(lexer, JSON_LEADER);
#endif /* PASSTHROUGH_ENABLE */
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* UBLOX_ENABLE */
#ifdef EVERMORE_ENABLE
@@ -1108,7 +1108,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == STX)
lexer->state = EVERMORE_LEADER_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case EVERMORE_LEADER_2:
lexer->length = (size_t) c;
@@ -1121,7 +1121,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == DLE)
lexer->state = EVERMORE_PAYLOAD_DLE;
else if (--lexer->length == 0)
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case EVERMORE_PAYLOAD_DLE:
switch (c) {
@@ -1139,7 +1139,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == DLE)
lexer->state = EVERMORE_LEADER_1;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* EVERMORE_ENABLE */
#ifdef ITRAX_ENABLE
@@ -1147,7 +1147,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == '!')
lexer->state = ITALK_LEADER_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ITALK_LEADER_2:
lexer->length = (size_t) (lexer->inbuffer[6] & 0xff);
@@ -1174,13 +1174,13 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == '>')
lexer->state = ITALK_RECOGNIZED;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case ITALK_RECOGNIZED:
if (c == '<')
lexer->state = ITALK_LEADER_1;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* ITRAX_ENABLE */
#ifdef GEOSTAR_ENABLE
@@ -1188,19 +1188,19 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 'S')
lexer->state = GEOSTAR_LEADER_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case GEOSTAR_LEADER_2:
if (c == 'G')
lexer->state = GEOSTAR_LEADER_3;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case GEOSTAR_LEADER_3:
if (c == 'G')
lexer->state = GEOSTAR_LEADER_4;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case GEOSTAR_LEADER_4:
lexer->state = GEOSTAR_MESSAGE_ID_1;
@@ -1217,7 +1217,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (lexer->length <= MAX_PACKET_LENGTH)
lexer->state = GEOSTAR_LENGTH_2;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case GEOSTAR_LENGTH_2:
lexer->state = GEOSTAR_PAYLOAD;
@@ -1240,7 +1240,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c == 'P')
lexer->state = GEOSTAR_LEADER_1;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* GEOSTAR_ENABLE */
#ifdef TSIP_ENABLE
@@ -1249,7 +1249,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if (c >= 0x13)
lexer->state = TSIP_PAYLOAD;
else
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case TSIP_PAYLOAD:
if (c == DLE)
@@ -1334,7 +1334,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
lexer->state = JSON_EXPECT_VALUE;
else
/* saw something other than value start after colon */
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case JSON_EXPECT_VALUE:
if (isspace(c))
@@ -1355,7 +1355,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
lexer->state = JSON_SPECIAL;
else
/* couldn't recognize start of value literal */
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
case JSON_NUMBER:
/*
@@ -1383,7 +1383,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
character_pushback(lexer, JSON_LEADER);
else
/* trailing garbage after JSON value */
- lexer->state = GROUND_STATE;
+ character_pushback(lexer, GROUND_STATE);
break;
#endif /* PASSTHROUGH_ENABLE */
}