3 /* sscanf( const char *, const char *, ... )
5 This file is part of the Public Domain C Library (PDCLib).
6 Permission is granted to use, modify, and / or redistribute at will.
14 int sscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... )
18 va_start( ap, format );
19 rc = vsscanf( s, format, ap );
27 #include <_PDCLIB_test.h>
32 #define symbol2value( x ) #x
33 #define symbol2string( x ) symbol2value( x )
35 #define CHECK_TRUE( a ) do { if ( a == 0 ) { fprintf( stderr, "Unexpected failure in " symbol2string( __LINE__ ) ": '" #a "' evaluated to false.\n" ); rc += 1; } } while ( 0 )
36 #define CHECK_FALSE( a ) do { if ( a != 0 ) { fprintf( stderr, "Unexpected failure in " symbol2string( __LINE__ ) ": '" #a "' evaluated to true.\n" ); rc += 1; } } while ( 0 )
37 #define CHECK_EQUAL( a, b ) do { int x = a; int y = b; if ( x != y ) { fprintf( stderr, "Mismatch in " symbol2string( __LINE__ ) ": result is %d, expected %d.\n", x, y ); rc += 1; } } while ( 0 )
38 #define CHECK_FEQUAL( a, b, T, F ) do { T x = a; T y = b; if ( x != y ) { fprintf( stderr, "Mismatch in " symbol2string( __LINE__ ) ": result is " F ", expected " F ".\n", x, y ); rc += 1; } } while ( 0 )
40 // literal matches, character matches, and basic integer matches
41 void suite_one( void );
42 // decimal integer matches
43 void suite_two( void );
44 // hexadecimal integer matches
45 void suite_three( void );
46 // octal integer matches
47 void suite_four( void );
49 void suite_five( void );
60 // literal matches, character matches, and basic integer matches
63 char const * string = "12345678901\0003-5+7\0009\3772 4 6 8 0\3771 \011 5%% 0";
64 CHECK_EQUAL( string[39], '0' );
66 // -----------------------------------------------------------------------
68 // -----------------------------------------------------------------------
70 // matching six characters literally
72 // should report six characters read
74 CHECK_EQUAL( sscanf( string + 0, "123456%n", &n ), 0 );
78 // matching a character, three whitespace chars, and another character
80 // should report five characters read
82 CHECK_EQUAL( sscanf( string + 30, "1 5%n", &n ), 0 );
86 // matching three characters, not matching whitespaces, and matching another three characters
88 // should report six characters matched
90 CHECK_EQUAL( sscanf( string + 0, "123 456%n", &n ), 0 );
94 // matching a character, two '%' characters, and two whitespaces
96 // should report five characters matched
98 CHECK_EQUAL( sscanf( string + 34, "5%%%% %n", &n ), 0 );
102 // seeking to last character in file, trying to match that char and a whitespace
104 // should report one character matched and EOF
106 CHECK_EQUAL( sscanf( string + 39, "0 %n", &n ), 0 );
110 // seeking to end of file, trying to match a -1
112 // should report error, not executing %n
114 CHECK_EQUAL( sscanf( string + 0, "\377%n", &n ), 0 );
115 CHECK_EQUAL( n, -1 );
118 // -----------------------------------------------------------------------
119 // Character matching ('%c')
120 // -----------------------------------------------------------------------
122 // reading a char array of specified width, including zero bytes
123 // should report the characters read up to first zero
125 memset( buffer, '\177', 8 );
126 CHECK_EQUAL( sscanf( string + 10, "%7c", buffer ), 1 );
127 CHECK_FALSE( memcmp( buffer, "1\177\177", 3 ) );
130 // reading a char array of unspecified width when positioned at -1 value
131 // should default to width one, read the -1 value, no zero termination of the array
133 memset( buffer, '\177', 2 );
134 CHECK_EQUAL( sscanf( string + 19, "%c", buffer ), 1 );
135 CHECK_FALSE( memcmp( buffer, "\377\177", 2 ) );
138 // reading a char array of specified width 1 when positioned at (non-space) whitespace
139 // should read the whitespace (literally), no zero termination of the array
141 memset( buffer, '\177', 2 );
142 CHECK_EQUAL( sscanf( string + 32, "%1c", buffer ), 1 );
143 CHECK_FALSE( memcmp( buffer, "\011\177", 2 ) );
146 // reading a char array of specified width 2 when positioned at last char of file
147 // should read the character, and report EOF
149 memset( buffer, '\177', 2 );
150 CHECK_EQUAL( sscanf( string + 39, "%2c", buffer ), 1 );
151 CHECK_FALSE( memcmp( buffer, "0\177", 2 ) );
154 // reading a char array of specified width 1 when positioned at last char of file
155 // should read the character, and NOT report EOF
157 memset( buffer, '\177', 2 );
158 CHECK_EQUAL( sscanf( string + 39, "%1c", buffer ), 1 );
159 CHECK_FALSE( memcmp( buffer, "0\177", 2 ) );
162 // reading a char array of specified width 1 when positioned at EOF
163 // should report input error before any conversion (-1)
165 memset( buffer, '\177', 2 );
166 CHECK_EQUAL( sscanf( string + 40, "%1c", buffer ), -1 );
167 CHECK_FALSE( memcmp( buffer, "\177\177", 2 ) );
170 // -----------------------------------------------------------------------
171 // Integer matching ('%d')
172 // -----------------------------------------------------------------------
174 // reading a whitespace-terminated integer
177 CHECK_EQUAL( sscanf( string + 20, "%d%n", &i, &n ), 1 );
182 // reading a -1 terminated integer
185 CHECK_EQUAL( sscanf( string + 18, "%d%n", &i, &n ), 1 );
190 // reading a EOF terminated integer
193 CHECK_EQUAL( sscanf( string + 39, "%d%n", &i, &n ), 1 );
198 // trying to read an integer when positioned at whitespace
199 // should skip whitespaces
202 CHECK_EQUAL( sscanf( string + 32, "%d%n", &i, &n ), 1 );
207 // trying to read an integer when positioned at -1 value
208 // should report matching failure
211 CHECK_EQUAL( sscanf( string + 19, "%d%n", &i, &n ), 0 );
213 CHECK_EQUAL( n, -1 );
216 // trying to read an integer when positioned at EOF
217 // should report reading failure
220 CHECK_EQUAL( sscanf( string + 40, "%d%n", &i, &n ), -1 );
222 CHECK_EQUAL( n, -1 );
225 // reading a '-'-prefixed integer
228 CHECK_EQUAL( sscanf( string + 13, "%d%n", &i, &n ), 1 );
229 CHECK_EQUAL( i, -5 );
233 // reading a '+'-prefixed integer
236 CHECK_EQUAL( sscanf( string + 15, "%d%n", &i, &n ), 1 );
242 // decimal integer matches
245 char const * string = "-0 +0 -128 +127 +255 -32768 +32767 +65535\n"
246 "-2147483648 +2147483647 +4294967295\n"
247 "-9223372036854775808 +9223372036854775807\n"
248 "+18446744073709551615\n";
249 CHECK_EQUAL( string[141], '\n' );
254 CHECK_EQUAL( sscanf( string + 1, "%hhd%n", &i, &n ), 1 );
262 CHECK_EQUAL( sscanf( string + 0, "%hhd%n", &i, &n ), 1 );
270 CHECK_EQUAL( sscanf( string + 3, "%hhd%n", &i, &n ), 1 );
278 CHECK_EQUAL( sscanf( string + 6, "%hhd%n", &i, &n ), 1 );
279 CHECK_EQUAL( i, -128 );
286 CHECK_EQUAL( sscanf( string + 12, "%hhd%n", &i, &n ), 1 );
287 CHECK_EQUAL( i, 127 );
294 CHECK_EQUAL( sscanf( string + 11, "%hhd%n", &i, &n ), 1 );
295 CHECK_EQUAL( i, 127 );
300 unsigned char i = -1;
302 CHECK_EQUAL( sscanf( string + 1, "%hhu%n", &i, &n ), 1 );
308 unsigned char i = -1;
310 CHECK_EQUAL( sscanf( string + 0, "%hhu%n", &i, &n ), 1 );
316 unsigned char i = -1;
318 CHECK_EQUAL( sscanf( string + 3, "%hhu%n", &i, &n ), 1 );
324 unsigned char i = -1;
326 CHECK_EQUAL( sscanf( string + 12, "%hhu%n", &i, &n ), 1 );
327 CHECK_EQUAL( i, 127 );
332 unsigned char i = -1;
334 CHECK_EQUAL( sscanf( string + 11, "%hhu%n", &i, &n ), 1 );
335 CHECK_EQUAL( i, 127 );
342 CHECK_EQUAL( sscanf( string + 17, "%hhu%n", &i, &n ), 1 );
343 CHECK_EQUAL( i, 255 );
350 CHECK_EQUAL( sscanf( string + 16, "%hhu%n", &i, &n ), 1 );
351 CHECK_EQUAL( i, 255 );
358 CHECK_EQUAL( sscanf( string + 1, "%hhi%n", &i, &n ), 1 );
366 CHECK_EQUAL( sscanf( string + 0, "%hhi%n", &i, &n ), 1 );
374 CHECK_EQUAL( sscanf( string + 3, "%hhi%n", &i, &n ), 1 );
382 CHECK_EQUAL( sscanf( string + 6, "%hhi%n", &i, &n ), 1 );
383 CHECK_EQUAL( i, -128 );
390 CHECK_EQUAL( sscanf( string + 12, "%hhi%n", &i, &n ), 1 );
391 CHECK_EQUAL( i, 127 );
398 CHECK_EQUAL( sscanf( string + 11, "%hhi%n", &i, &n ), 1 );
399 CHECK_EQUAL( i, 127 );
406 CHECK_EQUAL( sscanf( string + 1, "%hd%n", &i, &n ), 1 );
414 CHECK_EQUAL( sscanf( string + 0, "%hd%n", &i, &n ), 1 );
422 CHECK_EQUAL( sscanf( string + 3, "%hd%n", &i, &n ), 1 );
430 CHECK_EQUAL( sscanf( string + 21, "%hd%n", &i, &n ), 1 );
431 CHECK_EQUAL( i, -32768 );
438 CHECK_EQUAL( sscanf( string + 29, "%hd%n", &i, &n ), 1 );
439 CHECK_EQUAL( i, 32767 );
446 CHECK_EQUAL( sscanf( string + 28, "%hd%n", &i, &n ), 1 );
447 CHECK_EQUAL( i, 32767 );
452 unsigned short i = -1;
454 CHECK_EQUAL( sscanf( string + 1, "%hu%n", &i, &n ), 1 );
460 unsigned short i = -1;
462 CHECK_EQUAL( sscanf( string + 0, "%hu%n", &i, &n ), 1 );
468 unsigned short i = -1;
470 CHECK_EQUAL( sscanf( string + 3, "%hu%n", &i, &n ), 1 );
476 unsigned short i = -1;
478 CHECK_EQUAL( sscanf( string + 29, "%hu%n", &i, &n ), 1 );
479 CHECK_EQUAL( i, 32767 );
484 unsigned short i = -1;
486 CHECK_EQUAL( sscanf( string + 28, "%hu%n", &i, &n ), 1 );
487 CHECK_EQUAL( i, 32767 );
492 unsigned short i = 0;
494 CHECK_EQUAL( sscanf( string + 36, "%hu%n", &i, &n ), 1 );
495 CHECK_EQUAL( i, 65535 );
500 unsigned short i = 0;
502 CHECK_EQUAL( sscanf( string + 35, "%hu%n", &i, &n ), 1 );
503 CHECK_EQUAL( i, 65535 );
510 CHECK_EQUAL( sscanf( string + 1, "%hi%n", &i, &n ), 1 );
518 CHECK_EQUAL( sscanf( string + 0, "%hi%n", &i, &n ), 1 );
526 CHECK_EQUAL( sscanf( string + 3, "%hi%n", &i, &n ), 1 );
534 CHECK_EQUAL( sscanf( string + 21, "%hi%n", &i, &n ), 1 );
535 CHECK_EQUAL( i, -32768 );
542 CHECK_EQUAL( sscanf( string + 29, "%hi%n", &i, &n ), 1 );
543 CHECK_EQUAL( i, 32767 );
550 CHECK_EQUAL( sscanf( string + 28, "%hi%n", &i, &n ), 1 );
551 CHECK_EQUAL( i, 32767 );
558 CHECK_EQUAL( sscanf( string + 1, "%d%n", &i, &n ), 1 );
566 CHECK_EQUAL( sscanf( string + 0, "%d%n", &i, &n ), 1 );
574 CHECK_EQUAL( sscanf( string + 3, "%d%n", &i, &n ), 1 );
579 // reading -2147483648, d
582 CHECK_EQUAL( sscanf( string + 42, "%d%n", &i, &n ), 1 );
583 CHECK_EQUAL( i, -2147483648 );
584 CHECK_EQUAL( n, 11 );
587 // reading 2147483647, d
590 CHECK_EQUAL( sscanf( string + 55, "%d%n", &i, &n ), 1 );
591 CHECK_EQUAL( i, 2147483647 );
592 CHECK_EQUAL( n, 10 );
595 // reading +2147483647, d
598 CHECK_EQUAL( sscanf( string + 54, "%d%n", &i, &n ), 1 );
599 CHECK_EQUAL( i, 2147483647 );
600 CHECK_EQUAL( n, 11 );
606 CHECK_EQUAL( sscanf( string + 1, "%u%n", &i, &n ), 1 );
614 CHECK_EQUAL( sscanf( string + 0, "%u%n", &i, &n ), 1 );
622 CHECK_EQUAL( sscanf( string + 3, "%u%n", &i, &n ), 1 );
627 // reading 2147483647, u
630 CHECK_EQUAL( sscanf( string + 55, "%u%n", &i, &n ), 1 );
631 CHECK_EQUAL( i, 2147483647 );
632 CHECK_EQUAL( n, 10 );
635 // reading +2147483647, u
638 CHECK_EQUAL( sscanf( string + 54, "%u%n", &i, &n ), 1 );
639 CHECK_EQUAL( i, 2147483647 );
640 CHECK_EQUAL( n, 11 );
643 // reading 4294967295, u
646 CHECK_EQUAL( sscanf( string + 67, "%u%n", &i, &n ), 1 );
647 CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" );
648 CHECK_EQUAL( n, 10 );
651 // reading +4294967295, u
654 CHECK_EQUAL( sscanf( string + 66, "%u%n", &i, &n ), 1 );
655 CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" );
656 CHECK_EQUAL( n, 11 );
662 CHECK_EQUAL( sscanf( string + 1, "%i%n", &i, &n ), 1 );
670 CHECK_EQUAL( sscanf( string + 0, "%i%n", &i, &n ), 1 );
678 CHECK_EQUAL( sscanf( string + 3, "%i%n", &i, &n ), 1 );
683 // reading -2147483648, i
686 CHECK_EQUAL( sscanf( string + 42, "%i%n", &i, &n ), 1 );
687 CHECK_EQUAL( i, -2147483648 );
688 CHECK_EQUAL( n, 11 );
691 // reading 2147483647, i
694 CHECK_EQUAL( sscanf( string + 55, "%i%n", &i, &n ), 1 );
695 CHECK_EQUAL( i, 2147483647 );
696 CHECK_EQUAL( n, 10 );
699 // reading +2147483647, i
702 CHECK_EQUAL( sscanf( string + 54, "%i%n", &i, &n ), 1 );
703 CHECK_EQUAL( i, 2147483647 );
704 CHECK_EQUAL( n, 11 );
710 CHECK_EQUAL( sscanf( string + 1, "%ld%n", &i, &n ), 1 );
711 CHECK_EQUAL( i, 0l );
718 CHECK_EQUAL( sscanf( string + 0, "%ld%n", &i, &n ), 1 );
719 CHECK_EQUAL( i, 0l );
726 CHECK_EQUAL( sscanf( string + 3, "%ld%n", &i, &n ), 1 );
727 CHECK_EQUAL( i, 0l );
731 // reading -2147483648, d
734 CHECK_EQUAL( sscanf( string + 42, "%ld%n", &i, &n ), 1 );
735 CHECK_EQUAL( i, -2147483648l );
736 CHECK_EQUAL( n, 11 );
739 // reading 2147483647, d
742 CHECK_EQUAL( sscanf( string + 55, "%ld%n", &i, &n ), 1 );
743 CHECK_EQUAL( i, 2147483647l );
744 CHECK_EQUAL( n, 10 );
747 // reading +2147483647, d
750 CHECK_EQUAL( sscanf( string + 54, "%ld%n", &i, &n ), 1 );
751 CHECK_EQUAL( i, 2147483647l );
752 CHECK_EQUAL( n, 11 );
756 unsigned long i = -1;
758 CHECK_EQUAL( sscanf( string + 1, "%lu%n", &i, &n ), 1 );
759 CHECK_EQUAL( i, 0ul );
764 unsigned long i = -1;
766 CHECK_EQUAL( sscanf( string + 0, "%lu%n", &i, &n ), 1 );
767 CHECK_EQUAL( i, 0ul );
772 unsigned long i = -1;
774 CHECK_EQUAL( sscanf( string + 3, "%lu%n", &i, &n ), 1 );
775 CHECK_EQUAL( i, 0ul );
779 // reading 2147483647, u
780 unsigned long i = -1;
782 CHECK_EQUAL( sscanf( string + 55, "%lu%n", &i, &n ), 1 );
783 CHECK_EQUAL( i, 2147483647ul );
784 CHECK_EQUAL( n, 10 );
787 // reading +2147483647, u
788 unsigned long i = -1;
790 CHECK_EQUAL( sscanf( string + 54, "%lu%n", &i, &n ), 1 );
791 CHECK_EQUAL( i, 2147483647ul );
792 CHECK_EQUAL( n, 11 );
795 // reading 4294967295, u
798 CHECK_EQUAL( sscanf( string + 67, "%lu%n", &i, &n ), 1 );
799 CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" );
800 CHECK_EQUAL( n, 10 );
803 // reading +4294967295, u
806 CHECK_EQUAL( sscanf( string + 66, "%lu%n", &i, &n ), 1 );
807 CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" );
808 CHECK_EQUAL( n, 11 );
814 CHECK_EQUAL( sscanf( string + 1, "%li%n", &i, &n ), 1 );
815 CHECK_EQUAL( i, 0l );
822 CHECK_EQUAL( sscanf( string + 0, "%li%n", &i, &n ), 1 );
823 CHECK_EQUAL( i, 0l );
830 CHECK_EQUAL( sscanf( string + 3, "%li%n", &i, &n ), 1 );
831 CHECK_EQUAL( i, 0l );
835 // reading -2147483648, i
838 CHECK_EQUAL( sscanf( string + 42, "%li%n", &i, &n ), 1 );
839 CHECK_EQUAL( i, -2147483648l );
840 CHECK_EQUAL( n, 11 );
843 // reading 2147483647, i
846 CHECK_EQUAL( sscanf( string + 55, "%li%n", &i, &n ), 1 );
847 CHECK_EQUAL( i, 2147483647l );
848 CHECK_EQUAL( n, 10 );
851 // reading +2147483647, i
854 CHECK_EQUAL( sscanf( string + 54, "%li%n", &i, &n ), 1 );
855 CHECK_EQUAL( i, 2147483647l );
856 CHECK_EQUAL( n, 11 );
860 signed long long i = -1;
862 CHECK_EQUAL( sscanf( string + 1, "%lld%n", &i, &n ), 1 );
863 CHECK_EQUAL( i, 0ll );
868 signed long long i = -1;
870 CHECK_EQUAL( sscanf( string + 0, "%lld%n", &i, &n ), 1 );
871 CHECK_EQUAL( i, 0ll );
876 signed long long i = -1;
878 CHECK_EQUAL( sscanf( string + 3, "%lld%n", &i, &n ), 1 );
879 CHECK_EQUAL( i, 0ll );
883 // reading -9223372036854775808, d
884 signed long long i = -1;
886 CHECK_EQUAL( sscanf( string + 78, "%lld%n", &i, &n ), 1 );
887 CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lld" ); // should be literal -9223372036854775808ll but GCC balks.
888 CHECK_EQUAL( i < 0ll, 1 );
889 CHECK_EQUAL( n, 20 );
892 // reading 9223372036854775807, d
893 signed long long i = -1;
895 CHECK_EQUAL( sscanf( string + 100, "%lld%n", &i, &n ), 1 );
896 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lld" );
897 CHECK_EQUAL( n, 19 );
900 // reading +9223372036854775807, d
901 signed long long i = -1;
903 CHECK_EQUAL( sscanf( string + 99, "%lld%n", &i, &n ), 1 );
904 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lld" );
905 CHECK_EQUAL( n, 20 );
909 unsigned long long i = -1;
911 CHECK_EQUAL( sscanf( string + 1, "%llu%n", &i, &n ), 1 );
912 CHECK_EQUAL( i, 0ull );
917 unsigned long long i = -1;
919 CHECK_EQUAL( sscanf( string + 0, "%llu%n", &i, &n ), 1 );
920 CHECK_EQUAL( i, 0ull );
925 unsigned long long i = -1;
927 CHECK_EQUAL( sscanf( string + 3, "%llu%n", &i, &n ), 1 );
928 CHECK_EQUAL( i, 0ull );
932 // reading 9223372036854775807, u
933 unsigned long long i = -1;
935 CHECK_EQUAL( sscanf( string + 100, "%llu%n", &i, &n ), 1 );
936 CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" );
937 CHECK_EQUAL( n, 19 );
940 // reading +9223372036854775807, u
941 unsigned long long i = -1;
943 CHECK_EQUAL( sscanf( string + 99, "%llu%n", &i, &n ), 1 );
944 CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" );
945 CHECK_EQUAL( n, 20 );
948 // reading 18446744073709551615, u
949 unsigned long long i = 0;
951 CHECK_EQUAL( sscanf( string + 121, "%llu%n", &i, &n ), 1 );
952 CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" );
953 CHECK_EQUAL( n, 20 );
956 // reading +18446744073709551615, u
957 unsigned long long i = 0;
959 CHECK_EQUAL( sscanf( string + 120, "%llu%n", &i, &n ), 1 );
960 CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" );
961 CHECK_EQUAL( n, 21 );
965 signed long long i = -1;
967 CHECK_EQUAL( sscanf( string + 1, "%lli%n", &i, &n ), 1 );
968 CHECK_EQUAL( i, 0ll );
973 signed long long i = -1;
975 CHECK_EQUAL( sscanf( string + 0, "%lli%n", &i, &n ), 1 );
976 CHECK_EQUAL( i, 0ll );
981 signed long long i = -1;
983 CHECK_EQUAL( sscanf( string + 3, "%lli%n", &i, &n ), 1 );
984 CHECK_EQUAL( i, 0ll );
988 // reading -9223372036854775808, i
989 signed long long i = -1;
991 CHECK_EQUAL( sscanf( string + 78, "%lli%n", &i, &n ), 1 );
992 CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks.
993 CHECK_EQUAL( i < 0ll, 1 );
994 CHECK_EQUAL( n, 20 );
997 // reading 9223372036854775807, i
998 signed long long i = -1;
1000 CHECK_EQUAL( sscanf( string + 100, "%lli%n", &i, &n ), 1 );
1001 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" );
1002 CHECK_EQUAL( n, 19 );
1005 // reading +9223372036854775807, i
1006 signed long long i = -1;
1008 CHECK_EQUAL( sscanf( string + 99, "%lli%n", &i, &n ), 1 );
1009 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" );
1010 CHECK_EQUAL( n, 20 );
1014 // hexadecimal integer matches
1017 char const * string = "-0x0 -0x000 -0x7f 0x80 0xff -0x7fff 0x8000\n"
1018 "0xffff -0x7fffffff 0x80000000 0xffffffff\n"
1019 "-0x7fffffffffffffff 0x8000000000000000\n"
1020 "0xffffffffffffffff -0x\n";
1021 CHECK_EQUAL( string[145], '\n' );
1024 unsigned char i = -1;
1026 CHECK_EQUAL( sscanf( string + 3, "%hhx%n", &i, &n ), 1 );
1027 CHECK_EQUAL( i, 0 );
1028 CHECK_EQUAL( n, 1 );
1032 unsigned char i = -1;
1034 CHECK_EQUAL( sscanf( string + 0, "%hhx%n", &i, &n ), 1 );
1035 CHECK_EQUAL( i, 0 );
1036 CHECK_EQUAL( n, 4 );
1040 unsigned char i = -1;
1042 CHECK_EQUAL( sscanf( string + 142, "%hhx%n", &i, &n ), 1 );
1043 CHECK_EQUAL( i, 0 );
1044 CHECK_EQUAL( n, 3 );
1048 unsigned char i = -1;
1050 CHECK_EQUAL( sscanf( string + 5, "%hhx%n", &i, &n ), 1 );
1051 CHECK_EQUAL( i, 0 );
1052 CHECK_EQUAL( n, 6 );
1058 CHECK_EQUAL( sscanf( string + 0, "%hhi%n", &i, &n ), 1 );
1059 CHECK_EQUAL( i, 0 );
1060 CHECK_EQUAL( n, 4 );
1064 unsigned char i = -1;
1066 CHECK_EQUAL( sscanf( string + 15, "%hhx%n", &i, &n ), 1 );
1067 CHECK_EQUAL( i, 127 );
1068 CHECK_EQUAL( n, 2 );
1072 unsigned char i = -1;
1074 CHECK_EQUAL( sscanf( string + 12, "%hhx%n", &i, &n ), 1 );
1075 CHECK_FEQUAL( i, -127, unsigned char, "%hhu" );
1076 CHECK_EQUAL( n, 5 );
1082 CHECK_EQUAL( sscanf( string + 18, "%hhi%n", &i, &n ), 1 );
1083 CHECK_FEQUAL( i, -128, signed char, "%hd" );
1084 CHECK_EQUAL( n, 4 );
1088 unsigned char i = -1;
1090 CHECK_EQUAL( sscanf( string + 25, "%hhx%n", &i, &n ), 1 );
1091 CHECK_EQUAL( i, 0xff );
1092 CHECK_EQUAL( n, 2 );
1096 unsigned char i = -1;
1098 CHECK_EQUAL( sscanf( string + 23, "%hhx%n", &i, &n ), 1 );
1099 CHECK_EQUAL( i, 255 );
1100 CHECK_EQUAL( n, 4 );
1106 CHECK_EQUAL( sscanf( string + 23, "%hhi%n", &i, &n ), 1 );
1107 CHECK_EQUAL( i, -1 );
1108 CHECK_EQUAL( n, 4 );
1112 unsigned short i = -1;
1114 CHECK_EQUAL( sscanf( string + 3, "%hx%n", &i, &n ), 1 );
1115 CHECK_EQUAL( i, 0 );
1116 CHECK_EQUAL( n, 1 );
1120 unsigned short i = -1;
1122 CHECK_EQUAL( sscanf( string + 0, "%hx%n", &i, &n ), 1 );
1123 CHECK_EQUAL( i, 0 );
1124 CHECK_EQUAL( n, 4 );
1128 unsigned short i = -1;
1130 CHECK_EQUAL( sscanf( string + 142, "%hx%n", &i, &n ), 1 );
1131 CHECK_EQUAL( i, 0 );
1132 CHECK_EQUAL( n, 3 );
1136 unsigned short i = -1;
1138 CHECK_EQUAL( sscanf( string + 5, "%hx%n", &i, &n ), 1 );
1139 CHECK_EQUAL( i, 0 );
1140 CHECK_EQUAL( n, 6 );
1144 signed short i = -1;
1146 CHECK_EQUAL( sscanf( string + 0, "%hi%n", &i, &n ), 1 );
1147 CHECK_EQUAL( i, 0 );
1148 CHECK_EQUAL( n, 4 );
1152 unsigned short i = -1;
1154 CHECK_EQUAL( sscanf( string + 31, "%hx%n", &i, &n ), 1 );
1155 CHECK_EQUAL( i, 32767 );
1156 CHECK_EQUAL( n, 4 );
1159 // reading -0x7fff, x
1160 unsigned short i = -1;
1162 CHECK_EQUAL( sscanf( string + 28, "%hx%n", &i, &n ), 1 );
1163 CHECK_FEQUAL( i, -32767, unsigned short, "%hu" );
1164 CHECK_EQUAL( n, 7 );
1167 // reading 0x8000, i
1168 signed short i = -1;
1170 CHECK_EQUAL( sscanf( string + 36, "%hi%n", &i, &n ), 1 );
1171 CHECK_FEQUAL( i, -32768, signed short, "%hd" );
1172 CHECK_EQUAL( n, 6 );
1176 unsigned short i = -1;
1178 CHECK_EQUAL( sscanf( string + 45, "%hx%n", &i, &n ), 1 );
1179 CHECK_EQUAL( i, 65535 );
1180 CHECK_EQUAL( n, 4 );
1183 // reading 0xffff, x
1184 unsigned short i = -1;
1186 CHECK_EQUAL( sscanf( string + 43, "%hx%n", &i, &n ), 1 );
1187 CHECK_EQUAL( i, 65535 );
1188 CHECK_EQUAL( n, 6 );
1191 // reading 0xffff, i
1194 CHECK_EQUAL( sscanf( string + 43, "%hi%n", &i, &n ), 1 );
1195 CHECK_FEQUAL( i, -1, signed short, "%hd" );
1196 CHECK_EQUAL( n, 6 );
1200 unsigned int i = -1;
1202 CHECK_EQUAL( sscanf( string + 3, "%x%n", &i, &n ), 1 );
1203 CHECK_EQUAL( i, 0 );
1204 CHECK_EQUAL( n, 1 );
1208 unsigned int i = -1;
1210 CHECK_EQUAL( sscanf( string + 0, "%x%n", &i, &n ), 1 );
1211 CHECK_EQUAL( i, 0 );
1212 CHECK_EQUAL( n, 4 );
1216 unsigned int i = -1;
1218 CHECK_EQUAL( sscanf( string + 142, "%x%n", &i, &n ), 1 );
1219 CHECK_EQUAL( i, 0 );
1220 CHECK_EQUAL( n, 3 );
1224 unsigned int i = -1;
1226 CHECK_EQUAL( sscanf( string + 5, "%x%n", &i, &n ), 1 );
1227 CHECK_EQUAL( i, 0 );
1228 CHECK_EQUAL( n, 6 );
1234 CHECK_EQUAL( sscanf( string + 0, "%i%n", &i, &n ), 1 );
1235 CHECK_EQUAL( i, 0 );
1236 CHECK_EQUAL( n, 4 );
1239 // reading 7fffffff, x
1240 unsigned int i = -1;
1242 CHECK_EQUAL( sscanf( string + 53, "%x%n", &i, &n ), 1 );
1243 CHECK_EQUAL( i, 2147483647 );
1244 CHECK_EQUAL( n, 8 );
1247 // reading -0x7fffffff, x
1248 unsigned int i = -1;
1250 CHECK_EQUAL( sscanf( string + 50, "%x%n", &i, &n ), 1 );
1251 CHECK_FEQUAL( i, -2147483647, unsigned int, "%u" );
1252 CHECK_EQUAL( n, 11 );
1255 // reading 0x80000000, i
1258 CHECK_EQUAL( sscanf( string + 62, "%i%n", &i, &n ), 1 );
1259 CHECK_FEQUAL( i, 2147483647, signed int, "%d" ); // NOT overflowing, see strtol() specs.
1260 CHECK_EQUAL( n, 10 );
1263 // reading ffffffff, x
1264 unsigned int i = -1;
1266 CHECK_EQUAL( sscanf( string + 75, "%x%n", &i, &n ), 1 );
1267 CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" );
1268 CHECK_EQUAL( n, 8 );
1271 // reading 0xffffffff, x
1272 unsigned int i = -1;
1274 CHECK_EQUAL( sscanf( string + 73, "%x%n", &i, &n ), 1 );
1275 CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" );
1276 CHECK_EQUAL( n, 10 );
1279 // reading 0xffffffff, i
1282 CHECK_EQUAL( sscanf( string + 73, "%i%n", &i, &n ), 1 );
1283 CHECK_FEQUAL( i, 2147483647, signed int, "%d" ); // NOT overflowing; see strtol() specs.
1284 CHECK_EQUAL( n, 10 );
1288 // octal integer matches
1291 char const * string = "+0000 -0000 +0177 +0377 -0377 +077777 +0177777\n"
1292 "-0177777 +017777777777 +037777777777\n"
1293 "-037777777777 +0777777777777777777777\n"
1294 "+01777777777777777777777\n"
1295 "-01777777777777777777777\n";
1296 CHECK_EQUAL( string[171], '\n' );
1299 unsigned char i = -1;
1301 CHECK_EQUAL( sscanf( string + 4, "%hho%n", &i, &n ), 1 );
1302 CHECK_EQUAL( i, 0u );
1303 CHECK_EQUAL( n, 1 );
1307 unsigned char i = -1;
1309 CHECK_EQUAL( sscanf( string + 0, "%hho%n", &i, &n ), 1 );
1310 CHECK_EQUAL( i, 0u );
1311 CHECK_EQUAL( n, 5 );
1315 unsigned char i = -1;
1317 CHECK_EQUAL( sscanf( string + 6, "%hho%n", &i, &n ), 1 );
1318 CHECK_EQUAL( i, 0u );
1319 CHECK_EQUAL( n, 5 );
1323 unsigned char i = -1;
1325 CHECK_EQUAL( sscanf( string + 13, "%hho%n", &i, &n ), 1 );
1326 CHECK_EQUAL( i, 127u );
1327 CHECK_EQUAL( n, 4 );
1331 unsigned char i = -1;
1333 CHECK_EQUAL( sscanf( string + 12, "%hho%n", &i, &n ), 1 );
1334 CHECK_EQUAL( i, 127u );
1335 CHECK_EQUAL( n, 5 );
1339 unsigned char i = -1;
1341 CHECK_EQUAL( sscanf( string + 19, "%hho%n", &i, &n ), 1 );
1342 CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" );
1343 CHECK_EQUAL( n, 4 );
1347 unsigned char i = -1;
1349 CHECK_EQUAL( sscanf( string + 18, "%hho%n", &i, &n ), 1 );
1350 CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" );
1351 CHECK_EQUAL( n, 5 );
1355 unsigned char i = -1;
1357 CHECK_EQUAL( sscanf( string + 24, "%hho%n", &i, &n ), 1 );
1358 CHECK_FEQUAL( i, 1u, unsigned char, "%hhu" );
1359 CHECK_EQUAL( n, 5 );
1362 // reading 077777, o
1363 unsigned short i = -1;
1365 CHECK_EQUAL( sscanf( string + 31, "%ho%n", &i, &n ), 1 );
1366 CHECK_EQUAL( i, 32767u );
1367 CHECK_EQUAL( n, 6 );
1370 // reading +077777, o
1371 unsigned short i = -1;
1373 CHECK_EQUAL( sscanf( string + 30, "%ho%n", &i, &n ), 1 );
1374 CHECK_EQUAL( i, 32767u );
1375 CHECK_EQUAL( n, 7 );
1378 // reading 0177777, o
1379 unsigned short i = -1;
1381 CHECK_EQUAL( sscanf( string + 39, "%ho%n", &i, &n ), 1 );
1382 CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" );
1383 CHECK_EQUAL( n, 7 );
1386 // reading +0177777, o
1387 unsigned short i = -1;
1389 CHECK_EQUAL( sscanf( string + 38, "%ho%n", &i, &n ), 1 );
1390 CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" );
1391 CHECK_EQUAL( n, 8 );
1394 // reading -0177777, o
1395 unsigned short i = -1;
1397 CHECK_EQUAL( sscanf( string + 47, "%ho%n", &i, &n ), 1 );
1398 CHECK_FEQUAL( i, 1u, unsigned short, "%hu" );
1399 CHECK_EQUAL( n, 8 );
1402 // reading 017777777777, o
1403 unsigned int i = -1;
1405 CHECK_EQUAL( sscanf( string + 57, "%o%n", &i, &n ), 1 );
1406 CHECK_EQUAL( i, 2147483647u );
1407 CHECK_EQUAL( n, 12 );
1410 // reading +017777777777, o
1411 unsigned int i = -1;
1413 CHECK_EQUAL( sscanf( string + 56, "%o%n", &i, &n ), 1 );
1414 CHECK_EQUAL( i, 2147483647u );
1415 CHECK_EQUAL( n, 13 );
1418 // reading 037777777777, o
1419 unsigned int i = -1;
1421 CHECK_EQUAL( sscanf( string + 71, "%o%n", &i, &n ), 1 );
1422 CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" );
1423 CHECK_EQUAL( n, 12 );
1426 // reading +037777777777, o
1427 unsigned int i = -1;
1429 CHECK_EQUAL( sscanf( string + 70, "%o%n", &i, &n ), 1 );
1430 CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" );
1431 CHECK_EQUAL( n, 13 );
1434 // reading -037777777777, o
1435 unsigned int i = -1;
1437 CHECK_EQUAL( sscanf( string + 84, "%o%n", &i, &n ), 1 );
1438 CHECK_FEQUAL( i, 1u, unsigned int, "%u" );
1439 CHECK_EQUAL( n, 13 );
1442 // reading 017777777777, o
1443 unsigned long i = -1;
1445 CHECK_EQUAL( sscanf( string + 57, "%lo%n", &i, &n ), 1 );
1446 CHECK_EQUAL( i, 2147483647lu );
1447 CHECK_EQUAL( n, 12 );
1450 // reading +017777777777, o
1451 unsigned long i = -1;
1453 CHECK_EQUAL( sscanf( string + 56, "%lo%n", &i, &n ), 1 );
1454 CHECK_EQUAL( i, 2147483647lu );
1455 CHECK_EQUAL( n, 13 );
1458 // reading 037777777777, o
1459 unsigned long i = -1;
1461 CHECK_EQUAL( sscanf( string + 71, "%lo%n", &i, &n ), 1 );
1462 CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" );
1463 CHECK_EQUAL( n, 12 );
1466 // reading +037777777777, o
1467 unsigned long i = -1;
1469 CHECK_EQUAL( sscanf( string + 70, "%lo%n", &i, &n ), 1 );
1470 CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" );
1471 CHECK_EQUAL( n, 13 );
1474 // reading -037777777777, o
1475 unsigned long i = -1;
1477 CHECK_EQUAL( sscanf( string + 84, "%lo%n", &i, &n ), 1 );
1478 CHECK_FEQUAL( i, 1lu, unsigned long, "%lu" );
1479 CHECK_EQUAL( n, 13 );
1482 // reading 0777777777777777777777, o
1483 unsigned long long i = -1;
1485 CHECK_EQUAL( sscanf( string + 99, "%llo%n", &i, &n ), 1 );
1486 CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" );
1487 CHECK_EQUAL( n, 22 );
1490 // reading +0777777777777777777777, o
1491 unsigned long long i = -1;
1493 CHECK_EQUAL( sscanf( string + 98, "%llo%n", &i, &n ), 1 );
1494 CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" );
1495 CHECK_EQUAL( n, 23 );
1498 // reading 01777777777777777777777, o
1499 unsigned long long i = -1;
1501 CHECK_EQUAL( sscanf( string + 123, "%llo%n", &i, &n ), 1 );
1502 CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" );
1503 CHECK_EQUAL( n, 23 );
1506 // reading +01777777777777777777777, o
1507 unsigned long long i = -1;
1509 CHECK_EQUAL( sscanf( string + 122, "%llo%n", &i, &n ), 1 );
1510 CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" );
1511 CHECK_EQUAL( n, 24 );
1514 // reading -01777777777777777777777, o
1515 unsigned long long i = -1;
1517 CHECK_EQUAL( sscanf( string + 147, "%llo%n", &i, &n ), 1 );
1518 CHECK_FEQUAL( i, 1llu, unsigned long long, "%llu" );
1519 CHECK_EQUAL( n, 24 );
1526 char const * string = "abcdefgh-ijklmnop[qrs%uvw]xyz";
1527 CHECK_EQUAL( string[28], 'z' );
1528 size_t const BUFSIZE = 29;
1529 char buffer[ BUFSIZE ];
1532 memset( buffer, '\0', BUFSIZE );
1534 CHECK_EQUAL( sscanf( string + 0, "%[abc]%n", buffer, &n ), 1 );
1535 CHECK_EQUAL( n, 3 );
1536 CHECK_FALSE( memcmp( buffer, "abc", n + 1 ) );
1540 memset( buffer, '\0', BUFSIZE );
1542 CHECK_EQUAL( sscanf( string + 0, "%[a-c]%n", buffer, &n ), 1 );
1543 CHECK_EQUAL( n, 3 );
1544 CHECK_FALSE( memcmp( buffer, "abc", n + 1 ) );
1548 memset( buffer, '\0', BUFSIZE );
1550 CHECK_EQUAL( sscanf( string + 0, "%[a-h]%n", buffer, &n ), 1 );
1551 CHECK_EQUAL( n, 8 );
1552 CHECK_FALSE( memcmp( buffer, "abcdefgh", n + 1 ) );
1555 // reading o-r, including [, seperate char
1556 memset( buffer, '\0', BUFSIZE );
1558 CHECK_EQUAL( sscanf( string + 15, "%[[o-qr]%n", buffer, &n ), 1 );
1559 CHECK_EQUAL( n, 5 );
1560 CHECK_FALSE( memcmp( buffer, "op[qr", n + 1 ) );
1563 // reading v-y, including ], two groups
1564 memset( buffer, '\0', BUFSIZE );
1566 CHECK_EQUAL( sscanf( string + 23, "%[]v-wx-y]%n", buffer, &n ), 1 );
1567 CHECK_EQUAL( n, 5 );
1568 CHECK_FALSE( memcmp( buffer, "vw]xy", n + 1 ) );
1571 // missing on first character
1572 memset( buffer, '\0', BUFSIZE );
1574 CHECK_EQUAL( sscanf( string + 0, "%[b]%n", buffer, &n ), 0 );
1575 CHECK_FALSE( memcmp( buffer, "", 1 ) );
1578 // eof while reading, two groups
1579 memset( buffer, '\0', BUFSIZE );
1581 CHECK_EQUAL( sscanf( string + 27, "%[a-zA-Z]%n", buffer, &n ), 1 );
1582 CHECK_EQUAL( n, 2 );
1583 CHECK_FALSE( memcmp( buffer, "yz", n + 1 ) );
1586 // eof before reading
1587 memset( buffer, '\0', BUFSIZE );
1589 CHECK_EQUAL( sscanf( string + 29, "%[a-z]%n", buffer, &n ), -1 );
1590 CHECK_FALSE( memcmp( buffer, "", 1 ) );
1593 // negation - [^...]
1594 memset( buffer, '\0', BUFSIZE );
1596 CHECK_EQUAL( sscanf( string + 0, "%[^d-f]%n", buffer, &n ), 1 );
1597 CHECK_EQUAL( n, 3 );
1598 CHECK_FALSE( memcmp( buffer, "abc", 4 ) );