uint8_t *parse_payload (char *value, int *plen)
{
int slen = strlen (value);
- uint8_t *payload = NULL;
+ uint8_t *buffer = NULL;
int length = 0;
- /* string payload: "..." */
+ /* string payload: "..." (no space, tab or =) */
if ((*value == '"') && (slen > 1)) {
if (value[slen - 1] == '"') {
length = slen - 2;
- payload = (uint8_t *) calloc (length + 1, 1);
- memcpy (payload, value + 1, length);
+ buffer = (uint8_t *) calloc (length + 1, 1);
+ memcpy (buffer, value + 1, length);
} else {
VERBOSE (morep, ERROR, PRINTF ("incomplet string '%s'\n", value));
}
else if (*value == '@') {
FILE *fid = fopen (value + 1, "r");
if (fid != NULL) {
- payload = (uint8_t *) read_stream (fid, &length);
+ buffer = (uint8_t *) read_stream (fid, &length);
fclose (fid);
} else {
VERBOSE (morep, ERROR, PRINTF ("can't open file '%s'\n", value));
}
}
- /* hexa string: xxxxxx */
+ /* hexa payload: xxxxxx [0-9a-fA-F] */
else if (slen % 2 == 0) {
length = slen / 2;
- payload = (uint8_t *) calloc (length, 1);
+ buffer = (uint8_t *) calloc (length, 1);
int i;
for (i = 0; i < length; i++) {
char digit[3] = {0};
char *ptr = NULL;
digit[0] = value[2 * i];
digit[1] = value[2 * i + 1];
- payload[i] = strtol (digit, &ptr, 16);
+ buffer[i] = strtol (digit, &ptr, 16);
if (*ptr != '\0') {
- VERBOSE (morep, ERROR, PRINTF ("unrecognize hexa string (%d) '%s'\n", 2 * i, value));
- free (payload);
- payload = NULL;
+ VERBOSE (morep, ERROR, PRINTF ("unrecognize hexa-string (%d) '%s'\n", 2 * i, value));
+ free (buffer);
+ buffer = NULL;
break;
}
}
/* unrecognize format */
else {
- VERBOSE (morep, WARNING, PRINTF ("can't parse payload '%s'\n", value));
+ VERBOSE (morep, WARNING, PRINTF ("can't parse buffer '%s'\n", value));
}
if (plen) {
*plen = length;
}
- return payload;
+ return buffer;
}
-int parse_line (char *line, uint8_t *msgtype, uint8_t **payload)
+uint8_t *parse_line (char *line, uint8_t *msgtype, int *plen)
{
- int rc = -1;
+ uint8_t *payload = NULL;
+ int length = -1;
*msgtype = -1;
+ /* trim line */
while ((*line == ' ') || (*line == '\t')) {
line++;
}
+ /* segment line as var=val */
char *delim = " =\t";
char *str = strdup (line);
char *save_ptr;
char *val = strtok_r (NULL, delim, &save_ptr);
if (!var) break;
- if (0) {
- } else if (strcmp ("MSG", var) == 0) {
+ /* switch on string */
+ if (0) { }
+
+ /* case message type */
+ else if (strcmp ("MSG", var) == 0) {
*msgtype = strtol (val, NULL, 0);
- if (rc < 0 ) {
- rc = 0;
+ if (length < 0 ) {
+ length = 0;
}
- } else if (strcmp ("PAYLOAD", var) == 0) {
- *payload = parse_payload (val, &rc);
- } else {
+ }
+
+ /* case payload */
+ else if (strcmp ("PAYLOAD", var) == 0) {
+ payload = parse_payload (val, &length);
+ }
+
+ /* default */
+ else {
VERBOSE (morep, WARNING, PRINTF ("unknown word '%s'\n", var));
break;
}
+ /* end switch */
+
}
+ /* end of segmentation */
free (str);
- return rc;
+ if (plen) {
+ *plen = length;
+ }
+
+ return payload;
}
typedef struct {
/* get values */
uint8_t msgtype = 0;
- uint8_t *payload = NULL;
- int len = parse_line (pt, &msgtype, &payload);
+ int len = 0;
+ uint8_t *payload = parse_line (pt, &msgtype, &len);
if (len < 0) {
VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
continue;
uint8_t rxpayload[1496 * 16 - 1] = {0};
int rxlen = 0;
int seqnum = MOREP_Receive (comm->morep, &rxmsgtype, rxpayload, &rxlen);
+
+ /* check msg type */
if (rxmsgtype != msgtype) {
- VERBOSE (morep, WARNING, PRINTF ("R%04x seqnum=%d: expected msgtype %04x\n", rxmsgtype, seqnum, msgtype));
- } else {
+ VERBOSE (morep, WARNING, PRINTF ("R%04x seqnum=%d msg=%d: expected msgtype %04x\n", rxmsgtype, seqnum, rxmsgtype, msgtype));
+ }
+ /* check payload */
+ else {
int ok = (rxlen == len);
i = -1;
for (i = 0; ok && (i < rxlen); 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));
+ VERBOSE (morep, WARNING, PRINTF ("R%04x seqnum=%d msg=%d: payloads differed at %d/%d\n", rxmsgtype, seqnum, rxmsgtype, i, rxlen));
} else {
VERBOSE (morep, INFO, PRINTF ("R%04x seqnum=%d msg=%d length=%d\n", rxmsgtype, seqnum, rxmsgtype, rxlen));
}