>-----Original Message-----
>From: Troy Kisky [mailto:troy.ki...@boundarydevices.com]
>Sent: Wednesday, November 28, 2012 9:32 AM
>To: sba...@denx.de
>Cc: dirk.be...@googlemail.com; u-boot@lists.denx.de; Liu Hui-R64343;
>feste...@gmail.com; Troy Kisky
>Subject: [PATCH V4 09/11] tools: add parse_helper file
>
>This file can help you parse
>configuration files.

One line is enough. :)

>
>Signed-off-by: Troy Kisky <troy.ki...@boundarydevices.com>

Acked-by: Jason Liu <r64...@freescale.com>

>---
> tools/Makefile       |    2 +
> tools/parse_helper.c |  173
>++++++++++++++++++++++++++++++++++++++++++++++++++
> tools/parse_helper.h |   28 ++++++++
> 3 files changed, 203 insertions(+)
> create mode 100644 tools/parse_helper.c  create mode 100644
>tools/parse_helper.h
>
>diff --git a/tools/Makefile b/tools/Makefile index 686840a..db3b247 100644
>--- a/tools/Makefile
>+++ b/tools/Makefile
>@@ -94,6 +94,7 @@ NOPED_OBJ_FILES-y += aisimage.o  NOPED_OBJ_FILES-y
>+= kwbimage.o  NOPED_OBJ_FILES-y += pblimage.o  NOPED_OBJ_FILES-y +=
>imximage.o
>+NOPED_OBJ_FILES-y += parse_helper.o
> NOPED_OBJ_FILES-y += omapimage.o
> NOPED_OBJ_FILES-y += mkenvimage.o
> NOPED_OBJ_FILES-y += mkimage.o
>@@ -208,6 +209,7 @@ $(obj)mkimage$(SFX):       $(obj)aisimage.o \
>                       $(obj)fit_image.o \
>                       $(obj)image.o \
>                       $(obj)imximage.o \
>+                      $(obj)parse_helper.o \
>                       $(obj)kwbimage.o \
>                       $(obj)pblimage.o \
>                       $(obj)md5.o \
>diff --git a/tools/parse_helper.c b/tools/parse_helper.c new file mode 100644
>index 0000000..0a5c5f6
>--- /dev/null
>+++ b/tools/parse_helper.c
>@@ -0,0 +1,173 @@
>+/*
>+ * (C) Copyright 20012  Boundary Devices Inc,
>+troy.ki...@boundarydevices.com
>+ *
>+ * Licensed under the GPL-2 or later.
>+ */
>+
>+/* Required to obtain the getline prototype from stdio.h */ #define
>+_GNU_SOURCE
>+
>+#include "mkimage.h"
>+#include <image.h>
>+#include "parse_helper.h"
>+
>+int ph_open(struct parse_helper *ph, char *filename) {
>+      ph->line = NULL;
>+      ph->len = 0;
>+      ph->fd = fopen(filename, "r");
>+      ph->lineno = 0;
>+      ph->cmd_started = 0;
>+      ph->filename = filename;
>+      ph->p = NULL;
>+      return (!ph->fd) ? -1 : 0;
>+}
>+
>+void ph_close(struct parse_helper *ph)
>+{
>+      fclose(ph->fd);
>+      ph->fd = NULL;
>+}
>+
>+int ph_skip_separators(struct parse_helper *ph) {
>+      int line_no = ph->lineno;
>+      char *p = ph->p;
>+
>+      for (;;) {
>+              char c;
>+              if (!p) {
>+                      if (getline(&ph->line, &ph->len, ph->fd) <= 0)
>+                              return -1;
>+                      ph->lineno++;
>+                      p = ph->line;
>+                      if (ph->cmd_started) {
>+                              fprintf(stderr, "warning: continuing command
>on"
>+                                              " next line, line %s[%d](%s)\n",
>+                                              ph->filename, ph->lineno, p);
>+                      }
>+              }
>+              c = *p;
>+              if ((c == ' ') || (c == '\t')) {
>+                      p++;
>+                      continue;
>+              }
>+              /* Drop all text starting with '#' as comments */
>+              if ((c == '#') || (c == '\r') || (c == '\n')
>+                              || !c) {
>+                      p = NULL;
>+                      continue;
>+              }
>+              if (c == ';') {
>+                      if (ph->cmd_started) {
>+                              fprintf(stderr, "Error: command not "
>+                                              "finished:%s[%d](%s)\n",
>+                                              ph->filename, ph->lineno, p);
>+                              exit(EXIT_FAILURE);
>+                      }
>+                      p++;
>+                      continue;
>+              }
>+              if (!ph->cmd_started && line_no == ph->lineno) {
>+                      fprintf(stderr, "Error: extra data at end "
>+                                      "of line %s[%d](%s)\n",
>+                                      ph->filename, ph->lineno, p);
>+                      exit(EXIT_FAILURE);
>+              }
>+              ph->p = p;
>+              return 0;
>+      }
>+}
>+
>+int ph_skip_comma(struct parse_helper *ph) {
>+      char *p = ph->p;
>+
>+      for (;;) {
>+              char c = *p++;
>+              if ((c == '#') || (c == '\r') || (c == '\n') || !c)
>+                      return 0;
>+              if (c == ',') {
>+                      ph->p = p;
>+                      ph_skip_separators(ph);
>+                      return 1;
>+              }
>+              if ((c != ' ') && (c == '\t'))
>+                      return 0;
>+      }
>+}
>+
>+int ph_get_value(struct parse_helper *ph, uint32_t *pval) {
>+      char *endptr;
>+      uint32_t value;
>+
>+      if (ph_skip_separators(ph))
>+              return -1;
>+      errno = 0;
>+      value = strtoul(ph->p, &endptr, 16);
>+      if (errno || (ph->p == endptr))
>+              return -1;
>+      *pval = value;
>+      ph->p = endptr;
>+      return 0;
>+}
>+
>+/*
>+ * Comma separator optional
>+ * Input:
>+ * ph - input source
>+ * data - array to fill in
>+ * cnt - exact number of elements to parse
>+ * Return: number of elements parsed, or error  */ int
>+ph_get_array(struct parse_helper *ph, uint32_t *data, int cnt) {
>+      int i = 0;
>+
>+      for (;;) {
>+              int ret = ph_get_value(ph, &data[i++]);
>+              if (ret)
>+                      return ret;
>+              if (i >= cnt)
>+                      break;
>+              ph_skip_comma(ph);              /* comma is optional */
>+      }
>+      return i;
>+}
>+
>+static char *grab_token(char *dest, int size, char *src) {
>+      while (size) {
>+              char c = *src;
>+              if ((c == ' ') || (c == '\t') || (c == '\r') || (c == '\n')
>+                              || (c == '#') || !c)
>+                      break;
>+              *dest++ = c;
>+              size--;
>+              src++;
>+      }
>+      if (!size)
>+              return NULL;
>+      *dest = 0;
>+      return src;
>+}
>+
>+int ph_get_table_entry_id(struct parse_helper *ph,
>+              const table_entry_t *table, const char *table_name) {
>+      int val;
>+      char token[16];
>+      char *p;
>+
>+      if (ph_skip_separators(ph))
>+              return -1;
>+      p = grab_token(token, sizeof(token), ph->p);
>+      if (!p)
>+              return -1;
>+      val = get_table_entry_id(table, table_name, token);
>+      if (val != -1)
>+              ph->p = p;
>+      return val;
>+}
>+
>diff --git a/tools/parse_helper.h b/tools/parse_helper.h new file mode
>100644 index 0000000..1ff98a3
>--- /dev/null
>+++ b/tools/parse_helper.h
>@@ -0,0 +1,28 @@
>+/*
>+ * (C) Copyright 20012  Boundary Devices Inc,
>+troy.ki...@boundarydevices.com
>+ *
>+ * Licensed under the GPL-2 or later.
>+ */
>+
>+#ifndef _PARSE_HELPER_H_
>+#define _PARSE_HELPER_H_
>+
>+struct parse_helper {
>+      char *line;
>+      size_t len;
>+      FILE *fd;
>+      int lineno;
>+      char cmd_started;
>+      char *filename;
>+      char *p;
>+};
>+
>+int ph_open(struct parse_helper *ph, char *filename); void
>+ph_close(struct parse_helper *ph); int ph_skip_separators(struct
>+parse_helper *ph); int ph_skip_comma(struct parse_helper *ph); int
>+ph_get_value(struct parse_helper *ph, uint32_t *pval); int
>+ph_get_array(struct parse_helper *ph, uint32_t *data, int cnt); int
>+ph_get_table_entry_id(struct parse_helper *ph,
>+              const table_entry_t *table, const char *table_name); #endif
>--
>1.7.9.5
>


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to