3 /* fscanf( FILE *, 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 fscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... )
18 va_start( ap, format );
19 rc = vfscanf( stream, format, ap );
27 #include <_PDCLIB_test.h>
31 #include <_PDCLIB_aux.h>
34 #define CHECK_TRUE( a ) do { if ( a == 0 ) { fprintf( stderr, "Unexpected failure in " _PDCLIB_symbol2string( __LINE__ ) ": '" #a "' evaluated to false.\n" ); } } while ( 0 )
35 #define CHECK_FALSE( a ) do { if ( a != 0 ) { fprintf( stderr, "Unexpected failure in " _PDCLIB_symbol2string( __LINE__ ) ": '" #a "' evaluated to true.\n" ); } } while ( 0 )
36 #define CHECK_EQUAL( a, b ) do { int x = a; int y = b; if ( x != y ) { fprintf( stderr, "Mismatch in " _PDCLIB_symbol2string( __LINE__ ) ": result is %d, expected %d.\n", x, y ); } } while ( 0 )
37 #define CHECK_FEQUAL( a, b, T, F ) do { T x = a; T y = b; if ( x != y ) { fprintf( stderr, "Mismatch in " _PDCLIB_symbol2string( __LINE__ ) ": result is " F ", expected " F ".\n", x, y ); } } while ( 0 )
40 #define CHECK_TRUE( a ) TESTCASE( a != 0 )
41 #define CHECK_FALSE( a ) TESTCASE( a == 0 )
42 #define CHECK_EQUAL( a, b ) do { int x = a; int y = b; TESTCASE( x == y ); } while ( 0 )
43 #define CHECK_FEQUAL( a, b, T, F ) do { T x = a; T y = b; TESTCASE( x == y ); } while ( 0 )
45 // literal matches, character matches, and basic integer matches
46 void suite_one( void );
47 // decimal integer matches
48 void suite_two( void );
49 // hexadecimal integer matches
50 void suite_three( void );
51 // octal integer matches
52 void suite_four( void );
54 void suite_five( void );
65 // literal matches, character matches, and basic integer matches
69 if ( ( file = fopen( "tmpfile", "wb+" ) ) == NULL )
71 puts( "Failed to open tmpfile for writing." );
74 fprintf( file, "1234567890" );
75 fprintf( file, "1%c3-5+7%c9%c", 0, 0, -1 );
76 fprintf( file, "2 4 6 8 0%c", 255 );
77 fprintf( file, "1 \011 5%%%% 0" );
78 CHECK_EQUAL( ftell( file ), 40 );
80 // -----------------------------------------------------------------------
82 // -----------------------------------------------------------------------
84 // matching six characters literally
86 // should report six characters read
87 fseek( file, 0, SEEK_SET );
89 CHECK_EQUAL( fscanf( file, "123456%n", &n ), 0 );
91 CHECK_EQUAL( ftell( file ), 6 );
94 // matching a character, three whitespace chars, and another character
96 // should report five characters read
97 fseek( file, 30, SEEK_SET );
99 CHECK_EQUAL( fscanf( file, "1 5%n", &n ), 0 );
101 CHECK_EQUAL( ftell( file ), 35 );
104 // matching three characters, not matching whitespaces, and matching another three characters
106 // should report six characters matched
107 fseek( file, 0, SEEK_SET );
109 CHECK_EQUAL( fscanf( file, "123 456%n", &n ), 0 );
111 CHECK_EQUAL( ftell( file ), 6 );
114 // matching a character, two '%' characters, and two whitespaces
116 // should report five characters matched
117 fseek( file, 34, SEEK_SET );
119 CHECK_EQUAL( fscanf( file, "5%%%% %n", &n ), 0 );
121 CHECK_EQUAL( ftell( file ), 39 );
124 // seeking to last character in file, trying to match that char and a whitespace
126 // should report one character matched and EOF
127 fseek( file, -1, SEEK_END );
129 CHECK_EQUAL( fscanf( file, "0 %n", &n ), 0 );
131 CHECK_TRUE( feof( file ) );
132 CHECK_FALSE( ferror( file ) );
133 CHECK_EQUAL( ftell( file ), 40 );
136 // seeking to end of file, trying to match a -1
138 // should report error, not executing %n
139 fseek( file, 0, SEEK_END );
141 CHECK_EQUAL( fscanf( file, "\377%n", &n ), -1 );
142 CHECK_EQUAL( n, -1 );
143 CHECK_TRUE( feof( file ) );
144 CHECK_FALSE( ferror( file ) );
145 CHECK_EQUAL( ftell( file ), 40 );
148 // -----------------------------------------------------------------------
149 // Character matching ('%c')
150 // -----------------------------------------------------------------------
152 // reading a char array of specified width, including zero bytes
153 // should report the characters read, no zero termination of the array
154 fseek( file, 10, SEEK_SET );
156 memset( buffer, '\177', 8 );
157 CHECK_EQUAL( fscanf( file, "%7c", buffer ), 1 );
158 CHECK_FALSE( memcmp( buffer, "1\0003-5+7\177", 8 ) );
159 CHECK_EQUAL( ftell( file ), 17 );
162 // reading a char array of unspecified width when positioned at -1 value
163 // should default to width one, read the -1 value, no zero termination of the array
164 fseek( file, 19, SEEK_SET );
166 memset( buffer, '\177', 2 );
167 CHECK_EQUAL( fscanf( file, "%c", buffer ), 1 );
168 CHECK_FALSE( memcmp( buffer, "\377\177", 2 ) );
169 CHECK_EQUAL( ftell( file ), 20 );
172 // reading a char array of specified width 1 when positioned at (non-space) whitespace
173 // should read the whitespace (literally), no zero termination of the array
174 fseek( file, 32, SEEK_SET );
176 memset( buffer, '\177', 2 );
177 CHECK_EQUAL( fscanf( file, "%1c", buffer ), 1 );
178 CHECK_FALSE( memcmp( buffer, "\011\177", 2 ) );
179 CHECK_EQUAL( ftell( file ), 33 );
182 // reading a char array of specified width 2 when positioned at last char of file
183 // should read the character, and report EOF
184 fseek( file, -1, SEEK_END );
186 memset( buffer, '\177', 2 );
187 CHECK_EQUAL( fscanf( file, "%2c", buffer ), 1 );
188 CHECK_FALSE( memcmp( buffer, "0\177", 2 ) );
189 CHECK_TRUE( feof( file ) );
190 CHECK_FALSE( ferror( file ) );
191 CHECK_EQUAL( ftell( file ), 40 );
194 // reading a char array of specified width 1 when positioned at last char of file
195 // should read the character, and NOT report EOF
196 fseek( file, -1, SEEK_END );
198 memset( buffer, '\177', 2 );
199 CHECK_EQUAL( fscanf( file, "%1c", buffer ), 1 );
200 CHECK_FALSE( memcmp( buffer, "0\177", 2 ) );
201 CHECK_FALSE( feof( file ) );
202 CHECK_EQUAL( ftell( file ), 40 );
205 // reading a char array of specified width 1 when positioned at EOF
206 // should report input error before any conversion (-1)
207 fseek( file, 0, SEEK_END );
209 memset( buffer, '\177', 2 );
210 CHECK_EQUAL( fscanf( file, "%1c", buffer ), -1 );
211 CHECK_FALSE( memcmp( buffer, "\177\177", 2 ) );
212 CHECK_TRUE( feof( file ) );
213 CHECK_FALSE( ferror( file ) );
214 CHECK_EQUAL( ftell( file ), 40 );
217 // -----------------------------------------------------------------------
218 // Integer matching ('%d')
219 // -----------------------------------------------------------------------
221 // reading a whitespace-terminated integer
222 fseek( file, 20, SEEK_SET );
225 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
228 CHECK_EQUAL( ftell( file ), 21 );
231 // reading a -1 terminated integer
232 fseek( file, 18, SEEK_SET );
235 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
238 CHECK_EQUAL( ftell( file ), 19 );
241 // reading a EOF terminated integer
242 fseek( file, -1, SEEK_END );
245 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
248 CHECK_EQUAL( ftell( file ), 40 );
251 // trying to read an integer when positioned at whitespace
252 // should skip whitespaces
253 fseek( file, 32, SEEK_SET );
256 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
259 CHECK_EQUAL( ftell( file ), 35 );
262 // trying to read an integer when positioned at -1 value
263 // should report matching failure
264 fseek( file, 19, SEEK_SET );
267 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 0 );
269 CHECK_EQUAL( n, -1 );
270 CHECK_EQUAL( ftell( file ), 19 );
273 // trying to read an integer when positioned at EOF
274 // should report reading failure
275 fseek( file, 0, SEEK_END );
278 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), -1 );
280 CHECK_EQUAL( n, -1 );
281 CHECK_EQUAL( ftell( file ), 40 );
284 // reading a '-'-prefixed integer
285 fseek( file, 13, SEEK_SET );
288 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
289 CHECK_EQUAL( i, -5 );
291 CHECK_EQUAL( ftell( file ), 15 );
294 // reading a '+'-prefixed integer
295 fseek( file, 15, SEEK_SET );
298 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
301 CHECK_EQUAL( ftell( file ), 17 );
308 // decimal integer matches
312 if ( ( file = fopen( "tmpfile", "wb+" ) ) == NULL )
314 puts( "Failed to open tmpfile for writing." );
317 fprintf( file, "-0 +0 -128 +127 +255 -32768 +32767 +65535\n" );
318 fprintf( file, "-2147483648 +2147483647 +4294967295\n" );
319 fprintf( file, "-9223372036854775808 +9223372036854775807 +18446744073709551615\n" );
320 CHECK_EQUAL( ftell( file ), 142 );
323 fseek( file, 1, SEEK_SET );
326 CHECK_EQUAL( fscanf( file, "%hhd%n", &i, &n ), 1 );
329 CHECK_EQUAL( ftell( file ), 2 );
333 fseek( file, 0, SEEK_SET );
336 CHECK_EQUAL( fscanf( file, "%hhd%n", &i, &n ), 1 );
339 CHECK_EQUAL( ftell( file ), 2 );
343 fseek( file, 3, SEEK_SET );
346 CHECK_EQUAL( fscanf( file, "%hhd%n", &i, &n ), 1 );
349 CHECK_EQUAL( ftell( file ), 5 );
353 fseek( file, 6, SEEK_SET );
356 CHECK_EQUAL( fscanf( file, "%hhd%n", &i, &n ), 1 );
357 CHECK_EQUAL( i, -128 );
359 CHECK_EQUAL( ftell( file ), 10 );
363 fseek( file, 12, SEEK_SET );
366 CHECK_EQUAL( fscanf( file, "%hhd%n", &i, &n ), 1 );
367 CHECK_EQUAL( i, 127 );
369 CHECK_EQUAL( ftell( file ), 15 );
373 fseek( file, 11, SEEK_SET );
376 CHECK_EQUAL( fscanf( file, "%hhd%n", &i, &n ), 1 );
377 CHECK_EQUAL( i, 127 );
379 CHECK_EQUAL( ftell( file ), 15 );
383 fseek( file, 1, SEEK_SET );
384 unsigned char i = -1;
386 CHECK_EQUAL( fscanf( file, "%hhu%n", &i, &n ), 1 );
389 CHECK_EQUAL( ftell( file ), 2 );
393 fseek( file, 0, SEEK_SET );
394 unsigned char i = -1;
396 CHECK_EQUAL( fscanf( file, "%hhu%n", &i, &n ), 1 );
399 CHECK_EQUAL( ftell( file ), 2 );
403 fseek( file, 3, SEEK_SET );
404 unsigned char i = -1;
406 CHECK_EQUAL( fscanf( file, "%hhu%n", &i, &n ), 1 );
409 CHECK_EQUAL( ftell( file ), 5 );
413 fseek( file, 12, SEEK_SET );
414 unsigned char i = -1;
416 CHECK_EQUAL( fscanf( file, "%hhu%n", &i, &n ), 1 );
417 CHECK_EQUAL( i, 127 );
419 CHECK_EQUAL( ftell( file ), 15 );
423 fseek( file, 11, SEEK_SET );
424 unsigned char i = -1;
426 CHECK_EQUAL( fscanf( file, "%hhu%n", &i, &n ), 1 );
427 CHECK_EQUAL( i, 127 );
429 CHECK_EQUAL( ftell( file ), 15 );
433 fseek( file, 17, SEEK_SET );
436 CHECK_EQUAL( fscanf( file, "%hhu%n", &i, &n ), 1 );
437 CHECK_EQUAL( i, 255 );
439 CHECK_EQUAL( ftell( file ), 20 );
443 fseek( file, 16, SEEK_SET );
446 CHECK_EQUAL( fscanf( file, "%hhu%n", &i, &n ), 1 );
447 CHECK_EQUAL( i, 255 );
449 CHECK_EQUAL( ftell( file ), 20 );
453 fseek( file, 1, SEEK_SET );
456 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
459 CHECK_EQUAL( ftell( file ), 2 );
463 fseek( file, 0, SEEK_SET );
466 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
469 CHECK_EQUAL( ftell( file ), 2 );
473 fseek( file, 3, SEEK_SET );
476 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
479 CHECK_EQUAL( ftell( file ), 5 );
483 fseek( file, 6, SEEK_SET );
486 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
487 CHECK_EQUAL( i, -128 );
489 CHECK_EQUAL( ftell( file ), 10 );
493 fseek( file, 12, SEEK_SET );
496 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
497 CHECK_EQUAL( i, 127 );
499 CHECK_EQUAL( ftell( file ), 15 );
503 fseek( file, 11, SEEK_SET );
506 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
507 CHECK_EQUAL( i, 127 );
509 CHECK_EQUAL( ftell( file ), 15 );
513 fseek( file, 1, SEEK_SET );
516 CHECK_EQUAL( fscanf( file, "%hd%n", &i, &n ), 1 );
519 CHECK_EQUAL( ftell( file ), 2 );
523 fseek( file, 0, SEEK_SET );
526 CHECK_EQUAL( fscanf( file, "%hd%n", &i, &n ), 1 );
529 CHECK_EQUAL( ftell( file ), 2 );
533 fseek( file, 3, SEEK_SET );
536 CHECK_EQUAL( fscanf( file, "%hd%n", &i, &n ), 1 );
539 CHECK_EQUAL( ftell( file ), 5 );
543 fseek( file, 21, SEEK_SET );
546 CHECK_EQUAL( fscanf( file, "%hd%n", &i, &n ), 1 );
547 CHECK_EQUAL( i, -32768 );
549 CHECK_EQUAL( ftell( file ), 27 );
553 fseek( file, 29, SEEK_SET );
556 CHECK_EQUAL( fscanf( file, "%hd%n", &i, &n ), 1 );
557 CHECK_EQUAL( i, 32767 );
559 CHECK_EQUAL( ftell( file ), 34 );
563 fseek( file, 28, SEEK_SET );
566 CHECK_EQUAL( fscanf( file, "%hd%n", &i, &n ), 1 );
567 CHECK_EQUAL( i, 32767 );
569 CHECK_EQUAL( ftell( file ), 34 );
573 fseek( file, 1, SEEK_SET );
574 unsigned short i = -1;
576 CHECK_EQUAL( fscanf( file, "%hu%n", &i, &n ), 1 );
579 CHECK_EQUAL( ftell( file ), 2 );
583 fseek( file, 0, SEEK_SET );
584 unsigned short i = -1;
586 CHECK_EQUAL( fscanf( file, "%hu%n", &i, &n ), 1 );
589 CHECK_EQUAL( ftell( file ), 2 );
593 fseek( file, 3, SEEK_SET );
594 unsigned short i = -1;
596 CHECK_EQUAL( fscanf( file, "%hu%n", &i, &n ), 1 );
599 CHECK_EQUAL( ftell( file ), 5 );
603 fseek( file, 29, SEEK_SET );
604 unsigned short i = -1;
606 CHECK_EQUAL( fscanf( file, "%hu%n", &i, &n ), 1 );
607 CHECK_EQUAL( i, 32767 );
609 CHECK_EQUAL( ftell( file ), 34 );
613 fseek( file, 28, SEEK_SET );
614 unsigned short i = -1;
616 CHECK_EQUAL( fscanf( file, "%hu%n", &i, &n ), 1 );
617 CHECK_EQUAL( i, 32767 );
619 CHECK_EQUAL( ftell( file ), 34 );
623 fseek( file, 36, SEEK_SET );
624 unsigned short i = 0;
626 CHECK_EQUAL( fscanf( file, "%hu%n", &i, &n ), 1 );
627 CHECK_EQUAL( i, 65535 );
629 CHECK_EQUAL( ftell( file ), 41 );
633 fseek( file, 35, SEEK_SET );
634 unsigned short i = 0;
636 CHECK_EQUAL( fscanf( file, "%hu%n", &i, &n ), 1 );
637 CHECK_EQUAL( i, 65535 );
639 CHECK_EQUAL( ftell( file ), 41 );
643 fseek( file, 1, SEEK_SET );
646 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
649 CHECK_EQUAL( ftell( file ), 2 );
653 fseek( file, 0, SEEK_SET );
656 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
659 CHECK_EQUAL( ftell( file ), 2 );
663 fseek( file, 3, SEEK_SET );
666 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
669 CHECK_EQUAL( ftell( file ), 5 );
673 fseek( file, 21, SEEK_SET );
676 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
677 CHECK_EQUAL( i, -32768 );
679 CHECK_EQUAL( ftell( file ), 27 );
683 fseek( file, 29, SEEK_SET );
686 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
687 CHECK_EQUAL( i, 32767 );
689 CHECK_EQUAL( ftell( file ), 34 );
693 fseek( file, 28, SEEK_SET );
696 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
697 CHECK_EQUAL( i, 32767 );
699 CHECK_EQUAL( ftell( file ), 34 );
703 fseek( file, 1, SEEK_SET );
706 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
709 CHECK_EQUAL( ftell( file ), 2 );
713 fseek( file, 0, SEEK_SET );
716 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
719 CHECK_EQUAL( ftell( file ), 2 );
723 fseek( file, 3, SEEK_SET );
726 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
729 CHECK_EQUAL( ftell( file ), 5 );
732 // reading -2147483648, d
733 fseek( file, 42, SEEK_SET );
736 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
737 CHECK_EQUAL( i, -2147483648 );
738 CHECK_EQUAL( n, 11 );
739 CHECK_EQUAL( ftell( file ), 53 );
742 // reading 2147483647, d
743 fseek( file, 55, SEEK_SET );
746 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
747 CHECK_EQUAL( i, 2147483647 );
748 CHECK_EQUAL( n, 10 );
749 CHECK_EQUAL( ftell( file ), 65 );
752 // reading +2147483647, d
753 fseek( file, 54, SEEK_SET );
756 CHECK_EQUAL( fscanf( file, "%d%n", &i, &n ), 1 );
757 CHECK_EQUAL( i, 2147483647 );
758 CHECK_EQUAL( n, 11 );
759 CHECK_EQUAL( ftell( file ), 65 );
763 fseek( file, 1, SEEK_SET );
766 CHECK_EQUAL( fscanf( file, "%u%n", &i, &n ), 1 );
769 CHECK_EQUAL( ftell( file ), 2 );
773 fseek( file, 0, SEEK_SET );
776 CHECK_EQUAL( fscanf( file, "%u%n", &i, &n ), 1 );
779 CHECK_EQUAL( ftell( file ), 2 );
783 fseek( file, 3, SEEK_SET );
786 CHECK_EQUAL( fscanf( file, "%u%n", &i, &n ), 1 );
789 CHECK_EQUAL( ftell( file ), 5 );
792 // reading 2147483647, u
793 fseek( file, 55, SEEK_SET );
796 CHECK_EQUAL( fscanf( file, "%u%n", &i, &n ), 1 );
797 CHECK_EQUAL( i, 2147483647 );
798 CHECK_EQUAL( n, 10 );
799 CHECK_EQUAL( ftell( file ), 65 );
802 // reading +2147483647, u
803 fseek( file, 54, SEEK_SET );
806 CHECK_EQUAL( fscanf( file, "%u%n", &i, &n ), 1 );
807 CHECK_EQUAL( i, 2147483647 );
808 CHECK_EQUAL( n, 11 );
809 CHECK_EQUAL( ftell( file ), 65 );
812 // reading 4294967295, u
813 fseek( file, 67, SEEK_SET );
816 CHECK_EQUAL( fscanf( file, "%u%n", &i, &n ), 1 );
817 CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" );
818 CHECK_EQUAL( n, 10 );
819 CHECK_EQUAL( ftell( file ), 77 );
822 // reading +4294967295, u
823 fseek( file, 66, SEEK_SET );
826 CHECK_EQUAL( fscanf( file, "%u%n", &i, &n ), 1 );
827 CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" );
828 CHECK_EQUAL( n, 11 );
829 CHECK_EQUAL( ftell( file ), 77 );
833 fseek( file, 1, SEEK_SET );
836 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
839 CHECK_EQUAL( ftell( file ), 2 );
843 fseek( file, 0, SEEK_SET );
846 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
849 CHECK_EQUAL( ftell( file ), 2 );
853 fseek( file, 3, SEEK_SET );
856 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
859 CHECK_EQUAL( ftell( file ), 5 );
862 // reading -2147483648, i
863 fseek( file, 42, SEEK_SET );
866 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
867 CHECK_EQUAL( i, -2147483648 );
868 CHECK_EQUAL( n, 11 );
869 CHECK_EQUAL( ftell( file ), 53 );
872 // reading 2147483647, i
873 fseek( file, 55, SEEK_SET );
876 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
877 CHECK_EQUAL( i, 2147483647 );
878 CHECK_EQUAL( n, 10 );
879 CHECK_EQUAL( ftell( file ), 65 );
882 // reading +2147483647, i
883 fseek( file, 54, SEEK_SET );
886 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
887 CHECK_EQUAL( i, 2147483647 );
888 CHECK_EQUAL( n, 11 );
889 CHECK_EQUAL( ftell( file ), 65 );
893 fseek( file, 1, SEEK_SET );
896 CHECK_EQUAL( fscanf( file, "%ld%n", &i, &n ), 1 );
897 CHECK_EQUAL( i, 0l );
899 CHECK_EQUAL( ftell( file ), 2 );
903 fseek( file, 0, SEEK_SET );
906 CHECK_EQUAL( fscanf( file, "%ld%n", &i, &n ), 1 );
907 CHECK_EQUAL( i, 0l );
909 CHECK_EQUAL( ftell( file ), 2 );
913 fseek( file, 3, SEEK_SET );
916 CHECK_EQUAL( fscanf( file, "%ld%n", &i, &n ), 1 );
917 CHECK_EQUAL( i, 0l );
919 CHECK_EQUAL( ftell( file ), 5 );
922 // reading -2147483648, d
923 fseek( file, 42, SEEK_SET );
926 CHECK_EQUAL( fscanf( file, "%ld%n", &i, &n ), 1 );
927 CHECK_EQUAL( i, -2147483648l );
928 CHECK_EQUAL( n, 11 );
929 CHECK_EQUAL( ftell( file ), 53 );
932 // reading 2147483647, d
933 fseek( file, 55, SEEK_SET );
936 CHECK_EQUAL( fscanf( file, "%ld%n", &i, &n ), 1 );
937 CHECK_EQUAL( i, 2147483647l );
938 CHECK_EQUAL( n, 10 );
939 CHECK_EQUAL( ftell( file ), 65 );
942 // reading +2147483647, d
943 fseek( file, 54, SEEK_SET );
946 CHECK_EQUAL( fscanf( file, "%ld%n", &i, &n ), 1 );
947 CHECK_EQUAL( i, 2147483647l );
948 CHECK_EQUAL( n, 11 );
949 CHECK_EQUAL( ftell( file ), 65 );
953 fseek( file, 1, SEEK_SET );
954 unsigned long i = -1;
956 CHECK_EQUAL( fscanf( file, "%lu%n", &i, &n ), 1 );
957 CHECK_EQUAL( i, 0ul );
959 CHECK_EQUAL( ftell( file ), 2 );
963 fseek( file, 0, SEEK_SET );
964 unsigned long i = -1;
966 CHECK_EQUAL( fscanf( file, "%lu%n", &i, &n ), 1 );
967 CHECK_EQUAL( i, 0ul );
969 CHECK_EQUAL( ftell( file ), 2 );
973 fseek( file, 3, SEEK_SET );
974 unsigned long i = -1;
976 CHECK_EQUAL( fscanf( file, "%lu%n", &i, &n ), 1 );
977 CHECK_EQUAL( i, 0ul );
979 CHECK_EQUAL( ftell( file ), 5 );
982 // reading 2147483647, u
983 fseek( file, 55, SEEK_SET );
984 unsigned long i = -1;
986 CHECK_EQUAL( fscanf( file, "%lu%n", &i, &n ), 1 );
987 CHECK_EQUAL( i, 2147483647ul );
988 CHECK_EQUAL( n, 10 );
989 CHECK_EQUAL( ftell( file ), 65 );
992 // reading +2147483647, u
993 fseek( file, 54, SEEK_SET );
994 unsigned long i = -1;
996 CHECK_EQUAL( fscanf( file, "%lu%n", &i, &n ), 1 );
997 CHECK_EQUAL( i, 2147483647ul );
998 CHECK_EQUAL( n, 11 );
999 CHECK_EQUAL( ftell( file ), 65 );
1002 // reading 4294967295, u
1003 fseek( file, 67, SEEK_SET );
1004 unsigned long i = 0;
1006 CHECK_EQUAL( fscanf( file, "%lu%n", &i, &n ), 1 );
1007 CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" );
1008 CHECK_EQUAL( n, 10 );
1009 CHECK_EQUAL( ftell( file ), 77 );
1012 // reading +4294967295, u
1013 fseek( file, 66, SEEK_SET );
1014 unsigned long i = 0;
1016 CHECK_EQUAL( fscanf( file, "%lu%n", &i, &n ), 1 );
1017 CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" );
1018 CHECK_EQUAL( n, 11 );
1019 CHECK_EQUAL( ftell( file ), 77 );
1023 fseek( file, 1, SEEK_SET );
1026 CHECK_EQUAL( fscanf( file, "%li%n", &i, &n ), 1 );
1027 CHECK_EQUAL( i, 0l );
1028 CHECK_EQUAL( n, 1 );
1029 CHECK_EQUAL( ftell( file ), 2 );
1033 fseek( file, 0, SEEK_SET );
1036 CHECK_EQUAL( fscanf( file, "%li%n", &i, &n ), 1 );
1037 CHECK_EQUAL( i, 0l );
1038 CHECK_EQUAL( n, 2 );
1039 CHECK_EQUAL( ftell( file ), 2 );
1043 fseek( file, 3, SEEK_SET );
1046 CHECK_EQUAL( fscanf( file, "%li%n", &i, &n ), 1 );
1047 CHECK_EQUAL( i, 0l );
1048 CHECK_EQUAL( n, 2 );
1049 CHECK_EQUAL( ftell( file ), 5 );
1052 // reading -2147483648, i
1053 fseek( file, 42, SEEK_SET );
1056 CHECK_EQUAL( fscanf( file, "%li%n", &i, &n ), 1 );
1057 CHECK_EQUAL( i, -2147483648l );
1058 CHECK_EQUAL( n, 11 );
1059 CHECK_EQUAL( ftell( file ), 53 );
1062 // reading 2147483647, i
1063 fseek( file, 55, SEEK_SET );
1066 CHECK_EQUAL( fscanf( file, "%li%n", &i, &n ), 1 );
1067 CHECK_EQUAL( i, 2147483647l );
1068 CHECK_EQUAL( n, 10 );
1069 CHECK_EQUAL( ftell( file ), 65 );
1072 // reading +2147483647, i
1073 fseek( file, 54, SEEK_SET );
1076 CHECK_EQUAL( fscanf( file, "%li%n", &i, &n ), 1 );
1077 CHECK_EQUAL( i, 2147483647l );
1078 CHECK_EQUAL( n, 11 );
1079 CHECK_EQUAL( ftell( file ), 65 );
1083 fseek( file, 1, SEEK_SET );
1084 signed long long i = -1;
1086 CHECK_EQUAL( fscanf( file, "%lld%n", &i, &n ), 1 );
1087 CHECK_EQUAL( i, 0ll );
1088 CHECK_EQUAL( n, 1 );
1089 CHECK_EQUAL( ftell( file ), 2 );
1093 fseek( file, 0, SEEK_SET );
1094 signed long long i = -1;
1096 CHECK_EQUAL( fscanf( file, "%lld%n", &i, &n ), 1 );
1097 CHECK_EQUAL( i, 0ll );
1098 CHECK_EQUAL( n, 2 );
1099 CHECK_EQUAL( ftell( file ), 2 );
1103 fseek( file, 3, SEEK_SET );
1104 signed long long i = -1;
1106 CHECK_EQUAL( fscanf( file, "%lld%n", &i, &n ), 1 );
1107 CHECK_EQUAL( i, 0ll );
1108 CHECK_EQUAL( n, 2 );
1109 CHECK_EQUAL( ftell( file ), 5 );
1112 // reading -9223372036854775808, d
1113 fseek( file, 78, SEEK_SET );
1114 signed long long i = -1;
1116 CHECK_EQUAL( fscanf( file, "%lld%n", &i, &n ), 1 );
1117 CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lld" ); // should be literal -9223372036854775808ll but GCC balks.
1118 CHECK_EQUAL( i < 0ll, 1 );
1119 CHECK_EQUAL( n, 20 );
1120 CHECK_EQUAL( ftell( file ), 98 );
1123 // reading 9223372036854775807, d
1124 fseek( file, 100, SEEK_SET );
1125 signed long long i = -1;
1127 CHECK_EQUAL( fscanf( file, "%lld%n", &i, &n ), 1 );
1128 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lld" );
1129 CHECK_EQUAL( n, 19 );
1130 CHECK_EQUAL( ftell( file ), 119 );
1133 // reading +9223372036854775807, d
1134 fseek( file, 99, SEEK_SET );
1135 signed long long i = -1;
1137 CHECK_EQUAL( fscanf( file, "%lld%n", &i, &n ), 1 );
1138 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lld" );
1139 CHECK_EQUAL( n, 20 );
1140 CHECK_EQUAL( ftell( file ), 119 );
1144 fseek( file, 1, SEEK_SET );
1145 unsigned long long i = -1;
1147 CHECK_EQUAL( fscanf( file, "%llu%n", &i, &n ), 1 );
1148 CHECK_EQUAL( i, 0ull );
1149 CHECK_EQUAL( n, 1 );
1150 CHECK_EQUAL( ftell( file ), 2 );
1154 fseek( file, 0, SEEK_SET );
1155 unsigned long long i = -1;
1157 CHECK_EQUAL( fscanf( file, "%llu%n", &i, &n ), 1 );
1158 CHECK_EQUAL( i, 0ull );
1159 CHECK_EQUAL( n, 2 );
1160 CHECK_EQUAL( ftell( file ), 2 );
1164 fseek( file, 3, SEEK_SET );
1165 unsigned long long i = -1;
1167 CHECK_EQUAL( fscanf( file, "%llu%n", &i, &n ), 1 );
1168 CHECK_EQUAL( i, 0ull );
1169 CHECK_EQUAL( n, 2 );
1170 CHECK_EQUAL( ftell( file ), 5 );
1173 // reading 9223372036854775807, u
1174 fseek( file, 100, SEEK_SET );
1175 unsigned long long i = -1;
1177 CHECK_EQUAL( fscanf( file, "%llu%n", &i, &n ), 1 );
1178 CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" );
1179 CHECK_EQUAL( n, 19 );
1180 CHECK_EQUAL( ftell( file ), 119 );
1183 // reading +9223372036854775807, u
1184 fseek( file, 99, SEEK_SET );
1185 unsigned long long i = -1;
1187 CHECK_EQUAL( fscanf( file, "%llu%n", &i, &n ), 1 );
1188 CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" );
1189 CHECK_EQUAL( n, 20 );
1190 CHECK_EQUAL( ftell( file ), 119 );
1193 // reading 18446744073709551615, u
1194 fseek( file, 121, SEEK_SET );
1195 unsigned long long i = 0;
1197 CHECK_EQUAL( fscanf( file, "%llu%n", &i, &n ), 1 );
1198 CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" );
1199 CHECK_EQUAL( n, 20 );
1200 CHECK_EQUAL( ftell( file ), 141 );
1203 // reading +18446744073709551615, u
1204 fseek( file, 120, SEEK_SET );
1205 unsigned long long i = 0;
1207 CHECK_EQUAL( fscanf( file, "%llu%n", &i, &n ), 1 );
1208 CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" );
1209 CHECK_EQUAL( n, 21 );
1210 CHECK_EQUAL( ftell( file ), 141 );
1214 fseek( file, 1, SEEK_SET );
1215 signed long long i = -1;
1217 CHECK_EQUAL( fscanf( file, "%lli%n", &i, &n ), 1 );
1218 CHECK_EQUAL( i, 0ll );
1219 CHECK_EQUAL( n, 1 );
1220 CHECK_EQUAL( ftell( file ), 2 );
1224 fseek( file, 0, SEEK_SET );
1225 signed long long i = -1;
1227 CHECK_EQUAL( fscanf( file, "%lli%n", &i, &n ), 1 );
1228 CHECK_EQUAL( i, 0ll );
1229 CHECK_EQUAL( n, 2 );
1230 CHECK_EQUAL( ftell( file ), 2 );
1234 fseek( file, 3, SEEK_SET );
1235 signed long long i = -1;
1237 CHECK_EQUAL( fscanf( file, "%lli%n", &i, &n ), 1 );
1238 CHECK_EQUAL( i, 0ll );
1239 CHECK_EQUAL( n, 2 );
1240 CHECK_EQUAL( ftell( file ), 5 );
1243 // reading -9223372036854775808, i
1244 fseek( file, 78, SEEK_SET );
1245 signed long long i = -1;
1247 CHECK_EQUAL( fscanf( file, "%lli%n", &i, &n ), 1 );
1248 CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks.
1249 CHECK_EQUAL( i < 0ll, 1 );
1250 CHECK_EQUAL( n, 20 );
1251 CHECK_EQUAL( ftell( file ), 98 );
1254 // reading 9223372036854775807, i
1255 fseek( file, 100, SEEK_SET );
1256 signed long long i = -1;
1258 CHECK_EQUAL( fscanf( file, "%lli%n", &i, &n ), 1 );
1259 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" );
1260 CHECK_EQUAL( n, 19 );
1261 CHECK_EQUAL( ftell( file ), 119 );
1264 // reading +9223372036854775807, i
1265 fseek( file, 99, SEEK_SET );
1266 signed long long i = -1;
1268 CHECK_EQUAL( fscanf( file, "%lli%n", &i, &n ), 1 );
1269 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" );
1270 CHECK_EQUAL( n, 20 );
1271 CHECK_EQUAL( ftell( file ), 119 );
1275 remove( "tmpfile" );
1278 // hexadecimal integer matches
1282 if ( ( file = fopen( "tmpfile", "wb+" ) ) == NULL )
1284 puts( "Failed to open tmpfile for writing." );
1287 fprintf( file, "-0x0 -0x000 -0x7f 0x80 0xff -0x7fff 0x8000 0xffff -0x7fffffff 0x80000000 0xffffffff\n" );
1288 fprintf( file, "-0x7fffffffffffffff 0x8000000000000000 0xffffffffffffffff -0x\n" );
1289 CHECK_EQUAL( ftell( file ), 146 );
1292 fseek( file, 3, SEEK_SET );
1293 unsigned char i = -1;
1295 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1296 CHECK_EQUAL( i, 0 );
1297 CHECK_EQUAL( n, 1 );
1298 CHECK_EQUAL( ftell( file ), 4 );
1302 fseek( file, 0, SEEK_SET );
1303 unsigned char i = -1;
1305 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1306 CHECK_EQUAL( i, 0 );
1307 CHECK_EQUAL( n, 4 );
1308 CHECK_EQUAL( ftell( file ), 4 );
1312 fseek( file, -4, SEEK_END );
1313 unsigned char i = -1;
1315 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1316 CHECK_EQUAL( i, 0 );
1317 CHECK_EQUAL( n, 3 );
1318 CHECK_EQUAL( ftell( file ), 145 );
1322 fseek( file, 5, SEEK_SET );
1323 unsigned char i = -1;
1325 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1326 CHECK_EQUAL( i, 0 );
1327 CHECK_EQUAL( n, 6 );
1328 CHECK_EQUAL( ftell( file ), 11 );
1332 fseek( file, 0, SEEK_SET );
1335 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
1336 CHECK_EQUAL( i, 0 );
1337 CHECK_EQUAL( n, 4 );
1338 CHECK_EQUAL( ftell( file ), 4 );
1342 fseek( file, 15, SEEK_SET );
1343 unsigned char i = -1;
1345 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1346 CHECK_EQUAL( i, 127 );
1347 CHECK_EQUAL( n, 2 );
1348 CHECK_EQUAL( ftell( file ), 17 );
1352 fseek( file, 12, SEEK_SET );
1353 unsigned char i = -1;
1355 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1356 CHECK_FEQUAL( i, -127, unsigned char, "%hhu" );
1357 CHECK_EQUAL( n, 5 );
1358 CHECK_EQUAL( ftell( file ), 17 );
1362 fseek( file, 18, SEEK_SET );
1365 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
1366 CHECK_FEQUAL( i, -128, signed char, "%hd" );
1367 CHECK_EQUAL( n, 4 );
1368 CHECK_EQUAL( ftell( file ), 22 );
1372 fseek( file, 25, SEEK_SET );
1373 unsigned char i = -1;
1375 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1376 CHECK_EQUAL( i, 0xff );
1377 CHECK_EQUAL( n, 2 );
1378 CHECK_EQUAL( ftell( file ), 27 );
1382 fseek( file, 23, SEEK_SET );
1383 unsigned char i = -1;
1385 CHECK_EQUAL( fscanf( file, "%hhx%n", &i, &n ), 1 );
1386 CHECK_EQUAL( i, 255 );
1387 CHECK_EQUAL( n, 4 );
1388 CHECK_EQUAL( ftell( file ), 27 );
1392 fseek( file, 23, SEEK_SET );
1395 CHECK_EQUAL( fscanf( file, "%hhi%n", &i, &n ), 1 );
1396 CHECK_EQUAL( i, -1 );
1397 CHECK_EQUAL( n, 4 );
1398 CHECK_EQUAL( ftell( file ), 27 );
1402 fseek( file, 3, SEEK_SET );
1403 unsigned short i = -1;
1405 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1406 CHECK_EQUAL( i, 0 );
1407 CHECK_EQUAL( n, 1 );
1408 CHECK_EQUAL( ftell( file ), 4 );
1412 fseek( file, 0, SEEK_SET );
1413 unsigned short i = -1;
1415 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1416 CHECK_EQUAL( i, 0 );
1417 CHECK_EQUAL( n, 4 );
1418 CHECK_EQUAL( ftell( file ), 4 );
1422 fseek( file, -4, SEEK_END );
1423 unsigned short i = -1;
1425 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1426 CHECK_EQUAL( i, 0 );
1427 CHECK_EQUAL( n, 3 );
1428 CHECK_EQUAL( ftell( file ), 145 );
1432 fseek( file, 5, SEEK_SET );
1433 unsigned short i = -1;
1435 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1436 CHECK_EQUAL( i, 0 );
1437 CHECK_EQUAL( n, 6 );
1438 CHECK_EQUAL( ftell( file ), 11 );
1442 fseek( file, 0, SEEK_SET );
1443 signed short i = -1;
1445 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
1446 CHECK_EQUAL( i, 0 );
1447 CHECK_EQUAL( n, 4 );
1448 CHECK_EQUAL( ftell( file ), 4 );
1452 fseek( file, 31, SEEK_SET );
1453 unsigned short i = -1;
1455 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1456 CHECK_EQUAL( i, 32767 );
1457 CHECK_EQUAL( n, 4 );
1458 CHECK_EQUAL( ftell( file ), 35 );
1461 // reading -0x7fff, x
1462 fseek( file, 28, SEEK_SET );
1463 unsigned short i = -1;
1465 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1466 CHECK_FEQUAL( i, -32767, unsigned short, "%hu" );
1467 CHECK_EQUAL( n, 7 );
1468 CHECK_EQUAL( ftell( file ), 35 );
1471 // reading 0x8000, i
1472 fseek( file, 36, SEEK_SET );
1473 signed short i = -1;
1475 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
1476 CHECK_FEQUAL( i, -32768, signed short, "%hd" );
1477 CHECK_EQUAL( n, 6 );
1478 CHECK_EQUAL( ftell( file ), 42 );
1482 fseek( file, 45, SEEK_SET );
1483 unsigned short i = -1;
1485 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1486 CHECK_EQUAL( i, 65535 );
1487 CHECK_EQUAL( n, 4 );
1488 CHECK_EQUAL( ftell( file ), 49 );
1491 // reading 0xffff, x
1492 fseek( file, 43, SEEK_SET );
1493 unsigned short i = -1;
1495 CHECK_EQUAL( fscanf( file, "%hx%n", &i, &n ), 1 );
1496 CHECK_EQUAL( i, 65535 );
1497 CHECK_EQUAL( n, 6 );
1498 CHECK_EQUAL( ftell( file ), 49 );
1501 // reading 0xffff, i
1502 fseek( file, 43, SEEK_SET );
1505 CHECK_EQUAL( fscanf( file, "%hi%n", &i, &n ), 1 );
1506 CHECK_FEQUAL( i, -1, signed short, "%hd" );
1507 CHECK_EQUAL( n, 6 );
1508 CHECK_EQUAL( ftell( file ), 49 );
1512 fseek( file, 3, SEEK_SET );
1513 unsigned int i = -1;
1515 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1516 CHECK_EQUAL( i, 0 );
1517 CHECK_EQUAL( n, 1 );
1518 CHECK_EQUAL( ftell( file ), 4 );
1522 fseek( file, 0, SEEK_SET );
1523 unsigned int i = -1;
1525 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1526 CHECK_EQUAL( i, 0 );
1527 CHECK_EQUAL( n, 4 );
1528 CHECK_EQUAL( ftell( file ), 4 );
1532 fseek( file, -4, SEEK_END );
1533 unsigned int i = -1;
1535 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1536 CHECK_EQUAL( i, 0 );
1537 CHECK_EQUAL( n, 3 );
1538 CHECK_EQUAL( ftell( file ), 145 );
1542 fseek( file, 5, SEEK_SET );
1543 unsigned int i = -1;
1545 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1546 CHECK_EQUAL( i, 0 );
1547 CHECK_EQUAL( n, 6 );
1548 CHECK_EQUAL( ftell( file ), 11 );
1552 fseek( file, 0, SEEK_SET );
1555 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
1556 CHECK_EQUAL( i, 0 );
1557 CHECK_EQUAL( n, 4 );
1558 CHECK_EQUAL( ftell( file ), 4 );
1561 // reading 7fffffff, x
1562 fseek( file, 53, SEEK_SET );
1563 unsigned int i = -1;
1565 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1566 CHECK_EQUAL( i, 2147483647 );
1567 CHECK_EQUAL( n, 8 );
1568 CHECK_EQUAL( ftell( file ), 61 );
1571 // reading -0x7fffffff, x
1572 fseek( file, 50, SEEK_SET );
1573 unsigned int i = -1;
1575 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1576 CHECK_FEQUAL( i, -2147483647, unsigned int, "%u" );
1577 CHECK_EQUAL( n, 11 );
1578 CHECK_EQUAL( ftell( file ), 61 );
1581 // reading 0x80000000, i
1582 fseek( file, 62, SEEK_SET );
1585 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
1586 CHECK_FEQUAL( i, 2147483647, signed int, "%d" ); // NOT overflowing, see strtol() specs.
1587 CHECK_EQUAL( n, 10 );
1588 CHECK_EQUAL( ftell( file ), 72 );
1591 // reading ffffffff, x
1592 fseek( file, 75, SEEK_SET );
1593 unsigned int i = -1;
1595 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1596 CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" );
1597 CHECK_EQUAL( n, 8 );
1598 CHECK_EQUAL( ftell( file ), 83 );
1601 // reading 0xffffffff, x
1602 fseek( file, 73, SEEK_SET );
1603 unsigned int i = -1;
1605 CHECK_EQUAL( fscanf( file, "%x%n", &i, &n ), 1 );
1606 CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" );
1607 CHECK_EQUAL( n, 10 );
1608 CHECK_EQUAL( ftell( file ), 83 );
1611 // reading 0xffffffff, i
1612 fseek( file, 73, SEEK_SET );
1615 CHECK_EQUAL( fscanf( file, "%i%n", &i, &n ), 1 );
1616 CHECK_FEQUAL( i, 2147483647, signed int, "%d" ); // NOT overflowing; see strtol() specs.
1617 CHECK_EQUAL( n, 10 );
1618 CHECK_EQUAL( ftell( file ), 83 );
1621 remove( "tmpfile" );
1624 // octal integer matches
1628 if ( ( file = fopen( "tmpfile", "wb+" ) ) == NULL )
1630 puts( "Failed to open tmpfile for writing." );
1633 fprintf( file, "+0000 -0000 +0177 +0377 -0377 +077777 +0177777 -0177777\n" );
1634 fprintf( file, "+017777777777 +037777777777 -037777777777\n" );
1635 fprintf( file, "+0777777777777777777777 +01777777777777777777777\n" );
1636 fprintf( file, "-01777777777777777777777\n" );
1637 CHECK_EQUAL( ftell( file ), 172 );
1640 fseek( file, 4, SEEK_SET );
1641 unsigned char i = -1;
1643 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1644 CHECK_EQUAL( i, 0u );
1645 CHECK_EQUAL( n, 1 );
1646 CHECK_EQUAL( ftell( file ), 5 );
1650 fseek( file, 0, SEEK_SET );
1651 unsigned char i = -1;
1653 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1654 CHECK_EQUAL( i, 0u );
1655 CHECK_EQUAL( n, 5 );
1656 CHECK_EQUAL( ftell( file ), 5 );
1660 fseek( file, 6, SEEK_SET );
1661 unsigned char i = -1;
1663 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1664 CHECK_EQUAL( i, 0u );
1665 CHECK_EQUAL( n, 5 );
1666 CHECK_EQUAL( ftell( file ), 11 );
1670 fseek( file, 13, SEEK_SET );
1671 unsigned char i = -1;
1673 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1674 CHECK_EQUAL( i, 127u );
1675 CHECK_EQUAL( n, 4 );
1676 CHECK_EQUAL( ftell( file ), 17 );
1680 fseek( file, 12, SEEK_SET );
1681 unsigned char i = -1;
1683 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1684 CHECK_EQUAL( i, 127u );
1685 CHECK_EQUAL( n, 5 );
1686 CHECK_EQUAL( ftell( file ), 17 );
1690 fseek( file, 19, SEEK_SET );
1691 unsigned char i = -1;
1693 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1694 CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" );
1695 CHECK_EQUAL( n, 4 );
1696 CHECK_EQUAL( ftell( file ), 23 );
1700 fseek( file, 18, SEEK_SET );
1701 unsigned char i = -1;
1703 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1704 CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" );
1705 CHECK_EQUAL( n, 5 );
1706 CHECK_EQUAL( ftell( file ), 23 );
1710 fseek( file, 24, SEEK_SET );
1711 unsigned char i = -1;
1713 CHECK_EQUAL( fscanf( file, "%hho%n", &i, &n ), 1 );
1714 CHECK_FEQUAL( i, 1u, unsigned char, "%hhu" );
1715 CHECK_EQUAL( n, 5 );
1716 CHECK_EQUAL( ftell( file ), 29 );
1719 // reading 077777, o
1720 fseek( file, 31, SEEK_SET );
1721 unsigned short i = -1;
1723 CHECK_EQUAL( fscanf( file, "%ho%n", &i, &n ), 1 );
1724 CHECK_EQUAL( i, 32767u );
1725 CHECK_EQUAL( n, 6 );
1726 CHECK_EQUAL( ftell( file ), 37 );
1729 // reading +077777, o
1730 fseek( file, 30, SEEK_SET );
1731 unsigned short i = -1;
1733 CHECK_EQUAL( fscanf( file, "%ho%n", &i, &n ), 1 );
1734 CHECK_EQUAL( i, 32767u );
1735 CHECK_EQUAL( n, 7 );
1736 CHECK_EQUAL( ftell( file ), 37 );
1739 // reading 0177777, o
1740 fseek( file, 39, SEEK_SET );
1741 unsigned short i = -1;
1743 CHECK_EQUAL( fscanf( file, "%ho%n", &i, &n ), 1 );
1744 CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" );
1745 CHECK_EQUAL( n, 7 );
1746 CHECK_EQUAL( ftell( file ), 46 );
1749 // reading +0177777, o
1750 fseek( file, 38, SEEK_SET );
1751 unsigned short i = -1;
1753 CHECK_EQUAL( fscanf( file, "%ho%n", &i, &n ), 1 );
1754 CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" );
1755 CHECK_EQUAL( n, 8 );
1756 CHECK_EQUAL( ftell( file ), 46 );
1759 // reading -0177777, o
1760 fseek( file, 47, SEEK_SET );
1761 unsigned short i = -1;
1763 CHECK_EQUAL( fscanf( file, "%ho%n", &i, &n ), 1 );
1764 CHECK_FEQUAL( i, 1u, unsigned short, "%hu" );
1765 CHECK_EQUAL( n, 8 );
1766 CHECK_EQUAL( ftell( file ), 55 );
1769 // reading 017777777777, o
1770 fseek( file, 57, SEEK_SET );
1771 unsigned int i = -1;
1773 CHECK_EQUAL( fscanf( file, "%o%n", &i, &n ), 1 );
1774 CHECK_EQUAL( i, 2147483647u );
1775 CHECK_EQUAL( n, 12 );
1776 CHECK_EQUAL( ftell( file ), 69 );
1779 // reading +017777777777, o
1780 fseek( file, 56, SEEK_SET );
1781 unsigned int i = -1;
1783 CHECK_EQUAL( fscanf( file, "%o%n", &i, &n ), 1 );
1784 CHECK_EQUAL( i, 2147483647u );
1785 CHECK_EQUAL( n, 13 );
1786 CHECK_EQUAL( ftell( file ), 69 );
1789 // reading 037777777777, o
1790 fseek( file, 71, SEEK_SET );
1791 unsigned int i = -1;
1793 CHECK_EQUAL( fscanf( file, "%o%n", &i, &n ), 1 );
1794 CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" );
1795 CHECK_EQUAL( n, 12 );
1796 CHECK_EQUAL( ftell( file ), 83 );
1799 // reading +037777777777, o
1800 fseek( file, 70, SEEK_SET );
1801 unsigned int i = -1;
1803 CHECK_EQUAL( fscanf( file, "%o%n", &i, &n ), 1 );
1804 CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" );
1805 CHECK_EQUAL( n, 13 );
1806 CHECK_EQUAL( ftell( file ), 83 );
1809 // reading -037777777777, o
1810 fseek( file, 84, SEEK_SET );
1811 unsigned int i = -1;
1813 CHECK_EQUAL( fscanf( file, "%o%n", &i, &n ), 1 );
1814 CHECK_FEQUAL( i, 1u, unsigned int, "%u" );
1815 CHECK_EQUAL( n, 13 );
1816 CHECK_EQUAL( ftell( file ), 97 );
1819 // reading 017777777777, o
1820 fseek( file, 57, SEEK_SET );
1821 unsigned long i = -1;
1823 CHECK_EQUAL( fscanf( file, "%lo%n", &i, &n ), 1 );
1824 CHECK_EQUAL( i, 2147483647lu );
1825 CHECK_EQUAL( n, 12 );
1826 CHECK_EQUAL( ftell( file ), 69 );
1829 // reading +017777777777, o
1830 fseek( file, 56, SEEK_SET );
1831 unsigned long i = -1;
1833 CHECK_EQUAL( fscanf( file, "%lo%n", &i, &n ), 1 );
1834 CHECK_EQUAL( i, 2147483647lu );
1835 CHECK_EQUAL( n, 13 );
1836 CHECK_EQUAL( ftell( file ), 69 );
1839 // reading 037777777777, o
1840 fseek( file, 71, SEEK_SET );
1841 unsigned long i = -1;
1843 CHECK_EQUAL( fscanf( file, "%lo%n", &i, &n ), 1 );
1844 CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" );
1845 CHECK_EQUAL( n, 12 );
1846 CHECK_EQUAL( ftell( file ), 83 );
1849 // reading +037777777777, o
1850 fseek( file, 70, SEEK_SET );
1851 unsigned long i = -1;
1853 CHECK_EQUAL( fscanf( file, "%lo%n", &i, &n ), 1 );
1854 CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" );
1855 CHECK_EQUAL( n, 13 );
1856 CHECK_EQUAL( ftell( file ), 83 );
1859 // reading -037777777777, o
1860 fseek( file, 84, SEEK_SET );
1861 unsigned long i = -1;
1863 CHECK_EQUAL( fscanf( file, "%lo%n", &i, &n ), 1 );
1864 CHECK_FEQUAL( i, 1lu, unsigned long, "%lu" );
1865 CHECK_EQUAL( n, 13 );
1866 CHECK_EQUAL( ftell( file ), 97 );
1869 // reading 0777777777777777777777, o
1870 fseek( file, 99, SEEK_SET );
1871 unsigned long long i = -1;
1873 CHECK_EQUAL( fscanf( file, "%llo%n", &i, &n ), 1 );
1874 CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" );
1875 CHECK_EQUAL( n, 22 );
1876 CHECK_EQUAL( ftell( file ), 121 );
1879 // reading +0777777777777777777777, o
1880 fseek( file, 98, SEEK_SET );
1881 unsigned long long i = -1;
1883 CHECK_EQUAL( fscanf( file, "%llo%n", &i, &n ), 1 );
1884 CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" );
1885 CHECK_EQUAL( n, 23 );
1886 CHECK_EQUAL( ftell( file ), 121 );
1889 // reading 01777777777777777777777, o
1890 fseek( file, 123, SEEK_SET );
1891 unsigned long long i = -1;
1893 CHECK_EQUAL( fscanf( file, "%llo%n", &i, &n ), 1 );
1894 CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" );
1895 CHECK_EQUAL( n, 23 );
1896 CHECK_EQUAL( ftell( file ), 146 );
1899 // reading +01777777777777777777777, o
1900 fseek( file, 122, SEEK_SET );
1901 unsigned long long i = -1;
1903 CHECK_EQUAL( fscanf( file, "%llo%n", &i, &n ), 1 );
1904 CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" );
1905 CHECK_EQUAL( n, 24 );
1906 CHECK_EQUAL( ftell( file ), 146 );
1909 // reading -01777777777777777777777, o
1910 fseek( file, 147, SEEK_SET );
1911 unsigned long long i = -1;
1913 CHECK_EQUAL( fscanf( file, "%llo%n", &i, &n ), 1 );
1914 CHECK_FEQUAL( i, 1llu, unsigned long long, "%llu" );
1915 CHECK_EQUAL( n, 24 );
1916 CHECK_EQUAL( ftell( file ), 171 );
1919 remove( "tmpfile" );
1925 int const BUFSIZE = 1000;
1927 if ( ( file = fopen( "tmpfile", "wb+" ) ) == NULL )
1929 puts( "Failed to open tmpfile for writing." );
1932 fprintf( file, "abcdefgh-ijklmnop[qrs%%uvw]xyz" );
1933 CHECK_EQUAL( ftell( file ), 29 );
1934 char buffer[ BUFSIZE ];
1937 fseek( file, 0, SEEK_SET );
1938 memset( buffer, '\0', BUFSIZE );
1940 CHECK_EQUAL( fscanf( file, "%[abc]%n", buffer, &n ), 1 );
1941 CHECK_EQUAL( n, 3 );
1942 CHECK_FALSE( memcmp( buffer, "abc", n + 1 ) );
1943 CHECK_EQUAL( ftell( file ), 3 );
1947 fseek( file, 0, SEEK_SET );
1948 memset( buffer, '\0', BUFSIZE );
1950 CHECK_EQUAL( fscanf( file, "%[a-c]%n", buffer, &n ), 1 );
1951 CHECK_EQUAL( n, 3 );
1952 CHECK_FALSE( memcmp( buffer, "abc", n + 1 ) );
1953 CHECK_EQUAL( ftell( file ), 3 );
1957 fseek( file, 0, SEEK_SET );
1958 memset( buffer, '\0', BUFSIZE );
1960 CHECK_EQUAL( fscanf( file, "%[a-h]%n", buffer, &n ), 1 );
1961 CHECK_EQUAL( n, 8 );
1962 CHECK_FALSE( memcmp( buffer, "abcdefgh", n + 1 ) );
1963 CHECK_EQUAL( ftell( file ), 8 );
1966 // reading o-r, including [, seperate char
1967 fseek( file, 15, SEEK_SET );
1968 memset( buffer, '\0', BUFSIZE );
1970 CHECK_EQUAL( fscanf( file, "%[[o-qr]%n", buffer, &n ), 1 );
1971 CHECK_EQUAL( n, 5 );
1972 CHECK_FALSE( memcmp( buffer, "op[qr", n + 1 ) );
1973 CHECK_EQUAL( ftell( file ), 20 );
1976 // reading v-y, including ], two groups
1977 fseek( file, 23, SEEK_SET );
1978 memset( buffer, '\0', BUFSIZE );
1980 CHECK_EQUAL( fscanf( file, "%[]v-wx-y]%n", buffer, &n ), 1 );
1981 CHECK_EQUAL( n, 5 );
1982 CHECK_FALSE( memcmp( buffer, "vw]xy", n + 1 ) );
1983 CHECK_EQUAL( ftell( file ), 28 );
1986 // missing on first character
1987 fseek( file, 0, SEEK_SET );
1988 memset( buffer, '\0', BUFSIZE );
1990 CHECK_EQUAL( fscanf( file, "%[b]%n", buffer, &n ), 0 );
1991 CHECK_FALSE( memcmp( buffer, "", 1 ) );
1992 CHECK_EQUAL( ftell( file ), 0 );
1995 // eof while reading, two groups
1996 fseek( file, 27, SEEK_SET );
1997 memset( buffer, '\0', BUFSIZE );
1999 CHECK_EQUAL( fscanf( file, "%[a-zA-Z]%n", buffer, &n ), 1 );
2000 CHECK_EQUAL( n, 2 );
2001 CHECK_FALSE( memcmp( buffer, "yz", n + 1 ) );
2002 CHECK_TRUE( feof( file ) );
2003 CHECK_FALSE( ferror( file ) );
2004 CHECK_EQUAL( ftell( file ), 29 );
2007 // eof before reading
2008 fseek( file, 29, SEEK_SET );
2009 memset( buffer, '\0', BUFSIZE );
2011 CHECK_EQUAL( fscanf( file, "%[a-z]%n", buffer, &n ), -1 );
2012 CHECK_FALSE( memcmp( buffer, "", 1 ) );
2013 CHECK_TRUE( feof( file ) );
2014 CHECK_FALSE( ferror( file ) );
2015 CHECK_EQUAL( ftell( file ), 29 );
2018 // negation - [^...]
2019 fseek( file, 0, SEEK_SET );
2020 memset( buffer, '\0', BUFSIZE );
2022 CHECK_EQUAL( fscanf( file, "%[^d-f]%n", buffer, &n ), 1 );
2023 CHECK_EQUAL( n, 3 );
2024 CHECK_FALSE( memcmp( buffer, "abc", 4 ) );
2025 CHECK_EQUAL( ftell( file ), 3 );
2028 remove( "tmpfile" );
2032 char scanstring[] = " 1 23\00045\000\00067 ";
2034 void scantest( int testnr, FILE * fh, size_t position, char const * format,
2035 int expected_fscan_rc, char const * expected_fscan_output, size_t expected_fscan_length,
2036 int expected_sscan_rc, char const * expected_sscan_output, size_t expected_sscan_length )
2039 printf( "Test %d\n", testnr );
2040 TESTCASE( memset( buffer, -1, 15 ) == buffer );
2041 TESTCASE( fseek( fh, position, SEEK_SET ) == 0 );
2042 TESTCASE( fscanf( fh, format, buffer ) == expected_fscan_rc );
2043 TESTCASE( memcmp( buffer, expected_fscan_output, expected_fscan_length ) == 0 );
2044 TESTCASE( memset( buffer, -1, 15 ) == buffer );
2045 TESTCASE( sscanf( scanstring + position, format, buffer ) == expected_sscan_rc );
2046 TESTCASE( memcmp( buffer, expected_sscan_output, expected_sscan_length ) == 0 );
2052 TESTCASE( ( fh = fopen( "testfile", "w+" ) ) != NULL );
2053 TESTCASE( fwrite( scanstring, 14, 1, fh ) == 1 );
2056 /* %14c - full scan */
2057 scantest( 1, fh, 0, "%14c",
2058 1, " 1 23\00045\000\00067 \377", 15,
2059 1, " 1 23\377", 7 );
2061 /* %c - default to one, reading whitespace */
2062 scantest( 2, fh, 0, "%c",
2066 /* %1c - reading zero byte */
2067 scantest( 3, fh, 9, "%1c",
2071 /* %0c - NOT reading EOF */
2072 scantest( 4, fh, 13, "%0c",
2076 TESTCASE( fclose( fh ) == 0 );
2077 //TESTCASE( remove( "testfile" ) == 0 );
2079 return TEST_RESULTS;