From 3336ac272caee3dad7f0af42d4932a1ff47d6083 Mon Sep 17 00:00:00 2001 From: lohhiiccc <96543753+lohhiiccc@users.noreply.github.com> Date: Sun, 29 Mar 2026 03:27:25 +0200 Subject: [PATCH] feat: add cli_parse_int64 and fix parse_float for negative values --- include/cli_parse_utils.h | 1 + src/Makefile.am | 2 ++ src/parse_utils/parse_float.c | 2 +- src/parse_utils/parse_int.c | 11 ++++++----- src/parse_utils/parse_uint.c | 21 +++++++++++++++++++++ 5 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 src/parse_utils/parse_uint.c diff --git a/include/cli_parse_utils.h b/include/cli_parse_utils.h index 691f259..1ea87ae 100644 --- a/include/cli_parse_utils.h +++ b/include/cli_parse_utils.h @@ -4,6 +4,7 @@ #include int cli_parse_uint64(const char *s, uint64_t *out); +int cli_parse_int64(const char *s, int64_t *out); int cli_parse_float(const char *s, float *out); #endif diff --git a/src/Makefile.am b/src/Makefile.am index 5113a05..2e0e5a3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,6 +2,8 @@ lib_LTLIBRARIES = libcli.la libcli_la_SOURCES = \ parse.c \ + help.c \ + parse_utils/parse_uint.c \ parse_utils/parse_int.c \ parse_utils/parse_float.c diff --git a/src/parse_utils/parse_float.c b/src/parse_utils/parse_float.c index 85de590..fec2615 100644 --- a/src/parse_utils/parse_float.c +++ b/src/parse_utils/parse_float.c @@ -7,7 +7,7 @@ cli_parse_float(const char *s, float *out) { char *end; - if (NULL == s || '\0' == *s || '-' == *s) + if (NULL == s || '\0' == *s) return 1; errno = 0; diff --git a/src/parse_utils/parse_int.c b/src/parse_utils/parse_int.c index 9a3cdeb..4be858e 100644 --- a/src/parse_utils/parse_int.c +++ b/src/parse_utils/parse_int.c @@ -1,21 +1,22 @@ #include #include #include +#include int -cli_parse_uint64(const char *s, uint64_t *out) +cli_parse_int64(const char *s, int64_t *out) { char *end; - if ( NULL == s || '\0' == *s || '-' == *s) + if (NULL == s || '\0' == *s) return 1; errno = 0; - const uintmax_t v = (uintmax_t)strtoumax(s, &end, 10); + const intmax_t v = strtoimax(s, &end, 10); - if (s == end || ERANGE == errno || '\0' != *end || v > UINT64_MAX) + if (s == end || ERANGE == errno || '\0' != *end || v < INT64_MIN || v > INT64_MAX) return 1; - *out = (uint64_t)v; + *out = (int64_t)v; return 0; } diff --git a/src/parse_utils/parse_uint.c b/src/parse_utils/parse_uint.c new file mode 100644 index 0000000..9a3cdeb --- /dev/null +++ b/src/parse_utils/parse_uint.c @@ -0,0 +1,21 @@ +#include +#include +#include + +int +cli_parse_uint64(const char *s, uint64_t *out) +{ + char *end; + + if ( NULL == s || '\0' == *s || '-' == *s) + return 1; + + errno = 0; + const uintmax_t v = (uintmax_t)strtoumax(s, &end, 10); + + if (s == end || ERANGE == errno || '\0' != *end || v > UINT64_MAX) + return 1; + + *out = (uint64_t)v; + return 0; +}