Hi Stephen,

On 2023/11/22 0:36, Stephen Hemminger wrote:
> On Tue, 21 Nov 2023 12:26:51 +0000
> Chengwen Feng <fengcheng...@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-fengcheng...@huawei.com/
>>
>> Signed-off-by: Chengwen Feng <fengcheng...@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.

> 
> .
> 

Reply via email to