diff options
author | Alejandro Colomar <alx@kernel.org> | 2024-04-18 15:14:19 +0200 |
---|---|---|
committer | Alejandro Colomar <alx@kernel.org> | 2024-04-18 15:14:19 +0200 |
commit | 9f8e659cd1d3fa9b3bcd832c796a44c11a1af204 (patch) | |
tree | 2a881768b8a7cce03d2c254e84950b5f78933ef0 | |
parent | 59667938a4bac00cf492860fa8dfc049613f24eb (diff) |
include/a2i/a2i*, lib/src/a2i/a2i*: Merge files
Signed-off-by: Alejandro Colomar <alx@kernel.org>
-rw-r--r-- | include/a2i/a2i.h | 102 | ||||
-rw-r--r-- | include/a2i/a2i_func.h | 112 | ||||
-rw-r--r-- | lib/src/a2i/a2i.c | 205 | ||||
-rw-r--r-- | lib/src/a2i/a2i_func.c | 210 |
4 files changed, 306 insertions, 323 deletions
diff --git a/include/a2i/a2i.h b/include/a2i/a2i.h index 5d4e1a8..cf11c6d 100644 --- a/include/a2i/a2i.h +++ b/include/a2i/a2i.h @@ -6,7 +6,8 @@ #define INCLUDE_A2I_A2I_H_ -#include <a2i/a2i_func.h> // IWYU pragma: keep +#include <a2i/attr.h> +#include <a2i/qual.h> #define a2i(TYPE, n, s, endp, ...) \ @@ -181,4 +182,103 @@ ) +#define A2I_A2I_ATTR \ + A2I_ATTR_ACCESS(write_only, 1) \ + A2I_ATTR_ACCESS(read_only, 2) \ + A2I_ATTR_ACCESS(write_only, 3) \ + A2I_ATTR_STRING(2) \ + + +#if defined(__clang__) +# pragma clang assume_nonnull begin +#endif +A2I_A2I_ATTR +int a2shh_c(signed char *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + signed char min, signed char max); +A2I_A2I_ATTR +int a2sh_c(short *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + short min, short max); +A2I_A2I_ATTR +int a2si_c(int *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + int min, int max); +A2I_A2I_ATTR +int a2sl_c(long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + long min, long max); +A2I_A2I_ATTR +int a2sll_c(long long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + long long min, long long max); + +A2I_A2I_ATTR +int a2uhh_c(unsigned char *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned char min, unsigned char max); +A2I_A2I_ATTR +int a2uh_c(unsigned short *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned short min, unsigned short max); +A2I_A2I_ATTR +int a2ui_c(unsigned int *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned int min, unsigned int max); +A2I_A2I_ATTR +int a2ul_c(unsigned long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned long min, unsigned long max); +A2I_A2I_ATTR +int a2ull_c(unsigned long long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned long long min, unsigned long long max); + + +A2I_A2I_ATTR +int a2shh_nc(signed char *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + signed char min, signed char max); +A2I_A2I_ATTR +int a2sh_nc(short *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + short min, short max); +A2I_A2I_ATTR +int a2si_nc(int *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + int min, int max); +A2I_A2I_ATTR +int a2sl_nc(long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + long min, long max); +A2I_A2I_ATTR +int a2sll_nc(long long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + long long min, long long max); + +A2I_A2I_ATTR +int a2uhh_nc(unsigned char *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned char min, unsigned char max); +A2I_A2I_ATTR +int a2uh_nc(unsigned short *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned short min, unsigned short max); +A2I_A2I_ATTR +int a2ui_nc(unsigned int *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned int min, unsigned int max); +A2I_A2I_ATTR +int a2ul_nc(unsigned long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned long min, unsigned long max); +A2I_A2I_ATTR +int a2ull_nc(unsigned long long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned long long min, unsigned long long max); +#if defined(__clang__) +# pragma clang assume_nonnull end +#endif + + #endif // include guard diff --git a/include/a2i/a2i_func.h b/include/a2i/a2i_func.h deleted file mode 100644 index 7247e96..0000000 --- a/include/a2i/a2i_func.h +++ /dev/null @@ -1,112 +0,0 @@ -// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org> -// SPDX-License-Identifier: LGPL-3.0-only WITH LGPL-3.0-linking-exception - - -#ifndef INCLUDE_A2I_A2I_FUNC_H_ -#define INCLUDE_A2I_A2I_FUNC_H_ - - -#include <a2i/attr.h> -#include <a2i/qual.h> - - -#define A2I_A2I_ATTR \ - A2I_ATTR_ACCESS(write_only, 1) \ - A2I_ATTR_ACCESS(read_only, 2) \ - A2I_ATTR_ACCESS(write_only, 3) \ - A2I_ATTR_STRING(2) \ - - -#if defined(__clang__) -# pragma clang assume_nonnull begin -#endif -A2I_A2I_ATTR -int a2shh_c(signed char *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - signed char min, signed char max); -A2I_A2I_ATTR -int a2sh_c(short *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - short min, short max); -A2I_A2I_ATTR -int a2si_c(int *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - int min, int max); -A2I_A2I_ATTR -int a2sl_c(long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - long min, long max); -A2I_A2I_ATTR -int a2sll_c(long long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - long long min, long long max); - -A2I_A2I_ATTR -int a2uhh_c(unsigned char *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned char min, unsigned char max); -A2I_A2I_ATTR -int a2uh_c(unsigned short *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned short min, unsigned short max); -A2I_A2I_ATTR -int a2ui_c(unsigned int *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned int min, unsigned int max); -A2I_A2I_ATTR -int a2ul_c(unsigned long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned long min, unsigned long max); -A2I_A2I_ATTR -int a2ull_c(unsigned long long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned long long min, unsigned long long max); - - -A2I_A2I_ATTR -int a2shh_nc(signed char *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - signed char min, signed char max); -A2I_A2I_ATTR -int a2sh_nc(short *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - short min, short max); -A2I_A2I_ATTR -int a2si_nc(int *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - int min, int max); -A2I_A2I_ATTR -int a2sl_nc(long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - long min, long max); -A2I_A2I_ATTR -int a2sll_nc(long long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - long long min, long long max); - -A2I_A2I_ATTR -int a2uhh_nc(unsigned char *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned char min, unsigned char max); -A2I_A2I_ATTR -int a2uh_nc(unsigned short *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned short min, unsigned short max); -A2I_A2I_ATTR -int a2ui_nc(unsigned int *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned int min, unsigned int max); -A2I_A2I_ATTR -int a2ul_nc(unsigned long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned long min, unsigned long max); -A2I_A2I_ATTR -int a2ull_nc(unsigned long long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned long long min, unsigned long long max); -#if defined(__clang__) -# pragma clang assume_nonnull end -#endif - - -#endif // include guard diff --git a/lib/src/a2i/a2i.c b/lib/src/a2i/a2i.c index 300dc5a..a84aa0a 100644 --- a/lib/src/a2i/a2i.c +++ b/lib/src/a2i/a2i.c @@ -3,3 +3,208 @@ #include <a2i/a2i.h> + +#include <errno.h> + +#include <a2i/qual.h> +#include <a2i/strtoi.h> + + +#define a2i_a2I_nc(n, s, endp, base, min, max) \ +({ \ + int status_; \ + \ + *n = _Generic(*n, \ + signed char: a2i_strtoi, \ + short: a2i_strtoi, \ + int: a2i_strtoi, \ + long: a2i_strtoi, \ + long long: a2i_strtoi, \ + unsigned char: a2i_strtou_noneg, \ + unsigned short: a2i_strtou_noneg, \ + unsigned int: a2i_strtou_noneg, \ + unsigned long: a2i_strtou_noneg, \ + unsigned long long: a2i_strtou_noneg \ + )(s, endp, base, min, max, &status_); \ + if (status_ != 0) \ + errno = status_; \ + \ + -!!status_; \ +}) + + +#if defined(__clang__) +# pragma clang assume_nonnull begin +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wimplicit-int-conversion" +# pragma clang diagnostic ignored "-Wshorten-64-to-32" +#endif +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +int +a2shh_c(signed char *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + signed char min, signed char max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2sh_c(short *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + short min, short max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2si_c(int *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + int min, int max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2sl_c(long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + long min, long max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2sll_c(long long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + long long min, long long max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + + +int +a2uhh_c(unsigned char *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned char min, unsigned char max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2uh_c(unsigned short *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned short min, unsigned short max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2ui_c(unsigned int *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned int min, unsigned int max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2ul_c(unsigned long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned long min, unsigned long max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} + +int +a2ull_c(unsigned long long *restrict n, const char *s, + const char **a2i_nullable restrict endp, int base, + unsigned long long min, unsigned long long max) +{ + return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); +} +#pragma GCC diagnostic pop // -Wcast-qual + + +int +a2shh_nc(signed char *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + signed char min, signed char max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2sh_nc(short *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + short min, short max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2si_nc(int *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + int min, int max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2sl_nc(long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + long min, long max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2sll_nc(long long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + long long min, long long max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + + +int +a2uhh_nc(unsigned char *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned char min, unsigned char max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2uh_nc(unsigned short *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned short min, unsigned short max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2ui_nc(unsigned int *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned int min, unsigned int max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2ul_nc(unsigned long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned long min, unsigned long max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} + +int +a2ull_nc(unsigned long long *restrict n, const char *s, + char **a2i_nullable restrict endp, int base, + unsigned long long min, unsigned long long max) +{ + return a2i_a2I_nc(n, s, endp, base, min, max); +} +#if defined(__clang__) +# pragma clang diagnostic pop // -Wimplicit-int-conversion, -Wshorten-64-to-32 +# pragma clang assume_nonnull end +#endif diff --git a/lib/src/a2i/a2i_func.c b/lib/src/a2i/a2i_func.c deleted file mode 100644 index e9016a4..0000000 --- a/lib/src/a2i/a2i_func.c +++ /dev/null @@ -1,210 +0,0 @@ -// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org> -// SPDX-License-Identifier: LGPL-3.0-only WITH LGPL-3.0-linking-exception - - -#include <a2i/a2i_func.h> - -#include <errno.h> - -#include <a2i/qual.h> -#include <a2i/strtoi.h> - - -#define a2i_a2I_nc(n, s, endp, base, min, max) \ -({ \ - int status_; \ - \ - *n = _Generic(*n, \ - signed char: a2i_strtoi, \ - short: a2i_strtoi, \ - int: a2i_strtoi, \ - long: a2i_strtoi, \ - long long: a2i_strtoi, \ - unsigned char: a2i_strtou_noneg, \ - unsigned short: a2i_strtou_noneg, \ - unsigned int: a2i_strtou_noneg, \ - unsigned long: a2i_strtou_noneg, \ - unsigned long long: a2i_strtou_noneg \ - )(s, endp, base, min, max, &status_); \ - if (status_ != 0) \ - errno = status_; \ - \ - -!!status_; \ -}) - - -#if defined(__clang__) -# pragma clang assume_nonnull begin -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wimplicit-int-conversion" -# pragma clang diagnostic ignored "-Wshorten-64-to-32" -#endif -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -int -a2shh_c(signed char *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - signed char min, signed char max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2sh_c(short *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - short min, short max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2si_c(int *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - int min, int max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2sl_c(long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - long min, long max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2sll_c(long long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - long long min, long long max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - - -int -a2uhh_c(unsigned char *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned char min, unsigned char max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2uh_c(unsigned short *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned short min, unsigned short max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2ui_c(unsigned int *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned int min, unsigned int max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2ul_c(unsigned long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned long min, unsigned long max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} - -int -a2ull_c(unsigned long long *restrict n, const char *s, - const char **a2i_nullable restrict endp, int base, - unsigned long long min, unsigned long long max) -{ - return a2i_a2I_nc(n, s, (char **a2i_nullable) endp, base, min, max); -} -#pragma GCC diagnostic pop // -Wcast-qual - - -int -a2shh_nc(signed char *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - signed char min, signed char max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2sh_nc(short *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - short min, short max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2si_nc(int *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - int min, int max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2sl_nc(long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - long min, long max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2sll_nc(long long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - long long min, long long max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - - -int -a2uhh_nc(unsigned char *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned char min, unsigned char max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2uh_nc(unsigned short *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned short min, unsigned short max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2ui_nc(unsigned int *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned int min, unsigned int max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2ul_nc(unsigned long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned long min, unsigned long max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} - -int -a2ull_nc(unsigned long long *restrict n, const char *s, - char **a2i_nullable restrict endp, int base, - unsigned long long min, unsigned long long max) -{ - return a2i_a2I_nc(n, s, endp, base, min, max); -} -#if defined(__clang__) -# pragma clang diagnostic pop // -Wimplicit-int-conversion, -Wshorten-64-to-32 -# pragma clang assume_nonnull end -#endif |