From d193d54478243fbd9e68649e0eb534c72d6aea0d Mon Sep 17 00:00:00 2001 From: solar Date: Fri, 17 Dec 2010 06:05:00 +0000 Subject: [PATCH] Moved the macro magic into the common header. --- functions/stdio/puts.c | 13 +- platform/example/functions/stdlib/system.c | 10 ++ testing/_PDCLIB_iotest.h | 146 ++++++++++++++++++++ testing/printf_testcases.h | 148 --------------------- 4 files changed, 168 insertions(+), 149 deletions(-) diff --git a/functions/stdio/puts.c b/functions/stdio/puts.c index b7954ea..ec67478 100644 --- a/functions/stdio/puts.c +++ b/functions/stdio/puts.c @@ -49,7 +49,18 @@ int puts( const char * s ) int main( void ) { - TESTCASE( puts( "SUCCESS testing puts()" ) >= 0 ); + FILE * fh; + char const * message = "SUCCESS testing puts()"; + char buffer[23]; + buffer[22] = 'x'; + TESTCASE( ( fh = freopen( testfile, "wb+", stdout ) ) != NULL ); + TESTCASE( puts( message ) >= 0 ); + rewind( fh ); + TESTCASE( fread( buffer, 1, 22, fh ) == 22 ); + TESTCASE( memcmp( buffer, message, 22 ) == 0 ); + TESTCASE( buffer[22] == 'x' ); + TESTCASE( fclose( fh ) == 0 ); + TESTCASE( remove( testfile ) == 0 ); return TEST_RESULTS; } diff --git a/platform/example/functions/stdlib/system.c b/platform/example/functions/stdlib/system.c index 2e0079a..eb8db3d 100644 --- a/platform/example/functions/stdlib/system.c +++ b/platform/example/functions/stdlib/system.c @@ -40,7 +40,17 @@ int system( const char * string ) int main( void ) { + FILE * fh; + char buffer[25]; + buffer[24] = 'x'; + TESTCASE( ( fh = freopen( testfile, "wb+", stdout ) ) != NULL ); TESTCASE( system( SHELLCOMMAND ) ); + rewind( fh ); + TESTCASE( fread( buffer, 1, 24, fh ) == 24 ); + TESTCASE( memcmp( buffer, "SUCCESS testing system()", 24 ) == 0 ); + TESTCASE( buffer[24] == 'x' ); + TESTCASE( fclose( fh ) == 0 ); + TESTCASE( remove( testfile ) == 0 ); return TEST_RESULTS; } diff --git a/testing/_PDCLIB_iotest.h b/testing/_PDCLIB_iotest.h index 4dc33f4..4cdc6d5 100644 --- a/testing/_PDCLIB_iotest.h +++ b/testing/_PDCLIB_iotest.h @@ -65,3 +65,149 @@ } \ } while ( 0 ) +/* Virtually everything in the printf() / scanf() test drivers is heavily + depending on the platform, i.e. the width of the integer values. To do + proper domain tests, we need the limits of the integers (largest and + smallest value), which we can get from . But we also need the + string representations of these numbers, to the various bases, which of + course vary depending on how the platform defines 'int' and 'long'. +*/ + +#define sym2v( x ) #x +#define sym2s( x ) sym2v( x ) + +#if INT_MAX >> 15 == 1 + +#define UINT_DIG 5 +#define INT_DIG 5 +#define INT_DIG_LESS1 "4" +#define INT_DIG_PLUS1 "6" +#define INT_DIG_PLUS2 "7" +#define INT_HEXDIG "FFF" +#define INT_hexdig "fff" +#define INT_OCTDIG "177777" +#define INT_MAX_DEZ_STR "32767" +#define INT_MIN_DEZ_STR "32768" +#define UINT_MAX_DEZ_STR "65535" +#define INT_MAX_OCT_STR +#define INT_MIN_OCT_STR +#define UINT_MAX_OCT_STR +#define INT_MAX_HEX_STR +#define INT_MIN_HEX_STR +#define UINT_MAX_HEX_STR + +#elif UINT_MAX >> 31 == 1 + +#define UINT_DIG 10 +#define INT_DIG 10 +#define INT_DIG_LESS1 "9" +#define INT_DIG_PLUS1 "11" +#define INT_DIG_PLUS2 "12" +#define INT_HEXDIG "FFFFFFF" +#define INT_hexdig "fffffff" +#define INT_OCTDIG "37777777777" +#define INT_MAX_DEZ_STR "2147483647" +#define INT_MIN_DEZ_STR "2147483648" +#define UINT_MAX_DEZ_STR "4294967295" +#define INT_MAX_OCT_STR +#define INT_MIN_OCT_STR +#define UINT_MAX_OCT_STR +#define INT_MAX_HEX_STR +#define INT_MIN_HEX_STR +#define UINT_MAX_HEX_STR + +#elif UINT_MAX >> 63 == 1 + +#define UINT_DIG 20 +#define INT_DIG 19 +#define INT_DIG_LESS1 "18" +#define INT_DIG_PLUS1 "20" +#define INT_DIG_PLUS2 "21" +#define INT_HEXDIG "FFFFFFFFFFFFFFF" +#define INT_hexdig "fffffffffffffff" +#define INT_OCTDIG "1777777777777777777777" +#define INT_MAX_DEZ_STR "9223372036854775807" +#define INT_MIN_DEZ_STR "9223372036854775808" +#define UINT_MAX_DEZ_STR "18446744073709551615" +#define INT_MAX_OCT_STR +#define INT_MIN_OCT_STR +#define UINT_MAX_OCT_STR +#define INT_MAX_HEX_STR +#define INT_MIN_HEX_STR +#define UINT_MAX_HEX_STR + +#else + +#error Unsupported width of 'int' (neither 16, 32, nor 64 bit). + +#endif + + +#if ULONG_MAX >> 31 == 1 + +#define ULONG_DIG 10 +#define LONG_DIG 10 +#define LONG_MAX_DEZ_STR "2147483647" +#define LONG_MIN_DEZ_STR "2147483648" +#define ULONG_MAX_DEZ_STR "4294967295" +#define LONG_MAX_OCT_STR +#define LONG_MIN_OCT_STR +#define ULONG_MAX_OCT_STR +#define LONG_MAX_HEX_STR +#define LONG_MIN_HEX_STR +#define ULONG_MAX_HEX_STR + +#elif ULONG_MAX >> 63 == 1 + +#define ULONG_DIG 20 +#define LONG_DIG 19 +#define LONG_MAX_DEZ_STR "9223372036854775807" +#define LONG_MIN_DEZ_STR "9223372036854775808" +#define ULONG_MAX_DEZ_STR "18446744073709551615" +#define LONG_MAX_OCT_STR +#define LONG_MIN_OCT_STR +#define ULONG_MAX_OCT_STR +#define LONG_MAX_HEX_STR +#define LONG_MIN_HEX_STR +#define ULONG_MAX_HEX_STR + +#else + +#error Unsupported width of 'long' (neither 32 nor 64 bit). + +#endif + + +#if ULLONG_MAX >> 63 == 1 + +#define ULLONG_DIG 20 +#define LLONG_DIG 19 +#define LLONG_MAX_DEZ_STR "9223372036854775807" +#define LLONG_MIN_DEZ_STR "9223372036854775808" +#define ULLONG_MAX_DEZ_STR "18446744073709551615" +#define LLONG_MAX_OCT_STR +#define LLONG_MIN_OCT_STR +#define ULLONG_MAX_OCT_STR +#define LLONG_MAX_HEX_STR +#define LLONG_MIN_HEX_STR +#define ULLONG_MAX_HEX_STR + +#elif ULLONG_MAX >> 127 == 1 + +#define ULLONG_DIG 38 +#define LLONG_DIG 38 +#define LLONG_MAX_DEZ_STR "170141183460469231731687303715884105727" +#define LLONG_MIN_DEZ_STR "170141183460469231731687303715884105728" +#define ULLONG_MAX_DEZ_STR "340282366920938463463374607431768211455" +#define LLONG_MAX_OCT_STR +#define LLONG_MIN_OCT_STR +#define ULLONG_MAX_OCT_STR +#define LLONG_MAX_HEX_STR +#define LLONG_MIN_HEX_STR +#define ULLONG_MAX_HEX_STR + +#else + +#error Unsupported width of 'long long' (neither 64 nor 128 bit). + +#endif diff --git a/testing/printf_testcases.h b/testing/printf_testcases.h index 2514540..e024784 100644 --- a/testing/printf_testcases.h +++ b/testing/printf_testcases.h @@ -1,152 +1,4 @@ { - -/* Be afraid. Be very afraid. - Virtually everything in the printf() / scanf() test drivers is heavily - depending on the platform, i.e. the width of the integer values. Since - we need widths, string representations in hex, octal and decimal and - whatnot, there is some heavy macro abuse coming up... -*/ - -#define sym2v( x ) #x -#define sym2s( x ) sym2v( x ) - -#if INT_MAX >> 15 == 1 - -#define UINT_DIG 5 -#define INT_DIG 5 -#define INT_DIG_LESS1 "4" -#define INT_DIG_PLUS1 "6" -#define INT_DIG_PLUS2 "7" -#define INT_HEXDIG "FFF" -#define INT_hexdig "fff" -#define INT_OCTDIG "177777" -#define INT_MAX_DEZ_STR "32767" -#define INT_MIN_DEZ_STR "32768" -#define UINT_MAX_DEZ_STR "65535" -#define INT_MAX_OCT_STR -#define INT_MIN_OCT_STR -#define UINT_MAX_OCT_STR -#define INT_MAX_HEX_STR -#define INT_MIN_HEX_STR -#define UINT_MAX_HEX_STR - -#elif UINT_MAX >> 31 == 1 - -#define UINT_DIG 10 -#define INT_DIG 10 -#define INT_DIG_LESS1 "9" -#define INT_DIG_PLUS1 "11" -#define INT_DIG_PLUS2 "12" -#define INT_HEXDIG "FFFFFFF" -#define INT_hexdig "fffffff" -#define INT_OCTDIG "37777777777" -#define INT_MAX_DEZ_STR "2147483647" -#define INT_MIN_DEZ_STR "2147483648" -#define UINT_MAX_DEZ_STR "4294967295" -#define INT_MAX_OCT_STR -#define INT_MIN_OCT_STR -#define UINT_MAX_OCT_STR -#define INT_MAX_HEX_STR -#define INT_MIN_HEX_STR -#define UINT_MAX_HEX_STR - -#elif UINT_MAX >> 63 == 1 - -#define UINT_DIG 20 -#define INT_DIG 19 -#define INT_DIG_LESS1 "18" -#define INT_DIG_PLUS1 "20" -#define INT_DIG_PLUS2 "21" -#define INT_HEXDIG "FFFFFFFFFFFFFFF" -#define INT_hexdig "fffffffffffffff" -#define INT_OCTDIG "1777777777777777777777" -#define INT_MAX_DEZ_STR "9223372036854775807" -#define INT_MIN_DEZ_STR "9223372036854775808" -#define UINT_MAX_DEZ_STR "18446744073709551615" -#define INT_MAX_OCT_STR -#define INT_MIN_OCT_STR -#define UINT_MAX_OCT_STR -#define INT_MAX_HEX_STR -#define INT_MIN_HEX_STR -#define UINT_MAX_HEX_STR - -#else - -#error Unsupported width of 'int' (neither 16, 32, nor 64 bit). - -#endif - - -#if ULONG_MAX >> 31 == 1 - -#define ULONG_DIG 10 -#define LONG_DIG 10 -#define LONG_MAX_DEZ_STR "2147483647" -#define LONG_MIN_DEZ_STR "2147483648" -#define ULONG_MAX_DEZ_STR "4294967295" -#define LONG_MAX_OCT_STR -#define LONG_MIN_OCT_STR -#define ULONG_MAX_OCT_STR -#define LONG_MAX_HEX_STR -#define LONG_MIN_HEX_STR -#define ULONG_MAX_HEX_STR - -#elif ULONG_MAX >> 63 == 1 - -#define ULONG_DIG 20 -#define LONG_DIG 19 -#define LONG_MAX_DEZ_STR "9223372036854775807" -#define LONG_MIN_DEZ_STR "9223372036854775808" -#define ULONG_MAX_DEZ_STR "18446744073709551615" -#define LONG_MAX_OCT_STR -#define LONG_MIN_OCT_STR -#define ULONG_MAX_OCT_STR -#define LONG_MAX_HEX_STR -#define LONG_MIN_HEX_STR -#define ULONG_MAX_HEX_STR - -#else - -#error Unsupported width of 'long' (neither 32 nor 64 bit). - -#endif - - -#if ULLONG_MAX >> 63 == 1 - -#define ULLONG_DIG 20 -#define LLONG_DIG 19 -#define LLONG_MAX_DEZ_STR "9223372036854775807" -#define LLONG_MIN_DEZ_STR "9223372036854775808" -#define ULLONG_MAX_DEZ_STR "18446744073709551615" -#define LLONG_MAX_OCT_STR -#define LLONG_MIN_OCT_STR -#define ULLONG_MAX_OCT_STR -#define LLONG_MAX_HEX_STR -#define LLONG_MIN_HEX_STR -#define ULLONG_MAX_HEX_STR - -#elif ULLONG_MAX >> 127 == 1 - -#define ULLONG_DIG 38 -#define LLONG_DIG 38 -#define LLONG_MAX_DEZ_STR "170141183460469231731687303715884105727" -#define LLONG_MIN_DEZ_STR "170141183460469231731687303715884105728" -#define ULLONG_MAX_DEZ_STR "340282366920938463463374607431768211455" -#define LLONG_MAX_OCT_STR -#define LLONG_MIN_OCT_STR -#define ULLONG_MAX_OCT_STR -#define LLONG_MAX_HEX_STR -#define LLONG_MIN_HEX_STR -#define ULLONG_MAX_HEX_STR - -#else - -#error Unsupported width of 'long long' (neither 64 nor 128 bit). - -#endif - - PRINTF_TEST( 4, "-128", "%hhd", CHAR_MIN ); PRINTF_TEST( 3, "127", "%hhd", CHAR_MAX ); PRINTF_TEST( 1, "0", "%hhd", 0 ); -- 2.40.0