]> pd.if.org Git - pdclib/commitdiff
Better size-safe checking for integer widths.
authorsolar <unknown>
Sun, 18 Jul 2010 12:05:46 +0000 (12:05 +0000)
committersolar <unknown>
Sun, 18 Jul 2010 12:05:46 +0000 (12:05 +0000)
functions/inttypes/strtoimax.c
functions/inttypes/strtoumax.c
functions/stdio/printf_testcases.incl
functions/stdlib/strtol.c
functions/stdlib/strtoll.c
functions/stdlib/strtoul.c
functions/stdlib/strtoull.c

index 936389cbb97f8fd3392714cf1939117a8098568d..2d0fdf77c27e6500afa4465b36d7fedce88e202a 100755 (executable)
@@ -88,7 +88,7 @@ int main( void )
     /* one-complement and signed magnitude just as well. Anyone having a   */
     /* platform to test this on?                                           */
     errno = 0;
-#if INTMAX_MAX == 0x7fffffffffffffffLL
+#if INTMAX_MAX >> 62 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoimax( "9223372036854775807", NULL, 0 ) == INTMAX_MAX );
     TESTCASE( errno == 0 );
@@ -102,7 +102,7 @@ int main( void )
     TESTCASE( strtoimax( "-9223372036854775809", NULL, 0 ) == INTMAX_MIN );
     TESTCASE( errno == ERANGE );
     /* TODO: test "odd" overflow, i.e. base is not power of two */
-#elif LLONG_MAX == 0x7fffffffffffffffffffffffffffffffLL
+#elif LLONG_MAX >> 126 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoimax( "170141183460469231731687303715884105728", NULL, 0 ) == INTMAX_MAX );
     TESTCASE( errno == 0 );
index 0da7ec2889f31fffb2f510287e61a5d8dd5ad30c..9c9833eda92bd367d462f734e1fde975abf0c9b8 100755 (executable)
@@ -76,14 +76,16 @@ int main( void )
     TESTCASE( strtoumax( overflow, &endptr, 0 ) == 0 );
     TESTCASE( endptr == overflow );
     errno = 0;
-#if UINTMAX_MAX == 0xffffffffffffffffLL
+/* uintmax_t -> long long -> 64 bit */
+#if UINTMAX_MAX >> 63 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoumax( "18446744073709551615", NULL, 0 ) == UINTMAX_MAX );
     TESTCASE( errno == 0 );
     TESTCASE( strtoumax( "18446744073709551616", NULL, 0 ) == UINTMAX_MAX );
     TESTCASE( errno == ERANGE );
     /* TODO: test "odd" overflow, i.e. base is not power of two */
-#elif UINTMAX_MAX == 0xffffffffffffffffffffffffffffffffLL
+/* uintmax_t -> long long -> 128 bit */
+#elif UINTMAX_MAX >> 127 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoumax( "340282366920938463463374607431768211455", NULL, 0 ) == UINTMAX_MAX );
     TESTCASE( errno == 0 );
index 432d1e2e78fa38c787785e4bd5597604e7e660c4..a421ca669116ed7a8e287e83cf28c1c928747b51 100644 (file)
@@ -1,18 +1,18 @@
     {
 
-#if UINT_MAX / 0xffffu == 1
+#if UINT_MAX >> 15 == 1
 #define _PDCLIB_UINT_DIG 5
 #define _PDCLIB_INT_DIG  5
 #define _PDCLIB_INT_HEXDIG FFFF
 #define _PDCLIB_INT_hexdig ffff
 #define _PDCLIB_INT_OCTDIG 177777
-#elif UINT_MAX / 0xffffffffu == 1
+#elif UINT_MAX >> 31 == 1
 #define _PDCLIB_UINT_DIG 10
 #define _PDCLIB_INT_DIG  10
 #define _PDCLIB_INT_HEXDIG FFFFFFFF
 #define _PDCLIB_INT_hexdig ffffffff
 #define _PDCLIB_INT_OCTDIG 37777777777
-#elif UINT_MAX / 0xffffffffffffffffu == 1
+#elif UINT_MAX >> 63 == 1
 #define _PDCLIB_UINT_DIG 20
 #define _PDCLIB_INT_DIG  19
 #define _PDCLIB_INT_HEXDIG FFFFFFFFFFFFFFFF
 #error Unsupported width of 'int' (neither 16, 32, nor 64 bit).
 #endif
 
-#if ULONG_MAX / 0xfffffffful == 1
+#if ULONG_MAX >> 31 == 1
 #define _PDCLIB_ULONG_DIG 10
 #define _PDCLIB_LONG_DIG  10
-#elif ULONG_MAX / 0xfffffffffffffffful == 1
+#elif ULONG_MAX >> 63 == 1
 #define _PDCLIB_ULONG_DIG 20
 #define _PDCLIB_LONG_DIG  19
 #else
 #error Unsupported width of 'long' (neither 32 nor 64 bit).
 #endif
 
-#if ULLONG_MAX / 0xffffffffffffffffull == 1
+#if ULLONG_MAX >> 63 == 1
 #define _PDCLIB_ULLONG_DIG 20
 #define _PDCLIB_LLONG_DIG  19
-#elif ULLONG_MAX / 0xffffffffffffffffffffffffffffffffull == 1
+#elif ULLONG_MAX >> 127 == 1
 #define _PDCLIB_ULLONG_DIG 38
 #define _PDCLIB_LLONG_DIG  38
 #else
index 085abbb612c074fcfcdf3595a29a216914718a9a..dce035ea1f9bd8a254b36ce9cde74f4e18bbcb63 100644 (file)
@@ -88,7 +88,7 @@ int main( void )
     /* for one-complement and signed magnitude just as well. Anyone having */
     /* a platform to test this on?                                         */
     errno = 0;
-#if LONG_MAX == 0x7fffffffL
+#if LONG_MAX >> 30 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtol( "2147483647", NULL, 0 ) == 0x7fffffff );
     TESTCASE( errno == 0 );
@@ -105,7 +105,7 @@ int main( void )
     TESTCASE( strtol( "-2147483649", NULL, 0 ) == LONG_MIN );
     TESTCASE( errno == ERANGE );
     /* TODO: test "odd" overflow, i.e. base is not power of two */
-#elif LONG_MAX == 0x7fffffffffffffffL
+#elif LONG_MAX >> 62 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtol( "9223372036854775807", NULL, 0 ) == 0x7fffffffffffffff );
     TESTCASE( errno == 0 );
index b4476915b0a6b7c29fff1c17a8d8fa694746d01f..41640a159e074a632540410f805a1b72026bf2a5 100644 (file)
@@ -88,7 +88,7 @@ int main( void )
     /* for one-complement and signed magnitude just as well. Anyone having */
     /* a platform to test this on?                                         */
     errno = 0;
-#if LLONG_MAX == 0x7fffffffffffffffLL
+#if LLONG_MAX >> 62 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoll( "9223372036854775807", NULL, 0 ) == 0x7fffffffffffffff );
     TESTCASE( errno == 0 );
@@ -102,7 +102,7 @@ int main( void )
     TESTCASE( strtoll( "-9223372036854775809", NULL, 0 ) == LLONG_MIN );
     TESTCASE( errno == ERANGE );
     /* TODO: test "odd" overflow, i.e. base is not power of two */
-#elif LLONG_MAX == 0x7fffffffffffffffffffffffffffffffLL
+#elif LLONG_MAX >> 126 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoll( "170141183460469231731687303715884105728", NULL, 0 ) == 0x7fffffffffffffffffffffffffffffff );
     TESTCASE( errno == 0 );
index 568029756b69af9267be04b790ad5a086f0ba4bc..4b2fd3d208ec56c49f0e5ef4553992184c37125c 100644 (file)
@@ -79,7 +79,8 @@ int main( void )
     /* for one-complement and signed magnitude just as well. Anyone having */
     /* a platform to test this on?                                         */
     errno = 0;
-#if ULONG_MAX == 0xffffffffL
+/* long -> 32 bit */
+#if ULONG_MAX >> 31 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoul( "4294967295", NULL, 0 ) == ULONG_MAX );
     TESTCASE( errno == 0 );
@@ -87,7 +88,8 @@ int main( void )
     TESTCASE( strtoul( "4294967296", NULL, 0 ) == ULONG_MAX );
     TESTCASE( errno == ERANGE );
     /* TODO: test "odd" overflow, i.e. base is not power of two */
-#elif ULONG_MAX == 0xffffffffffffffffL
+/* long -> 64 bit */
+#elif ULONG_MAX >> 63 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoul( "18446744073709551615", NULL, 0 ) == ULONG_MAX );
     TESTCASE( errno == 0 );
index ca9dd1936ee2fb46c11dddfaf5f424aa5147e3bb..a28bb45d5ef7c7fca86e85feae554d3e45a320b9 100644 (file)
@@ -76,14 +76,16 @@ int main( void )
     TESTCASE( strtoull( overflow, &endptr, 0 ) == 0 );
     TESTCASE( endptr == overflow );
     errno = 0;
-#if ULLONG_MAX == 0xffffffffffffffffLL
+/* long long -> 64 bit */
+#if ULLONG_MAX >> 63 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoull( "18446744073709551615", NULL, 0 ) == ULLONG_MAX );
     TESTCASE( errno == 0 );
     TESTCASE( strtoull( "18446744073709551616", NULL, 0 ) == ULLONG_MAX );
     TESTCASE( errno == ERANGE );
     /* TODO: test "odd" overflow, i.e. base is not power of two */
-#elif ULLONG_MAX == 0xffffffffffffffffffffffffffffffffLL
+/* long long -> 128 bit */
+#elif ULLONG_MAX >> 127 == 1
     /* testing "even" overflow, i.e. base is power of two */
     TESTCASE( strtoull( "340282366920938463463374607431768211455", NULL, 0 ) == ULLONG_MAX );
     TESTCASE( errno == 0 );