<filename>packet.c</filename> Functions:-The packet-sniffing engine for reading data packets from GPS devices. Notes based on code as of Tue Apr 6 10:17:55 2010 -0400. static void nextstate(struct gps_packet_t *lexer, unsigned char c) This is the main packet-sniffer loop. It scans the character against the definitions of all the packet structures known to gpsd and, if possible, sets a new packet state.If the state is xxx_RECOGNIZED, the packet_parse routine will despatch the packet to the appropriate driver. static void packet_accept(struct gps_packet_t *lexer, int packet_type) This shifts a packet that has been recognized into the output buffer, provided it is not bigger than the buffer. static void packet_discard(struct gps_packet_t *lexer) This clears a handled packet out of the input buffer. static void character_discard(struct gps_packet_t *lexer) This is called if the nextstate() function returns GROUND_STATE.In this case the character does not match any pattern, so to discard it, the input buffer is shifted back by one character to overwrite the bad character. ssize_t packet_parse(struct gps_packet_t *lexer, size_t fix) Call the nextstate() function to process the available data and set the recognition state correctly.When a packet is matched to a driver, call packet_accept() and packet_discard() to handle the packet. If it is not matched, call packet_discard() and set the state to GROUND_STATEReturn the number of characters handled. ssize_t packet_get(int fd, struct gps_packet_t *lexer) Reads raw data from the input port.Returns the number of characters read (0 or more) or BAD_PACKET if there was an error in reading.Errors EAGAIN and EINTR are not classed as failures and cause a return of 0.In case of a good read of more than 0 characters, the return value is the output from a call to packet_parse(). void packet_reset(struct gps_packet_t *lexer) This simply resets the entire packet state machine to the ground state. void packet_nit(struct gps_packet_t *lexer) Zeros some counters, then resets the entire packet state machine to the ground state. void packet_pushback(struct gps_packet_t *lexer) This pushes back the last packet from the output buffer to the input buffer, provided doing so would not overflow the input buffer.