--- /dev/null
+/*
+ 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: */