Use ring buffer for packet decoding in frame parser tool
This commit is contained in:
parent
867e953036
commit
0ce5c0c206
|
@ -0,0 +1,4 @@
|
|||
*~
|
||||
*%
|
||||
*.swp
|
||||
*.py[co]
|
|
@ -10,7 +10,6 @@ struct packet_s {
|
|||
char status;
|
||||
char options[4];
|
||||
char eol[2];
|
||||
char eos;
|
||||
};
|
||||
|
||||
enum unit_e {
|
||||
|
@ -91,26 +90,51 @@ int parse_packet(struct packet_s *packet) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int read_packet(struct packet_s *packet) {
|
||||
char *r;
|
||||
void log_packet(struct packet_s *packet) {
|
||||
int i;
|
||||
int valid;
|
||||
char *c = (char *)packet;
|
||||
|
||||
while (1) {
|
||||
r = fgets((char *)packet, sizeof(*packet), stdin);
|
||||
if (r == NULL)
|
||||
for (i=0; i<sizeof(*packet); i++)
|
||||
putc(c[i], stderr);
|
||||
}
|
||||
|
||||
int read_packet(struct packet_s *packet) {
|
||||
char ring[sizeof(*packet)];
|
||||
char *p;
|
||||
int ring_pos;
|
||||
char c;
|
||||
int ch;
|
||||
int shift;
|
||||
|
||||
p = (char *)packet;
|
||||
ring_pos = 0;
|
||||
shift = sizeof(*packet);
|
||||
for (;;) {
|
||||
ch = getc(stdin);
|
||||
if (ch == EOF)
|
||||
return 0;
|
||||
// Sanity checks
|
||||
// Packet must end with CR+LF
|
||||
if (packet->eol[0] != '\r' || packet->eol[1] != '\n')
|
||||
continue;
|
||||
// All fields must be encoded as 0x3X
|
||||
for (valid=1, i=0; i<sizeof(*packet)-4; i++)
|
||||
if ((r[i] & 0xf0) != 0x30)
|
||||
valid = 0;
|
||||
// Should also check for valid BCD values for digits
|
||||
if (valid)
|
||||
return 1;
|
||||
c = (char) ch;
|
||||
ring[ring_pos] = c;
|
||||
ring_pos = (ring_pos + 1) % sizeof(*packet);
|
||||
if (((c & 0xf0) != 0x30) && (c != '\r') && (c != '\n')) {
|
||||
shift = sizeof(*packet);
|
||||
} else {
|
||||
if ((c == '\r') && (shift != 2)) {
|
||||
shift = sizeof(*packet);
|
||||
continue;
|
||||
}
|
||||
if (c == '\n') {
|
||||
if (shift == 1) {
|
||||
for (int i=0; i<sizeof(ring); i++)
|
||||
p[i] = ring[(ring_pos + i) % sizeof(*packet)];
|
||||
log_packet(packet);
|
||||
return 1;
|
||||
}
|
||||
shift = sizeof(*packet);
|
||||
continue;
|
||||
}
|
||||
shift = (shift > 0) ? shift - 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue