@@ -621,6 +621,51 @@ int expect_str_buf_eq(size_t expr, const char *buf, size_t val, int llen, const
621
621
return 0 ;
622
622
}
623
623
624
+ #define EXPECT_STRTOX (cond , func , input , base , expected , chars , expected_errno ) \
625
+ do { if (!(cond)) result(llen, SKIPPED); else ret += expect_strtox(llen, func, input, base, expected, chars, expected_errno); } while (0)
626
+
627
+ static __attribute__((unused ))
628
+ int expect_strtox (int llen , void * func , const char * input , int base , intmax_t expected , int expected_chars , int expected_errno )
629
+ {
630
+ char * endptr ;
631
+ int actual_errno , actual_chars ;
632
+ intmax_t r ;
633
+
634
+ errno = 0 ;
635
+ if (func == strtol ) {
636
+ r = strtol (input , & endptr , base );
637
+ } else if (func == strtoul ) {
638
+ r = strtoul (input , & endptr , base );
639
+ } else {
640
+ result (llen , FAIL );
641
+ return 1 ;
642
+ }
643
+ actual_errno = errno ;
644
+ actual_chars = endptr - input ;
645
+
646
+ llen += printf (" %lld = %lld" , (long long )expected , (long long )r );
647
+ if (r != expected ) {
648
+ result (llen , FAIL );
649
+ return 1 ;
650
+ }
651
+ if (expected_chars == -1 ) {
652
+ if (* endptr != '\0' ) {
653
+ result (llen , FAIL );
654
+ return 1 ;
655
+ }
656
+ } else if (expected_chars != actual_chars ) {
657
+ result (llen , FAIL );
658
+ return 1 ;
659
+ }
660
+ if (actual_errno != expected_errno ) {
661
+ result (llen , FAIL );
662
+ return 1 ;
663
+ }
664
+
665
+ result (llen , OK );
666
+ return 0 ;
667
+ }
668
+
624
669
/* declare tests based on line numbers. There must be exactly one test per line. */
625
670
#define CASE_TEST (name ) \
626
671
case __LINE__: llen += printf("%d %s", test, #name);
@@ -1143,6 +1188,22 @@ int run_stdlib(int min, int max)
1143
1188
CASE_TEST (limit_ptrdiff_min ); EXPECT_EQ (1 , PTRDIFF_MIN , sizeof (long ) == 8 ? (ptrdiff_t ) 0x8000000000000000LL : (ptrdiff_t ) 0x80000000 ); break ;
1144
1189
CASE_TEST (limit_ptrdiff_max ); EXPECT_EQ (1 , PTRDIFF_MAX , sizeof (long ) == 8 ? (ptrdiff_t ) 0x7fffffffffffffffLL : (ptrdiff_t ) 0x7fffffff ); break ;
1145
1190
CASE_TEST (limit_size_max ); EXPECT_EQ (1 , SIZE_MAX , sizeof (long ) == 8 ? (size_t ) 0xffffffffffffffffULL : (size_t ) 0xffffffffU ); break ;
1191
+ CASE_TEST (strtol_simple ); EXPECT_STRTOX (1 , strtol , "35" , 10 , 35 , -1 , 0 ); break ;
1192
+ CASE_TEST (strtol_positive ); EXPECT_STRTOX (1 , strtol , "+35" , 10 , 35 , -1 , 0 ); break ;
1193
+ CASE_TEST (strtol_negative ); EXPECT_STRTOX (1 , strtol , "-35" , 10 , -35 , -1 , 0 ); break ;
1194
+ CASE_TEST (strtol_hex_auto ); EXPECT_STRTOX (1 , strtol , "0xFF" , 0 , 255 , -1 , 0 ); break ;
1195
+ CASE_TEST (strtol_base36 ); EXPECT_STRTOX (1 , strtol , "12yZ" , 36 , 50507 , -1 , 0 ); break ;
1196
+ CASE_TEST (strtol_cutoff ); EXPECT_STRTOX (1 , strtol , "1234567890" , 8 , 342391 , 7 , 0 ); break ;
1197
+ CASE_TEST (strtol_octal_auto ); EXPECT_STRTOX (1 , strtol , "011" , 0 , 9 , -1 , 0 ); break ;
1198
+ CASE_TEST (strtol_hex_00 ); EXPECT_STRTOX (1 , strtol , "0x00" , 16 , 0 , -1 , 0 ); break ;
1199
+ CASE_TEST (strtol_hex_FF ); EXPECT_STRTOX (1 , strtol , "FF" , 16 , 255 , -1 , 0 ); break ;
1200
+ CASE_TEST (strtol_hex_ff ); EXPECT_STRTOX (1 , strtol , "ff" , 16 , 255 , -1 , 0 ); break ;
1201
+ CASE_TEST (strtol_hex_prefix ); EXPECT_STRTOX (1 , strtol , "0xFF" , 16 , 255 , -1 , 0 ); break ;
1202
+ CASE_TEST (strtol_trailer ); EXPECT_STRTOX (1 , strtol , "35foo" , 10 , 35 , 2 , 0 ); break ;
1203
+ CASE_TEST (strtol_overflow ); EXPECT_STRTOX (1 , strtol , "0x8000000000000000" , 16 , LONG_MAX , -1 , ERANGE ); break ;
1204
+ CASE_TEST (strtol_underflow ); EXPECT_STRTOX (1 , strtol , "-0x8000000000000001" , 16 , LONG_MIN , -1 , ERANGE ); break ;
1205
+ CASE_TEST (strtoul_negative ); EXPECT_STRTOX (1 , strtoul , "-0x1" , 16 , ULONG_MAX , 4 , 0 ); break ;
1206
+ CASE_TEST (strtoul_overflow ); EXPECT_STRTOX (1 , strtoul , "0x10000000000000000" , 16 , ULONG_MAX , -1 , ERANGE ); break ;
1146
1207
1147
1208
case __LINE__ :
1148
1209
return ret ; /* must be last */
0 commit comments