changeset 687:19bcd869e80d

int: add str2u8 for symmetry Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Mon, 25 Feb 2019 16:11:48 -0500
parents adc02e842728
children e338babd5670
files include/jeffpc/int.h tests/test_str2uint.c
diffstat 2 files changed, 125 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/include/jeffpc/int.h	Mon Feb 25 16:10:33 2019 -0500
+++ b/include/jeffpc/int.h	Mon Feb 25 16:11:48 2019 -0500
@@ -78,6 +78,7 @@
 STR_TO_INT(64, 0xffffffffffffffffull)
 STR_TO_INT(32, 0x00000000fffffffful)
 STR_TO_INT(16, 0x000000000000fffful)
+STR_TO_INT(8,  0x00000000000000fful)
 
 #undef STR_TO_INT
 
@@ -90,16 +91,20 @@
 			       int base, char terminator);
 static inline int str2u16_full(const char *restrict s, uint16_t *i,
 			       int base, char terminator);
+static inline int str2u8_full(const char *restrict s, uint8_t *i,
+			      int base, char terminator);
 
 /* base [2, 36], nul-terminated */
 #define str2u64_base(s, i, b)	str2u64_full((s), (i), (b), '\0')
 #define str2u32_base(s, i, b)	str2u32_full((s), (i), (b), '\0')
 #define str2u16_base(s, i, b)	str2u16_full((s), (i), (b), '\0')
+#define str2u8_base(s, i, b)	str2u8_full((s), (i), (b), '\0')
 
 /* base 10, nul-terminated */
 #define str2u64(s, i)	str2u64_full((s), (i), 10, '\0')
 #define str2u32(s, i)	str2u32_full((s), (i), 10, '\0')
 #define str2u16(s, i)	str2u16_full((s), (i), 10, '\0')
+#define str2u8(s, i)	str2u8_full((s), (i), 10, '\0')
 
 /*
  * These prototypes exist to catch bugs in the code generating macros below.
--- a/tests/test_str2uint.c	Mon Feb 25 16:10:33 2019 -0500
+++ b/tests/test_str2uint.c	Mon Feb 25 16:11:48 2019 -0500
@@ -33,7 +33,7 @@
 
 struct run {
 	const char *in;
-	struct res out[3][3]; /* out[base][size] */
+	struct res out[3][4]; /* out[base][size] */
 };
 
 #define B8	0
@@ -46,18 +46,21 @@
 	[B16] = 16,
 };
 
-#define SZ16	0
-#define SZ32	1
-#define SZ64	2
+#define SZ8	0
+#define SZ16	1
+#define SZ32	2
+#define SZ64	3
 
 static const int sizes[] = {
+	[SZ8]  = 8,
 	[SZ16] = 16,
 	[SZ32] = 32,
 	[SZ64] = 64,
 };
 
