[24.03 RFC] argparse: add argparse library
fengchengwen
fengchengwen at huawei.com
Wed Nov 22 07:28:09 CET 2023
Hi Stephen,
On 2023/11/22 0:36, Stephen Hemminger wrote:
> On Tue, 21 Nov 2023 12:26:51 +0000
> Chengwen Feng <fengchengwen at huawei.com> wrote:
>
>> Introduce argparse library (which was inspired by the thread [1]),
>> compared with getopt, the argparse has following advantages:
>> 1) Set the help information when defining parameters.
>> 2) Support positional parameters.
>>
>> The parameters parsing according following:
>> 1) positional: use callback to parse (passed the long-name as the key
>> for callback).
>> 2) optional:
>> In addition to callback to parse, but also support:
>> 2.1) no-val: support set default value to saver.
>> 2.2) has-val: support set value to saver, the value must be conform
>> RTE_ARGPARSE_ARG_VAL_xxx.
>> 2.3) opt-val: if current without value then treat as no-val, else could
>> treat as has-val.
>>
>> Examples: (take dmafwd as example):
>> 1) If parse with callback:
>> static int
>> func(const char *key, const char *value, const char *opaque)
>> {
>> if (!strcmp("--mac-updating", key)) {
>> mac_updating = 1;
>> } else if (!strcmp("--no-mac-updating", key)) {
>> mac_updating = 0;
>> } else if (!strcmp("--portmask", key)) {
>> dma_enabled_port_mask = dma_parse_portmask(optarg);
>> if (dma_enabled_port_mask & ~default_port_mask ||
>> dma_enabled_port_mask <= 0) {
>> ...
>> }
>> } else {
>> ...
>> }
>> }
>>
>> static int
>> dma_parse_args(int argc, char **argv, unsigned int nb_ports)
>> {
>> static struct rte_argparse opts[] = {
>> .prog = "dma",
>> .usage = NULL,
>> .descriptor = "dma and nic fwd example",
>> .epilog = NULL,
>> .exit_on_error = true,
>> .opt = {
>> { "--mac-updating", NULL, "Enable MAC addresses updating", func, 0, NULL, NULL, RTE_ARGPARSE_ARG_NO_VAL },
>> { "--no-mac-updating", NULL, "disable MAC addresses updating", func, 0, NULL, NULL, RTE_ARGPARSE_ARG_NO_VAL },
>> { "--portmask", "-p", "hexadecimal bitmask of ports to configure", func, 0, NULL, NULL, RTE_ARGPARSE_ARG_HAS_VAL },
>> { NULL, NULL, NULL, NULL, 0, NULL, NULL, 0}
>> }
>> };
>> return rte_argparse_parse(opts, argc, argv);
>> }
>>
>> 2) If parse with value:
>> static int
>> dma_parse_args(int argc, char **argv, unsigned int nb_ports)
>> {
>> static struct rte_argparse opts[] = {
>> .prog = "dma",
>> .usage = NULL,
>> .descriptor = "dma and nic fwd example",
>> .epilog = NULL,
>> .exit_on_error = true,
>> .opt = {
>> { "--mac-updating", NULL, "Enable MAC addresses updating", NULL, 0, &mac_updating, (void *)1, RTE_ARGPARSE_ARG_NO_VAL },
>> { "--no-mac-updating", NULL, "disable MAC addresses updating", NULL, 0, &mac_updating, (void *)0, RTE_ARGPARSE_ARG_NO_VAL },
>> { "--portmask", "-p", "hexadecimal bitmask of ports to configure", NULL, 0, &dma_enabled_port_mask, NULL, RTE_ARGPARSE_ARG_HAS_VAL },
>> { NULL, NULL, NULL, NULL, 0, NULL, NULL, 0}
>> }
>> };
>> int ret;
>> ret = rte_argparse_parse(opts, argc, argv);
>> if (ret != 0)
>> return ret;
>> if (dma_enabled_port_mask & ~default_port_mask ||
>> dma_enabled_port_mask <= 0) {
>> ...
>> }
>> }
>>
>> 3) Also could mix parse with func and with value.
>>
>> [1] https://patchwork.dpdk.org/project/dpdk/patch/20231105054539.22303-2-fengchengwen@huawei.com/
>>
>> Signed-off-by: Chengwen Feng <fengchengwen at huawei.com>
>> ---
>
> Need tests and more detailed man page.
> Maybe convert one of the existing examples.
Should add now ?
I prefer wait TB decide to accept it before starting it.
>
> Can it be used in nested fashion for kvargs?
I planed to use kvargs inner to implement the argparse library.
> The existing kvargs syntax is awkward, would be nice to fix/change that but would
> cause lots of arguments :-)
Yes, I try to fix/change by two different ways but no progress:
1) fix the wrong usage, which involve many drivers.
2) add one new API.
Maybe we should keep kvargs as it is.
>
> .
>
More information about the dev
mailing list