X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=list.c;h=58880422cdb16d7c49253c7caf94ff6acb9f1063;hp=43b58f4a1ae3d145652aa645faad1e0dc86c43ea;hb=1d2aca0fc893bd253a66e1b2628f8c8c5925fb41;hpb=4535c379ced2bdb6a4b414f71080fa0c6f5180aa diff --git a/list.c b/list.c index 43b58f4..5888042 100644 --- a/list.c +++ b/list.c @@ -12,3 +12,58 @@ * GNU General Public License for more details. */ +/* initialize a list head/item */ +static inline void uci_list_init(struct uci_list *ptr) +{ + ptr->prev = ptr; + ptr->next = ptr; +} + +/* inserts a new list entry between two consecutive entries */ +static inline void __uci_list_add(struct uci_list *prev, struct uci_list *next, struct uci_list *ptr) +{ + prev->next = ptr; + next->prev = ptr; + ptr->prev = prev; + ptr->next = next; +} + +/* inserts a new list entry at the tail of the list */ +static inline void uci_list_add(struct uci_list *head, struct uci_list *ptr) +{ + /* NB: head->prev points at the tail */ + __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_alloc_file(struct uci_context *ctx, const char *name) +{ + struct uci_config *cfg; + + cfg = (struct uci_config *) uci_malloc(ctx, sizeof(struct uci_config)); + uci_list_init(&cfg->list); + uci_list_init(&cfg->sections); + cfg->name = uci_strdup(ctx, name); + 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); +}