-#define ENT(v_s16, v_s32, v_s64, r_s16, r_s32, r_s64) \
+#define ENT(v_s8, v_s16, v_s32, v_s64, r_s8, r_s16, r_s32, r_s64) \
 	{ \
+		[SZ8]  = { .ret = (r_s8),  .out = (v_s8), }, \
 		[SZ16] = { .ret = (r_s16), .out = (v_s16), }, \
 		[SZ32] = { .ret = (r_s32), .out = (v_s32), }, \
 		[SZ64] = { .ret = (r_s64), .out = (v_s64), }, \
@@ -66,228 +69,228 @@
 static const struct run runs[] = {
 	{
 		.in	  = "",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
 	},
 	/*
 	 * Check various well-formed (in at least one base) inputs
 	 */
 	{
 		.in	  = "0",
-		.out[B8]  = ENT(0, 0, 0, 0, 0, 0),
-		.out[B10] = ENT(0, 0, 0, 0, 0, 0),
-		.out[B16] = ENT(0, 0, 0, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, 0, 0, 0, 0),
+		.out[B10] = ENT(0, 0, 0, 0, 0, 0, 0, 0),
+		.out[B16] = ENT(0, 0, 0, 0, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "00",
-		.out[B8]  = ENT(0, 0, 0, 0, 0, 0),
-		.out[B10] = ENT(0, 0, 0, 0, 0, 0),
-		.out[B16] = ENT(0, 0, 0, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, 0, 0, 0, 0),
+		.out[B10] = ENT(0, 0, 0, 0, 0, 0, 0, 0),
+		.out[B16] = ENT(0, 0, 0, 0, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "0x0",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0, 0, 0, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0, 0, 0, 0, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "5",
-		.out[B8]  = ENT(5, 5, 5, 0, 0, 0),
-		.out[B10] = ENT(5, 5, 5, 0, 0, 0),
-		.out[B16] = ENT(5, 5, 5, 0, 0, 0),
+		.out[B8]  = ENT(5, 5, 5, 5, 0, 0, 0, 0),
+		.out[B10] = ENT(5, 5, 5, 5, 0, 0, 0, 0),
+		.out[B16] = ENT(5, 5, 5, 5, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "8",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(8, 8, 8, 0, 0, 0),
-		.out[B16] = ENT(8, 8, 8, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(8, 8, 8, 8, 0, 0, 0, 0),
+		.out[B16] = ENT(8, 8, 8, 8, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "0x8",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(8, 8, 8, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(8, 8, 8, 8, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "A",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0xa, 0xa, 0xa, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0xa, 0xa, 0xa, 0xa, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "a",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0xa, 0xa, 0xa, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0xa, 0xa, 0xa, 0xa, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "0XA",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0xa, 0xa, 0xa, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0xa, 0xa, 0xa, 0xa, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "0Xa",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0xa, 0xa, 0xa, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0xa, 0xa, 0xa, 0xa, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "0xA",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0xa, 0xa, 0xa, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0xa, 0xa, 0xa, 0xa, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "0xa",
-		.out[B8]  = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B10] = ENT(0, 0, 0, -EINVAL, -EINVAL, -EINVAL),
-		.out[B16] = ENT(0xa, 0xa, 0xa, 0, 0, 0),
+		.out[B8]  = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B10] = ENT(0, 0, 0, 0, -EINVAL, -EINVAL, -EINVAL, -EINVAL),
+		.out[B16] = ENT(0xa, 0xa, 0xa, 0xa, 0, 0, 0, 0),
 	},
 	/*
 	 * Check various well-formed inputs for overflows
 	 */
 	{
 		.in	  = "7",
-		.out[B8]  = ENT(7, 7, 7, 0, 0, 0),
-		.out[B10] = ENT(7, 7, 7, 0, 0, 0),
-		.out[B16] = ENT(7, 7, 7, 0, 0, 0),
+		.out[B8]  = ENT(7, 7, 7, 7, 0, 0, 0, 0),
+		.out[B10] = ENT(7, 7, 7, 7, 0, 0, 0, 0),
+		.out[B16] = ENT(7, 7, 7, 7, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "70",
-		.out[B8]  = ENT(070,  070,  070,  0, 0, 0),
-		.out[B10] = ENT(70,   70,   70,   0, 0, 0),
-		.out[B16] = ENT(0x70, 0x70, 0x70, 0, 0, 0),
+		.out[B8]  = ENT(070,  070,  070,  070,  0, 0, 0, 0),
+		.out[B10] = ENT(70,   70,   70,   70,   0, 0, 0, 0),
+		.out[B16] = ENT(0x70, 0x70, 0x70, 0x70, 0, 0, 0, 0),
 	},
 	{
 		.in	  = "7070",
-		.out[B8]  = ENT(07070,  07070,  07070,  0, 0, 0),
-		.out[B10] = ENT(7070,   7070,   7070,   0, 0, 0),
-		.out[B16] = ENT(0x7070, 0x7070, 0x7070, 0, 0, 0),
+		.out[B8]  = ENT(0, 07070,  07070,  07070,  -ERANGE, 0, 0, 0),
+		.out[B10] = ENT(0, 7070,   7070,   7070,   -ERANGE, 0, 0, 0),
+		.out[B16] = ENT(0, 0x7070, 0x7070, 0x7070, -ERANGE, 0, 0, 0),
 	},
 	{
 		.in	  = "70707",
-		.out[B8]  = ENT(070707,  070707,  070707, 0, 0, 0),
-		.out[B10] = ENT(     0,   70707,   70707, -ERANGE, 0, 0),
-		.out[B16] = ENT(     0, 0x70707, 0x70707, -ERANGE, 0, 0),
+		.out[B8]  = ENT(0, 070707,  070707,  070707, -ERANGE, 0, 0, 0),
+		.out[B10] = ENT(0,      0,   70707,   70707, -ERANGE, -ERANGE, 0, 0),
+		.out[B16] = ENT(0,      0, 0x70707, 0x70707, -ERANGE, -ERANGE, 0, 0),
 	},
 	{
 		.in	  = "707070",
-		.out[B8]  = ENT(0,  0707070,  0707070, -ERANGE, 0, 0),
-		.out[B10] = ENT(0,   707070,   707070, -ERANGE, 0, 0),
-		.out[B16] = ENT(0, 0x707070, 0x707070, -ERANGE, 0, 0),
+		.out[B8]  = ENT(0, 0,  0707070,  0707070, -ERANGE, -ERANGE, 0, 0),
+		.out[B10] = ENT(0, 0,   707070,   707070, -ERANGE, -ERANGE, 0, 0),
+		.out[B16] = ENT(0, 0, 0x707070, 0x707070, -ERANGE, -ERANGE, 0, 0),
 	},
 	{
 		.in	  = "70707070",
-		.out[B8]  = ENT(0,  070707070,  070707070, -ERANGE, 0, 0),
-		.out[B10] = ENT(0,   70707070,   70707070, -ERANGE, 0, 0),
-		.out[B16] = ENT(0, 0x70707070, 0x70707070, -ERANGE, 0, 0),
+		.out[B8]  = ENT(0, 0,  070707070,  070707070, -ERANGE, -ERANGE, 0, 0),
+		.out[B10] = ENT(0, 0,   70707070,   70707070, -ERANGE, -ERANGE, 0, 0),
+		.out[B16] = ENT(0, 0, 0x70707070, 0x70707070, -ERANGE, -ERANGE, 0, 0),
 	},
 	{
 		.in	  = "7070707070",
-		.out[B8]  = ENT(0,  07070707070,  07070707070, -ERANGE, 0, 0),
-		.out[B10] = ENT(0,            0,   7070707070, -ERANGE, -ERANGE, 0),
-		.out[B16] = ENT(0,            0, 0x7070707070, -ERANGE, -ERANGE, 0),
+		.out[B8]  = ENT(0, 0,  07070707070,  07070707070, -ERANGE, -ERANGE, 0, 0),
+		.out[B10] = ENT(0, 0,            0,   7070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B16] = ENT(0, 0,            0, 0x7070707070, -ERANGE, -ERANGE, -ERANGE, 0),
 	},
 	{
 		.in	  = "707070707070",
-		.out[B8]  = ENT(0, 0,  0707070707070, -ERANGE, -ERANGE, 0),
-		.out[B10] = ENT(0, 0,   707070707070, -ERANGE, -ERANGE, 0),
-		.out[B16] = ENT(0, 0, 0x707070707070, -ERANGE, -ERANGE, 0),
+		.out[B8]  = ENT(0, 0, 0,  0707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B10] = ENT(0, 0, 0,   707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B16] = ENT(0, 0, 0, 0x707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
 	},
 	{
 		.in	  = "70707070707070",
-		.out[B8]  = ENT(0, 0,  070707070707070, -ERANGE, -ERANGE, 0),
-		.out[B10] = ENT(0, 0,   70707070707070, -ERANGE, -ERANGE, 0),
-		.out[B16] = ENT(0, 0, 0x70707070707070, -ERANGE, -ERANGE, 0),
+		.out[B8]  = ENT(0, 0, 0,  070707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B10] = ENT(0, 0, 0,   70707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B16] = ENT(0, 0, 0, 0x70707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
 	},
 	{
 		.in	  = "7070707070707070",
-		.out[B8]  = ENT(0, 0,  07070707070707070, -ERANGE, -ERANGE, 0),
-		.out[B10] = ENT(0, 0,   7070707070707070, -ERANGE, -ERANGE, 0),
-		.out[B16] = ENT(0, 0, 0x7070707070707070, -ERANGE, -ERANGE, 0),
+		.out[B8]  = ENT(0, 0, 0,  07070707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B10] = ENT(0, 0, 0,   7070707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B16] = ENT(0, 0, 0, 0x7070707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
 	},
 	{
 		.in	  = "707070707070707070",
-		.out[B8]  = ENT(0, 0, 0707070707070707070, -ERANGE, -ERANGE, 0),
-		.out[B10] = ENT(0, 0,  707070707070707070, -ERANGE, -ERANGE, 0),
-		.out[B16] = ENT(0, 0,                   0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0707070707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B10] = ENT(0, 0, 0,  707070707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B16] = ENT(0, 0, 0,                   0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "70707070707070707070",
-		.out[B8]  = ENT(0, 0, 070707070707070707070, -ERANGE, -ERANGE, 0),
-		.out[B10] = ENT(0, 0,                     0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0,                     0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 070707070707070707070, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B10] = ENT(0, 0, 0,                     0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0,                     0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "707070707070707070707",
-		.out[B8]  = ENT(0, 0, 0707070707070707070707, -ERANGE, -ERANGE, 0),
-		.out[B10] = ENT(0, 0,                      0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0,                      0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0707070707070707070707, -ERANGE, -ERANGE, -ERANGE, 0),
+		.out[B10] = ENT(0, 0, 0,                      0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0,                      0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "7070707070707070707070",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	/*
 	 * Check negative numbers
 	 */
 	{
 		.in       = "-0",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in       = "-1",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in       = "-8",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "-A",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "-a",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "-0XA",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "-0Xa",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "-0xA",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	{
 		.in	  = "-0xa",
-		.out[B8]  = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B10] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
-		.out[B16] = ENT(0, 0, 0, -ERANGE, -ERANGE, -ERANGE),
+		.out[B8]  = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B10] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
+		.out[B16] = ENT(0, 0, 0, 0, -ERANGE, -ERANGE, -ERANGE, -ERANGE),
 	},
 	/*
 	 * FIXME: more test cases
@@ -348,19 +351,23 @@
 		fprintf(stderr, "%2d: in='%s'...\n", i, runs[i].in);
 
 		/* test simple base 10 parsing */
+		TEST(i, B10, SZ8, str2u8(in, &tmp), uint8_t);
 		TEST(i, B10, SZ16, str2u16(in, &tmp), uint16_t);
 		TEST(i, B10, SZ32, str2u32(in, &tmp), uint32_t);
 		TEST(i, B10, SZ64, str2u64(in, &tmp), uint64_t);
 
 		/* test underlying function with all bases */
+		TEST(i, B8, SZ8, str2u8_base(in, &tmp, 8), uint8_t);
 		TEST(i, B8, SZ16, str2u16_base(in, &tmp, 8), uint16_t);
 		TEST(i, B8, SZ32, str2u32_base(in, &tmp, 8), uint32_t);
 		TEST(i, B8, SZ64, str2u64_base(in, &tmp, 8), uint64_t);
 
+		TEST(i, B10, SZ8, str2u8_base(in, &tmp, 10), uint8_t);
 		TEST(i, B10, SZ16, str2u16_base(in, &tmp, 10), uint16_t);
 		TEST(i, B10, SZ32, str2u32_base(in, &tmp, 10), uint32_t);
 		TEST(i, B10, SZ64, str2u64_base(in, &tmp, 10), uint64_t);
 
+		TEST(i, B16, SZ8, str2u8_base(in, &tmp, 16), uint8_t);
 		TEST(i, B16, SZ16, str2u16_base(in, &tmp, 16), uint16_t);
 		TEST(i, B16, SZ32, str2u32_base(in, &tmp, 16), uint32_t);
 		TEST(i, B16, SZ64, str2u64_base(in, &tmp, 16), uint64_t);