Moved test-related files to testing subdirectory (i.e., out of the way).
authorsolar <solar@546481bc-9713-0410-bf18-d3337bbf4a3e>
Mon, 19 Jul 2010 09:47:39 +0000 (09:47 +0000)
committersolar <solar@546481bc-9713-0410-bf18-d3337bbf4a3e>
Mon, 19 Jul 2010 09:47:39 +0000 (09:47 +0000)
git-svn-id: https://srv7.svn-repos.de/dev34/pdclib/trunk@448 546481bc-9713-0410-bf18-d3337bbf4a3e

17 files changed:
Makefile
functions/stdio/fprintf_reftest.incl [deleted file]
functions/stdio/fscan_sources.incl [deleted file]
functions/stdio/printf_reference.txt [deleted file]
functions/stdio/printf_testcases.incl [deleted file]
functions/stdio/scan_test.h [deleted file]
functions/stdio/scanf_testcases.incl [deleted file]
functions/stdio/sscan_sources.incl [deleted file]
internals/_PDCLIB_test.h [deleted file]
testing/_PDCLIB_test.h [new file with mode: 0644]
testing/fprintf_reftest.incl [new file with mode: 0644]
testing/fscan_sources.incl [new file with mode: 0644]
testing/printf_reference.txt [new file with mode: 0644]
testing/printf_testcases.incl [new file with mode: 0644]
testing/scan_test.h [new file with mode: 0644]
testing/scanf_testcases.incl [new file with mode: 0644]
testing/sscan_sources.incl [new file with mode: 0644]

index 6748be49117d6479ec9f239b256b2c7eb5efdf7a..0acd1cc6132e91de48c5445930759832302f499b 100644 (file)
--- 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 (file)
index afc89b9..0000000
+++ /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 (file)
index 704c542..0000000
+++ /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 (file)
index c3e1d86..0000000
+++ /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 (file)
index a421ca6..0000000
+++ /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 (file)
index 9eae7c8..0000000
+++ /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 <string.h>
-#include <limits.h>
-
-#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 (file)
index a32d0ca..0000000
+++ /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 (file)
index 78063a9..0000000
+++ /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 (file)
index ad02b0f..0000000
+++ /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 <stdio.h>
-
-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 (file)
index 0000000..ad02b0f
--- /dev/null
@@ -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 <stdio.h>
+
+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 (file)
index 0000000..05c74c2
--- /dev/null
@@ -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 (file)
index 0000000..a7dc18b
--- /dev/null
@@ -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 (file)
index 0000000..c3e1d86
--- /dev/null
@@ -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 (file)
index 0000000..a421ca6
--- /dev/null
@@ -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 (file)
index 0000000..9eae7c8
--- /dev/null
@@ -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 <string.h>
+#include <limits.h>
+
+#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 (file)
index 0000000..a32d0ca
--- /dev/null
@@ -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 (file)
index 0000000..78063a9
--- /dev/null
@@ -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
+