From b7c8119d0ee92c588b4e2869fcb2e8989fc859a5 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Mon, 7 Apr 2025 14:43:03 +0200 Subject: [PATCH] missing file --- parse.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 parse.c diff --git a/parse.c b/parse.c new file mode 100644 index 0000000..47c8e4d --- /dev/null +++ b/parse.c @@ -0,0 +1,120 @@ +/* + File name : parse.h + Projet : MERLIN + Date of creation : 2025/03/19 + Version : 1.0 + Copyright : Thales SIX + Author : Laurent Mazet + + Description : This file contains parse functions and macros + + History : + - initial version +*/ + +#include +#include +#include + +#include "verbose.h" + +#include "parse.h" + +int parse_int (char *str) +{ + char *pt = NULL; + int val = strtol (str, &pt, 0); + if (*pt != '\0') { + VERBOSE (morep, WARNING, PRINTF ("can't parse '%s' as integer\n", str)); + } + return val; +} + +double parse_double (char *str) +{ + char *pt = NULL; + double val = strtod (str, &pt); + if (*pt != '\0') { + VERBOSE (morep, WARNING, PRINTF ("can't parse '%s' as double\n", str)); + } + return val; +} + +int parse_array (char *str, uint8_t *buffer, int maxlen) +{ + int len = 0; + int slen = strlen (str); + + /* string payload: "..." (space must be protected by '\') */ + if ((*str == '"') && (slen > 1)) { + if (str[slen - 1] == '"') { + len = slen - 2; + if (len > maxlen) { + VERBOSE (morep, WARNING, PRINTF ("string too large (%d > %d) for '%s'\n", len, maxlen, str)); + len = maxlen; + } + memcpy (buffer, str + 1, len); + } else { + VERBOSE (morep, ERROR, PRINTF ("incomplet string '%s'\n", str)); + } + } + + /* file payload: @filename */ + else if (*str == '@') { + FILE *fid = fopen (str + 1, "r"); + if (fid != NULL) { + while ((len < maxlen) && (!feof (fid))) { + len += fread (buffer + len, 1, maxlen - len, fid); + } + if (!feof (fid)) { + fseek (fid, 0L, SEEK_SET); + fseek (fid, 0L, SEEK_END); + int flen = ftell (fid); + VERBOSE (morep, WARNING, PRINTF ("file too large (%d > %d) for '%s'\n", flen, maxlen, str)); + } + fclose (fid); + } else { + VERBOSE (morep, ERROR, PRINTF ("can't open file '%s'\n", str)); + } + } + + /* hexa payload: xxxxxx [0-9a-fA-F] */ + else if (slen % 2 == 0) { + len = slen / 2; + if (len > maxlen) { + VERBOSE (morep, WARNING, PRINTF ("string too large (%d > %d) for '%s'\n", len, maxlen, str)); + len = maxlen; + } + int i; + for (i = 0; i < len; i++) { + char digit[3] = {0}; + char *ptr = NULL; + digit[0] = str[2 * i]; + digit[1] = str[2 * i + 1]; + buffer[i] = strtol (digit, &ptr, 16); + if (*ptr != '\0') { + VERBOSE (morep, ERROR, PRINTF ("unrecognize hexa-string (%d) '%s'\n", 2 * i, str)); + break; + } + } + } + + /* unrecognize format */ + else { + VERBOSE (morep, WARNING, PRINTF ("can't parse buffer '%s'\n", str)); + } + + return len; +} + +int snprint_array (char *buffer, int size, uint8_t *data, int nb) +{ + int i; + int len = 0; + for (i = 0; (i < nb) && (len < size); i++) { + len += snprintf (buffer + 2 * i, size - len, "%02x", data[i]); + } + return len; +} + +/* vim: set ts=4 sw=4 si et: */ -- 2.30.2