From: Jan Venekamp Date: Sun, 20 Nov 2022 01:08:22 +0000 (+0100) Subject: uci: optimize update option in uci_set X-Git-Url: http://git.openwrt.org/feed/routing.git;lede-17.01?a=commitdiff_plain;h=7e01d66d7bec5f9e3694dcad25c472327a0ff352;p=project%2Fuci.git uci: optimize update option in uci_set Optimize for the case when there is no need to reallocate memory when updating an option in uci_set. Signed-off-by: Jan Venekamp --- diff --git a/list.c b/list.c index a8f2a2c..5148dfd 100644 --- a/list.c +++ b/list.c @@ -725,17 +725,19 @@ int uci_set(struct uci_context *ctx, struct uci_ptr *ptr) ptr->s = uci_alloc_section(ptr->p, ptr->value, ptr->section); ptr->last = &ptr->s->e; } else if (ptr->o && ptr->option) { /* update option */ - struct uci_option *old = ptr->o; - - if ((ptr->o->type == UCI_TYPE_STRING) && - !strcmp(ptr->o->v.string, ptr->value)) + if (ptr->o->type == UCI_TYPE_STRING && !strcmp(ptr->o->v.string, ptr->value)) return 0; - ptr->o = uci_alloc_option(ptr->s, ptr->option, ptr->value, &old->e.list); - if (ptr->option == old->e.name) - ptr->option = ptr->o->e.name; - uci_free_option(old); - ptr->last = &ptr->o->e; + if (ptr->o->type == UCI_TYPE_STRING && strlen(ptr->o->v.string) == strlen(ptr->value)) { + strcpy(ptr->o->v.string, ptr->value); + } else { + struct uci_option *old = ptr->o; + ptr->o = uci_alloc_option(ptr->s, ptr->option, ptr->value, &old->e.list); + 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 */ char *s = uci_strdup(ctx, ptr->value);