Use ring buffer for packet decoding in frame parser tool

This commit is contained in:
Maurizio Porrato 2018-12-14 10:13:06 +00:00
parent 867e953036
commit 0ce5c0c206
2 changed files with 46 additions and 18 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*~
*%
*.swp
*.py[co]

View File

@ -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;
}
}
}