X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=libuci.c;h=92205e8a0492d995352549b432f961c36701f7e9;hp=c3a8fc06f6a0127999613d6b943415600d3e2ecc;hb=8f5a6c07caaaf5bd692623d1ed8ffbfa20f564d8;hpb=4535c379ced2bdb6a4b414f71080fa0c6f5180aa diff --git a/libuci.c b/libuci.c index c3a8fc0..92205e8 100644 --- a/libuci.c +++ b/libuci.c @@ -21,7 +21,7 @@ #include #include #include -#include "libuci.h" +#include "uci.h" #define DEBUG #include "err.h" @@ -31,6 +31,7 @@ static const char *uci_errstr[] = { [UCI_ERR_MEM] = "Out of memory", [UCI_ERR_INVAL] = "Invalid argument", [UCI_ERR_NOTFOUND] = "Entry not found", + [UCI_ERR_IO] = "I/O error", [UCI_ERR_PARSE] = "Parse error", [UCI_ERR_UNKNOWN] = "Unknown error", }; @@ -42,7 +43,7 @@ static const char *uci_errstr[] = { static void *uci_malloc(struct uci_context *ctx, size_t size) { void *ptr; - + ptr = malloc(size); if (!ptr) UCI_THROW(ctx, UCI_ERR_MEM); @@ -63,25 +64,52 @@ static void *uci_realloc(struct uci_context *ctx, void *ptr, size_t size) 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 "list.c" -#include "parse.c" +#include "file.c" /* externally visible functions */ struct uci_context *uci_alloc(void) { struct uci_context *ctx; - + ctx = (struct uci_context *) malloc(sizeof(struct uci_context)); memset(ctx, 0, sizeof(struct uci_context)); - + uci_list_init(&ctx->root); + return ctx; } +void uci_free(struct uci_context *ctx) +{ + struct uci_element *e, *tmp; + + uci_cleanup(ctx); + uci_foreach_element_safe(&ctx->root, tmp, e) { + uci_free_package(uci_to_package(e)); + } + free(ctx); + return; +} + int uci_cleanup(struct uci_context *ctx) { UCI_HANDLE_ERR(ctx); - uci_parse_cleanup(ctx); + uci_file_cleanup(ctx); return 0; } @@ -93,14 +121,14 @@ void uci_perror(struct uci_context *ctx, const char *str) err = UCI_ERR_INVAL; else err = ctx->errno; - + if ((err < 0) || (err >= UCI_ERR_LAST)) err = UCI_ERR_UNKNOWN; switch (err) { case UCI_ERR_PARSE: if (ctx->pctx) { - fprintf(stderr, "%s: %s at line %d, byte %d\n", str, uci_errstr[err], ctx->pctx->line, ctx->pctx->byte); + fprintf(stderr, "%s: %s (%s) at line %d, byte %d\n", str, uci_errstr[err], (ctx->pctx->reason ? ctx->pctx->reason : "unknown"), ctx->pctx->line, ctx->pctx->byte); break; } /* fall through */