- ptr->o = uci_alloc_list(ptr->s, ptr->option);
- if (prev) {
- uci_add_element_list(ctx, ptr, true);
- if (ptr->option == prev->e.name)
+ /* create new item */
+ e1 = uci_alloc_generic(ctx, UCI_TYPE_ITEM, ptr->value, sizeof(struct uci_option));
+
+ if (!ptr->o) {
+ /* create new list */
+ UCI_TRAP_SAVE(ctx, error);
+ ptr->o = uci_alloc_list(ptr->s, ptr->option);
+ UCI_TRAP_RESTORE(ctx);
+ ptr->last = &ptr->o->e;
+ } else if (ptr->o->type == UCI_TYPE_STRING) {
+ /* create new list and add old string value as item to list */
+ struct uci_option *old = ptr->o;
+ UCI_TRAP_SAVE(ctx, error);
+ e2 = uci_alloc_generic(ctx, UCI_TYPE_ITEM, old->v.string, sizeof(struct uci_option));
+ ptr->o = uci_alloc_list(ptr->s, ptr->option);
+ UCI_TRAP_RESTORE(ctx);
+ uci_list_add(&ptr->o->v.list, &e2->list);
+
+ /* remove old option */
+ if (ptr->option == old->e.name)