1e3e579f5SChengwen Feng.. SPDX-License-Identifier: BSD-3-Clause 2e3e579f5SChengwen Feng Copyright(c) 2024 HiSilicon Limited 3e3e579f5SChengwen Feng 4e3e579f5SChengwen FengArgparse Library 5e3e579f5SChengwen Feng================ 6e3e579f5SChengwen Feng 7e3e579f5SChengwen FengThe argparse library provides argument parsing functionality, 8e3e579f5SChengwen Fengthis library makes it easy to write user-friendly command-line program. 9e3e579f5SChengwen Feng 10e3e579f5SChengwen FengFeatures and Capabilities 11e3e579f5SChengwen Feng------------------------- 12e3e579f5SChengwen Feng 13e3e579f5SChengwen Feng- Support parsing optional argument (which could take with no-value, 14e3e579f5SChengwen Feng required-value and optional-value). 15e3e579f5SChengwen Feng 16e3e579f5SChengwen Feng- Support parsing positional argument (which must take with required-value). 17e3e579f5SChengwen Feng 18e3e579f5SChengwen Feng- Support automatic generate usage information. 19e3e579f5SChengwen Feng 20e3e579f5SChengwen Feng- Support issue errors when provide with invalid arguments. 21e3e579f5SChengwen Feng 22e3e579f5SChengwen Feng- Support parsing argument by two ways: 23e3e579f5SChengwen Feng 24e3e579f5SChengwen Feng #. autosave: used for parsing known value types; 25e3e579f5SChengwen Feng #. callback: will invoke user callback to parse. 26e3e579f5SChengwen Feng 27e3e579f5SChengwen FengUsage Guide 28e3e579f5SChengwen Feng----------- 29e3e579f5SChengwen Feng 30e3e579f5SChengwen FengThe following code demonstrates how to use: 31e3e579f5SChengwen Feng 32e3e579f5SChengwen Feng.. code-block:: C 33e3e579f5SChengwen Feng 34e3e579f5SChengwen Feng static int 35e3e579f5SChengwen Feng argparse_user_callback(uint32_t index, const char *value, void *opaque) 36e3e579f5SChengwen Feng { 37e3e579f5SChengwen Feng if (index == 1) { 38e3e579f5SChengwen Feng /* process "--ddd" argument, because it is configured as no-value, 39e3e579f5SChengwen Feng * the parameter 'value' is NULL. 40e3e579f5SChengwen Feng */ 41e3e579f5SChengwen Feng ... 42e3e579f5SChengwen Feng } else if (index == 2) { 43e3e579f5SChengwen Feng /* process "--eee" argument, because it is configured as 44e3e579f5SChengwen Feng * required-value, the parameter 'value' must not be NULL. 45e3e579f5SChengwen Feng */ 46e3e579f5SChengwen Feng ... 47e3e579f5SChengwen Feng } else if (index == 3) { 48e3e579f5SChengwen Feng /* process "--fff" argument, because it is configured as 49e3e579f5SChengwen Feng * optional-value, the parameter 'value' maybe NULL or not NULL, 50e3e579f5SChengwen Feng * depend on input. 51e3e579f5SChengwen Feng */ 52e3e579f5SChengwen Feng ... 53e3e579f5SChengwen Feng } else if (index == 300) { 54e3e579f5SChengwen Feng /* process "ppp" argument, because it's a positional argument, 55e3e579f5SChengwen Feng * the parameter 'value' must not be NULL. 56e3e579f5SChengwen Feng */ 57e3e579f5SChengwen Feng ... 58e3e579f5SChengwen Feng } else { 59e3e579f5SChengwen Feng return -EINVAL; 60e3e579f5SChengwen Feng } 61e3e579f5SChengwen Feng } 62e3e579f5SChengwen Feng 63e3e579f5SChengwen Feng static int aaa_val, bbb_val, ccc_val, ooo_val; 64e3e579f5SChengwen Feng 65e3e579f5SChengwen Feng static struct rte_argparse obj = { 66e3e579f5SChengwen Feng .prog_name = "test-demo", 67e3e579f5SChengwen Feng .usage = "[EAL options] -- [optional parameters] [positional parameters]", 68e3e579f5SChengwen Feng .descriptor = NULL, 69e3e579f5SChengwen Feng .epilog = NULL, 70e3e579f5SChengwen Feng .exit_on_error = true, 71e3e579f5SChengwen Feng .callback = argparse_user_callback, 72e3e579f5SChengwen Feng .args = { 73e3e579f5SChengwen Feng { "--aaa", "-a", "aaa argument", &aaa_val, (void *)100, RTE_ARGPARSE_ARG_NO_VALUE | RTE_ARGPARSE_ARG_VALUE_INT }, 74e3e579f5SChengwen Feng { "--bbb", "-b", "bbb argument", &bbb_val, NULL, RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT }, 75e3e579f5SChengwen Feng { "--ccc", "-c", "ccc argument", &ccc_val, (void *)200, RTE_ARGPARSE_ARG_OPTIONAL_VALUE | RTE_ARGPARSE_ARG_VALUE_INT }, 76e3e579f5SChengwen Feng { "--ddd", "-d", "ddd argument", NULL, (void *)1, RTE_ARGPARSE_ARG_NO_VALUE }, 77e3e579f5SChengwen Feng { "--eee", "-e", "eee argument", NULL, (void *)2, RTE_ARGPARSE_ARG_REQUIRED_VALUE }, 78e3e579f5SChengwen Feng { "--fff", "-f", "fff argument", NULL, (void *)3, RTE_ARGPARSE_ARG_OPTIONAL_VALUE }, 79e3e579f5SChengwen Feng { "ooo", NULL, "ooo argument", &ooo_val, NULL, RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT }, 80e3e579f5SChengwen Feng { "ppp", NULL, "ppp argument", NULL, (void *)300, RTE_ARGPARSE_ARG_REQUIRED_VALUE }, 81e3e579f5SChengwen Feng }, 82e3e579f5SChengwen Feng }; 83e3e579f5SChengwen Feng 84e3e579f5SChengwen Feng int 85e3e579f5SChengwen Feng main(int argc, char **argv) 86e3e579f5SChengwen Feng { 87e3e579f5SChengwen Feng ... 88e3e579f5SChengwen Feng ret = rte_argparse_parse(&obj, argc, argv); 89e3e579f5SChengwen Feng ... 90e3e579f5SChengwen Feng } 91e3e579f5SChengwen Feng 92e3e579f5SChengwen FengIn this example, the arguments which start with a hyphen (-) are optional 93*51a639caSChengwen Fengarguments (they're ``--aaa``/``--bbb``/``--ccc``/``--ddd``/``--eee``/``--fff``); 94*51a639caSChengwen Fengand the arguments which don't start with a hyphen (-) are positional arguments 95*51a639caSChengwen Feng(they're ``ooo``/``ppp``). 96e3e579f5SChengwen Feng 97e3e579f5SChengwen FengEvery argument must be set whether to carry a value (one of 98e3e579f5SChengwen Feng``RTE_ARGPARSE_ARG_NO_VALUE``, ``RTE_ARGPARSE_ARG_REQUIRED_VALUE`` and 99e3e579f5SChengwen Feng``RTE_ARGPARSE_ARG_OPTIONAL_VALUE``). 100e3e579f5SChengwen Feng 101e3e579f5SChengwen Feng.. note:: 102e3e579f5SChengwen Feng 103e3e579f5SChengwen Feng Positional argument must set ``RTE_ARGPARSE_ARG_REQUIRED_VALUE``. 104e3e579f5SChengwen Feng 105e3e579f5SChengwen FengUser Input Requirements 106e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~ 107e3e579f5SChengwen Feng 108e3e579f5SChengwen FengFor optional arguments which take no-value, 109*51a639caSChengwen Fengthe following mode is supported (take above ``--aaa`` as an example): 110e3e579f5SChengwen Feng 111*51a639caSChengwen Feng- The single mode: ``--aaa`` or ``-a``. 112e3e579f5SChengwen Feng 113e3e579f5SChengwen FengFor optional arguments which take required-value, 114*51a639caSChengwen Fengthe following two modes are supported (take above ``--bbb`` as an example): 115e3e579f5SChengwen Feng 116*51a639caSChengwen Feng- The kv mode: ``--bbb=1234`` or ``-b=1234``. 117e3e579f5SChengwen Feng 118*51a639caSChengwen Feng- The split mode: ``--bbb 1234`` or ``-b 1234``. 119e3e579f5SChengwen Feng 120e3e579f5SChengwen FengFor optional arguments which take optional-value, 121*51a639caSChengwen Fengthe following two modes are supported (take above ``--ccc`` as an example): 122e3e579f5SChengwen Feng 123*51a639caSChengwen Feng- The single mode: ``--ccc`` or ``-c``. 124e3e579f5SChengwen Feng 125*51a639caSChengwen Feng- The kv mode: ``--ccc=123`` or ``-c=123``. 126e3e579f5SChengwen Feng 127e3e579f5SChengwen FengFor positional arguments which must take required-value, 128e3e579f5SChengwen Fengtheir values are parsing in the order defined. 129e3e579f5SChengwen Feng 130e3e579f5SChengwen Feng.. note:: 131e3e579f5SChengwen Feng 132e3e579f5SChengwen Feng The compact mode is not supported. 133*51a639caSChengwen Feng Take above ``-a`` and ``-d`` as an example, don't support ``-ad`` input. 134e3e579f5SChengwen Feng 135e3e579f5SChengwen FengParsing by autosave way 136e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~ 137e3e579f5SChengwen Feng 138e3e579f5SChengwen FengArgument of known value type (e.g. ``RTE_ARGPARSE_ARG_VALUE_INT``) 139e3e579f5SChengwen Fengcould be parsed using this autosave way, 140e3e579f5SChengwen Fengand its result will save in the ``val_saver`` field. 141e3e579f5SChengwen Feng 142*51a639caSChengwen FengIn the above example, the arguments ``--aaa``/``--bbb``/``--ccc`` and ``ooo`` 143e3e579f5SChengwen Fengboth use this way, the parsing is as follows: 144e3e579f5SChengwen Feng 145*51a639caSChengwen Feng- For argument ``--aaa``, it is configured as no-value, 146e3e579f5SChengwen Feng so the ``aaa_val`` will be set to ``val_set`` field 147e3e579f5SChengwen Feng which is 100 in the above example. 148e3e579f5SChengwen Feng 149*51a639caSChengwen Feng- For argument ``--bbb``, it is configured as required-value, 150e3e579f5SChengwen Feng so the ``bbb_val`` will be set to user input's value 151*51a639caSChengwen Feng (e.g. will be set to 1234 with input ``--bbb 1234``). 152e3e579f5SChengwen Feng 153*51a639caSChengwen Feng- For argument ``--ccc``, it is configured as optional-value, 154*51a639caSChengwen Feng if user only input ``--ccc`` then the ``ccc_val`` will be set to ``val_set`` 155*51a639caSChengwen Feng field which is 200 in the above example; 156*51a639caSChengwen Feng if user input ``--ccc=123``, then the ``ccc_val`` will be set to 123. 157e3e579f5SChengwen Feng 158*51a639caSChengwen Feng- For argument ``ooo``, it is positional argument, 159e3e579f5SChengwen Feng the ``ooo_val`` will be set to user input's value. 160e3e579f5SChengwen Feng 161e3e579f5SChengwen FengParsing by callback way 162e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~ 163e3e579f5SChengwen Feng 164e3e579f5SChengwen FengIt could also choose to use callback to parse, 165e3e579f5SChengwen Fengjust define a unique index for the argument 166e3e579f5SChengwen Fengand make the ``val_save`` field to be NULL also zero value-type. 167e3e579f5SChengwen Feng 168*51a639caSChengwen FengIn the above example, the arguments ``--ddd``/``--eee``/``--fff`` and ``ppp`` 169*51a639caSChengwen Fengboth use this way. 170e3e579f5SChengwen Feng 171e3e579f5SChengwen FengMultiple times argument 172e3e579f5SChengwen Feng~~~~~~~~~~~~~~~~~~~~~~~ 173e3e579f5SChengwen Feng 174e3e579f5SChengwen FengIf want to support the ability to enter the same argument multiple times, 175e3e579f5SChengwen Fengthen should mark ``RTE_ARGPARSE_ARG_SUPPORT_MULTI`` in the ``flags`` field. 176e3e579f5SChengwen FengFor example: 177e3e579f5SChengwen Feng 178e3e579f5SChengwen Feng.. code-block:: C 179e3e579f5SChengwen Feng 180e3e579f5SChengwen Feng { "--xyz", "-x", "xyz argument", NULL, (void *)10, RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_SUPPORT_MULTI }, 181e3e579f5SChengwen Feng 182*51a639caSChengwen FengThen the user input could contain multiple ``--xyz`` arguments. 183e3e579f5SChengwen Feng 184e3e579f5SChengwen Feng.. note:: 185e3e579f5SChengwen Feng 186e3e579f5SChengwen Feng The multiple times argument only support with optional argument 187e3e579f5SChengwen Feng and must be parsed by callback way. 188