From: solar Date: Mon, 19 Jul 2010 09:47:39 +0000 (+0000) Subject: Moved test-related files to testing subdirectory (i.e., out of the way). X-Git-Url: https://git.gag.com/?p=fw%2Fpdclib;a=commitdiff_plain;h=8f80da097704e9bdfd7a78c27a07f2f92b584846 Moved test-related files to testing subdirectory (i.e., out of the way). git-svn-id: https://srv7.svn-repos.de/dev34/pdclib/trunk@448 546481bc-9713-0410-bf18-d3337bbf4a3e --- diff --git a/Makefile b/Makefile index 6748be4..0acd1cc 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ PATCHFILES2 := $(shell ls platform/$(PLATFORM)/functions/stdlib/*.c) PATCHFILES3 := $(shell ls platform/$(PLATFORM)/functions/stdio/*.c) WARNINGS := -Wall -Wextra -pedantic -Wno-unused-parameter -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -fno-builtin -CFLAGS := -g -std=c99 -I./internals $(WARNINGS) $(USERFLAGS) +CFLAGS := -g -std=c99 -I./internals -I./testing $(WARNINGS) $(USERFLAGS) .PHONY: all clean srcdist bindist test tests testdrivers regtests regtestdrivers todos fixmes find links unlink help diff --git a/functions/stdio/fprintf_reftest.incl b/functions/stdio/fprintf_reftest.incl deleted file mode 100644 index afc89b9..0000000 --- a/functions/stdio/fprintf_reftest.incl +++ /dev/null @@ -1,13 +0,0 @@ - { - char readbuffer[2000]; - char refbuffer[2000]; - size_t readcounter; - TESTCASE( ( buffer = fopen( "testfile", "r" ) ) != NULL ); - readcounter = fread( readbuffer, 1, 2000, buffer ); - TESTCASE( fclose( buffer ) == 0 ); - TESTCASE( ( buffer = fopen( "functions/stdio/printf_reference.txt", "r" ) ) != NULL ); - TESTCASE( fread( refbuffer, 1, 2000, buffer ) == readcounter ); - TESTCASE( fclose( buffer ) == 0 ); - TESTCASE( memcmp( readbuffer, refbuffer, readcounter ) == 0 ); - TESTCASE( remove( "testfile" ) == 0 ); - } diff --git a/functions/stdio/fscan_sources.incl b/functions/stdio/fscan_sources.incl deleted file mode 100644 index 704c542..0000000 --- a/functions/stdio/fscan_sources.incl +++ /dev/null @@ -1,67 +0,0 @@ - FILE * general = fopen( "scanf_testdata_general", "wb+" ); - TESTCASE( general != NULL ); - TESTCASE( fwrite( "12345678901\0003-5+7\0009\3772 4 6 8 0\3771 \011 5%% 0", 1, 40, general ) == 40 ); - rewind( general ); - - FILE * decimal = fopen( "scanf_testdata_decimal", "wb+" ); - TESTCASE( decimal != NULL ); - TESTCASE( fwrite( "-0 +0 -128 +127 +255 -32768 +32767 +65535\n" - "-2147483648 +2147483647 +4294967295\n" - "-9223372036854775808 +9223372036854775807\n" - "+18446744073709551615\n", 1, 142, decimal ) == 142 ); - rewind( decimal ); - - FILE * hexadecimal = fopen( "scanf_testdata_hexadecimal", "wb+" ); - TESTCASE( hexadecimal != NULL ); - TESTCASE( fwrite( "-0x0 -0x000 -0x7f -0x80 0xff -0x7fff -0x8000\n" - "0xffff -0x7fffffff -0x80000000 0xffffffff\n" - "-0x7fffffffffffffff -0x8000000000000000\n" - "0xffffffffffffffff\n", 1, 146, hexadecimal ) == 146 ); - rewind( hexadecimal ); - - FILE * octal = fopen( "scanf_testdata_octal", "wb+" ); - TESTCASE( octal != NULL ); - TESTCASE( fwrite( "+0000 -0000 +0177 +0377 -0377 +077777 +0177777\n" - "-0177777 +017777777777 +037777777777\n" - "-037777777777 +0777777777777777777777\n" - "+01777777777777777777777\n" - "-01777777777777777777777\n", 1, 172, octal ) == 172 ); - rewind( octal ); - - FILE * alpha = fopen( "scanf_testdata_alpha", "wb+" ); - TESTCASE( alpha != NULL ); - TESTCASE( fwrite( "abcdefgh-ijklmnop[qrs%uvw]xyz", 1, 29, alpha ) == 29 ); - rewind( alpha ); - -#ifndef REGTEST - FILE * special = fopen( "scanf_testdata_special", "wb+" ); - TESTCASE( special != NULL ); - TESTCASE( fwrite( "-0xz\n", 1, 5, special ) == 5 ); - rewind( special ); -#endif - - -/* fscan */ -#define TESTSCAN( result, count, source, offset, ... ) \ - do \ - { \ - int n = -1; \ - TESTCASE( fseek( source, offset, SEEK_SET ) == 0 ); \ - int res = SCANFUNC( source, __VA_ARGS__ ); \ - if ( res != result ) \ - { \ - rc += 1; \ - printf( "FAILED: " __FILE__ ", line %d - expected result %d, got %d\n", __LINE__, result, res ); \ - } \ - if ( n != count ) \ - { \ - rc += 1; \ - printf( "FAILED: " __FILE__ ", line %d - expected count %d, got %d\n", __LINE__, count, n ); \ - } \ - } while ( 0 ) - -#define SCAN( format ) format "%n", &n -#define SCANPARMS( format, ... ) format "%n", __VA_ARGS__, &n - -#define _PDCLIB_FSCAN - diff --git a/functions/stdio/printf_reference.txt b/functions/stdio/printf_reference.txt deleted file mode 100644 index c3e1d86..0000000 --- a/functions/stdio/printf_reference.txt +++ /dev/null @@ -1 +0,0 @@ --1281270-32768327670-214748364821474836470-922337203685477580892233720368547758070-92233720368547758089223372036854775807025525565535655354294967295429496729518446744073709551615184467440737095516151844674407370955161518446744073709551615FFFFFFFF0XFFFFFFFFffffffff0xffffffff37777777777037777777777%.0#o-2147483648+2147483647+042949672954294967295-2147483648 2147483647 042949672954294967295-21474836482147483647-21474836482147483647-2147483648 2147483647 -2147483648 2147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 -21474836482147483647-21474836482147483647-214748364802147483647-02147483648002147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 00000000002147483647ffffffff0xffffffff0xffffffff-2147483648-2147483648-21474836480xffffffff0xffffffff0xffffffff214748364721474836472147483647+2147483647+2147483647+2147483647+2147483647+2147483647+2147483647- 2147483647- 2147483647 % -2147483648xabcdef0xdeadbeef123456789 \ No newline at end of file diff --git a/functions/stdio/printf_testcases.incl b/functions/stdio/printf_testcases.incl deleted file mode 100644 index a421ca6..0000000 --- a/functions/stdio/printf_testcases.incl +++ /dev/null @@ -1,249 +0,0 @@ - { - -#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 >> 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 >> 63 == 1 -#define _PDCLIB_UINT_DIG 20 -#define _PDCLIB_INT_DIG 19 -#define _PDCLIB_INT_HEXDIG FFFFFFFFFFFFFFFF -#define _PDCLIB_INT_hexdig ffffffffffffffff -#define _PDCLIB_INT_OCTDIG 1777777777777777777777 -#else -#error Unsupported width of 'int' (neither 16, 32, nor 64 bit). -#endif - -#if ULONG_MAX >> 31 == 1 -#define _PDCLIB_ULONG_DIG 10 -#define _PDCLIB_LONG_DIG 10 -#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 >> 63 == 1 -#define _PDCLIB_ULLONG_DIG 20 -#define _PDCLIB_LLONG_DIG 19 -#elif ULLONG_MAX >> 127 == 1 -#define _PDCLIB_ULLONG_DIG 38 -#define _PDCLIB_LLONG_DIG 38 -#else -#error Unsupported width of 'long long' (neither 64 nor 128 bit). -#endif - - TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); - //TESTCASE( strcmp( buffer, "-128" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); - //TESTCASE( strcmp( buffer, "127" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); - //TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); - //TESTCASE( strcmp( buffer, "-32768" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); - //TESTCASE( strcmp( buffer, "32767" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); - //TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == _PDCLIB_INT_DIG + 1 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == _PDCLIB_INT_DIG ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); - //TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == _PDCLIB_LONG_DIG + 1 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == _PDCLIB_LONG_DIG ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); - //TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == _PDCLIB_LLONG_DIG + 1 ); - //TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == _PDCLIB_LLONG_DIG ); - //TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); - //TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); - //TESTCASE( strcmp( buffer, "255" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); - //TESTCASE( strcmp( buffer, "255" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); - //TESTCASE( strcmp( buffer, "65535" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); - //TESTCASE( strcmp( buffer, "65535" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == _PDCLIB_UINT_DIG ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%u", -1u ) == _PDCLIB_UINT_DIG ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == _PDCLIB_ULONG_DIG ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == _PDCLIB_ULONG_DIG ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); - //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); - //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); - //TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); - //TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); - //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); - //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); - //TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); - /* TODO: This test case is broken, doesn't test what it was intended to. */ - TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); - //TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); - //TESTCASE( strcmp( buffer, "+0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); - //TESTCASE( strcmp( buffer, " 0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); - //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); - //TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); - //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); - //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); - //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); - //TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); - //TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); - //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); - //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); - //TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); - //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); - //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); - //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); - //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); - //TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); - //TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); - //TESTCASE( strcmp( buffer, "x" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); - //TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); - //TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); /* FIXME */ - { - int val1, val2; - TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); - //TESTCASE( strcmp( buffer, "123456789" ) == 0 ); /* FIXME */ - TESTCASE( val1 == 6 ); - TESTCASE( val2 == 9 ); - } - } diff --git a/functions/stdio/scan_test.h b/functions/stdio/scan_test.h deleted file mode 100644 index 9eae7c8..0000000 --- a/functions/stdio/scan_test.h +++ /dev/null @@ -1,16 +0,0 @@ -/* $Id$ */ - -/* scan test header - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -#include -#include - -#define CHECK_TRUE( a ) TESTCASE( a != 0 ) -#define CHECK_FALSE( a ) TESTCASE( a == 0 ) -#define CHECK_EQUAL( a, b ) do { int x = a; int y = b; TESTCASE( x == y ); } while ( 0 ) -#define CHECK_FEQUAL( a, b, T, F ) do { T x = a; T y = b; TESTCASE( x == y ); } while ( 0 ) - diff --git a/functions/stdio/scanf_testcases.incl b/functions/stdio/scanf_testcases.incl deleted file mode 100644 index a32d0ca..0000000 --- a/functions/stdio/scanf_testcases.incl +++ /dev/null @@ -1,1181 +0,0 @@ - // ----------------------------------------------------------------------- - // Literal matching - // ----------------------------------------------------------------------- - { - // matching six characters literally - // should report six characters read - TESTSCAN( 0, 6, general, 0, SCAN( "123456" ) ); - } - { - // matching a character, three whitespace chars, and another character - // should report five characters read - TESTSCAN( 0, 5, general, 30, SCAN( "1 5" ) ); - } - { - // matching three characters, not matching whitespaces, and matching another three characters - // should report six characters matched - TESTSCAN( 0, 6, general, 0, SCAN( "123 456" ) ); - } - { - // matching a character, two '%' characters, and two whitespaces - // should report five characters matched - TESTSCAN( 0, 5, general, 34, SCAN( "5%%%% " ) ); - } - { - // seeking to last character in file, trying to match that char and a whitespace - // should report one character matched and EOF - TESTSCAN( 0, 1, general, 39, SCAN( "0 " ) ); - } - { - // seeking to end of file, trying to match a -1 - // should report error, not executing %n - TESTSCAN( -1, -1, general, 40, SCAN( "\377" ) ); /* FIXME */ - } - - // ----------------------------------------------------------------------- - // Character matching ('%c') - // ----------------------------------------------------------------------- - { - // reading a char array of specified width, including zero bytes - // should report the characters read up to first zero - char buffer[ 8 ]; -#ifdef _PDCLIB_SSCAN - int count = 1; - char expected[] = "1\177\177\177\177\177\177\177"; -#else - int count = 7; - char expected[] = "1\0003-5+7"; -#endif - memset( buffer, '\177', 8 ); - TESTSCAN( 1, count, general, 10, SCANPARMS( "%7c", buffer ) ); - CHECK_FALSE( memcmp( buffer, expected, 7 ) ); - } - { - // reading a char array of unspecified width when positioned at -1 value - // should default to width one, read the -1 value, no zero termination of the array - char buffer[ 2 ]; - memset( buffer, '\177', 2 ); - TESTSCAN( 1, 1, general, 19, SCANPARMS( "%c", buffer ) ); - CHECK_FALSE( memcmp( buffer, "\377\177", 2 ) ); - } - { - // reading a char array of specified width 1 when positioned at (non-space) whitespace - // should read the whitespace (literally), no zero termination of the array - char buffer[ 2 ]; - memset( buffer, '\177', 2 ); - TESTSCAN( 1, 1, general, 32, SCANPARMS( "%1c", buffer ) ); - CHECK_FALSE( memcmp( buffer, "\011\177", 2 ) ); - } - { - // reading a char array of specified width 2 when positioned at last char of file - // should read the character, and report EOF - char buffer[ 2 ]; - memset( buffer, '\177', 2 ); - TESTSCAN( 1, 1, general, 39, SCANPARMS( "%2c", buffer ) ); - CHECK_FALSE( memcmp( buffer, "0\177", 2 ) ); - } - { - // reading a char array of specified width 1 when positioned at last char of file - // should read the character, and NOT report EOF - char buffer[ 2 ]; - memset( buffer, '\177', 2 ); - TESTSCAN( 1, 1, general, 39, SCANPARMS( "%1c", buffer ) ); - CHECK_FALSE( memcmp( buffer, "0\177", 2 ) ); - } - { - // reading a char array of specified width 1 when positioned at EOF - // should report input error before any conversion (-1) - char buffer[ 2 ]; - memset( buffer, '\177', 2 ); - TESTSCAN( -1, -1, general, 40, SCANPARMS( "%1c", buffer ) ); - CHECK_FALSE( memcmp( buffer, "\177\177", 2 ) ); - } - - // ----------------------------------------------------------------------- - // Integer matching ('%d') - // ----------------------------------------------------------------------- - { - // reading a whitespace-terminated integer - int i; - TESTSCAN( 1, 1, general, 20, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 2 ); - } - { - // reading a -1 terminated integer - int i; - TESTSCAN( 1, 1, general, 18, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 9 ); - } - { - // reading a EOF terminated integer - int i = -1; - TESTSCAN( 1, 1, general, 39, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // trying to read an integer when positioned at whitespace - // should skip whitespaces - int i = -1; - TESTSCAN( 1, 3, general, 32, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 5 ); - } - { - // trying to read an integer when positioned at -1 value - // should report matching failure - int i = 0; - TESTSCAN( 0, -1, general, 19, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // trying to read an integer when positioned at EOF - // should report reading failure - int i = 0; - TESTSCAN( -1, -1, general, 40, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading a '-'-prefixed integer - int i; - TESTSCAN( 1, 2, general, 13, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, -5 ); - } - { - // reading a '+'-prefixed integer - int i; - TESTSCAN( 1, 2, general, 15, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 7 ); - } - - // decimal integer matches - { - // reading 0, d - signed char i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hhd", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, d - signed char i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hhd", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, d - signed char i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hhd", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -128, d - signed char i = -1; - TESTSCAN( 1, 4, decimal, 6, SCANPARMS( "%hhd", &i ) ); - CHECK_EQUAL( i, -128 ); - } - { - // reading 127, d - signed char i = -1; - TESTSCAN( 1, 3, decimal, 12, SCANPARMS( "%hhd", &i ) ); - CHECK_EQUAL( i, 127 ); - } - { - // reading +127, d - signed char i = -1; - TESTSCAN( 1, 4, decimal, 11, SCANPARMS( "%hhd", &i ) ); - CHECK_EQUAL( i, 127 ); - } - { - // reading 0, u - unsigned char i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hhu", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, u - unsigned char i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hhu", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, u - unsigned char i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hhu", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 127, u - unsigned char i = -1; - TESTSCAN( 1, 3, decimal, 12, SCANPARMS( "%hhu", &i ) ); - CHECK_EQUAL( i, 127 ); - } - { - // reading +127, u - unsigned char i = -1; - TESTSCAN( 1, 4, decimal, 11, SCANPARMS( "%hhu", &i ) ); - CHECK_EQUAL( i, 127 ); - } - { - // reading 255, u - unsigned char i = 0; - TESTSCAN( 1, 3, decimal, 17, SCANPARMS( "%hhu", &i ) ); - CHECK_EQUAL( i, 255 ); - } - { - // reading +255, u - unsigned char i = 0; - TESTSCAN( 1, 4, decimal, 16, SCANPARMS( "%hhu", &i ) ); - CHECK_EQUAL( i, 255 ); - } - { - // reading 0, i - signed char i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, i - signed char i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, i - signed char i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -128, i - signed char i = -1; - TESTSCAN( 1, 4, decimal, 6, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, -128 ); - } - { - // reading 127, i - signed char i = -1; - TESTSCAN( 1, 3, decimal, 12, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, 127 ); - } - { - // reading +127, i - signed char i = -1; - TESTSCAN( 1, 4, decimal, 11, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, 127 ); - } - { - // reading 0, d - signed short i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hd", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, d - signed short i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hd", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, d - signed short i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hd", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -32768, d - signed short i = -1; - TESTSCAN( 1, 6, decimal, 21, SCANPARMS( "%hd", &i ) ); - CHECK_EQUAL( i, -32768 ); - } - { - // reading 32767, d - signed short i = -1; - TESTSCAN( 1, 5, decimal, 29, SCANPARMS( "%hd", &i ) ); - CHECK_EQUAL( i, 32767 ); - } - { - // reading +32767, d - signed short i = -1; - TESTSCAN( 1, 6, decimal, 28, SCANPARMS( "%hd", &i ) ); - CHECK_EQUAL( i, 32767 ); - } - { - // reading 0, u - unsigned short i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hu", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, u - unsigned short i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hu", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, u - unsigned short i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hu", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 32767, u - unsigned short i = -1; - TESTSCAN( 1, 5, decimal, 29, SCANPARMS( "%hu", &i ) ); - CHECK_EQUAL( i, 32767 ); - } - { - // reading +32767, u - unsigned short i = -1; - TESTSCAN( 1, 6, decimal, 28, SCANPARMS( "%hu", &i ) ); - CHECK_EQUAL( i, 32767 ); - } - { - // reading 65535, u - unsigned short i = 0; - TESTSCAN( 1, 5, decimal, 36, SCANPARMS( "%hu", &i ) ); - CHECK_EQUAL( i, 65535 ); - } - { - // reading +65535, u - unsigned short i = 0; - TESTSCAN( 1, 6, decimal, 35, SCANPARMS( "%hu", &i ) ); - CHECK_EQUAL( i, 65535 ); - } - { - // reading 0, i - signed short i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, i - signed short i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, i - signed short i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -32768, i - signed short i = -1; - TESTSCAN( 1, 6, decimal, 21, SCANPARMS( "%hi", &i ) ); - CHECK_EQUAL( i, -32768 ); - } - { - // reading 32767, i - signed short i = -1; - TESTSCAN( 1, 5, decimal, 29, SCANPARMS( "%hi", &i ) ); - CHECK_EQUAL( i, 32767 ); - } - { - // reading +32767, i - signed short i = -1; - TESTSCAN( 1, 6, decimal, 28, SCANPARMS( "%hi", &i ) ); - CHECK_EQUAL( i, 32767 ); - } - { - // reading 0, d - signed int i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, d - signed int i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, d - signed int i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -2147483648, d - signed int i = -1; - TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, -2147483648 ); - } - { - // reading 2147483647, d - signed int i = -1; - TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 2147483647 ); - } - { - // reading +2147483647, d - signed int i = -1; - TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%d", &i ) ); - CHECK_EQUAL( i, 2147483647 ); - } - { - // reading 0, u - unsigned int i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%u", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, u - unsigned int i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%u", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, u - unsigned int i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%u", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 2147483647, u - unsigned int i = -1; - TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%u", &i ) ); - CHECK_EQUAL( i, 2147483647 ); - } - { - // reading +2147483647, u - unsigned int i = -1; - TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%u", &i ) ); - CHECK_EQUAL( i, 2147483647 ); - } - { - // reading 4294967295, u - unsigned int i = 0; - TESTSCAN( 1, 10, decimal, 67, SCANPARMS( "%u", &i ) ); - CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" ); - } - { - // reading +4294967295, u - unsigned int i = 0; - TESTSCAN( 1, 11, decimal, 66, SCANPARMS( "%u", &i ) ); - CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" ); - } - { - // reading 0, i - signed int i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%i", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0, i - signed int i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%i", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading +0, i - signed int i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%i", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -2147483648, i - signed int i = -1; - TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%i", &i ) ); - CHECK_EQUAL( i, -2147483648 ); - } - { - // reading 2147483647, i - signed int i = -1; - TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%i", &i ) ); - CHECK_EQUAL( i, 2147483647 ); - } - { - // reading +2147483647, i - signed int i = -1; - TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%i", &i ) ); - CHECK_EQUAL( i, 2147483647 ); - } - { - // reading 0, d - signed long i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%ld", &i ) ); - CHECK_EQUAL( i, 0l ); - } - { - // reading -0, d - signed long i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%ld", &i ) ); - CHECK_EQUAL( i, 0l ); - } - { - // reading +0, d - signed long i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%ld", &i ) ); - CHECK_EQUAL( i, 0l ); - } - { - // reading -2147483648, d - signed long i = -1; - TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%ld", &i ) ); - CHECK_EQUAL( i, -2147483648l ); - } - { - // reading 2147483647, d - signed long i = -1; - TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%ld", &i ) ); - CHECK_EQUAL( i, 2147483647l ); - } - { - // reading +2147483647, d - signed long i = -1; - TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%ld", &i ) ); - CHECK_EQUAL( i, 2147483647l ); - } - { - // reading 0, u - unsigned long i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%lu", &i ) ); - CHECK_EQUAL( i, 0ul ); - } - { - // reading -0, u - unsigned long i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%lu", &i ) ); - CHECK_EQUAL( i, 0ul ); - } - { - // reading +0, u - unsigned long i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%lu", &i ) ); - CHECK_EQUAL( i, 0ul ); - } - { - // reading 2147483647, u - unsigned long i = -1; - TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%lu", &i ) ); - CHECK_EQUAL( i, 2147483647ul ); - } - { - // reading +2147483647, u - unsigned long i = -1; - TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%lu", &i ) ); - CHECK_EQUAL( i, 2147483647ul ); - } - { - // reading 4294967295, u - unsigned long i = 0; - TESTSCAN( 1, 10, decimal, 67, SCANPARMS( "%lu", &i ) ); - CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" ); - } - { - // reading +4294967295, u - unsigned long i = 0; - TESTSCAN( 1, 11, decimal, 66, SCANPARMS( "%lu", &i ) ); - CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" ); - } - { - // reading 0, i - signed long i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%li", &i ) ); - CHECK_EQUAL( i, 0l ); - } - { - // reading -0, i - signed long i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%li", &i ) ); - CHECK_EQUAL( i, 0l ); - } - { - // reading +0, i - signed long i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%li", &i ) ); - CHECK_EQUAL( i, 0l ); - } - { - // reading -2147483648, i - signed long i = -1; - TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%li", &i ) ); - CHECK_EQUAL( i, -2147483648l ); - } - { - // reading 2147483647, i - signed long i = -1; - TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%li", &i ) ); - CHECK_EQUAL( i, 2147483647l ); - } - { - // reading +2147483647, i - signed long i = -1; - TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%li", &i ) ); - CHECK_EQUAL( i, 2147483647l ); - } - { - // reading 0, d - signed long long i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%lld", &i ) ); - CHECK_EQUAL( i, 0ll ); - } - { - // reading -0, d - signed long long i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%lld", &i ) ); - CHECK_EQUAL( i, 0ll ); - } - { - // reading +0, d - signed long long i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%lld", &i ) ); - CHECK_EQUAL( i, 0ll ); - } - { - // reading -9223372036854775808, d - signed long long i = -1; - TESTSCAN( 1, 20, decimal, 78, SCANPARMS( "%lli", &i ) ); - CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks. - CHECK_EQUAL( i < 0ll, 1 ); - } - { - // reading +9223372036854775807, d - signed long long i = -1; - TESTSCAN( 1, 20, decimal, 99, SCANPARMS( "%lld", &i ) ); - CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lld" ); - } - { - // reading 0, u - unsigned long long i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%llu", &i ) ); - CHECK_EQUAL( i, 0ull ); - } - { - // reading -0, u - unsigned long long i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%llu", &i ) ); - CHECK_EQUAL( i, 0ull ); - } - { - // reading +0, u - unsigned long long i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%llu", &i ) ); - CHECK_EQUAL( i, 0ull ); - } - { - // reading 9223372036854775807, u - unsigned long long i = -1; - TESTSCAN( 1, 19, decimal, 100, SCANPARMS( "%llu", &i ) ); - CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" ); - } - { - // reading +9223372036854775807, u - unsigned long long i = -1; - TESTSCAN( 1, 20, decimal, 99, SCANPARMS( "%llu", &i ) ); - CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" ); - } - { - // reading 18446744073709551615, u - unsigned long long i = 0; - TESTSCAN( 1, 20, decimal, 121, SCANPARMS( "%llu", &i ) ); - CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" ); - } - { - // reading +18446744073709551615, u - unsigned long long i = 0; - TESTSCAN( 1, 21, decimal, 120, SCANPARMS( "%llu", &i ) ); - CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" ); - } - { - // reading 0, i - signed long long i = -1; - TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%lli", &i ) ); - CHECK_EQUAL( i, 0ll ); - } - { - // reading -0, i - signed long long i = -1; - TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%lli", &i ) ); - CHECK_EQUAL( i, 0ll ); - } - { - // reading +0, i - signed long long i = -1; - TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%lli", &i ) ); - CHECK_EQUAL( i, 0ll ); - } - { - // reading -9223372036854775808, i - signed long long i = -1; - TESTSCAN( 1, 20, decimal, 78, SCANPARMS( "%lli", &i ) ); - CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks. - CHECK_EQUAL( i < 0ll, 1 ); - } - { - // reading 9223372036854775807, i - signed long long i = -1; - TESTSCAN( 1, 19, decimal, 100, SCANPARMS( "%lli", &i ) ); - CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" ); - } - { - // reading +9223372036854775807, i - signed long long i = -1; - TESTSCAN( 1, 20, decimal, 99, SCANPARMS( "%lli", &i ) ); - CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" ); - } - - // hexadecimal integer matches - { - // reading 0, x - unsigned char i = -1; - TESTSCAN( 1, 1, hexadecimal, 3, SCANPARMS( "%hhx", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0x0, x - unsigned char i = -1; - TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hhx", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 0x000, x - unsigned char i = -1; - TESTSCAN( 1, 6, hexadecimal, 5, SCANPARMS( "%hhx", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 0x0, i - signed char i = -1; - TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 7f, x - unsigned char i = -1; - TESTSCAN( 1, 2, hexadecimal, 15, SCANPARMS( "%hhx", &i ) ); - CHECK_EQUAL( i, 127 ); - } - { - // reading -0x7f, x - unsigned char i = -1; - TESTSCAN( 1, 5, hexadecimal, 12, SCANPARMS( "%hhx", &i ) ); - CHECK_FEQUAL( i, -127, unsigned char, "%hhu" ); - } - { - // reading -0x80, i - signed char i = -1; - TESTSCAN( 1, 5, hexadecimal, 18, SCANPARMS( "%hhi", &i ) ); - CHECK_FEQUAL( i, -128, signed char, "%hhd" ); - } - { - // reading ff, x - unsigned char i = -1; - TESTSCAN( 1, 2, hexadecimal, 26, SCANPARMS( "%hhx", &i ) ); - CHECK_EQUAL( i, 0xff ); - } - { - // reading 0xff, x - unsigned char i = -1; - TESTSCAN( 1, 4, hexadecimal, 24, SCANPARMS( "%hhx", &i ) ); - CHECK_EQUAL( i, 255 ); - } - { - // reading 0xff, i - signed char i = 0; - TESTSCAN( 1, 4, hexadecimal, 24, SCANPARMS( "%hhi", &i ) ); - CHECK_EQUAL( i, -1 ); - } - { - // reading 0, x - unsigned short i = -1; - TESTSCAN( 1, 1, hexadecimal, 3, SCANPARMS( "%hx", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0x0, x - unsigned short i = -1; - TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hx", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 0x000, x - unsigned short i = -1; - TESTSCAN( 1, 6, hexadecimal, 5, SCANPARMS( "%hx", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 0x0, i - signed short i = -1; - TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hi", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 7fff, x - unsigned short i = -1; - TESTSCAN( 1, 4, hexadecimal, 32, SCANPARMS( "%hx", &i ) ); - CHECK_EQUAL( i, 32767 ); - } - { - // reading -0x7fff, x - unsigned short i = -1; - TESTSCAN( 1, 7, hexadecimal, 29, SCANPARMS( "%hx", &i ) ); - CHECK_FEQUAL( i, -32767, unsigned short, "%hu" ); - } - { - // reading -0x8000, i - signed short i = -1; - TESTSCAN( 1, 7, hexadecimal, 37, SCANPARMS( "%hi", &i ) ); - CHECK_FEQUAL( i, -32768, signed short, "%hd" ); - } - { - // reading ffff, x - unsigned short i = -1; - TESTSCAN( 1, 4, hexadecimal, 47, SCANPARMS( "%hx", &i ) ); - CHECK_EQUAL( i, 65535 ); - } - { - // reading 0xffff, x - unsigned short i = -1; - TESTSCAN( 1, 6, hexadecimal, 45, SCANPARMS( "%hx", &i ) ); - CHECK_EQUAL( i, 65535 ); - } - { - // reading 0xffff, i - signed short i = 0; - TESTSCAN( 1, 6, hexadecimal, 45, SCANPARMS( "%hi", &i ) ); - CHECK_FEQUAL( i, -1, signed short, "%hd" ); - } - { - // reading 0, x - unsigned int i = -1; - TESTSCAN( 1, 1, hexadecimal, 3, SCANPARMS( "%x", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading -0x0, x - unsigned int i = -1; - TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%x", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 0x000, x - unsigned int i = -1; - TESTSCAN( 1, 6, hexadecimal, 5, SCANPARMS( "%x", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 0x0, i - signed int i = -1; - TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%i", &i ) ); - CHECK_EQUAL( i, 0 ); - } - { - // reading 7fffffff, x - unsigned int i = -1; - TESTSCAN( 1, 8, hexadecimal, 55, SCANPARMS( "%x", &i ) ); - CHECK_EQUAL( i, 2147483647 ); - } - { - // reading -0x7fffffff, x - unsigned int i = -1; - TESTSCAN( 1, 11, hexadecimal, 52, SCANPARMS( "%x", &i ) ); - CHECK_FEQUAL( i, -2147483647, unsigned int, "%u" ); - } - { - // reading -0x80000000, i - signed int i = -1; - TESTSCAN( 1, 11, hexadecimal, 64, SCANPARMS( "%i", &i ) ); - CHECK_FEQUAL( i, -2147483648, signed int, "%d" ); /* FIXME */ - } - { - // reading ffffffff, x - unsigned int i = -1; - TESTSCAN( 1, 8, hexadecimal, 78, SCANPARMS( "%x", &i ) ); - CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" ); - } - { - // reading 0xffffffff, x - unsigned int i = -1; - TESTSCAN( 1, 10, hexadecimal, 76, SCANPARMS( "%x", &i ) ); - CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" ); - } - - // octal integer matches - { - // reading 0, o - unsigned char i = -1; - TESTSCAN( 1, 1, octal, 4, SCANPARMS( "%hho", &i ) ); - CHECK_EQUAL( i, 0u ); - } - { - // reading +0000, o - unsigned char i = -1; - TESTSCAN( 1, 5, octal, 0, SCANPARMS( "%hho", &i ) ); - CHECK_EQUAL( i, 0u ); - } - { - // reading -0000, o - unsigned char i = -1; - TESTSCAN( 1, 5, octal, 6, SCANPARMS( "%hho", &i ) ); - CHECK_EQUAL( i, 0u ); - } - { - // reading 0177, o - unsigned char i = -1; - TESTSCAN( 1, 4, octal, 13, SCANPARMS( "%hho", &i ) ); - CHECK_EQUAL( i, 127u ); - } - { - // reading +0177, o - unsigned char i = -1; - TESTSCAN( 1, 5, octal, 12, SCANPARMS( "%hho", &i ) ); - CHECK_EQUAL( i, 127u ); - } - { - // reading 0377, o - unsigned char i = -1; - TESTSCAN( 1, 4, octal, 19, SCANPARMS( "%hho", &i ) ); - CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" ); - } - { - // reading +0377, o - unsigned char i = -1; - TESTSCAN( 1, 5, octal, 18, SCANPARMS( "%hho", &i ) ); - CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" ); - } - { - // reading -0377, o - unsigned char i = -1; - TESTSCAN( 1, 5, octal, 24, SCANPARMS( "%hho", &i ) ); - CHECK_FEQUAL( i, 1u, unsigned char, "%hhu" ); - } - { - // reading 077777, o - unsigned short i = -1; - TESTSCAN( 1, 6, octal, 31, SCANPARMS( "%ho", &i ) ); - CHECK_EQUAL( i, 32767u ); - } - { - // reading +077777, o - unsigned short i = -1; - TESTSCAN( 1, 7, octal, 30, SCANPARMS( "%ho", &i ) ); - CHECK_EQUAL( i, 32767u ); - } - { - // reading 0177777, o - unsigned short i = -1; - TESTSCAN( 1, 7, octal, 39, SCANPARMS( "%ho", &i ) ); - CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" ); - } - { - // reading +0177777, o - unsigned short i = -1; - TESTSCAN( 1, 8, octal, 38, SCANPARMS( "%ho", &i ) ); - CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" ); - } - { - // reading -0177777, o - unsigned short i = -1; - TESTSCAN( 1, 8, octal, 47, SCANPARMS( "%ho", &i ) ); - CHECK_FEQUAL( i, 1u, unsigned short, "%hu" ); - } - { - // reading 017777777777, o - unsigned int i = -1; - TESTSCAN( 1, 12, octal, 57, SCANPARMS( "%o", &i ) ); - CHECK_EQUAL( i, 2147483647u ); - } - { - // reading +017777777777, o - unsigned int i = -1; - TESTSCAN( 1, 13, octal, 56, SCANPARMS( "%o", &i ) ); - CHECK_EQUAL( i, 2147483647u ); - } - { - // reading 037777777777, o - unsigned int i = -1; - TESTSCAN( 1, 12, octal, 71, SCANPARMS( "%o", &i ) ); - CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" ); - } - { - // reading +037777777777, o - unsigned int i = -1; - TESTSCAN( 1, 13, octal, 70, SCANPARMS( "%o", &i ) ); - CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" ); - } - { - // reading -037777777777, o - unsigned int i = -1; - TESTSCAN( 1, 13, octal, 84, SCANPARMS( "%o", &i ) ); - CHECK_FEQUAL( i, 1u, unsigned int, "%u" ); - } - { - // reading 017777777777, o - unsigned long i = -1; - TESTSCAN( 1, 12, octal, 57, SCANPARMS( "%lo", &i ) ); - CHECK_EQUAL( i, 2147483647lu ); - } - { - // reading +017777777777, o - unsigned long i = -1; - TESTSCAN( 1, 13, octal, 56, SCANPARMS( "%lo", &i ) ); - CHECK_EQUAL( i, 2147483647lu ); - } - { - // reading 037777777777, o - unsigned long i = -1; - TESTSCAN( 1, 12, octal, 71, SCANPARMS( "%lo", &i ) ); - CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" ); - } - { - // reading +037777777777, o - unsigned long i = -1; - TESTSCAN( 1, 13, octal, 70, SCANPARMS( "%lo", &i ) ); - CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" ); - } - { - // reading -037777777777, o - unsigned long i = -1; - TESTSCAN( 1, 13, octal, 84, SCANPARMS( "%lo", &i ) ); - CHECK_FEQUAL( i, 1lu, unsigned long, "%lu" ); - } - { - // reading 0777777777777777777777, o - unsigned long long i = -1; - TESTSCAN( 1, 22, octal, 99, SCANPARMS( "%llo", &i ) ); - CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" ); - } - { - // reading +0777777777777777777777, o - unsigned long long i = -1; - TESTSCAN( 1, 23, octal, 98, SCANPARMS( "%llo", &i ) ); - CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" ); - } - { - // reading 01777777777777777777777, o - unsigned long long i = -1; - TESTSCAN( 1, 23, octal, 123, SCANPARMS( "%llo", &i ) ); - CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" ); - } - { - // reading +01777777777777777777777, o - unsigned long long i = -1; - TESTSCAN( 1, 24, octal, 122, SCANPARMS( "%llo", &i ) ); - CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" ); - } - { - // reading -01777777777777777777777, o - unsigned long long i = -1; - TESTSCAN( 1, 24, octal, 147, SCANPARMS( "%llo", &i ) ); - CHECK_FEQUAL( i, 1llu, unsigned long long, "%llu" ); - } - - // string matches - size_t const BUFSIZE = 1000; - char buffer[BUFSIZE]; - { - // reading abc - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 1, 3, alpha, 0, SCANPARMS( "%[abc]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "abc", 4 ) ); - } - { - // reading a-c - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 1, 3, alpha, 0, SCANPARMS( "%[a-c]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "abc", 4 ) ); - } - { - // reading a-h - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 1, 8, alpha, 0, SCANPARMS( "%[a-h]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "abcdefgh", 9 ) ); - } - { - // reading o-r, including [, seperate char - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 1, 5, alpha, 15, SCANPARMS( "%[[o-qr]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "op[qr", 6 ) ); - } - { - // reading v-y, including ], two groups - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 1, 5, alpha, 23, SCANPARMS( "%[]v-wx-y]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "vw]xy", 6 ) ); - } - { - // missing on first character - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 0, -1, alpha, 0, SCANPARMS( "%[b]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "", 1 ) ); - } - { - // eof while reading, two groups - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 1, 2, alpha, 27, SCANPARMS( "%[a-zA-Z]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "yz", 3 ) ); - } - { - // eof before reading - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( -1, -1, alpha, 29, SCANPARMS( "%[a-z]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "", 1 ) ); - } - { - // negation - [^...] - memset( buffer, '\0', BUFSIZE ); - TESTSCAN( 1, 3, alpha, 0, SCANPARMS( "%[^d-f]", buffer ) ); - CHECK_FALSE( memcmp( buffer, "abc", 4 ) ); - } - -#ifndef REGTEST - // special bordercase - /* Most existing libraries disagree with this test case, so a little - explanation of why PDCLib chose the implementation it did might be - necessary. All references are from ISO/IEC 9899:1999 "Programming - languages - C". Wording critical to the explanation is in UPPERCASE. - Input stream holds "-0xz". - 6.4.4.1 Integer constants - states that '0' is a valid (hexa)decimal - constant, whereas '0x' IS NOT. - 7.19.6.2 The fscanf function - states... - ...in paragraph 9 that "an INPUT ITEM is defined as the longest - sequence of input characters [...] which is, OR IS A PREFIX OF, - a matching input sequence". - ...in paragraph 10 that "if the INPUT ITEM is not a matching - sequence, the execution of THE DIRECTIVE FAILS; this condition - is a matching failure". - ...in footnote 242) that "fscanf pushes back AT MOST ONE input - character onto the input stream." - ...in paragraph 12 that either of the conversion specifiers d, i, - o, u, or x "matches an [...] integer whose format is the same as - expected for THE SUBJECT SEQUENCE of the [strtol|strtoul] - function". - 7.20.1.4 The strtol, strtoll, strtoul, and strtoull functions - states - in paragraph 3 that "the EXPECTED FORM OF THE SUBJECT SEQUENCE is - that of an integer constant AS DESCRIBED IN 6.4.4.1". - These parts of the standard result in the following reasoning: - - The longest sequence of input characters which is a prefix of a - matching input sequence is "-0x" (negative sign, hexadecimal-prefix). - The 'z' is the first character remaining unread as "-0xz" is not a - (prefix of a) matching input sequence. This is according to 7.19.6.2 - paragraph 9. - - "0x", without a valid hexadecimal digit following it, is not a valid - integer constant according to 6.4.4.1. - - "0x" is thus also not of the expected form for a strto[u]l subject - sequence according to 7.20.1.4 paragraph 3. (strto[u]l() would parse - it as zero, but leave the "x" in the final string, i.e. outside the - subject sequence.) - - "0x" is therefore also not a matching sequence to the i or x - conversion specifier according to 7.19.6.2 paragraph 12. - - The conversion should therefore result in a matching failure - according to 7.19.6.2 paragraph 10. - */ - { - // reading -0x, x - unsigned char i = 1; - TESTSCAN( 0, -1, special, 0, SCANPARMS( "%hhx", &i ) ); - CHECK_EQUAL( i, 1 ); /* FIXME */ - } - { - // reading -0x, x - unsigned short i = 1; - TESTSCAN( 0, -1, special, 0, SCANPARMS( "%hx", &i ) ); - CHECK_EQUAL( i, 1 ); /* FIXME */ - } - { - // reading -0x, x - unsigned int i = 1; - TESTSCAN( 0, -1, special, 0, SCANPARMS( "%x", &i ) ); - CHECK_EQUAL( i, 1 ); /* FIXME */ - } -#endif diff --git a/functions/stdio/sscan_sources.incl b/functions/stdio/sscan_sources.incl deleted file mode 100644 index 78063a9..0000000 --- a/functions/stdio/sscan_sources.incl +++ /dev/null @@ -1,43 +0,0 @@ - char const * general = "12345678901\0003-5+7\0009\3772 4 6 8 0\3771 \011 5%% 0"; - char const * decimal = "-0 +0 -128 +127 +255 -32768 +32767 +65535\n" - "-2147483648 +2147483647 +4294967295\n" - "-9223372036854775808 +9223372036854775807\n" - "+18446744073709551615\n"; - char const * hexadecimal = "-0x0 -0x000 -0x7f -0x80 0xff -0x7fff -0x8000\n" - "0xffff -0x7fffffff -0x80000000 0xffffffff\n" - "-0x7fffffffffffffff -0x8000000000000000\n" - "0xffffffffffffffff\n"; - char const * octal = "+0000 -0000 +0177 +0377 -0377 +077777 +0177777\n" - "-0177777 +017777777777 +037777777777\n" - "-037777777777 +0777777777777777777777\n" - "+01777777777777777777777\n" - "-01777777777777777777777\n"; - char const * alpha = "abcdefgh-ijklmnop[qrs%uvw]xyz"; -#ifndef REGTEST - char const * special = "-0xz\n"; -#endif - - -/* sscan */ -#define TESTSCAN( result, count, source, offset, ... ) \ - do \ - { \ - int n = -1; \ - int res = SCANFUNC( source + offset, __VA_ARGS__ ); \ - if ( res != result ) \ - { \ - rc += 1; \ - printf( "FAILED: " __FILE__ ", line %d - expected result %d, got %d\n", __LINE__, result, res ); \ - } \ - if ( n != count ) \ - { \ - rc += 1; \ - printf( "FAILED: " __FILE__ ", line %d - expected count %d, got %d\n", __LINE__, count, n ); \ - } \ - } while ( 0 ) - -#define SCAN( format ) format "%n", &n -#define SCANPARMS( format, ... ) format "%n", __VA_ARGS__, &n - -#define _PDCLIB_SSCAN - diff --git a/internals/_PDCLIB_test.h b/internals/_PDCLIB_test.h deleted file mode 100644 index ad02b0f..0000000 --- a/internals/_PDCLIB_test.h +++ /dev/null @@ -1,33 +0,0 @@ -/* $Id$ */ - -/* PDCLib testing suite <_PDCLIB_test.h> - - This file is part of the Public Domain C Library (PDCLib). - Permission is granted to use, modify, and / or redistribute at will. -*/ - -/* -------------------------------------------------------------------------- */ -/* Helper macros for test drivers */ -/* -------------------------------------------------------------------------- */ - -#include - -char const abcde[] = "abcde"; -char const abcdx[] = "abcdx"; -char const * teststring = "1234567890\nABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz\n"; - -int NO_TESTDRIVER = 0; - -static int rc = 0; - -#define TESTCASE( x ) if ( x ) {} \ - else { rc += 1; printf( "FAILED: " __FILE__ ", line %d - %s\n", __LINE__, #x ); } - -#ifndef REGTEST -#define TESTCASE_NOREG( x ) TESTCASE( x ) -#else -#define TESTCASE_NOREG( x ) -#endif - -#define TEST_RESULTS rc - diff --git a/testing/_PDCLIB_test.h b/testing/_PDCLIB_test.h new file mode 100644 index 0000000..ad02b0f --- /dev/null +++ b/testing/_PDCLIB_test.h @@ -0,0 +1,33 @@ +/* $Id$ */ + +/* PDCLib testing suite <_PDCLIB_test.h> + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* -------------------------------------------------------------------------- */ +/* Helper macros for test drivers */ +/* -------------------------------------------------------------------------- */ + +#include + +char const abcde[] = "abcde"; +char const abcdx[] = "abcdx"; +char const * teststring = "1234567890\nABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz\n"; + +int NO_TESTDRIVER = 0; + +static int rc = 0; + +#define TESTCASE( x ) if ( x ) {} \ + else { rc += 1; printf( "FAILED: " __FILE__ ", line %d - %s\n", __LINE__, #x ); } + +#ifndef REGTEST +#define TESTCASE_NOREG( x ) TESTCASE( x ) +#else +#define TESTCASE_NOREG( x ) +#endif + +#define TEST_RESULTS rc + diff --git a/testing/fprintf_reftest.incl b/testing/fprintf_reftest.incl new file mode 100644 index 0000000..05c74c2 --- /dev/null +++ b/testing/fprintf_reftest.incl @@ -0,0 +1,13 @@ + { + char readbuffer[2000]; + char refbuffer[2000]; + size_t readcounter; + TESTCASE( ( buffer = fopen( "testfile", "r" ) ) != NULL ); + readcounter = fread( readbuffer, 1, 2000, buffer ); + TESTCASE( fclose( buffer ) == 0 ); + TESTCASE( ( buffer = fopen( "testing/printf_reference.txt", "r" ) ) != NULL ); + TESTCASE( fread( refbuffer, 1, 2000, buffer ) == readcounter ); + TESTCASE( fclose( buffer ) == 0 ); + TESTCASE( memcmp( readbuffer, refbuffer, readcounter ) == 0 ); + TESTCASE( remove( "testfile" ) == 0 ); + } diff --git a/testing/fscan_sources.incl b/testing/fscan_sources.incl new file mode 100644 index 0000000..a7dc18b --- /dev/null +++ b/testing/fscan_sources.incl @@ -0,0 +1,67 @@ + FILE * general = fopen( "testing/scanf_testdata_general", "wb+" ); + TESTCASE( general != NULL ); + TESTCASE( fwrite( "12345678901\0003-5+7\0009\3772 4 6 8 0\3771 \011 5%% 0", 1, 40, general ) == 40 ); + rewind( general ); + + FILE * decimal = fopen( "testing/scanf_testdata_decimal", "wb+" ); + TESTCASE( decimal != NULL ); + TESTCASE( fwrite( "-0 +0 -128 +127 +255 -32768 +32767 +65535\n" + "-2147483648 +2147483647 +4294967295\n" + "-9223372036854775808 +9223372036854775807\n" + "+18446744073709551615\n", 1, 142, decimal ) == 142 ); + rewind( decimal ); + + FILE * hexadecimal = fopen( "testing/scanf_testdata_hexadecimal", "wb+" ); + TESTCASE( hexadecimal != NULL ); + TESTCASE( fwrite( "-0x0 -0x000 -0x7f -0x80 0xff -0x7fff -0x8000\n" + "0xffff -0x7fffffff -0x80000000 0xffffffff\n" + "-0x7fffffffffffffff -0x8000000000000000\n" + "0xffffffffffffffff\n", 1, 146, hexadecimal ) == 146 ); + rewind( hexadecimal ); + + FILE * octal = fopen( "testing/scanf_testdata_octal", "wb+" ); + TESTCASE( octal != NULL ); + TESTCASE( fwrite( "+0000 -0000 +0177 +0377 -0377 +077777 +0177777\n" + "-0177777 +017777777777 +037777777777\n" + "-037777777777 +0777777777777777777777\n" + "+01777777777777777777777\n" + "-01777777777777777777777\n", 1, 172, octal ) == 172 ); + rewind( octal ); + + FILE * alpha = fopen( "testing/scanf_testdata_alpha", "wb+" ); + TESTCASE( alpha != NULL ); + TESTCASE( fwrite( "abcdefgh-ijklmnop[qrs%uvw]xyz", 1, 29, alpha ) == 29 ); + rewind( alpha ); + +#ifndef REGTEST + FILE * special = fopen( "testing/scanf_testdata_special", "wb+" ); + TESTCASE( special != NULL ); + TESTCASE( fwrite( "-0xz\n", 1, 5, special ) == 5 ); + rewind( special ); +#endif + + +/* fscan */ +#define TESTSCAN( result, count, source, offset, ... ) \ + do \ + { \ + int n = -1; \ + TESTCASE( fseek( source, offset, SEEK_SET ) == 0 ); \ + int res = SCANFUNC( source, __VA_ARGS__ ); \ + if ( res != result ) \ + { \ + rc += 1; \ + printf( "FAILED: " __FILE__ ", line %d - expected result %d, got %d\n", __LINE__, result, res ); \ + } \ + if ( n != count ) \ + { \ + rc += 1; \ + printf( "FAILED: " __FILE__ ", line %d - expected count %d, got %d\n", __LINE__, count, n ); \ + } \ + } while ( 0 ) + +#define SCAN( format ) format "%n", &n +#define SCANPARMS( format, ... ) format "%n", __VA_ARGS__, &n + +#define _PDCLIB_FSCAN + diff --git a/testing/printf_reference.txt b/testing/printf_reference.txt new file mode 100644 index 0000000..c3e1d86 --- /dev/null +++ b/testing/printf_reference.txt @@ -0,0 +1 @@ +-1281270-32768327670-214748364821474836470-922337203685477580892233720368547758070-92233720368547758089223372036854775807025525565535655354294967295429496729518446744073709551615184467440737095516151844674407370955161518446744073709551615FFFFFFFF0XFFFFFFFFffffffff0xffffffff37777777777037777777777%.0#o-2147483648+2147483647+042949672954294967295-2147483648 2147483647 042949672954294967295-21474836482147483647-21474836482147483647-2147483648 2147483647 -2147483648 2147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 -21474836482147483647-21474836482147483647-214748364802147483647-02147483648002147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 00000000002147483647ffffffff0xffffffff0xffffffff-2147483648-2147483648-21474836480xffffffff0xffffffff0xffffffff214748364721474836472147483647+2147483647+2147483647+2147483647+2147483647+2147483647+2147483647- 2147483647- 2147483647 % -2147483648xabcdef0xdeadbeef123456789 \ No newline at end of file diff --git a/testing/printf_testcases.incl b/testing/printf_testcases.incl new file mode 100644 index 0000000..a421ca6 --- /dev/null +++ b/testing/printf_testcases.incl @@ -0,0 +1,249 @@ + { + +#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 >> 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 >> 63 == 1 +#define _PDCLIB_UINT_DIG 20 +#define _PDCLIB_INT_DIG 19 +#define _PDCLIB_INT_HEXDIG FFFFFFFFFFFFFFFF +#define _PDCLIB_INT_hexdig ffffffffffffffff +#define _PDCLIB_INT_OCTDIG 1777777777777777777777 +#else +#error Unsupported width of 'int' (neither 16, 32, nor 64 bit). +#endif + +#if ULONG_MAX >> 31 == 1 +#define _PDCLIB_ULONG_DIG 10 +#define _PDCLIB_LONG_DIG 10 +#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 >> 63 == 1 +#define _PDCLIB_ULLONG_DIG 20 +#define _PDCLIB_LLONG_DIG 19 +#elif ULLONG_MAX >> 127 == 1 +#define _PDCLIB_ULLONG_DIG 38 +#define _PDCLIB_LLONG_DIG 38 +#else +#error Unsupported width of 'long long' (neither 64 nor 128 bit). +#endif + + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + //TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + //TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == _PDCLIB_INT_DIG + 1 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == _PDCLIB_INT_DIG ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == _PDCLIB_LONG_DIG + 1 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == _PDCLIB_LONG_DIG ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == _PDCLIB_LLONG_DIG + 1 ); + //TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == _PDCLIB_LLONG_DIG ); + //TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == _PDCLIB_UINT_DIG ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == _PDCLIB_UINT_DIG ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == _PDCLIB_ULONG_DIG ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == _PDCLIB_ULONG_DIG ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + //TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + //TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + //TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + //TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + //TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + //TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + //TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); /* FIXME */ + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + //TESTCASE( strcmp( buffer, "123456789" ) == 0 ); /* FIXME */ + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + } diff --git a/testing/scan_test.h b/testing/scan_test.h new file mode 100644 index 0000000..9eae7c8 --- /dev/null +++ b/testing/scan_test.h @@ -0,0 +1,16 @@ +/* $Id$ */ + +/* scan test header + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#define CHECK_TRUE( a ) TESTCASE( a != 0 ) +#define CHECK_FALSE( a ) TESTCASE( a == 0 ) +#define CHECK_EQUAL( a, b ) do { int x = a; int y = b; TESTCASE( x == y ); } while ( 0 ) +#define CHECK_FEQUAL( a, b, T, F ) do { T x = a; T y = b; TESTCASE( x == y ); } while ( 0 ) + diff --git a/testing/scanf_testcases.incl b/testing/scanf_testcases.incl new file mode 100644 index 0000000..a32d0ca --- /dev/null +++ b/testing/scanf_testcases.incl @@ -0,0 +1,1181 @@ + // ----------------------------------------------------------------------- + // Literal matching + // ----------------------------------------------------------------------- + { + // matching six characters literally + // should report six characters read + TESTSCAN( 0, 6, general, 0, SCAN( "123456" ) ); + } + { + // matching a character, three whitespace chars, and another character + // should report five characters read + TESTSCAN( 0, 5, general, 30, SCAN( "1 5" ) ); + } + { + // matching three characters, not matching whitespaces, and matching another three characters + // should report six characters matched + TESTSCAN( 0, 6, general, 0, SCAN( "123 456" ) ); + } + { + // matching a character, two '%' characters, and two whitespaces + // should report five characters matched + TESTSCAN( 0, 5, general, 34, SCAN( "5%%%% " ) ); + } + { + // seeking to last character in file, trying to match that char and a whitespace + // should report one character matched and EOF + TESTSCAN( 0, 1, general, 39, SCAN( "0 " ) ); + } + { + // seeking to end of file, trying to match a -1 + // should report error, not executing %n + TESTSCAN( -1, -1, general, 40, SCAN( "\377" ) ); /* FIXME */ + } + + // ----------------------------------------------------------------------- + // Character matching ('%c') + // ----------------------------------------------------------------------- + { + // reading a char array of specified width, including zero bytes + // should report the characters read up to first zero + char buffer[ 8 ]; +#ifdef _PDCLIB_SSCAN + int count = 1; + char expected[] = "1\177\177\177\177\177\177\177"; +#else + int count = 7; + char expected[] = "1\0003-5+7"; +#endif + memset( buffer, '\177', 8 ); + TESTSCAN( 1, count, general, 10, SCANPARMS( "%7c", buffer ) ); + CHECK_FALSE( memcmp( buffer, expected, 7 ) ); + } + { + // reading a char array of unspecified width when positioned at -1 value + // should default to width one, read the -1 value, no zero termination of the array + char buffer[ 2 ]; + memset( buffer, '\177', 2 ); + TESTSCAN( 1, 1, general, 19, SCANPARMS( "%c", buffer ) ); + CHECK_FALSE( memcmp( buffer, "\377\177", 2 ) ); + } + { + // reading a char array of specified width 1 when positioned at (non-space) whitespace + // should read the whitespace (literally), no zero termination of the array + char buffer[ 2 ]; + memset( buffer, '\177', 2 ); + TESTSCAN( 1, 1, general, 32, SCANPARMS( "%1c", buffer ) ); + CHECK_FALSE( memcmp( buffer, "\011\177", 2 ) ); + } + { + // reading a char array of specified width 2 when positioned at last char of file + // should read the character, and report EOF + char buffer[ 2 ]; + memset( buffer, '\177', 2 ); + TESTSCAN( 1, 1, general, 39, SCANPARMS( "%2c", buffer ) ); + CHECK_FALSE( memcmp( buffer, "0\177", 2 ) ); + } + { + // reading a char array of specified width 1 when positioned at last char of file + // should read the character, and NOT report EOF + char buffer[ 2 ]; + memset( buffer, '\177', 2 ); + TESTSCAN( 1, 1, general, 39, SCANPARMS( "%1c", buffer ) ); + CHECK_FALSE( memcmp( buffer, "0\177", 2 ) ); + } + { + // reading a char array of specified width 1 when positioned at EOF + // should report input error before any conversion (-1) + char buffer[ 2 ]; + memset( buffer, '\177', 2 ); + TESTSCAN( -1, -1, general, 40, SCANPARMS( "%1c", buffer ) ); + CHECK_FALSE( memcmp( buffer, "\177\177", 2 ) ); + } + + // ----------------------------------------------------------------------- + // Integer matching ('%d') + // ----------------------------------------------------------------------- + { + // reading a whitespace-terminated integer + int i; + TESTSCAN( 1, 1, general, 20, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 2 ); + } + { + // reading a -1 terminated integer + int i; + TESTSCAN( 1, 1, general, 18, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 9 ); + } + { + // reading a EOF terminated integer + int i = -1; + TESTSCAN( 1, 1, general, 39, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // trying to read an integer when positioned at whitespace + // should skip whitespaces + int i = -1; + TESTSCAN( 1, 3, general, 32, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 5 ); + } + { + // trying to read an integer when positioned at -1 value + // should report matching failure + int i = 0; + TESTSCAN( 0, -1, general, 19, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // trying to read an integer when positioned at EOF + // should report reading failure + int i = 0; + TESTSCAN( -1, -1, general, 40, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading a '-'-prefixed integer + int i; + TESTSCAN( 1, 2, general, 13, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, -5 ); + } + { + // reading a '+'-prefixed integer + int i; + TESTSCAN( 1, 2, general, 15, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 7 ); + } + + // decimal integer matches + { + // reading 0, d + signed char i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hhd", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, d + signed char i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hhd", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, d + signed char i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hhd", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -128, d + signed char i = -1; + TESTSCAN( 1, 4, decimal, 6, SCANPARMS( "%hhd", &i ) ); + CHECK_EQUAL( i, -128 ); + } + { + // reading 127, d + signed char i = -1; + TESTSCAN( 1, 3, decimal, 12, SCANPARMS( "%hhd", &i ) ); + CHECK_EQUAL( i, 127 ); + } + { + // reading +127, d + signed char i = -1; + TESTSCAN( 1, 4, decimal, 11, SCANPARMS( "%hhd", &i ) ); + CHECK_EQUAL( i, 127 ); + } + { + // reading 0, u + unsigned char i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hhu", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, u + unsigned char i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hhu", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, u + unsigned char i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hhu", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 127, u + unsigned char i = -1; + TESTSCAN( 1, 3, decimal, 12, SCANPARMS( "%hhu", &i ) ); + CHECK_EQUAL( i, 127 ); + } + { + // reading +127, u + unsigned char i = -1; + TESTSCAN( 1, 4, decimal, 11, SCANPARMS( "%hhu", &i ) ); + CHECK_EQUAL( i, 127 ); + } + { + // reading 255, u + unsigned char i = 0; + TESTSCAN( 1, 3, decimal, 17, SCANPARMS( "%hhu", &i ) ); + CHECK_EQUAL( i, 255 ); + } + { + // reading +255, u + unsigned char i = 0; + TESTSCAN( 1, 4, decimal, 16, SCANPARMS( "%hhu", &i ) ); + CHECK_EQUAL( i, 255 ); + } + { + // reading 0, i + signed char i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, i + signed char i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, i + signed char i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -128, i + signed char i = -1; + TESTSCAN( 1, 4, decimal, 6, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, -128 ); + } + { + // reading 127, i + signed char i = -1; + TESTSCAN( 1, 3, decimal, 12, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, 127 ); + } + { + // reading +127, i + signed char i = -1; + TESTSCAN( 1, 4, decimal, 11, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, 127 ); + } + { + // reading 0, d + signed short i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hd", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, d + signed short i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hd", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, d + signed short i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hd", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -32768, d + signed short i = -1; + TESTSCAN( 1, 6, decimal, 21, SCANPARMS( "%hd", &i ) ); + CHECK_EQUAL( i, -32768 ); + } + { + // reading 32767, d + signed short i = -1; + TESTSCAN( 1, 5, decimal, 29, SCANPARMS( "%hd", &i ) ); + CHECK_EQUAL( i, 32767 ); + } + { + // reading +32767, d + signed short i = -1; + TESTSCAN( 1, 6, decimal, 28, SCANPARMS( "%hd", &i ) ); + CHECK_EQUAL( i, 32767 ); + } + { + // reading 0, u + unsigned short i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hu", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, u + unsigned short i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hu", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, u + unsigned short i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hu", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 32767, u + unsigned short i = -1; + TESTSCAN( 1, 5, decimal, 29, SCANPARMS( "%hu", &i ) ); + CHECK_EQUAL( i, 32767 ); + } + { + // reading +32767, u + unsigned short i = -1; + TESTSCAN( 1, 6, decimal, 28, SCANPARMS( "%hu", &i ) ); + CHECK_EQUAL( i, 32767 ); + } + { + // reading 65535, u + unsigned short i = 0; + TESTSCAN( 1, 5, decimal, 36, SCANPARMS( "%hu", &i ) ); + CHECK_EQUAL( i, 65535 ); + } + { + // reading +65535, u + unsigned short i = 0; + TESTSCAN( 1, 6, decimal, 35, SCANPARMS( "%hu", &i ) ); + CHECK_EQUAL( i, 65535 ); + } + { + // reading 0, i + signed short i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%hi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, i + signed short i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%hi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, i + signed short i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%hi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -32768, i + signed short i = -1; + TESTSCAN( 1, 6, decimal, 21, SCANPARMS( "%hi", &i ) ); + CHECK_EQUAL( i, -32768 ); + } + { + // reading 32767, i + signed short i = -1; + TESTSCAN( 1, 5, decimal, 29, SCANPARMS( "%hi", &i ) ); + CHECK_EQUAL( i, 32767 ); + } + { + // reading +32767, i + signed short i = -1; + TESTSCAN( 1, 6, decimal, 28, SCANPARMS( "%hi", &i ) ); + CHECK_EQUAL( i, 32767 ); + } + { + // reading 0, d + signed int i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, d + signed int i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, d + signed int i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -2147483648, d + signed int i = -1; + TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, -2147483648 ); + } + { + // reading 2147483647, d + signed int i = -1; + TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 2147483647 ); + } + { + // reading +2147483647, d + signed int i = -1; + TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%d", &i ) ); + CHECK_EQUAL( i, 2147483647 ); + } + { + // reading 0, u + unsigned int i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%u", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, u + unsigned int i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%u", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, u + unsigned int i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%u", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 2147483647, u + unsigned int i = -1; + TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%u", &i ) ); + CHECK_EQUAL( i, 2147483647 ); + } + { + // reading +2147483647, u + unsigned int i = -1; + TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%u", &i ) ); + CHECK_EQUAL( i, 2147483647 ); + } + { + // reading 4294967295, u + unsigned int i = 0; + TESTSCAN( 1, 10, decimal, 67, SCANPARMS( "%u", &i ) ); + CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" ); + } + { + // reading +4294967295, u + unsigned int i = 0; + TESTSCAN( 1, 11, decimal, 66, SCANPARMS( "%u", &i ) ); + CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" ); + } + { + // reading 0, i + signed int i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%i", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0, i + signed int i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%i", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading +0, i + signed int i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%i", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -2147483648, i + signed int i = -1; + TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%i", &i ) ); + CHECK_EQUAL( i, -2147483648 ); + } + { + // reading 2147483647, i + signed int i = -1; + TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%i", &i ) ); + CHECK_EQUAL( i, 2147483647 ); + } + { + // reading +2147483647, i + signed int i = -1; + TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%i", &i ) ); + CHECK_EQUAL( i, 2147483647 ); + } + { + // reading 0, d + signed long i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%ld", &i ) ); + CHECK_EQUAL( i, 0l ); + } + { + // reading -0, d + signed long i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%ld", &i ) ); + CHECK_EQUAL( i, 0l ); + } + { + // reading +0, d + signed long i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%ld", &i ) ); + CHECK_EQUAL( i, 0l ); + } + { + // reading -2147483648, d + signed long i = -1; + TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%ld", &i ) ); + CHECK_EQUAL( i, -2147483648l ); + } + { + // reading 2147483647, d + signed long i = -1; + TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%ld", &i ) ); + CHECK_EQUAL( i, 2147483647l ); + } + { + // reading +2147483647, d + signed long i = -1; + TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%ld", &i ) ); + CHECK_EQUAL( i, 2147483647l ); + } + { + // reading 0, u + unsigned long i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%lu", &i ) ); + CHECK_EQUAL( i, 0ul ); + } + { + // reading -0, u + unsigned long i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%lu", &i ) ); + CHECK_EQUAL( i, 0ul ); + } + { + // reading +0, u + unsigned long i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%lu", &i ) ); + CHECK_EQUAL( i, 0ul ); + } + { + // reading 2147483647, u + unsigned long i = -1; + TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%lu", &i ) ); + CHECK_EQUAL( i, 2147483647ul ); + } + { + // reading +2147483647, u + unsigned long i = -1; + TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%lu", &i ) ); + CHECK_EQUAL( i, 2147483647ul ); + } + { + // reading 4294967295, u + unsigned long i = 0; + TESTSCAN( 1, 10, decimal, 67, SCANPARMS( "%lu", &i ) ); + CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" ); + } + { + // reading +4294967295, u + unsigned long i = 0; + TESTSCAN( 1, 11, decimal, 66, SCANPARMS( "%lu", &i ) ); + CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" ); + } + { + // reading 0, i + signed long i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%li", &i ) ); + CHECK_EQUAL( i, 0l ); + } + { + // reading -0, i + signed long i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%li", &i ) ); + CHECK_EQUAL( i, 0l ); + } + { + // reading +0, i + signed long i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%li", &i ) ); + CHECK_EQUAL( i, 0l ); + } + { + // reading -2147483648, i + signed long i = -1; + TESTSCAN( 1, 11, decimal, 42, SCANPARMS( "%li", &i ) ); + CHECK_EQUAL( i, -2147483648l ); + } + { + // reading 2147483647, i + signed long i = -1; + TESTSCAN( 1, 10, decimal, 55, SCANPARMS( "%li", &i ) ); + CHECK_EQUAL( i, 2147483647l ); + } + { + // reading +2147483647, i + signed long i = -1; + TESTSCAN( 1, 11, decimal, 54, SCANPARMS( "%li", &i ) ); + CHECK_EQUAL( i, 2147483647l ); + } + { + // reading 0, d + signed long long i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%lld", &i ) ); + CHECK_EQUAL( i, 0ll ); + } + { + // reading -0, d + signed long long i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%lld", &i ) ); + CHECK_EQUAL( i, 0ll ); + } + { + // reading +0, d + signed long long i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%lld", &i ) ); + CHECK_EQUAL( i, 0ll ); + } + { + // reading -9223372036854775808, d + signed long long i = -1; + TESTSCAN( 1, 20, decimal, 78, SCANPARMS( "%lli", &i ) ); + CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks. + CHECK_EQUAL( i < 0ll, 1 ); + } + { + // reading +9223372036854775807, d + signed long long i = -1; + TESTSCAN( 1, 20, decimal, 99, SCANPARMS( "%lld", &i ) ); + CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lld" ); + } + { + // reading 0, u + unsigned long long i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%llu", &i ) ); + CHECK_EQUAL( i, 0ull ); + } + { + // reading -0, u + unsigned long long i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%llu", &i ) ); + CHECK_EQUAL( i, 0ull ); + } + { + // reading +0, u + unsigned long long i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%llu", &i ) ); + CHECK_EQUAL( i, 0ull ); + } + { + // reading 9223372036854775807, u + unsigned long long i = -1; + TESTSCAN( 1, 19, decimal, 100, SCANPARMS( "%llu", &i ) ); + CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" ); + } + { + // reading +9223372036854775807, u + unsigned long long i = -1; + TESTSCAN( 1, 20, decimal, 99, SCANPARMS( "%llu", &i ) ); + CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" ); + } + { + // reading 18446744073709551615, u + unsigned long long i = 0; + TESTSCAN( 1, 20, decimal, 121, SCANPARMS( "%llu", &i ) ); + CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" ); + } + { + // reading +18446744073709551615, u + unsigned long long i = 0; + TESTSCAN( 1, 21, decimal, 120, SCANPARMS( "%llu", &i ) ); + CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" ); + } + { + // reading 0, i + signed long long i = -1; + TESTSCAN( 1, 1, decimal, 1, SCANPARMS( "%lli", &i ) ); + CHECK_EQUAL( i, 0ll ); + } + { + // reading -0, i + signed long long i = -1; + TESTSCAN( 1, 2, decimal, 0, SCANPARMS( "%lli", &i ) ); + CHECK_EQUAL( i, 0ll ); + } + { + // reading +0, i + signed long long i = -1; + TESTSCAN( 1, 2, decimal, 3, SCANPARMS( "%lli", &i ) ); + CHECK_EQUAL( i, 0ll ); + } + { + // reading -9223372036854775808, i + signed long long i = -1; + TESTSCAN( 1, 20, decimal, 78, SCANPARMS( "%lli", &i ) ); + CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks. + CHECK_EQUAL( i < 0ll, 1 ); + } + { + // reading 9223372036854775807, i + signed long long i = -1; + TESTSCAN( 1, 19, decimal, 100, SCANPARMS( "%lli", &i ) ); + CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" ); + } + { + // reading +9223372036854775807, i + signed long long i = -1; + TESTSCAN( 1, 20, decimal, 99, SCANPARMS( "%lli", &i ) ); + CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" ); + } + + // hexadecimal integer matches + { + // reading 0, x + unsigned char i = -1; + TESTSCAN( 1, 1, hexadecimal, 3, SCANPARMS( "%hhx", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0x0, x + unsigned char i = -1; + TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hhx", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 0x000, x + unsigned char i = -1; + TESTSCAN( 1, 6, hexadecimal, 5, SCANPARMS( "%hhx", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 0x0, i + signed char i = -1; + TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 7f, x + unsigned char i = -1; + TESTSCAN( 1, 2, hexadecimal, 15, SCANPARMS( "%hhx", &i ) ); + CHECK_EQUAL( i, 127 ); + } + { + // reading -0x7f, x + unsigned char i = -1; + TESTSCAN( 1, 5, hexadecimal, 12, SCANPARMS( "%hhx", &i ) ); + CHECK_FEQUAL( i, -127, unsigned char, "%hhu" ); + } + { + // reading -0x80, i + signed char i = -1; + TESTSCAN( 1, 5, hexadecimal, 18, SCANPARMS( "%hhi", &i ) ); + CHECK_FEQUAL( i, -128, signed char, "%hhd" ); + } + { + // reading ff, x + unsigned char i = -1; + TESTSCAN( 1, 2, hexadecimal, 26, SCANPARMS( "%hhx", &i ) ); + CHECK_EQUAL( i, 0xff ); + } + { + // reading 0xff, x + unsigned char i = -1; + TESTSCAN( 1, 4, hexadecimal, 24, SCANPARMS( "%hhx", &i ) ); + CHECK_EQUAL( i, 255 ); + } + { + // reading 0xff, i + signed char i = 0; + TESTSCAN( 1, 4, hexadecimal, 24, SCANPARMS( "%hhi", &i ) ); + CHECK_EQUAL( i, -1 ); + } + { + // reading 0, x + unsigned short i = -1; + TESTSCAN( 1, 1, hexadecimal, 3, SCANPARMS( "%hx", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0x0, x + unsigned short i = -1; + TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hx", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 0x000, x + unsigned short i = -1; + TESTSCAN( 1, 6, hexadecimal, 5, SCANPARMS( "%hx", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 0x0, i + signed short i = -1; + TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%hi", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 7fff, x + unsigned short i = -1; + TESTSCAN( 1, 4, hexadecimal, 32, SCANPARMS( "%hx", &i ) ); + CHECK_EQUAL( i, 32767 ); + } + { + // reading -0x7fff, x + unsigned short i = -1; + TESTSCAN( 1, 7, hexadecimal, 29, SCANPARMS( "%hx", &i ) ); + CHECK_FEQUAL( i, -32767, unsigned short, "%hu" ); + } + { + // reading -0x8000, i + signed short i = -1; + TESTSCAN( 1, 7, hexadecimal, 37, SCANPARMS( "%hi", &i ) ); + CHECK_FEQUAL( i, -32768, signed short, "%hd" ); + } + { + // reading ffff, x + unsigned short i = -1; + TESTSCAN( 1, 4, hexadecimal, 47, SCANPARMS( "%hx", &i ) ); + CHECK_EQUAL( i, 65535 ); + } + { + // reading 0xffff, x + unsigned short i = -1; + TESTSCAN( 1, 6, hexadecimal, 45, SCANPARMS( "%hx", &i ) ); + CHECK_EQUAL( i, 65535 ); + } + { + // reading 0xffff, i + signed short i = 0; + TESTSCAN( 1, 6, hexadecimal, 45, SCANPARMS( "%hi", &i ) ); + CHECK_FEQUAL( i, -1, signed short, "%hd" ); + } + { + // reading 0, x + unsigned int i = -1; + TESTSCAN( 1, 1, hexadecimal, 3, SCANPARMS( "%x", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading -0x0, x + unsigned int i = -1; + TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%x", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 0x000, x + unsigned int i = -1; + TESTSCAN( 1, 6, hexadecimal, 5, SCANPARMS( "%x", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 0x0, i + signed int i = -1; + TESTSCAN( 1, 4, hexadecimal, 0, SCANPARMS( "%i", &i ) ); + CHECK_EQUAL( i, 0 ); + } + { + // reading 7fffffff, x + unsigned int i = -1; + TESTSCAN( 1, 8, hexadecimal, 55, SCANPARMS( "%x", &i ) ); + CHECK_EQUAL( i, 2147483647 ); + } + { + // reading -0x7fffffff, x + unsigned int i = -1; + TESTSCAN( 1, 11, hexadecimal, 52, SCANPARMS( "%x", &i ) ); + CHECK_FEQUAL( i, -2147483647, unsigned int, "%u" ); + } + { + // reading -0x80000000, i + signed int i = -1; + TESTSCAN( 1, 11, hexadecimal, 64, SCANPARMS( "%i", &i ) ); + CHECK_FEQUAL( i, -2147483648, signed int, "%d" ); /* FIXME */ + } + { + // reading ffffffff, x + unsigned int i = -1; + TESTSCAN( 1, 8, hexadecimal, 78, SCANPARMS( "%x", &i ) ); + CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" ); + } + { + // reading 0xffffffff, x + unsigned int i = -1; + TESTSCAN( 1, 10, hexadecimal, 76, SCANPARMS( "%x", &i ) ); + CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" ); + } + + // octal integer matches + { + // reading 0, o + unsigned char i = -1; + TESTSCAN( 1, 1, octal, 4, SCANPARMS( "%hho", &i ) ); + CHECK_EQUAL( i, 0u ); + } + { + // reading +0000, o + unsigned char i = -1; + TESTSCAN( 1, 5, octal, 0, SCANPARMS( "%hho", &i ) ); + CHECK_EQUAL( i, 0u ); + } + { + // reading -0000, o + unsigned char i = -1; + TESTSCAN( 1, 5, octal, 6, SCANPARMS( "%hho", &i ) ); + CHECK_EQUAL( i, 0u ); + } + { + // reading 0177, o + unsigned char i = -1; + TESTSCAN( 1, 4, octal, 13, SCANPARMS( "%hho", &i ) ); + CHECK_EQUAL( i, 127u ); + } + { + // reading +0177, o + unsigned char i = -1; + TESTSCAN( 1, 5, octal, 12, SCANPARMS( "%hho", &i ) ); + CHECK_EQUAL( i, 127u ); + } + { + // reading 0377, o + unsigned char i = -1; + TESTSCAN( 1, 4, octal, 19, SCANPARMS( "%hho", &i ) ); + CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" ); + } + { + // reading +0377, o + unsigned char i = -1; + TESTSCAN( 1, 5, octal, 18, SCANPARMS( "%hho", &i ) ); + CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" ); + } + { + // reading -0377, o + unsigned char i = -1; + TESTSCAN( 1, 5, octal, 24, SCANPARMS( "%hho", &i ) ); + CHECK_FEQUAL( i, 1u, unsigned char, "%hhu" ); + } + { + // reading 077777, o + unsigned short i = -1; + TESTSCAN( 1, 6, octal, 31, SCANPARMS( "%ho", &i ) ); + CHECK_EQUAL( i, 32767u ); + } + { + // reading +077777, o + unsigned short i = -1; + TESTSCAN( 1, 7, octal, 30, SCANPARMS( "%ho", &i ) ); + CHECK_EQUAL( i, 32767u ); + } + { + // reading 0177777, o + unsigned short i = -1; + TESTSCAN( 1, 7, octal, 39, SCANPARMS( "%ho", &i ) ); + CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" ); + } + { + // reading +0177777, o + unsigned short i = -1; + TESTSCAN( 1, 8, octal, 38, SCANPARMS( "%ho", &i ) ); + CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" ); + } + { + // reading -0177777, o + unsigned short i = -1; + TESTSCAN( 1, 8, octal, 47, SCANPARMS( "%ho", &i ) ); + CHECK_FEQUAL( i, 1u, unsigned short, "%hu" ); + } + { + // reading 017777777777, o + unsigned int i = -1; + TESTSCAN( 1, 12, octal, 57, SCANPARMS( "%o", &i ) ); + CHECK_EQUAL( i, 2147483647u ); + } + { + // reading +017777777777, o + unsigned int i = -1; + TESTSCAN( 1, 13, octal, 56, SCANPARMS( "%o", &i ) ); + CHECK_EQUAL( i, 2147483647u ); + } + { + // reading 037777777777, o + unsigned int i = -1; + TESTSCAN( 1, 12, octal, 71, SCANPARMS( "%o", &i ) ); + CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" ); + } + { + // reading +037777777777, o + unsigned int i = -1; + TESTSCAN( 1, 13, octal, 70, SCANPARMS( "%o", &i ) ); + CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" ); + } + { + // reading -037777777777, o + unsigned int i = -1; + TESTSCAN( 1, 13, octal, 84, SCANPARMS( "%o", &i ) ); + CHECK_FEQUAL( i, 1u, unsigned int, "%u" ); + } + { + // reading 017777777777, o + unsigned long i = -1; + TESTSCAN( 1, 12, octal, 57, SCANPARMS( "%lo", &i ) ); + CHECK_EQUAL( i, 2147483647lu ); + } + { + // reading +017777777777, o + unsigned long i = -1; + TESTSCAN( 1, 13, octal, 56, SCANPARMS( "%lo", &i ) ); + CHECK_EQUAL( i, 2147483647lu ); + } + { + // reading 037777777777, o + unsigned long i = -1; + TESTSCAN( 1, 12, octal, 71, SCANPARMS( "%lo", &i ) ); + CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" ); + } + { + // reading +037777777777, o + unsigned long i = -1; + TESTSCAN( 1, 13, octal, 70, SCANPARMS( "%lo", &i ) ); + CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" ); + } + { + // reading -037777777777, o + unsigned long i = -1; + TESTSCAN( 1, 13, octal, 84, SCANPARMS( "%lo", &i ) ); + CHECK_FEQUAL( i, 1lu, unsigned long, "%lu" ); + } + { + // reading 0777777777777777777777, o + unsigned long long i = -1; + TESTSCAN( 1, 22, octal, 99, SCANPARMS( "%llo", &i ) ); + CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" ); + } + { + // reading +0777777777777777777777, o + unsigned long long i = -1; + TESTSCAN( 1, 23, octal, 98, SCANPARMS( "%llo", &i ) ); + CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" ); + } + { + // reading 01777777777777777777777, o + unsigned long long i = -1; + TESTSCAN( 1, 23, octal, 123, SCANPARMS( "%llo", &i ) ); + CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" ); + } + { + // reading +01777777777777777777777, o + unsigned long long i = -1; + TESTSCAN( 1, 24, octal, 122, SCANPARMS( "%llo", &i ) ); + CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" ); + } + { + // reading -01777777777777777777777, o + unsigned long long i = -1; + TESTSCAN( 1, 24, octal, 147, SCANPARMS( "%llo", &i ) ); + CHECK_FEQUAL( i, 1llu, unsigned long long, "%llu" ); + } + + // string matches + size_t const BUFSIZE = 1000; + char buffer[BUFSIZE]; + { + // reading abc + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 1, 3, alpha, 0, SCANPARMS( "%[abc]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "abc", 4 ) ); + } + { + // reading a-c + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 1, 3, alpha, 0, SCANPARMS( "%[a-c]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "abc", 4 ) ); + } + { + // reading a-h + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 1, 8, alpha, 0, SCANPARMS( "%[a-h]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "abcdefgh", 9 ) ); + } + { + // reading o-r, including [, seperate char + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 1, 5, alpha, 15, SCANPARMS( "%[[o-qr]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "op[qr", 6 ) ); + } + { + // reading v-y, including ], two groups + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 1, 5, alpha, 23, SCANPARMS( "%[]v-wx-y]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "vw]xy", 6 ) ); + } + { + // missing on first character + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 0, -1, alpha, 0, SCANPARMS( "%[b]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "", 1 ) ); + } + { + // eof while reading, two groups + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 1, 2, alpha, 27, SCANPARMS( "%[a-zA-Z]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "yz", 3 ) ); + } + { + // eof before reading + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( -1, -1, alpha, 29, SCANPARMS( "%[a-z]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "", 1 ) ); + } + { + // negation - [^...] + memset( buffer, '\0', BUFSIZE ); + TESTSCAN( 1, 3, alpha, 0, SCANPARMS( "%[^d-f]", buffer ) ); + CHECK_FALSE( memcmp( buffer, "abc", 4 ) ); + } + +#ifndef REGTEST + // special bordercase + /* Most existing libraries disagree with this test case, so a little + explanation of why PDCLib chose the implementation it did might be + necessary. All references are from ISO/IEC 9899:1999 "Programming + languages - C". Wording critical to the explanation is in UPPERCASE. + Input stream holds "-0xz". + 6.4.4.1 Integer constants - states that '0' is a valid (hexa)decimal + constant, whereas '0x' IS NOT. + 7.19.6.2 The fscanf function - states... + ...in paragraph 9 that "an INPUT ITEM is defined as the longest + sequence of input characters [...] which is, OR IS A PREFIX OF, + a matching input sequence". + ...in paragraph 10 that "if the INPUT ITEM is not a matching + sequence, the execution of THE DIRECTIVE FAILS; this condition + is a matching failure". + ...in footnote 242) that "fscanf pushes back AT MOST ONE input + character onto the input stream." + ...in paragraph 12 that either of the conversion specifiers d, i, + o, u, or x "matches an [...] integer whose format is the same as + expected for THE SUBJECT SEQUENCE of the [strtol|strtoul] + function". + 7.20.1.4 The strtol, strtoll, strtoul, and strtoull functions - states + in paragraph 3 that "the EXPECTED FORM OF THE SUBJECT SEQUENCE is + that of an integer constant AS DESCRIBED IN 6.4.4.1". + These parts of the standard result in the following reasoning: + - The longest sequence of input characters which is a prefix of a + matching input sequence is "-0x" (negative sign, hexadecimal-prefix). + The 'z' is the first character remaining unread as "-0xz" is not a + (prefix of a) matching input sequence. This is according to 7.19.6.2 + paragraph 9. + - "0x", without a valid hexadecimal digit following it, is not a valid + integer constant according to 6.4.4.1. + - "0x" is thus also not of the expected form for a strto[u]l subject + sequence according to 7.20.1.4 paragraph 3. (strto[u]l() would parse + it as zero, but leave the "x" in the final string, i.e. outside the + subject sequence.) + - "0x" is therefore also not a matching sequence to the i or x + conversion specifier according to 7.19.6.2 paragraph 12. + - The conversion should therefore result in a matching failure + according to 7.19.6.2 paragraph 10. + */ + { + // reading -0x, x + unsigned char i = 1; + TESTSCAN( 0, -1, special, 0, SCANPARMS( "%hhx", &i ) ); + CHECK_EQUAL( i, 1 ); /* FIXME */ + } + { + // reading -0x, x + unsigned short i = 1; + TESTSCAN( 0, -1, special, 0, SCANPARMS( "%hx", &i ) ); + CHECK_EQUAL( i, 1 ); /* FIXME */ + } + { + // reading -0x, x + unsigned int i = 1; + TESTSCAN( 0, -1, special, 0, SCANPARMS( "%x", &i ) ); + CHECK_EQUAL( i, 1 ); /* FIXME */ + } +#endif diff --git a/testing/sscan_sources.incl b/testing/sscan_sources.incl new file mode 100644 index 0000000..78063a9 --- /dev/null +++ b/testing/sscan_sources.incl @@ -0,0 +1,43 @@ + char const * general = "12345678901\0003-5+7\0009\3772 4 6 8 0\3771 \011 5%% 0"; + char const * decimal = "-0 +0 -128 +127 +255 -32768 +32767 +65535\n" + "-2147483648 +2147483647 +4294967295\n" + "-9223372036854775808 +9223372036854775807\n" + "+18446744073709551615\n"; + char const * hexadecimal = "-0x0 -0x000 -0x7f -0x80 0xff -0x7fff -0x8000\n" + "0xffff -0x7fffffff -0x80000000 0xffffffff\n" + "-0x7fffffffffffffff -0x8000000000000000\n" + "0xffffffffffffffff\n"; + char const * octal = "+0000 -0000 +0177 +0377 -0377 +077777 +0177777\n" + "-0177777 +017777777777 +037777777777\n" + "-037777777777 +0777777777777777777777\n" + "+01777777777777777777777\n" + "-01777777777777777777777\n"; + char const * alpha = "abcdefgh-ijklmnop[qrs%uvw]xyz"; +#ifndef REGTEST + char const * special = "-0xz\n"; +#endif + + +/* sscan */ +#define TESTSCAN( result, count, source, offset, ... ) \ + do \ + { \ + int n = -1; \ + int res = SCANFUNC( source + offset, __VA_ARGS__ ); \ + if ( res != result ) \ + { \ + rc += 1; \ + printf( "FAILED: " __FILE__ ", line %d - expected result %d, got %d\n", __LINE__, result, res ); \ + } \ + if ( n != count ) \ + { \ + rc += 1; \ + printf( "FAILED: " __FILE__ ", line %d - expected count %d, got %d\n", __LINE__, count, n ); \ + } \ + } while ( 0 ) + +#define SCAN( format ) format "%n", &n +#define SCANPARMS( format, ... ) format "%n", __VA_ARGS__, &n + +#define _PDCLIB_SSCAN +