remove internal usage of redundant uci_ptr.last

In uci_lookup_ptr and uci_set the pointer uci_ptr ptr.last is set to
the element corresponding to the first of: ptr.o, ptr.s, ptr.p.

Thus, ptr.last is redundant and in case of uci_set is (and was) not
always consistently set.

In order to simplify the code this commit removes internal usage
of ptr.last, and remove setting it from uci_set (and from uci_add_list
that was never used anyway).

As it is part of the public C api ptr.last cannot be completely
removed though. A search on lxr.openwrt.org shows that it is used as
the output of uci_lookup_ptr in several packages.

So we leave setting ptr.last in uci_lookup_ptr intact.

Signed-off-by: Jan Venekamp <jan@venekamp.net>
This commit is contained in:
Jan Venekamp
2023-07-14 20:28:11 +02:00
committed by Hauke Mehrtens
parent 3cda25127b
commit 5781664d50
4 changed files with 32 additions and 65 deletions

39
cli.c
View File

@@ -314,7 +314,6 @@ static void uci_show_changes(struct uci_package *p)
static int package_cmd(int cmd, char *tuple)
{
struct uci_element *e = NULL;
struct uci_ptr ptr;
int ret = 1;
@@ -323,7 +322,6 @@ static int package_cmd(int cmd, char *tuple)
return 1;
}
e = ptr.last;
switch(cmd) {
case CMD_CHANGES:
uci_show_changes(ptr.p);
@@ -349,20 +347,14 @@ static int package_cmd(int cmd, char *tuple)
cli_perror();
goto out;
}
switch(e->type) {
case UCI_TYPE_PACKAGE:
uci_show_package(ptr.p);
break;
case UCI_TYPE_SECTION:
uci_show_section(ptr.s);
break;
case UCI_TYPE_OPTION:
uci_show_option(ptr.o, true);
break;
default:
/* should not happen */
goto out;
}
if (ptr.o)
uci_show_option(ptr.o, true);
else if (ptr.s)
uci_show_section(ptr.s);
else if (ptr.p)
uci_show_package(ptr.p);
else
goto out; /* should not happen */
break;
}
@@ -475,7 +467,6 @@ done:
static int uci_do_section_cmd(int cmd, int argc, char **argv)
{
struct uci_element *e;
struct uci_ptr ptr;
int ret = UCI_OK;
int dummy;
@@ -493,7 +484,6 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
(cmd != CMD_RENAME) && (cmd != CMD_REORDER))
return 1;
e = ptr.last;
switch(cmd) {
case CMD_GET:
if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) {
@@ -501,17 +491,10 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
cli_perror();
return 1;
}
switch(e->type) {
case UCI_TYPE_SECTION:
printf("%s\n", ptr.s->type);
break;
case UCI_TYPE_OPTION:
if (ptr.o)
uci_show_value(ptr.o, false);
break;
default:
break;
}
/* throw the value to stdout */
else if (ptr.s)
printf("%s\n", ptr.s->type);
break;
case CMD_RENAME:
ret = uci_rename(ctx, &ptr);

10
delta.c
View File

@@ -213,7 +213,6 @@ error:
static void uci_parse_delta_line(struct uci_context *ctx, struct uci_package *p)
{
struct uci_element *e = NULL;
struct uci_ptr ptr;
int cmd;
@@ -244,11 +243,14 @@ static void uci_parse_delta_line(struct uci_context *ctx, struct uci_package *p)
UCI_INTERNAL(uci_del_list, ctx, &ptr);
break;
case UCI_CMD_ADD:
UCI_INTERNAL(uci_set, ctx, &ptr);
if (!ptr.option && ptr.s)
ptr.s->anonymous = true;
break;
case UCI_CMD_CHANGE:
UCI_INTERNAL(uci_set, ctx, &ptr);
e = ptr.last;
if (!ptr.option && e && (cmd == UCI_CMD_ADD))
uci_to_section(e)->anonymous = true;
break;
default:
break;
}
return;

6
list.c
View File

@@ -616,7 +616,6 @@ int uci_add_list(struct uci_context *ctx, struct uci_ptr *ptr)
UCI_TRAP_SAVE(ctx, error);
ptr->o = uci_alloc_list(ptr->s, ptr->option, NULL);
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;
@@ -630,7 +629,6 @@ int uci_add_list(struct uci_context *ctx, struct uci_ptr *ptr)
if (ptr->option == old->e.name)
ptr->option = ptr->o->e.name;
uci_free_option(old);
ptr->last = &ptr->o->e;
}
/* add new item to list */
@@ -708,10 +706,8 @@ int uci_set(struct uci_context *ctx, struct uci_ptr *ptr)
return uci_delete(ctx, ptr);
} else if (!ptr->o && ptr->option) { /* new option */
ptr->o = uci_alloc_option(ptr->s, ptr->option, ptr->value, NULL);
ptr->last = &ptr->o->e;
} else if (!ptr->s && ptr->section) { /* new section */
ptr->s = uci_alloc_section(ptr->p, ptr->value, ptr->section, NULL);
ptr->last = &ptr->s->e;
} else if (ptr->o && ptr->option) { /* update option */
if (ptr->o->type == UCI_TYPE_STRING && !strcmp(ptr->o->v.string, ptr->value))
return 0;
@@ -724,7 +720,6 @@ int uci_set(struct uci_context *ctx, struct uci_ptr *ptr)
if (ptr->option == old->e.name)
ptr->option = ptr->o->e.name;
uci_free_option(old);
ptr->last = &ptr->o->e;
}
} else if (ptr->s && ptr->section) { /* update section */
if (!strcmp(ptr->s->type, ptr->value))
@@ -740,7 +735,6 @@ int uci_set(struct uci_context *ctx, struct uci_ptr *ptr)
ptr->section = ptr->s->e.name;
uci_free_section(old);
ptr->s->package->n_section--;
ptr->last = &ptr->s->e;
}
} else {
UCI_THROW(ctx, UCI_ERR_INVAL);

View File

@@ -374,19 +374,16 @@ static int
uci_lua_get_any(lua_State *L, bool all)
{
struct uci_context *ctx;
struct uci_element *e = NULL;
struct uci_ptr ptr;
int offset = 0;
int nret = 1;
char *s = NULL;
int err = UCI_ERR_NOTFOUND;
ctx = find_context(L, &offset);
if (lookup_args(L, ctx, offset, &ptr, &s))
goto error;
lookup_ptr(ctx, &ptr, NULL, true);
if (!all && !ptr.s) {
ctx->err = UCI_ERR_INVAL;
goto error;
@@ -396,33 +393,24 @@ uci_lua_get_any(lua_State *L, bool all)
goto error;
}
err = UCI_OK;
e = ptr.last;
switch(e->type) {
case UCI_TYPE_PACKAGE:
uci_push_package(L, ptr.p);
break;
case UCI_TYPE_SECTION:
if (all) {
uci_push_section(L, ptr.s, -1);
}
else {
lua_pushstring(L, ptr.s->type);
lua_pushstring(L, ptr.s->e.name);
nret++;
}
break;
case UCI_TYPE_OPTION:
uci_push_option(L, ptr.o);
break;
default:
ctx->err = UCI_ERR_INVAL;
goto error;
if (ptr.o) {
uci_push_option(L, ptr.o);
} else if (ptr.s) {
if (all) {
uci_push_section(L, ptr.s, -1);
}
else {
lua_pushstring(L, ptr.s->type);
lua_pushstring(L, ptr.s->e.name);
nret++;
}
} else {
uci_push_package(L, ptr.p);
}
if (s)
free(s);
if (!err)
return nret;
return nret;
error:
if (s)