missing file
authorLaurent Mazet <mazet@softndesign.org>
Mon, 7 Apr 2025 12:43:03 +0000 (14:43 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Mon, 7 Apr 2025 12:43:03 +0000 (14:43 +0200)
parse.c [new file with mode: 0644]

diff --git a/parse.c b/parse.c
new file mode 100644 (file)
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 <laurent.mazet@thalesgroup.com>
+
+  Description      : This file contains parse functions and macros
+
+  History          :
+  - initial version
+*/
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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: */