[PATCH uci 2/2] remove internal usage of redundant uci_ptr.last

Jan Venekamp jan at venekamp.net
Tue Aug 1 17:12:20 PDT 2023


On 01/08/2023 22:27, Hauke Mehrtens wrote:
> On 7/14/23 20:28, Jan Venekamp wrote:
>> 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 at venekamp.net>
>> ---
>>   cli.c     | 39 +++++++++++----------------------------
>>   delta.c   | 10 ++++++----
>>   list.c    |  6 ------
>>   lua/uci.c | 42 +++++++++++++++---------------------------
>>   4 files changed, 32 insertions(+), 65 deletions(-)
>>
> ......
>> @@ -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;
>
> How do we make sure that only one of these is set at a time?
> Before the code would print the last element added.
>

The code in uci_lookup_ptr makes sure that the element being looked up 
is the last of: ptr.p, ptr.s, ptr.o with a non null value (pointer).

Thus, if an option is looked up ptr.o is set and printed. When a section 
is looked up ptr.o is null, but ptr.s is set and printed. Else a package 
is looked up, ptr.o and ptr.s are null so ptr.p is printed. (When a 
looked up element is not found UCI_LOOKUP_COMPLETE is not set which will 
result in an error.)

So the code prints the same element as before.

Hope this explains it.

>>       }
>>   @@ -475,7 +467,6 @@ done:
> ......




More information about the openwrt-devel mailing list