44#include "tests.h"
55
66#include "bfstd.h"
7- #include "bit.h"
87#include "diag.h"
98
109#include <errno.h>
@@ -95,37 +94,74 @@ static void check_wordescs(void) {
9594
9695/** xstrto*() test cases. */
9796static void check_strtox (void ) {
97+ short s ;
98+ unsigned short us ;
99+ int i ;
100+ unsigned int ui ;
98101 long l ;
102+ unsigned long ul ;
99103 long long ll ;
104+ unsigned long long ull ;
100105 char * end ;
101106
107+ #define check_strtouerr (err , str , end , base ) \
108+ do { \
109+ bfs_echeck(xstrtous(str, end, base, &us) != 0 && errno == err); \
110+ bfs_echeck(xstrtoui(str, end, base, &ui) != 0 && errno == err); \
111+ bfs_echeck(xstrtoul(str, end, base, &ul) != 0 && errno == err); \
112+ bfs_echeck(xstrtoull(str, end, base, &ull) != 0 && errno == err); \
113+ } while (0)
114+
115+ check_strtouerr (ERANGE , "-1" , NULL , 0 );
116+ check_strtouerr (ERANGE , "-0x1" , NULL , 0 );
117+
118+ check_strtouerr (EINVAL , "-" , NULL , 0 );
119+ check_strtouerr (EINVAL , "-q" , NULL , 0 );
120+ check_strtouerr (EINVAL , "-1q" , NULL , 0 );
121+ check_strtouerr (EINVAL , "-0x" , NULL , 0 );
122+
102123#define check_strtoerr (err , str , end , base ) \
103- bfs_echeck(xstrtol(str, end, base, &l) != 0 && errno == err); \
104- bfs_echeck(xstrtoll(str, end, base, &ll) != 0 && errno == err)
124+ do { \
125+ bfs_echeck(xstrtos(str, end, base, &s) != 0 && errno == err); \
126+ bfs_echeck(xstrtoi(str, end, base, &i) != 0 && errno == err); \
127+ bfs_echeck(xstrtol(str, end, base, &l) != 0 && errno == err); \
128+ bfs_echeck(xstrtoll(str, end, base, &ll) != 0 && errno == err); \
129+ check_strtouerr(err, str, end, base); \
130+ } while (0)
105131
106132 check_strtoerr (EINVAL , "" , NULL , 0 );
107133 check_strtoerr (EINVAL , "" , & end , 0 );
108134 check_strtoerr (EINVAL , " 1 " , & end , 0 );
135+ check_strtoerr (EINVAL , " -1" , NULL , 0 );
109136 check_strtoerr (EINVAL , " 123" , NULL , 0 );
110137 check_strtoerr (EINVAL , "123 " , NULL , 0 );
111138 check_strtoerr (EINVAL , "0789" , NULL , 0 );
112139 check_strtoerr (EINVAL , "789A" , NULL , 0 );
113140 check_strtoerr (EINVAL , "0x" , NULL , 0 );
114141 check_strtoerr (EINVAL , "0x789A" , NULL , 10 );
115-
116- if (LLONG_WIDTH == 64 ) {
117- check_strtoerr (ERANGE , "9223372036854775808" , NULL , 0 );
118- }
142+ check_strtoerr (EINVAL , "0x-1" , NULL , 0 );
143+
144+ #define check_strtotype (type , min , max , fmt , fn , str , base , v , n ) \
145+ do { \
146+ if ((n) >= min && (n) <= max) { \
147+ bfs_echeck(fn(str, NULL, base, &v) == 0); \
148+ bfs_check(v == (type)(n), "%s('%s') == " fmt " (!= " fmt ")", #fn, str, v, (type)(n)); \
149+ } else { \
150+ bfs_echeck(fn(str, NULL, base, &v) != 0 && errno == ERANGE); \
151+ } \
152+ } while (0)
119153
120154#define check_strtoint (str , base , n ) \
121- if ((n) >= LONG_MIN && (n) <= LONG_MAX) { \
122- bfs_echeck(xstrtol(str, NULL, base, &l) == 0); \
123- bfs_check(l == (n), "xstrtol('%s') == %ld (!= %ld)", str, l, (long)(n)); \
124- } else { \
125- bfs_echeck(xstrtol(str, NULL, base, &l) != 0 && errno == ERANGE); \
126- } \
127- bfs_echeck(xstrtoll(str, NULL, base, &ll) == 0); \
128- bfs_check(ll == (n), "xstrtoll('%s') == %lld (!= %lld)", str, ll, (long long)(n)) \
155+ do { \
156+ check_strtotype( signed short, SHRT_MIN, SHRT_MAX, "%d", xstrtos, str, base, s, n); \
157+ check_strtotype( signed int, INT_MIN, INT_MAX, "%d", xstrtoi, str, base, i, n); \
158+ check_strtotype( signed long, LONG_MIN, LONG_MAX, "%ld", xstrtol, str, base, l, n); \
159+ check_strtotype( signed long long, LLONG_MIN, LLONG_MAX, "%lld", xstrtoll, str, base, ll, n); \
160+ check_strtotype(unsigned short, 0, USHRT_MAX, "%u", xstrtous, str, base, us, n); \
161+ check_strtotype(unsigned int, 0, UINT_MAX, "%u", xstrtoui, str, base, ui, n); \
162+ check_strtotype(unsigned long, 0, ULONG_MAX, "%lu", xstrtoul, str, base, ul, n); \
163+ check_strtotype(unsigned long long, 0, ULLONG_MAX, "%llu", xstrtoull, str, base, ull, n); \
164+ } while (0)
129165
130166 check_strtoint ("123" , 0 , 123 );
131167 check_strtoint ("+123" , 0 , 123 );
@@ -139,13 +175,21 @@ static void check_strtox(void) {
139175
140176 check_strtoint ("123" , 16 , 0x123 );
141177
142- check_strtoint ("9223372036854775807" , 0 , 9223372036854775807LL );
143- check_strtoint ("-9223372036854775808" , 0 , -9223372036854775807LL - 1 );
178+ check_strtoint ("0x7FFF" , 0 , 0x7FFF );
179+ check_strtoint ("-0x8000" , 0 , -0x8000 );
180+
181+ check_strtoint ("0x7FFFFFFF" , 0 , 0x7FFFFFFFL );
182+ check_strtoint ("-0x80000000" , 0 , -0x7FFFFFFFL - 1 );
183+
184+ check_strtoint ("0x7FFFFFFFFFFFFFFF" , 0 , 0x7FFFFFFFFFFFFFFFLL );
185+ check_strtoint ("-0x8000000000000000" , 0 , -0x7FFFFFFFFFFFFFFFLL - 1 );
144186
145187#define check_strtoend (str , estr , base , n ) \
146- bfs_echeck(xstrtoll(str, &end, base, &ll) == 0); \
147- bfs_check(ll == (n), "xstrtoll('%s') == %lld (!= %lld)", str, ll, (long long)(n)); \
148- bfs_check(strcmp(end, estr) == 0, "xstrtoll('%s'): end == '%s' (!= '%s')", str, end, estr) \
188+ do { \
189+ bfs_echeck(xstrtoll(str, &end, base, &ll) == 0); \
190+ bfs_check(ll == (n), "xstrtoll('%s') == %lld (!= %lld)", str, ll, (long long)(n)); \
191+ bfs_check(strcmp(end, estr) == 0, "xstrtoll('%s'): end == '%s' (!= '%s')", str, end, estr); \
192+ } while (0)
149193
150194 check_strtoend ("123 " , " " , 0 , 123 );
151195 check_strtoend ("0789" , "89" , 0 , 07 );
0 commit comments