From: Felix Fietkau Date: Wed, 23 Jan 2008 15:06:29 +0000 (+0100) Subject: implement more suggestions by lorenz schori X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=171170de64e0faff8d0e93581d9971439f474cbd;p=oweals%2Fuci.git implement more suggestions by lorenz schori --- diff --git a/Makefile b/Makefile index c32626d..ecfa8bc 100644 --- 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 85fab6f..b7ddd51 100644 --- 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; } diff --git a/libuci.c b/libuci.c index af240ce..400acd8 100644 --- 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 a4e3f96..b9b5cb3 100644 --- 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 index 0000000..c9be293 --- /dev/null +++ b/util.c @@ -0,0 +1,52 @@ +/* + * libuci - Library for the Unified Configuration Interface + * Copyright (C) 2008 Felix Fietkau + * + * 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; +} + +