uci_list_del(ptr);
uci_foreach_element(head, p) {
- new_head = &p->list;
if (pos-- <= 0)
break;
+ new_head = &p->list;
}
- uci_list_add(new_head, ptr);
+
+ uci_list_add(new_head->next, ptr);
}
static inline void uci_list_fixup(struct uci_list *ptr)
* uci_alloc_generic allocates a new uci_element with payload
* payload is appended to the struct to save memory and reduce fragmentation
*/
-static struct uci_element *
+__private struct uci_element *
uci_alloc_generic(struct uci_context *ctx, int type, const char *name, int size)
{
struct uci_element *e;
return e;
}
-static void
+__private void
uci_free_element(struct uci_element *e)
{
if (e->name)
}
int
+uci_lookup_next(struct uci_context *ctx, struct uci_element **e, struct uci_list *list, const char *name)
+{
+ UCI_HANDLE_ERR(ctx);
+
+ *e = uci_lookup_list(list, name);
+ if (!*e)
+ UCI_THROW(ctx, UCI_ERR_NOTFOUND);
+
+ return 0;
+}
+
+int
uci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *str, bool extended)
{
struct uci_element *e;
ptr->flags |= UCI_LOOKUP_DONE;
/* look up the package first */
- e = uci_lookup_list(&ctx->root, ptr->package);
+ if (ptr->p)
+ e = &ptr->p->e;
+ else
+ e = uci_lookup_list(&ctx->root, ptr->package);
+
if (!e) {
UCI_INTERNAL(uci_load, ctx, ptr->package, &ptr->p);
if (!ptr->p)
ptr->last = e;
}
- if (!ptr->section)
+ if (!ptr->section && !ptr->s)
goto complete;
/* if the section name validates as a regular name, pass through
* to the regular uci_lookup function call */
- if (ptr->flags & UCI_LOOKUP_EXTENDED)
- e = uci_lookup_ext_section(ctx, ptr);
- else
+ if (ptr->s) {
+ e = &ptr->s->e;
+ } else if (ptr->flags & UCI_LOOKUP_EXTENDED) {
+ if (extended)
+ e = uci_lookup_ext_section(ctx, ptr);
+ else
+ UCI_THROW(ctx, UCI_ERR_INVAL);
+ } else {
e = uci_lookup_list(&ptr->p->sections, ptr->section);
+ }
if (!e)
goto abort;
return 0;
}
-static struct uci_element *
-expand_ptr(struct uci_context *ctx, struct uci_ptr *ptr, bool complete)
+__private struct uci_element *
+uci_expand_ptr(struct uci_context *ctx, struct uci_ptr *ptr, bool complete)
{
UCI_ASSERT(ctx, ptr != NULL);
UCI_HANDLE_ERR(ctx);
- e = expand_ptr(ctx, ptr, true);
+ e = uci_expand_ptr(ctx, ptr, true);
p = ptr->p;
UCI_ASSERT(ctx, ptr->s);
UCI_HANDLE_ERR(ctx);
- e = expand_ptr(ctx, ptr, true);
+ e = uci_expand_ptr(ctx, ptr, true);
p = ptr->p;
UCI_ASSERT(ctx, ptr->s);
UCI_HANDLE_ERR(ctx);
- expand_ptr(ctx, ptr, false);
+ uci_expand_ptr(ctx, ptr, false);
UCI_ASSERT(ctx, ptr->s);
UCI_ASSERT(ctx, ptr->value);
bool internal = ctx->internal;
UCI_HANDLE_ERR(ctx);
- expand_ptr(ctx, ptr, false);
+ uci_expand_ptr(ctx, ptr, false);
UCI_ASSERT(ctx, ptr->value);
UCI_ASSERT(ctx, ptr->s || (!ptr->option && ptr->section));
if (!ptr->option && ptr->value[0]) {