From: Mazet Laurent Date: Thu, 27 Mar 2025 21:39:26 +0000 (+0100) Subject: parser coded X-Git-Tag: v1.0~85 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=add11112974352fd02ddcf964b41686a30a8a2c7;p=morep.git parser coded --- diff --git a/morep_valid.c b/morep_valid.c index 92e3746..409e9cb 100644 --- a/morep_valid.c +++ b/morep_valid.c @@ -19,9 +19,11 @@ #include #include +#include #include #include #include +#include #include "morep.h" #include "verbose.h" @@ -47,6 +49,96 @@ void sig_handler (int sig) } } +char *readstream (FILE *sd, int *length) +{ + VERBOSE (morep, TRACE, PRINTF ("readstream\n")); + + char *buffer = NULL; + size_t size = 0; + int blocklen = 0; + int _length = 0; + do { + size += BUFMAX + (size == 0); + buffer = (char *) realloc (buffer, size); + memset (buffer + size - BUFMAX - 1, 0, BUFMAX + 1); + blocklen = fread (buffer + size - BUFMAX - 1, 1, BUFMAX, sd); + _length += blocklen; + VERBOSE (morep, DEBUG, PRINTF ("buffer: 0x%p 0x%p %d %d %d\n", buffer, buffer + size - BUFMAX - 1, (int)size, _length, blocklen)); + } while (blocklen > 0); + + /* check size */ + VERBOSE (morep, DEBUG, PRINTF ("read length: %d\n", _length)); + if (_length == 0) { + free (buffer); + buffer = NULL; + } + if (length) { + *length = _length; + } + + return buffer; +} + +int parse_line (char *line, uint8_t *msgtype, uint8_t **payload) +{ + char *delim = " =\t"; + char *str = strdup (line); + char *save_ptr; + char *pt = str; + int rc = -1; + *msgtype = -1; + while (1) { + char *var = strtok_r (pt, delim, &save_ptr); + pt = NULL; + if (!var) break; + char *val = strtok_r (NULL, delim, &save_ptr); + if (!var) break; + + if (0) { + } else if (strcmp ("MSGTYPE", var) == 0) { + *msgtype = strtol (val, NULL, 0); + if (rc < 0 ) { + rc = 0; + } + } else if (strcmp ("PAYLOAD", var) == 0) { + if ((*val == '"') && (val[strlen (val) - 1] == '"')) { + val++; + rc = strlen (val) - 1; + uint8_t *buf = *payload = (uint8_t *) calloc (rc, 1); + do { + *buf++ = *val++; + } while (*val != '\0'); + buf[-1] = '\0'; + } else if (*val == '@') { + FILE *fid = fopen (++val, "r"); + if (fid == NULL) { + VERBOSE (morep, ERROR, PRINTF ("can't open file '%s'\n", val)); + break; + } + *payload = (uint8_t *) readstream (fid, &rc); + fclose (fid); + } else if (strlen (val) % 2 == 0) { + rc = strlen (val) % 2; + uint8_t *buf = *payload = (uint8_t *) calloc (rc / 2, 1); + while (*val != '\0') { + char digit[3] = {0}; + digit[0] = *val++; + digit[1] = *val++; + *buf++ = strtol (digit, NULL, 16); + } + } else { + VERBOSE (morep, WARNING, PRINTF ("can't parse payload in '%s'\n", line)); + break; + } + } else { + VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line)); + break; + } + } + + return rc; +} + typedef struct { int morep; int mode; @@ -88,7 +180,7 @@ int main (int argc, char **argv) return 1; } url = arg; - mode = 1; + mode = 0; break; case 't': arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL; @@ -181,8 +273,71 @@ int main (int argc, char **argv) } /* analyse line */ + mode = -1; + if (*pt == 'R') { + mode = 0; + } else if (*pt == 'T') { + mode = 1; + } else if (strcmp (pt, "SLEEP") == 0) { + int duration = atoi (pt + 5); + usleep (duration * 1000); + continue; + } + if (mode == -1) { + VERBOSE (morep, WARNING, PRINTF ("unrecognize line '%s'\n", line)); + continue; + } + + /* find ethertype */ + pt++; + comm_t *comm = NULL; + for (i = 0; i < nbcomms; i++) { + comm_t *c = comm_list + i; + if ((strncmp (pt, c->etype, strlen (c->etype)) == 0) && (c->mode == mode)) { + comm = c; + break; + } + } + if (comm == NULL) { + VERBOSE (morep, WARNING, PRINTF ("no morep found '%s'\n", line)); + continue; + } + /* get values */ + uint8_t msgtype = 0; + uint8_t *payload = NULL; + int len = parse_line (pt, &msgtype, &payload); + if (len < 0) { + VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line)); + continue; + } + /* transmit */ + if (mode == 1) { + int seqnum = MOREP_Send (comm->morep, msgtype, payload, len); + VERBOSE (morep, INFO, PRINTF ("S%s seqnum %d\n", comm->etype, seqnum)); + } else { /* receive */ + uint8_t rxmsgtype = 0; + uint8_t *rxpayload = NULL; + int rxlen = 0; + int seqnum = MOREP_Receive (comm->morep, &rxmsgtype, rxpayload, &rxlen); + if (rxmsgtype != msgtype) { + VERBOSE (morep, WARNING, PRINTF ("R%04x seqnum %d: expected msgtype %04x\n", rxmsgtype, seqnum, msgtype)); + } else { + int ok = (len == rxlen); + i = -1; + for (i = 0; ok && (i < len); i++) { + ok = (rxpayload[i] == payload[i]); + } + if (!ok) { + VERBOSE (morep, WARNING, PRINTF ("R%04x seqnum %d: payload diff at %d/%d\n", rxmsgtype, seqnum, i, rxlen)); + } else { + VERBOSE (morep, INFO, PRINTF ("R%04x seqnum %d\n", rxmsgtype, seqnum)); + } + } + free (rxpayload); + } + free (payload); } /* cleaning */ @@ -198,4 +353,4 @@ int main (int argc, char **argv) /* test: morep_valid.exe -h | grep usage */ -/* vim: set ts=4 sw=4 et: */ +/* vim: set ts=4 sw=4 si et: */