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
+++ /dev/null
- {
- 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 );
- }
+++ /dev/null
- 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
-
+++ /dev/null
--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
+++ /dev/null
- {
-
-#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 );
- }
- }
+++ /dev/null
-/* $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 )
-
+++ /dev/null
- // -----------------------------------------------------------------------
- // 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
+++ /dev/null
- 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
-
+++ /dev/null
-/* $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
-
--- /dev/null
+/* $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
+
--- /dev/null
+ {
+ 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 );
+ }
--- /dev/null
+ 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
+
--- /dev/null
+-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
--- /dev/null
+ {
+
+#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 );
+ }
+ }
--- /dev/null
+/* $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 )
+
--- /dev/null
+ // -----------------------------------------------------------------------
+ // 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
--- /dev/null
+ 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
+