This commit supports parsing unsigned base type (u8/u16/u32/u64).

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
---
 lib/argparse/rte_argparse.c | 116 ++++++++++++++++++++++++++++++++++++
 lib/argparse/rte_argparse.h |  10 +++-
 2 files changed, 125 insertions(+), 1 deletion(-)

diff --git a/lib/argparse/rte_argparse.c b/lib/argparse/rte_argparse.c
index f536a7f92b..cfd9bcf5f6 100644
--- a/lib/argparse/rte_argparse.c
+++ b/lib/argparse/rte_argparse.c
@@ -397,6 +397,118 @@ parse_arg_int(struct rte_argparse_arg *arg, const char 
*value)
        return 0;
 }
 
+static int
+parse_arg_u8(struct rte_argparse_arg *arg, const char *value)
+{
+       unsigned long val;
+       char *s = NULL;
+
+       if (value == NULL) {
+               *(uint8_t *)arg->val_saver = (uint8_t)(intptr_t)arg->val_set;
+               return 0;
+       }
+
+       errno = 0;
+       val = strtoul(value, &s, 0);
+       if (errno == ERANGE || val > UINT8_MAX) {
+               ARGPARSE_LOG(ERR, "argument %s numerical out of range!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       if (s[0] != '\0') {
+               ARGPARSE_LOG(ERR, "argument %s expect an uint8 value!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       *(uint8_t *)arg->val_saver = val;
+
+       return 0;
+}
+
+static int
+parse_arg_u16(struct rte_argparse_arg *arg, const char *value)
+{
+       unsigned long val;
+       char *s = NULL;
+
+       if (value == NULL) {
+               *(uint16_t *)arg->val_saver = (uint16_t)(intptr_t)arg->val_set;
+               return 0;
+       }
+
+       errno = 0;
+       val = strtoul(value, &s, 0);
+       if (errno == ERANGE || val > UINT16_MAX) {
+               ARGPARSE_LOG(ERR, "argument %s numerical out of range!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       if (s[0] != '\0') {
+               ARGPARSE_LOG(ERR, "argument %s expect an uint16 value!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       *(uint16_t *)arg->val_saver = val;
+
+       return 0;
+}
+
+static int
+parse_arg_u32(struct rte_argparse_arg *arg, const char *value)
+{
+       unsigned long val;
+       char *s = NULL;
+
+       if (value == NULL) {
+               *(uint32_t *)arg->val_saver = (uint32_t)(intptr_t)arg->val_set;
+               return 0;
+       }
+
+       errno = 0;
+       val = strtoul(value, &s, 0);
+       if (errno == ERANGE || val > UINT32_MAX) {
+               ARGPARSE_LOG(ERR, "argument %s numerical out of range!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       if (s[0] != '\0') {
+               ARGPARSE_LOG(ERR, "argument %s expect an uint32 value!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       *(uint32_t *)arg->val_saver = val;
+
+       return 0;
+}
+
+static int
+parse_arg_u64(struct rte_argparse_arg *arg, const char *value)
+{
+       unsigned long val;
+       char *s = NULL;
+
+       if (value == NULL) {
+               *(uint64_t *)arg->val_saver = (uint64_t)(intptr_t)arg->val_set;
+               return 0;
+       }
+
+       errno = 0;
+       val = strtoull(value, &s, 0);
+       if (errno == ERANGE) {
+               ARGPARSE_LOG(ERR, "argument %s numerical out of range!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       if (s[0] != '\0') {
+               ARGPARSE_LOG(ERR, "argument %s expect an uint64 value!", 
arg->name_long);
+               return -EINVAL;
+       }
+
+       *(uint64_t *)arg->val_saver = val;
+
+       return 0;
+}
+
 static int
 parse_arg_autosave(struct rte_argparse_arg *arg, const char *value)
 {
@@ -406,6 +518,10 @@ parse_arg_autosave(struct rte_argparse_arg *arg, const 
char *value)
                /* Sort by RTE_ARGPARSE_ARG_VALUE_XXX. */
                { NULL          },
                { parse_arg_int },
+               { parse_arg_u8  },
+               { parse_arg_u16 },
+               { parse_arg_u32 },
+               { parse_arg_u64 },
        };
        uint32_t index = arg_attr_val_type(arg);
        int ret = -EINVAL;
diff --git a/lib/argparse/rte_argparse.h b/lib/argparse/rte_argparse.h
index d4e074d3d7..2059fe11da 100644
--- a/lib/argparse/rte_argparse.h
+++ b/lib/argparse/rte_argparse.h
@@ -59,8 +59,16 @@ enum rte_argparse_flag {
 
        /** The argument's value is int type. */
        RTE_ARGPARSE_ARG_VALUE_INT = RTE_MBIT64(1, 2),
+       /** The argument's value is uint8 type. */
+       RTE_ARGPARSE_ARG_VALUE_U8 = RTE_MBIT64(2, 2),
+       /** The argument's value is uint16 type. */
+       RTE_ARGPARSE_ARG_VALUE_U16 = RTE_MBIT64(3, 2),
+       /** The argument's value is uint32 type. */
+       RTE_ARGPARSE_ARG_VALUE_U32 = RTE_MBIT64(4, 2),
+       /** The argument's value is uint64 type. */
+       RTE_ARGPARSE_ARG_VALUE_U64 = RTE_MBIT64(5, 2),
        /** Max value type. */
-       RTE_ARGPARSE_ARG_VALUE_MAX = RTE_MBIT64(2, 2),
+       RTE_ARGPARSE_ARG_VALUE_MAX = RTE_MBIT64(6, 2),
 
 
        /**
-- 
2.17.1

Reply via email to