add strict mode flag (enabled by default, can be disabled to ignore lines with parser...
authorFelix Fietkau <nbd@openwrt.org>
Wed, 30 Jan 2008 01:58:57 +0000 (02:58 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 30 Jan 2008 01:58:57 +0000 (02:58 +0100)
cli.c
file.c
libuci.c
uci.h

diff --git a/cli.c b/cli.c
index 043ba1a05d90063093c3d50c1b07916b3a6664e9..7139f0bddd697ba7d109fdf1c899808de61d069f 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -12,6 +12,7 @@
  */
 #include <strings.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include "uci.h"
 
 static const char *appname = "uci";
@@ -208,13 +209,39 @@ static int uci_cmd(int argc, char **argv)
 int main(int argc, char **argv)
 {
        int ret;
+       int c;
 
        ctx = uci_alloc_context();
+       if (!ctx) {
+               fprintf(stderr, "Out of memory\n");
+               return 1;
+       }
+
+       while((c = getopt(argc, argv, "sS")) != -1) {
+               switch(c) {
+                       case 's':
+                               ctx->flags |= UCI_FLAG_STRICT;
+                               break;
+                       case 'S':
+                               ctx->flags &= ~UCI_FLAG_STRICT;
+                               ctx->flags |= UCI_FLAG_PERROR;
+                               break;
+                       default:
+                               uci_usage(argc, argv);
+                               break;
+               }
+       }
+       if (optind > 1)
+               argv[optind - 1] = argv[0];
+       argv += optind - 1;
+       argc -= optind - 1;
+
        if (argc < 2)
                uci_usage(argc, argv);
        ret = uci_cmd(argc - 1, argv + 1);
        if (ret == 255)
                uci_usage(argc, argv);
+
        uci_free_context(ctx);
 
        return ret;
diff --git a/file.c b/file.c
index b8aa8653377fe43afb12e9b7beb7e25e5fa8ab60..be63247be7da3eec4d5c7472168bd30b7d506ba3 100644 (file)
--- a/file.c
+++ b/file.c
@@ -502,8 +502,18 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u
 
        while (!feof(pctx->file)) {
                uci_getln(ctx, 0);
+
+               UCI_TRAP_SAVE(ctx, error);
                if (pctx->buf[0])
                        uci_parse_line(ctx, single);
+               UCI_TRAP_RESTORE(ctx);
+               continue;
+error:
+               if (ctx->flags & UCI_FLAG_PERROR)
+                       uci_perror(ctx, NULL);
+               if ((ctx->errno != UCI_ERR_PARSE) ||
+                       (ctx->flags & UCI_FLAG_STRICT))
+                       UCI_THROW(ctx, ctx->errno);
        }
 
        if (package)
index 74b3d7b935ecf2fd9d0f2b8fd1d69542c8389774..0dd81fe3ba0f19bd2c28757ddb9aa2a95e398668 100644 (file)
--- a/libuci.c
+++ b/libuci.c
@@ -47,6 +47,7 @@ struct uci_context *uci_alloc_context(void)
        ctx = (struct uci_context *) malloc(sizeof(struct uci_context));
        memset(ctx, 0, sizeof(struct uci_context));
        uci_list_init(&ctx->root);
+       ctx->flags = UCI_FLAG_STRICT;
 
        return ctx;
 }
diff --git a/uci.h b/uci.h
index 78a0249e8f36f05e39b79febb1a1b8b83dd7b4b1..e0b3d305c32d57652f58ed74d3f5120058faeadc 100644 (file)
--- a/uci.h
+++ b/uci.h
@@ -220,6 +220,11 @@ enum uci_type {
        UCI_TYPE_OPTION = 3
 };
 
+enum uci_flags {
+       UCI_FLAG_STRICT = (1 << 0), /* strict mode for the parser */
+       UCI_FLAG_PERROR = (1 << 1), /* print error messages to stderr */
+};
+
 struct uci_element
 {
        struct uci_list list;
@@ -235,6 +240,9 @@ struct uci_context
        /* parser context, use for error handling only */
        struct uci_parse_context *pctx;
 
+       /* uci runtime flags */
+       enum uci_flags flags;
+
        /* private: */
        int errno;
        const char *func;