implement more suggestions by lorenz schori
authorFelix Fietkau <nbd@openwrt.org>
Wed, 23 Jan 2008 15:06:29 +0000 (16:06 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 23 Jan 2008 15:06:29 +0000 (16:06 +0100)
Makefile
cli.c
libuci.c
uci.h
util.c [new file with mode: 0644]

index c32626de9e9deda5f213ba59a61de5620d2a4137..ecfa8bc9723c43708f7e09c2195ed1b342cd6301 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ cli.o: cli.c uci.h
 uci: cli.o libuci.a
        $(CC) $(CFLAGS) -o $@ $^
 
-libuci.o: libuci.c file.c uci.h list.c err.h
+libuci.o: libuci.c file.c uci.h list.c err.h util.c
 libuci.a: libuci.o
        rm -f $@
        $(AR) rc $@ $^
diff --git a/cli.c b/cli.c
index 85fab6f5e7482ead1c342ee77ab8e8f6a31b4aaa..b7ddd511676ed82fdfe9ce77c841bb6a8cc74ad0 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -107,13 +107,13 @@ int main(int argc, char **argv)
 {
        int ret;
 
-       ctx = uci_alloc();
+       ctx = uci_alloc_context();
        if (argc < 2)
                uci_usage(argc, argv);
        ret = uci_cmd(argc - 1, argv + 1);
        if (ret == 255)
                uci_usage(argc, argv);
-       uci_free(ctx);
+       uci_free_context(ctx);
 
        return ret;
 }
index af240ce6930f259128e1531a2330495daaad3152..400acd8967de5ada548b46fd2d6776f79bd3a665 100644 (file)
--- a/libuci.c
+++ b/libuci.c
@@ -34,54 +34,12 @@ static const char *uci_errstr[] = {
        [UCI_ERR_UNKNOWN] =  "Unknown error",
 };
 
-
-/*
- * UCI wrapper for malloc, which uses exception handling
- */
-static void *uci_malloc(struct uci_context *ctx, size_t size)
-{
-       void *ptr;
-
-       ptr = malloc(size);
-       if (!ptr)
-               UCI_THROW(ctx, UCI_ERR_MEM);
-       memset(ptr, 0, size);
-
-       return ptr;
-}
-
-/*
- * UCI wrapper for realloc, which uses exception handling
- */
-static void *uci_realloc(struct uci_context *ctx, void *ptr, size_t size)
-{
-       ptr = realloc(ptr, size);
-       if (!ptr)
-               UCI_THROW(ctx, UCI_ERR_MEM);
-
-       return ptr;
-}
-
-/*
- * UCI wrapper for strdup, which uses exception handling
- */
-static char *uci_strdup(struct uci_context *ctx, const char *str)
-{
-       char *ptr;
-
-       ptr = strdup(str);
-       if (!ptr)
-               UCI_THROW(ctx, UCI_ERR_MEM);
-
-       return ptr;
-}
-
+#include "util.c"
 #include "list.c"
 #include "file.c"
 
-/* externally visible functions */
-
-struct uci_context *uci_alloc(void)
+/* exported functions */
+struct uci_context *uci_alloc_context(void)
 {
        struct uci_context *ctx;
 
@@ -92,15 +50,19 @@ struct uci_context *uci_alloc(void)
        return ctx;
 }
 
-void uci_free(struct uci_context *ctx)
+void uci_free_context(struct uci_context *ctx)
 {
        struct uci_element *e, *tmp;
 
+       UCI_TRAP_SAVE(ctx, ignore);
        uci_cleanup(ctx);
        uci_foreach_element_safe(&ctx->root, tmp, e) {
                uci_free_package(uci_to_package(e));
        }
        free(ctx);
+       UCI_TRAP_RESTORE(ctx);
+
+ignore:
        return;
 }
 
diff --git a/uci.h b/uci.h
index a4e3f96d3ef2373ee657173ed7d935bbdacee636..b9b5cb38a07458467de40444a486ed50f0ca0885 100644 (file)
--- a/uci.h
+++ b/uci.h
@@ -60,14 +60,14 @@ struct uci_parse_context;
 
 
 /**
- * uci_alloc: Allocate a new uci context
+ * uci_alloc_context: Allocate a new uci context
  */
-extern struct uci_context *uci_alloc(void);
+extern struct uci_context *uci_alloc_context(void);
 
 /**
- * uci_free: Free the uci context including all of its data
+ * uci_free_context: Free the uci context including all of its data
  */
-extern void uci_free(struct uci_context *ctx);
+extern void uci_free_context(struct uci_context *ctx);
 
 /**
  * uci_perror: Print the last uci error that occured
diff --git a/util.c b/util.c
new file mode 100644 (file)
index 0000000..c9be293
--- /dev/null
+++ b/util.c
@@ -0,0 +1,52 @@
+/*
+ * libuci - Library for the Unified Configuration Interface
+ * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+/*
+ * This file contains wrappers to standard functions, which
+ * throw exceptions upon failure.
+ */
+
+static void *uci_malloc(struct uci_context *ctx, size_t size)
+{
+       void *ptr;
+
+       ptr = malloc(size);
+       if (!ptr)
+               UCI_THROW(ctx, UCI_ERR_MEM);
+       memset(ptr, 0, size);
+
+       return ptr;
+}
+
+static void *uci_realloc(struct uci_context *ctx, void *ptr, size_t size)
+{
+       ptr = realloc(ptr, size);
+       if (!ptr)
+               UCI_THROW(ctx, UCI_ERR_MEM);
+
+       return ptr;
+}
+
+static char *uci_strdup(struct uci_context *ctx, const char *str)
+{
+       char *ptr;
+
+       ptr = strdup(str);
+       if (!ptr)
+               UCI_THROW(ctx, UCI_ERR_MEM);
+
+       return ptr;
+}
+
+