From: Felix Fietkau Date: Sat, 19 Jan 2008 18:58:45 +0000 (+0100) Subject: more list handling X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=1d2aca0fc893bd253a66e1b2628f8c8c5925fb41;p=uci.git more list handling --- diff --git a/libuci.h b/libuci.h index 3427526..aba4359 100644 --- a/libuci.h +++ b/libuci.h @@ -89,6 +89,7 @@ struct uci_parse_context int byte; /* private: */ + struct uci_config *cfg; FILE *file; char *buf; int bufsz; diff --git a/list.c b/list.c index f681611..5888042 100644 --- a/list.c +++ b/list.c @@ -35,8 +35,18 @@ static inline void uci_list_add(struct uci_list *head, struct uci_list *ptr) __uci_list_add(head->prev, head, ptr); } +static inline void uci_list_del(struct uci_list *ptr) +{ + struct uci_list *next, *prev; + + next = ptr->next; + prev = ptr->prev; + + prev->next = next; + next->prev = prev; +} -static struct uci_config *uci_add_file(struct uci_context *ctx, const char *name) +static struct uci_config *uci_alloc_file(struct uci_context *ctx, const char *name) { struct uci_config *cfg; @@ -44,7 +54,16 @@ static struct uci_config *uci_add_file(struct uci_context *ctx, const char *name uci_list_init(&cfg->list); uci_list_init(&cfg->sections); cfg->name = uci_strdup(ctx, name); - uci_list_add(&ctx->root, &cfg->list); + cfg->ctx = ctx; return cfg; } + +static void uci_drop_file(struct uci_config *cfg) +{ + /* TODO: free children */ + uci_list_del(&cfg->list); + if (cfg->name) + free(cfg->name); + free(cfg); +} diff --git a/parse.c b/parse.c index b154210..f5e6c29 100644 --- a/parse.c +++ b/parse.c @@ -72,6 +72,8 @@ static void uci_parse_cleanup(struct uci_context *ctx) if (!pctx) return; + if (pctx->cfg) + uci_drop_file(pctx->cfg); if (pctx->buf) free(pctx->buf); if (pctx->file) @@ -277,12 +279,18 @@ int uci_parse(struct uci_context *ctx, const char *name) if (!pctx->file) UCI_THROW(ctx, UCI_ERR_NOTFOUND); + pctx->cfg = uci_alloc_file(ctx, name); + while (!feof(pctx->file)) { uci_getln(ctx); if (*(pctx->buf)) uci_parse_line(ctx); } + /* add to main config file list */ + uci_list_add(&ctx->root, &pctx->cfg->list); + pctx->cfg = NULL; + /* if no error happened, we can get rid of the parser context now */ uci_parse_cleanup(ctx);