diff --git a/lib/atoi/a2i.c b/lib/atoi/a2i.c
index 1b9037c3b..6dca7e89a 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 2b65f4b3e..3935f42d1 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
@@ -38,6 +102,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 127ac8279..25ce3609b 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 ee3cece17..b3ded0310 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
@@ -29,6 +70,27 @@ 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)
 {
@@ -36,4 +98,11 @@ str2ul(unsigned long *restrict n, const char *restrict s)
 }
 
 
+inline int
+str2ull(unsigned long long *restrict n, const char *restrict s)
+{
+	return a2ull(n, s, NULL, 0, 0, ULLONG_MAX);
+}
+
+
 #endif  // include guard