diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2015-02-08 16:42:13 -0500 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2015-02-08 16:42:13 -0500 |
commit | 2a8969b376a185126b5cce97e538d0872313eaf3 (patch) | |
tree | bed9c8e617f5d10c9c418409468bae32ff0aed8f /packet.c | |
parent | 896c8a8ca16ac63d03971ad617bbf19e73e52e37 (diff) | |
download | gpsd-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.c | 148 |
1 files changed, 74 insertions, 74 deletions
@@ -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 */ } |