summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandro Colomar <alx@kernel.org>2024-01-16 21:48:22 +0100
committerSerge Hallyn <serge@hallyn.com>2024-03-29 14:29:13 -0500
commitf7fe4c59781fde33e112be2cfdec44b84fda6497 (patch)
tree2161780e5ca1f998d9f910b71d62826d374aecb3
parentf39ac101ff48beea7fc03efb924806fdfeef92f3 (diff)
lib/atoi/: a2*(), str2*(): Add variants for other types
And type-generic macros that wrap them: a2i(), str2i() Signed-off-by: Alejandro Colomar <alx@kernel.org>
-rw-r--r--lib/atoi/a2i.c13
-rw-r--r--lib/atoi/a2i.h124
-rw-r--r--lib/atoi/str2i.c6
-rw-r--r--lib/atoi/str2i.h69
4 files changed, 212 insertions, 0 deletions
diff --git a/lib/atoi/a2i.c b/lib/atoi/a2i.c
index 1b9037c3..6dca7e89 100644
--- a/lib/atoi/a2i.c
+++ b/lib/atoi/a2i.c
@@ -7,7 +7,20 @@
#include "atoi/a2i.h"
+extern inline int a2sh(short *restrict n, const char *s,
+ char **restrict endp, int base, short min, short max);
+extern inline int a2si(int *restrict n, const char *s,
+ char **restrict endp, int base, int min, int max);
extern inline int a2sl(long *restrict n, const char *s,
char **restrict endp, int base, long min, long max);
+extern inline int a2sll(long long *restrict n, const char *s,
+ char **restrict endp, int base, long long min, long long max);
+extern inline int a2uh(unsigned short *restrict n, const char *s,
+ char **restrict endp, int base, unsigned short min, unsigned short max);
+extern inline int a2ui(unsigned int *restrict n, const char *s,
+ char **restrict endp, int base, unsigned int min, unsigned int max);
extern inline int a2ul(unsigned long *restrict n, const char *s,
char **restrict endp, int base, unsigned long min, unsigned long max);
+extern inline int a2ull(unsigned long long *restrict n, const char *s,
+ char **restrict endp, int base, unsigned long long min,
+ unsigned long long max);
diff --git a/lib/atoi/a2i.h b/lib/atoi/a2i.h
index 2b65f4b3..3935f42d 100644
--- a/lib/atoi/a2i.h
+++ b/lib/atoi/a2i.h
@@ -15,12 +15,76 @@
#include "attr.h"
+#define a2i(TYPE, ...) \
+( \
+ _Generic((TYPE) 0, \
+ short: a2sh, \
+ int: a2si, \
+ long: a2sl, \
+ long long: a2sll, \
+ unsigned short: a2uh, \
+ unsigned int: a2ui, \
+ unsigned long: a2ul, \
+ unsigned long long: a2ull \
+ )(__VA_ARGS__) \
+)
+
+
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
+inline int a2sh(short *restrict n, const char *s,
+ char **restrict endp, int base, short min, short max);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
+inline int a2si(int *restrict n, const char *s,
+ char **restrict endp, int base, int min, int max);
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
inline int a2sl(long *restrict n, const char *s,
char **restrict endp, int base, long min, long max);
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
+inline int a2sll(long long *restrict n, const char *s,
+ char **restrict endp, int base, long long min, long long max);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
+inline int a2uh(unsigned short *restrict n, const char *s,
+ char **restrict endp, int base, unsigned short min, unsigned short max);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
+inline int a2ui(unsigned int *restrict n, const char *s,
+ char **restrict endp, int base, unsigned int min, unsigned int max);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
inline int a2ul(unsigned long *restrict n, const char *s,
char **restrict endp, int base, unsigned long min, unsigned long max);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
+inline int a2ull(unsigned long long *restrict n, const char *s,
+ char **restrict endp, int base, unsigned long long min,
+ unsigned long long max);
+
+
+inline int
+a2sh(short *restrict n, const char *s, char **restrict endp,
+ int base, short min, short max)
+{
+ int status;
+
+ *n = strtoi_(s, endp, base, min, max, &status);
+ if (status != 0) {
+ errno = status;
+ return -1;
+ }
+ return 0;
+}
+
+
+inline int
+a2si(int *restrict n, const char *s, char **restrict endp,
+ int base, int min, int max)
+{
+ int status;
+
+ *n = strtoi_(s, endp, base, min, max, &status);
+ if (status != 0) {
+ errno = status;
+ return -1;
+ }
+ return 0;
+}
inline int
@@ -39,6 +103,51 @@ a2sl(long *restrict n, const char *s, char **restrict endp,
inline int
+a2sll(long long *restrict n, const char *s, char **restrict endp,
+ int base, long long min, long long max)
+{
+ int status;
+
+ *n = strtoi_(s, endp, base, min, max, &status);
+ if (status != 0) {
+ errno = status;
+ return -1;
+ }
+ return 0;
+}
+
+
+inline int
+a2uh(unsigned short *restrict n, const char *s, char **restrict endp,
+ int base, unsigned short min, unsigned short max)
+{
+ int status;
+
+ *n = strtou_noneg(s, endp, base, min, max, &status);
+ if (status != 0) {
+ errno = status;
+ return -1;
+ }
+ return 0;
+}
+
+
+inline int
+a2ui(unsigned int *restrict n, const char *s, char **restrict endp,
+ int base, unsigned int min, unsigned int max)
+{
+ int status;
+
+ *n = strtou_noneg(s, endp, base, min, max, &status);
+ if (status != 0) {
+ errno = status;
+ return -1;
+ }
+ return 0;
+}
+
+
+inline int
a2ul(unsigned long *restrict n, const char *s, char **restrict endp,
int base, unsigned long min, unsigned long max)
{
@@ -53,4 +162,19 @@ a2ul(unsigned long *restrict n, const char *s, char **restrict endp,
}
+inline int
+a2ull(unsigned long long *restrict n, const char *s, char **restrict endp,
+ int base, unsigned long long min, unsigned long long max)
+{
+ int status;
+
+ *n = strtou_noneg(s, endp, base, min, max, &status);
+ if (status != 0) {
+ errno = status;
+ return -1;
+ }
+ return 0;
+}
+
+
#endif // include guard
diff --git a/lib/atoi/str2i.c b/lib/atoi/str2i.c
index 127ac827..25ce3609 100644
--- a/lib/atoi/str2i.c
+++ b/lib/atoi/str2i.c
@@ -8,5 +8,11 @@
#include "atoi/str2i.h"
+extern inline int str2sh(short *restrict n, const char *restrict s);
+extern inline int str2si(int *restrict n, const char *restrict s);
extern inline int str2sl(long *restrict n, const char *restrict s);
+extern inline int str2sll(long long *restrict n, const char *restrict s);
+extern inline int str2uh(unsigned short *restrict n, const char *restrict s);
+extern inline int str2ui(unsigned int *restrict n, const char *restrict s);
extern inline int str2ul(unsigned long *restrict n, const char *restrict s);
+extern inline int str2ull(unsigned long long *restrict n, const char *restrict s);
diff --git a/lib/atoi/str2i.h b/lib/atoi/str2i.h
index ee3cece1..b3ded031 100644
--- a/lib/atoi/str2i.h
+++ b/lib/atoi/str2i.h
@@ -16,10 +16,51 @@
#include "attr.h"
+#define str2i(TYPE, ...) \
+( \
+ _Generic((TYPE) 0, \
+ short: str2sh, \
+ int: str2si, \
+ long: str2sl, \
+ long long: str2sll, \
+ unsigned short: str2uh, \
+ unsigned int: str2ui, \
+ unsigned long: str2ul, \
+ unsigned long long: str2ull \
+ )(__VA_ARGS__) \
+)
+
+
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
+inline int str2sh(short *restrict n, const char *restrict s);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
+inline int str2si(int *restrict n, const char *restrict s);
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
inline int str2sl(long *restrict n, const char *restrict s);
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
+inline int str2sll(long long *restrict n, const char *restrict s);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
+inline int str2uh(unsigned short *restrict n, const char *restrict s);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
+inline int str2ui(unsigned int *restrict n, const char *restrict s);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
inline int str2ul(unsigned long *restrict n, const char *restrict s);
+ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
+inline int str2ull(unsigned long long *restrict n, const char *restrict s);
+
+
+inline int
+str2sh(short *restrict n, const char *restrict s)
+{
+ return a2sh(n, s, NULL, 0, SHRT_MIN, SHRT_MAX);
+}
+
+
+inline int
+str2si(int *restrict n, const char *restrict s)
+{
+ return a2si(n, s, NULL, 0, INT_MIN, INT_MAX);
+}
inline int
@@ -30,10 +71,38 @@ str2sl(long *restrict n, const char *restrict s)
inline int
+str2sll(long long *restrict n, const char *restrict s)
+{
+ return a2sll(n, s, NULL, 0, LLONG_MIN, LLONG_MAX);
+}
+
+
+inline int
+str2uh(unsigned short *restrict n, const char *restrict s)
+{
+ return a2uh(n, s, NULL, 0, 0, USHRT_MAX);
+}
+
+
+inline int
+str2ui(unsigned int *restrict n, const char *restrict s)
+{
+ return a2ui(n, s, NULL, 0, 0, UINT_MAX);
+}
+
+
+inline int
str2ul(unsigned long *restrict n, const char *restrict s)
{
return a2ul(n, s, NULL, 0, 0, ULONG_MAX);
}
+inline int
+str2ull(unsigned long long *restrict n, const char *restrict s)
+{
+ return a2ull(n, s, NULL, 0, 0, ULLONG_MAX);
+}
+
+
#endif // include guard