summaryrefslogtreecommitdiff
path: root/libsensors_iio/tools/cfgdefine.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsensors_iio/tools/cfgdefine.c')
-rw-r--r--libsensors_iio/tools/cfgdefine.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/libsensors_iio/tools/cfgdefine.c b/libsensors_iio/tools/cfgdefine.c
new file mode 100644
index 0000000..5fe5b14
--- /dev/null
+++ b/libsensors_iio/tools/cfgdefine.c
@@ -0,0 +1,222 @@
+/****************************************************************************
+ * tools/cfgdefine.c
+ *
+ * Copyright (C) 2007-2013 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Modified by Denis Ciocca <denis.ciocca@st.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "cfgdefine.h"
+#include <stdbool.h>
+
+#define CUTOM_MACRO_LIST 6
+
+char line[LINESIZE + 1];
+
+static struct custom_macro {
+ char name[45];
+} custom_macro[] = {
+ { .name = "CONFIG_ST_HAL_INEMO_GBIAS_THRESOLD_ACCEL" },
+ { .name = "CONFIG_ST_HAL_INEMO_GBIAS_THRESOLD_MAGN" },
+ { .name = "CONFIG_ST_HAL_INEMO_GBIAS_THRESOLD_GYRO" },
+ { .name = "CONFIG_ST_HAL_ACCEL_ROT_MATRIX" },
+ { .name = "CONFIG_ST_HAL_MAGN_ROT_MATRIX" },
+ { .name = "CONFIG_ST_HAL_GYRO_ROT_MATRIX" },
+};
+
+/* Skip over any spaces */
+static char *skip_space(char *ptr)
+{
+ while (*ptr && isspace((int)*ptr)) ptr++;
+
+ return ptr;
+}
+
+/* Find the end of a variable string */
+static char *find_name_end(char *ptr)
+{
+ while (*ptr && (isalnum((int)*ptr) || *ptr == '_')) ptr++;
+
+ return ptr;
+}
+
+/* Find the end of a value string */
+static char *find_value_end(char *ptr)
+{
+ while (*ptr && !isspace((int)*ptr)) {
+ if (*ptr == '"') {
+ do ptr++; while (*ptr && *ptr != '"');
+ if (*ptr) ptr++;
+ } else
+ do ptr++; while (*ptr && !isspace((int)*ptr) && *ptr != '"');
+
+ }
+
+ return ptr;
+}
+
+/* Read the next line from the configuration file */
+static char *read_line(FILE *stream)
+{
+ char *ptr;
+
+ for (;;) {
+ line[LINESIZE] = '\0';
+
+ if (!fgets(line, LINESIZE, stream))
+ return NULL;
+ else {
+ ptr = skip_space(line);
+ if (*ptr && *ptr != '#' && *ptr != '\n')
+ return ptr;
+ else if ((*ptr == '#') && (*(ptr+1) == '\n'))
+ printf("\n");
+ }
+ }
+
+ return NULL;
+}
+
+static void dequote_custom_values(char *var, char *value)
+{
+ int i, n, ret;
+ char *t1;
+
+ if (!var)
+ return;
+
+ for (i = 0; i < CUTOM_MACRO_LIST; i++) {
+ ret = strncmp(custom_macro[i].name, var, strlen(custom_macro[i].name));
+ if (ret == 0) {
+ for (n = 1; n < strlen(value) - 1; n++)
+ value[n - 1] = value[n];
+
+ value[n - 1] = '\0';
+ return;
+ }
+ }
+
+ return;
+}
+
+/* Parse the line from the configuration file into a variable name
+ * string and a value string.
+ */
+static void parse_line(char *ptr, char **varname, char **varval)
+{
+ /* Skip over any leading spaces */
+ ptr = skip_space(ptr);
+
+ /* The first no-space is the beginning of the variable name */
+ *varname = skip_space(ptr);
+ *varval = NULL;
+
+ /* Parse to the end of the variable name */
+ ptr = find_name_end(ptr);
+
+ /* An equal sign is expected next, perhaps after some white space */
+ if (*ptr && *ptr != '=') {
+ /* Some else follows the variable name. Terminate the variable
+ * name and skip over any spaces.
+ */
+
+ *ptr = '\0';
+ ptr = skip_space(ptr + 1);
+ }
+
+ /* Verify that the equal sign is present */
+ if (*ptr == '=') {
+ /* Make sure that the variable name is terminated (this was already
+ * done if the name was followed by white space.
+ */
+
+ *ptr = '\0';
+
+ /* The variable value should follow =, perhaps separated by some
+ * white space.
+ */
+
+ ptr = skip_space(ptr + 1);
+ if (*ptr) {
+ /* Yes.. a variable follows. Save the pointer to the start
+ * of the variable string.
+ */
+
+ *varval = ptr;
+
+ /* Find the end of the variable string and make sure that it
+ * is terminated.
+ */
+
+ ptr = find_value_end(ptr);
+ *ptr = '\0';
+ }
+ }
+}
+
+void generate_definitions(FILE *stream)
+{
+ char *varname;
+ char *varval;
+ char *ptr;
+
+ /* Loop until the entire file has been parsed. */
+ do {
+ /* Read the next line from the file */
+ ptr = read_line(stream);
+ if (ptr) {
+ /* Parse the line into a variable and a value field */
+ parse_line(ptr, &varname, &varval);
+
+ dequote_custom_values(varname, varval);
+
+ /* Was a variable name found? */
+ if (varname) {
+ /* If no value was provided or if the special value 'n' was provided,
+ * then undefine the configuration variable.
+ */
+
+ if (!varval || strcmp(varval, "n") == 0)
+ printf("#undef %s\n", varname);
+ else if (strcmp(varval, "y") == 0)
+ printf("#define %s 1\n", varname);
+ else
+ printf("#define %s %s\n", varname, varval);
+ }
+ }
+ } while (ptr);
+}