1 // -----------------------------------------------------------------------
3 // -----------------------------------------------------------------------
5 // matching six characters literally
6 // should report six characters read
7 TESTSCAN( 0, 6, general, 0, "123456" );
10 // matching a character, three whitespace chars, and another character
11 // should report five characters read
12 TESTSCAN( 0, 5, general, 30, "1 5" );
15 // matching three characters, not matching whitespaces, and matching another three characters
16 // should report six characters matched
17 TESTSCAN( 0, 6, general, 0, "123 456" );
20 // matching a character, two '%' characters, and two whitespaces
21 // should report five characters matched
22 TESTSCAN( 0, 5, general, 34, "5%%%% " );
25 // seeking to last character in file, trying to match that char and a whitespace
26 // should report one character matched and EOF
27 TESTSCAN( 0, 1, general, 39, "0 " );
30 // seeking to end of file, trying to match a -1
31 // should report error, not executing %n
32 TESTSCAN( 0, 1, general, 40, "\377" );
35 // -----------------------------------------------------------------------
36 // Character matching ('%c')
37 // -----------------------------------------------------------------------
39 // reading a char array of specified width, including zero bytes
40 // should report the characters read up to first zero
42 memset( buffer, '\177', 8 );
43 TESTSCAN( 1, 1, general, 10, "%7c", buffer );
44 CHECK_FALSE( memcmp( buffer, "1\177\177", 3 ) );
47 // reading a char array of unspecified width when positioned at -1 value
48 // should default to width one, read the -1 value, no zero termination of the array
50 memset( buffer, '\177', 2 );
51 TESTSCAN( 1, 1, general, 19, "%c", buffer );
52 CHECK_FALSE( memcmp( buffer, "\377\177", 2 ) );
55 // reading a char array of specified width 1 when positioned at (non-space) whitespace
56 // should read the whitespace (literally), no zero termination of the array
58 memset( buffer, '\177', 2 );
59 TESTSCAN( 1, 1, general, 32, "%1c", buffer );
60 CHECK_FALSE( memcmp( buffer, "\011\177", 2 ) );
63 // reading a char array of specified width 2 when positioned at last char of file
64 // should read the character, and report EOF
66 memset( buffer, '\177', 2 );
67 TESTSCAN( 1, 1, general, 39, "%2c", buffer );
68 CHECK_FALSE( memcmp( buffer, "0\177", 2 ) );
71 // reading a char array of specified width 1 when positioned at last char of file
72 // should read the character, and NOT report EOF
74 memset( buffer, '\177', 2 );
75 TESTSCAN( 1, 1, general, 39, "%1c", buffer );
76 CHECK_FALSE( memcmp( buffer, "0\177", 2 ) );
79 // reading a char array of specified width 1 when positioned at EOF
80 // should report input error before any conversion (-1)
82 memset( buffer, '\177', 2 );
83 TESTSCAN( -1, -1, general, 40, "%1c", buffer );
84 CHECK_FALSE( memcmp( buffer, "\177\177", 2 ) );
87 // -----------------------------------------------------------------------
88 // Integer matching ('%d')
89 // -----------------------------------------------------------------------
91 // reading a whitespace-terminated integer
93 TESTSCAN( 1, 1, general, 20, "%d", &i );
97 // reading a -1 terminated integer
99 TESTSCAN( 1, 1, general, 18, "%d", &i );
103 // reading a EOF terminated integer
105 TESTSCAN( 1, 1, general, 39, "%d", &i );
109 // trying to read an integer when positioned at whitespace
110 // should skip whitespaces
112 TESTSCAN( 1, 3, general, 32, "%d", &i );
116 // trying to read an integer when positioned at -1 value
117 // should report matching failure
119 TESTSCAN( 0, -1, general, 19, "%d", &i, &n ), 0 );
123 // trying to read an integer when positioned at EOF
124 // should report reading failure
126 TESTSCAN( -1, -1, general, 40, "%d", &i, &n ), -1 );
130 // reading a '-'-prefixed integer
132 TESTSCAN( 1, 2, general, 13, "%d", &i );
133 CHECK_EQUAL( i, -5 );
136 // reading a '+'-prefixed integer
138 TESTSCAN( 1, 2, general, 15, "%d", &i );
142 // decimal integer matches
146 TESTSCAN( 1, 1, decimal, 1, "%hhd", &i );
152 TESTSCAN( 1, 2, decimal, 0, "%hhd", &i );
158 TESTSCAN( 1, 2, decimal, 3, "%hhd", &i );
164 TESTSCAN( 1, 4, decimal, 6, "%hhd", &i );
165 CHECK_EQUAL( i, -128 );
170 TESTSCAN( 1, 3, decimal, 12, "%hhd", &i );
171 CHECK_EQUAL( i, 127 );
176 TESTSCAN( 1, 4, decimal, 11, "%hhd", &i );
177 CHECK_EQUAL( i, 127 );
181 unsigned char i = -1;
182 TESTSCAN( 1, 1, decimal, 1, "%hhu", &i );
187 unsigned char i = -1;
188 TESTSCAN( 1, 2, decimal, 0, "%hhu", &i );
193 unsigned char i = -1;
194 TESTSCAN( 1, 2, decimal, 3, "%hhu", &i );
199 unsigned char i = -1;
200 TESTSCAN( 1, 3, decimal, 12, "%hhu", &i );
201 CHECK_EQUAL( i, 127 );
205 unsigned char i = -1;
206 TESTSCAN( 1, 4, decimal, 11, "%hhu", &i );
207 CHECK_EQUAL( i, 127 );
212 TESTSCAN( 1, 3, decimal, 17, "%hhu", &i );
213 CHECK_EQUAL( i, 255 );
218 TESTSCAN( 1, 4, decimal, 16, "%hhu", &i );
219 CHECK_EQUAL( i, 255 );
224 TESTSCAN( 1, 1, decimal, 1, "%hhi", &i );
230 TESTSCAN( 1, 2, decimal, 0, "%hhi", &i );
236 TESTSCAN( 1, 2, decimal, 3, "%hhi", &i );
242 TESTSCAN( 1, 4, decimal, 6, "%hhi", &i );
243 CHECK_EQUAL( i, -128 );
248 TESTSCAN( 1, 3, decimal, 12, "%hhi", &i );
249 CHECK_EQUAL( i, 127 );
254 TESTSCAN( 1, 4, decimal, 11, "%hhi", &i );
255 CHECK_EQUAL( i, 127 );
260 TESTSCAN( 1, 1, decimal, 1, "%hd", &i );
266 TESTSCAN( 1, 2, decimal, 0, "%hd", &i );
272 TESTSCAN( 1, 2, decimal, 3, "%hd", &i );
278 TESTSCAN( 1, 6, decimal, 21, "%hd", &i );
279 CHECK_EQUAL( i, -32768 );
284 TESTSCAN( 1, 5, decimal, 29, "%hd", &i );
285 CHECK_EQUAL( i, 32767 );
290 TESTSCAN( 1, 6, decimal, 28, "%hd", &i );
291 CHECK_EQUAL( i, 32767 );
295 unsigned short i = -1;
296 TESTSCAN( 1, 1, decimal, 1, "%hu", &i );
301 unsigned short i = -1;
302 TESTSCAN( 1, 2, decimal, 0, "%hu", &i );
307 unsigned short i = -1;
308 TESTSCAN( 1, 2, decimal, 3, "%hu", &i );
313 unsigned short i = -1;
314 TESTSCAN( 1, 5, decimal, 29, "%hu", &i );
315 CHECK_EQUAL( i, 32767 );
319 unsigned short i = -1;
320 TESTSCAN( 1, 6, decimal, 28, "%hu", &i );
321 CHECK_EQUAL( i, 32767 );
325 unsigned short i = 0;
326 TESTSCAN( 1, 5, decimal, 36, "%hu", &i );
327 CHECK_EQUAL( i, 65535 );
331 unsigned short i = 0;
332 TESTSCAN( 1, 6, decimal, 35, "%hu", &i );
333 CHECK_EQUAL( i, 65535 );
338 TESTSCAN( 1, 1, decimal, 1, "%hi", &i );
344 TESTSCAN( 1, 2, decimal, 0, "%hi", &i );
350 TESTSCAN( 1, 2, decimal, 3, "%hi", &i );
356 TESTSCAN( 1, 6, decimal, 21, "%hi", &i );
357 CHECK_EQUAL( i, -32768 );
362 TESTSCAN( 1, 5, decimal, 29, "%hi", &i );
363 CHECK_EQUAL( i, 32767 );
368 TESTSCAN( 1, 6, decimal, 28, "%hi", &i );
369 CHECK_EQUAL( i, 32767 );
374 TESTSCAN( 1, 1, decimal, 1, "%d", &i );
380 TESTSCAN( 1, 2, decimal, 0, "%d", &i );
386 TESTSCAN( 1, 2, decimal, 3, "%d", &i );
390 // reading -2147483648, d
392 TESTSCAN( 1, 11, decimal, 42, "%d", &i );
393 CHECK_EQUAL( i, -2147483648 );
396 // reading 2147483647, d
398 TESTSCAN( 1, 10, decimal, 55, "%d", &i );
399 CHECK_EQUAL( i, 2147483647 );
402 // reading +2147483647, d
404 TESTSCAN( 1, 11, decimal, 54, "%d", &i );
405 CHECK_EQUAL( i, 2147483647 );
410 TESTSCAN( 1, 1, decimal, 1, "%u", &i );
416 TESTSCAN( 1, 2, decimal, 0, "%u", &i );
422 TESTSCAN( 1, 2, decimal, 3, "%u", &i );
426 // reading 2147483647, u
428 TESTSCAN( 1, 10, decimal, 55, "%u", &i );
429 CHECK_EQUAL( i, 2147483647 );
432 // reading +2147483647, u
434 TESTSCAN( 1, 11, decimal, 54, "%u", &i );
435 CHECK_EQUAL( i, 2147483647 );
438 // reading 4294967295, u
440 TESTSCAN( 1, 10, decimal, 67, "%u", &i );
441 CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" );
444 // reading +4294967295, u
446 TESTSCAN( 1, 11, decimal, 66, "%u", &i );
447 CHECK_FEQUAL( i, 4294967295, unsigned int, "%u" );
452 TESTSCAN( 1, 1, decimal, 1, "%i", &i );
458 TESTSCAN( 1, 2, decimal, 0, "%i", &i );
464 TESTSCAN( 1, 2, decimal, 3, "%i", &i );
468 // reading -2147483648, i
470 TESTSCAN( 1, 11, decimal, 42, "%i", &i );
471 CHECK_EQUAL( i, -2147483648 );
474 // reading 2147483647, i
476 TESTSCAN( 1, 10, decimal, 55, "%i", &i );
477 CHECK_EQUAL( i, 2147483647 );
480 // reading +2147483647, i
482 TESTSCAN( 1, 11, decimal, 54, "%i", &i );
483 CHECK_EQUAL( i, 2147483647 );
488 TESTSCAN( 1, 1, decimal, 1, "%ld", &i );
489 CHECK_EQUAL( i, 0l );
494 TESTSCAN( 1, 2, decimal, 0, "%ld", &i );
495 CHECK_EQUAL( i, 0l );
500 TESTSCAN( 1, 2, decimal, 3, "%ld", &i );
501 CHECK_EQUAL( i, 0l );
504 // reading -2147483648, d
506 TESTSCAN( 1, 11, decimal, 42, "%ld", &i );
507 CHECK_EQUAL( i, -2147483648l );
510 // reading 2147483647, d
512 TESTSCAN( 1, 10, decimal, 55, "%ld", &i );
513 CHECK_EQUAL( i, 2147483647l );
516 // reading +2147483647, d
518 TESTSCAN( 1, 11, decimal, 54, "%ld", &i );
519 CHECK_EQUAL( i, 2147483647l );
523 unsigned long i = -1;
524 TESTSCAN( 1, 1, decimal, 1, "%lu", &i );
525 CHECK_EQUAL( i, 0ul );
529 unsigned long i = -1;
530 TESTSCAN( 1, 2, decimal, 0, "%lu", &i );
531 CHECK_EQUAL( i, 0ul );
535 unsigned long i = -1;
536 TESTSCAN( 1, 2, decimal, 3, "%lu", &i );
537 CHECK_EQUAL( i, 0ul );
540 // reading 2147483647, u
541 unsigned long i = -1;
542 TESTSCAN( 1, 10, decimal, 55, "%lu", &i );
543 CHECK_EQUAL( i, 2147483647ul );
546 // reading +2147483647, u
547 unsigned long i = -1;
548 TESTSCAN( 1, 11, decimal, 54, "%lu", &i );
549 CHECK_EQUAL( i, 2147483647ul );
552 // reading 4294967295, u
554 TESTSCAN( 1, 10, decimal, 67, "%lu", &i );
555 CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" );
558 // reading +4294967295, u
560 TESTSCAN( 1, 11, decimal, 66, "%lu", &i );
561 CHECK_FEQUAL( i, 4294967295ul, unsigned long, "%lu" );
566 TESTSCAN( 1, 1, decimal, 1, "%li", &i );
567 CHECK_EQUAL( i, 0l );
572 TESTSCAN( 1, 2, decimal, 0, "%li", &i );
573 CHECK_EQUAL( i, 0l );
578 TESTSCAN( 1, 2, decimal, 3, "%li", &i );
579 CHECK_EQUAL( i, 0l );
582 // reading -2147483648, i
584 TESTSCAN( 1, 11, decimal, 42, "%li", &i );
585 CHECK_EQUAL( i, -2147483648l );
588 // reading 2147483647, i
590 TESTSCAN( 1, 10, decimal, 55, "%li", &i );
591 CHECK_EQUAL( i, 2147483647l );
594 // reading +2147483647, i
596 TESTSCAN( 1, 11, decimal, 54, "%li", &i );
597 CHECK_EQUAL( i, 2147483647l );
601 signed long long i = -1;
602 TESTSCAN( 1, 1, decimal, 1, "%lld", &i );
603 CHECK_EQUAL( i, 0ll );
607 signed long long i = -1;
608 TESTSCAN( 1, 2, decimal, 0, "%lld", &i );
609 CHECK_EQUAL( i, 0ll );
613 signed long long i = -1;
614 TESTSCAN( 1, 2, decimal, 3, "%lld", &i );
615 CHECK_EQUAL( i, 0ll );
618 // reading -9223372036854775808, d
619 signed long long i = -1;
620 TESTSCAN( 1, 20, decimal, 78, "%lli", &i );
621 CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks.
622 CHECK_EQUAL( i < 0ll, 1 );
625 // reading +9223372036854775807, d
626 signed long long i = -1;
627 TESTSCAN( 1, 20, decimal, 99, "%lld", &i );
628 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lld" );
632 unsigned long long i = -1;
633 TESTSCAN( 1, 1, decimal, 1, "%llu", &i );
634 CHECK_EQUAL( i, 0ull );
638 unsigned long long i = -1;
639 TESTSCAN( 1, 2, decimal, 0, "%llu", &i );
640 CHECK_EQUAL( i, 0ull );
644 unsigned long long i = -1;
645 TESTSCAN( 1, 2, decimal, 3, "%llu", &i );
646 CHECK_EQUAL( i, 0ull );
649 // reading 9223372036854775807, u
650 unsigned long long i = -1;
651 TESTSCAN( 1, 19, decimal, 100, "%llu", &i );
652 CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" );
655 // reading +9223372036854775807, u
656 unsigned long long i = -1;
657 TESTSCAN( 1, 20, decimal, 99, "%llu", &i );
658 CHECK_FEQUAL( i, 9223372036854775807ull, unsigned long long, "%llu" );
661 // reading 18446744073709551615, u
662 unsigned long long i = 0;
663 TESTSCAN( 1, 20, decimal, 121, "%llu", &i );
664 CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" );
667 // reading +18446744073709551615, u
668 unsigned long long i = 0;
669 TESTSCAN( 1, 21, decimal, 120, "%llu", &i );
670 CHECK_FEQUAL( i, 18446744073709551615ull, unsigned long long, "%llu" );
674 signed long long i = -1;
675 TESTSCAN( 1, 1, decimal, 1, "%lli", &i );
676 CHECK_EQUAL( i, 0ll );
680 signed long long i = -1;
681 TESTSCAN( 1, 2, decimal, 0, "%lli", &i );
682 CHECK_EQUAL( i, 0ll );
686 signed long long i = -1;
687 TESTSCAN( 1, 2, decimal, 3, "%lli", &i );
688 CHECK_EQUAL( i, 0ll );
691 // reading -9223372036854775808, i
692 signed long long i = -1;
693 TESTSCAN( 1, 20, decimal, 78, "%lli", &i );
694 CHECK_FEQUAL( i, LLONG_MIN, signed long long, "%lli" ); // should be literal -9223372036854775808ll but GCC balks.
695 CHECK_EQUAL( i < 0ll, 1 );
698 // reading 9223372036854775807, i
699 signed long long i = -1;
700 TESTSCAN( 1, 19, decimal, 100, "%lli", &i );
701 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" );
704 // reading +9223372036854775807, i
705 signed long long i = -1;
706 TESTSCAN( 1, 20, decimal, 99, "%lli", &i );
707 CHECK_FEQUAL( i, 9223372036854775807ll, signed long long, "%lli" );
710 // hexadecimal integer matches
713 unsigned char i = -1;
714 TESTSCAN( 1, 1, hexadecimal, 3, "%hhx", &i );
719 unsigned char i = -1;
720 TESTSCAN( 1, 4, hexadecimal, 0, "%hhx", &i );
725 unsigned char i = -1;
726 TESTSCAN( 1, 6, hexadecimal, 5, "%hhx", &i );
732 TESTSCAN( 1, 4, hexadecimal, 0, "%hhi", &i );
737 unsigned char i = -1;
738 TESTSCAN( 1, 2, hexadecimal, 15, "%hhx", &i );
739 CHECK_EQUAL( i, 127 );
743 unsigned char i = -1;
744 TESTSCAN( 1, 5, hexadecimal, 12, "%hhx", &i );
745 CHECK_FEQUAL( i, -127, unsigned char, "%hhu" );
750 TESTSCAN( 1, 4, hexadecimal, 18, "%hhi", &i );
751 CHECK_FEQUAL( i, -128, signed char, "%hhd" );
755 unsigned char i = -1;
756 TESTSCAN( 1, 2, hexadecimal, 25, "%hhx", &i );
757 CHECK_EQUAL( i, 0xff );
761 unsigned char i = -1;
762 TESTSCAN( 1, 4, hexadecimal, 23, "%hhx", &i );
763 CHECK_EQUAL( i, 255 );
768 TESTSCAN( 1, 4, hexadecimal, 23, "%hhi", &i );
769 CHECK_EQUAL( i, -1 );
773 unsigned short i = -1;
774 TESTSCAN( 1, 1, hexadecimal, 3, "%hx", &i );
779 unsigned short i = -1;
780 TESTSCAN( 1, 4, hexadecimal, 0, "%hx", &i );
785 unsigned short i = -1;
786 TESTSCAN( 1, 6, hexadecimal, 5, "%hx", &i );
792 TESTSCAN( 1, 4, hexadecimal, 0, "%hi", &i );
797 unsigned short i = -1;
798 TESTSCAN( 1, 4, hexadecimal, 31, "%hx", &i );
799 CHECK_EQUAL( i, 32767 );
802 // reading -0x7fff, x
803 unsigned short i = -1;
804 TESTSCAN( 1, 7, hexadecimal, 28, "%hx", &i );
805 CHECK_FEQUAL( i, -32767, unsigned short, "%hu" );
810 TESTSCAN( 1, 6, hexadecimal, 36, "%hi", &i );
811 CHECK_FEQUAL( i, -32768, signed short, "%hd" );
815 unsigned short i = -1;
816 TESTSCAN( 1, 4, hexadecimal, 45, "%hx", &i );
817 CHECK_EQUAL( i, 65535 );
821 unsigned short i = -1;
822 TESTSCAN( 1, 6, hexadecimal, 43, "%hx", &i );
823 CHECK_EQUAL( i, 65535 );
828 TESTSCAN( 1, 6, hexadecimal, 43, "%hi", &i );
829 CHECK_FEQUAL( i, -1, signed short, "%hd" );
834 TESTSCAN( 1, 1, hexadecimal, 3, "%x", &i );
840 TESTSCAN( 1, 4, hexadecimal, 0, "%x", &i );
846 TESTSCAN( 1, 6, hexadecimal, 5, "%x", &i );
852 TESTSCAN( 1, 4, hexadecimal, 0, "%i", &i );
856 // reading 7fffffff, x
858 TESTSCAN( 1, 8, hexadecimal, 53, "%x", &i );
859 CHECK_EQUAL( i, 2147483647 );
862 // reading -0x7fffffff, x
864 TESTSCAN( 1, 11, hexadecimal, 50, "%x", &i );
865 CHECK_FEQUAL( i, -2147483647, unsigned int, "%u" );
868 // reading 0x80000000, i
870 //TESTSCAN( 1, 11, hexadecimal, 62, "%i", &i );
871 CHECK_EQUAL( sscanf( "-0x80000000", "%i", &i );
872 CHECK_FEQUAL( i, -2147483648, signed int, "%d" );
875 // reading ffffffff, x
877 TESTSCAN( 1, 8, hexadecimal, 75, "%x", &i );
878 CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" );
881 // reading 0xffffffff, x
883 TESTSCAN( 1, 10, hexadecimal, 73, "%x", &i );
884 CHECK_FEQUAL( i, 4294967295, unsigned int, "%d" );
887 // octal integer matches
890 unsigned char i = -1;
891 TESTSCAN( 1, 1, octal, 4, "%hho", &i );
892 CHECK_EQUAL( i, 0u );
896 unsigned char i = -1;
897 TESTSCAN( 1, 5, octal, 0, "%hho", &i );
898 CHECK_EQUAL( i, 0u );
902 unsigned char i = -1;
903 TESTSCAN( 1, 5, octal, 6, "%hho", &i );
904 CHECK_EQUAL( i, 0u );
908 unsigned char i = -1;
909 TESTSCAN( 1, 4, octal, 13, "%hho", &i );
910 CHECK_EQUAL( i, 127u );
914 unsigned char i = -1;
915 TESTSCAN( 1, 5, octal, 12, "%hho", &i );
916 CHECK_EQUAL( i, 127u );
920 unsigned char i = -1;
921 TESTSCAN( 1, 4, octal, 19, "%hho", &i );
922 CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" );
926 unsigned char i = -1;
927 TESTSCAN( 1, 5, octal, 18, "%hho", &i );
928 CHECK_FEQUAL( i, 255u, unsigned char, "%hhu" );
932 unsigned char i = -1;
933 TESTSCAN( 1, 5, octal, 24, "%hho", &i );
934 CHECK_FEQUAL( i, 1u, unsigned char, "%hhu" );
938 unsigned short i = -1;
939 TESTSCAN( 1, 6, octal, 31, "%ho", &i );
940 CHECK_EQUAL( i, 32767u );
943 // reading +077777, o
944 unsigned short i = -1;
945 TESTSCAN( 1, 7, octal, 30, "%ho", &i );
946 CHECK_EQUAL( i, 32767u );
949 // reading 0177777, o
950 unsigned short i = -1;
951 TESTSCAN( 1, 7, octal, 39, "%ho", &i );
952 CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" );
955 // reading +0177777, o
956 unsigned short i = -1;
957 TESTSCAN( 1, 8, octal, 38, "%ho", &i );
958 CHECK_FEQUAL( i, 65535u, unsigned short, "%hu" );
961 // reading -0177777, o
962 unsigned short i = -1;
963 TESTSCAN( 1, 8, octal, 47, "%ho", &i );
964 CHECK_FEQUAL( i, 1u, unsigned short, "%hu" );
967 // reading 017777777777, o
969 TESTSCAN( 1, 12, octal, 57, "%o", &i );
970 CHECK_EQUAL( i, 2147483647u );
973 // reading +017777777777, o
975 TESTSCAN( 1, 13, octal, 56, "%o", &i );
976 CHECK_EQUAL( i, 2147483647u );
979 // reading 037777777777, o
981 TESTSCAN( 1, 12, octal, 71, "%o", &i );
982 CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" );
985 // reading +037777777777, o
987 TESTSCAN( 1, 13, octal, 70, "%o", &i );
988 CHECK_FEQUAL( i, 4294967295u, unsigned int, "%u" );
991 // reading -037777777777, o
993 TESTSCAN( 1, 13, octal, 84, "%o", &i );
994 CHECK_FEQUAL( i, 1u, unsigned int, "%u" );
997 // reading 017777777777, o
998 unsigned long i = -1;
999 TESTSCAN( 1, 12, octal, 57, "%lo", &i );
1000 CHECK_EQUAL( i, 2147483647lu );
1003 // reading +017777777777, o
1004 unsigned long i = -1;
1005 TESTSCAN( 1, 13, octal, 56, "%lo", &i );
1006 CHECK_EQUAL( i, 2147483647lu );
1009 // reading 037777777777, o
1010 unsigned long i = -1;
1011 TESTSCAN( 1, 12, octal, 71, "%lo", &i );
1012 CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" );
1015 // reading +037777777777, o
1016 unsigned long i = -1;
1017 TESTSCAN( 1, 13, octal, 70, "%lo", &i );
1018 CHECK_FEQUAL( i, 4294967295lu, unsigned long, "%lu" );
1021 // reading -037777777777, o
1022 unsigned long i = -1;
1023 TESTSCAN( 1, 13, octal, 84, "%lo", &i );
1024 CHECK_FEQUAL( i, 1lu, unsigned long, "%lu" );
1027 // reading 0777777777777777777777, o
1028 unsigned long long i = -1;
1029 TESTSCAN( 1, 22, octal, 99, "%llo", &i );
1030 CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" );
1033 // reading +0777777777777777777777, o
1034 unsigned long long i = -1;
1035 TESTSCAN( 1, 23, octal, 98, "%llo", &i );
1036 CHECK_FEQUAL( i, 9223372036854775807llu, unsigned long long, "%llu" );
1039 // reading 01777777777777777777777, o
1040 unsigned long long i = -1;
1041 TESTSCAN( 1, 23, octal, 123, "%llo", &i );
1042 CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" );
1045 // reading +01777777777777777777777, o
1046 unsigned long long i = -1;
1047 TESTSCAN( 1, 24, octal, 122, "%llo", &i );
1048 CHECK_FEQUAL( i, 18446744073709551615llu, unsigned long long, "%llu" );
1051 // reading -01777777777777777777777, o
1052 unsigned long long i = -1;
1053 TESTSCAN( 1, 24, octal, 147, "%llo", &i );
1054 CHECK_FEQUAL( i, 1llu, unsigned long long, "%llu" );
1058 size_t const BUFSIZE = 1000;
1059 char buffer[BUFSIZE];
1062 memset( buffer, '\0', BUFSIZE );
1063 TESTSCAN( 1, 3, alpha, 0, "%[abc]", buffer );
1064 CHECK_FALSE( memcmp( buffer, "abc", 4 ) );
1068 memset( buffer, '\0', BUFSIZE );
1069 TESTSCAN( 1, 3, alpha, 0, "%[a-c]", buffer );
1070 CHECK_FALSE( memcmp( buffer, "abc", 4 ) );
1074 memset( buffer, '\0', BUFSIZE );
1075 TESTSCAN( 1, 8, alpha, 0, "%[a-h]", buffer );
1076 CHECK_FALSE( memcmp( buffer, "abcdefgh", 9 ) );
1079 // reading o-r, including [, seperate char
1080 memset( buffer, '\0', BUFSIZE );
1081 TESTSCAN( 1, 5, alpha, 15, "%[[o-qr]", buffer );
1082 CHECK_FALSE( memcmp( buffer, "op[qr", 6 ) );
1085 // reading v-y, including ], two groups
1086 memset( buffer, '\0', BUFSIZE );
1087 TESTSCAN( 1, 5, alpha, 23, "%[]v-wx-y]", buffer );
1088 CHECK_FALSE( memcmp( buffer, "vw]xy", 6 ) );
1091 // missing on first character
1092 memset( buffer, '\0', BUFSIZE );
1093 TESTSCAN( 0, -1, alpha, 0, "%[b]", buffer );
1094 CHECK_FALSE( memcmp( buffer, "", 1 ) );
1097 // eof while reading, two groups
1098 memset( buffer, '\0', BUFSIZE );
1099 TESTSCAN( 1, 2, alpha, 27, "%[a-zA-Z]", buffer );
1100 CHECK_FALSE( memcmp( buffer, "yz", 3 ) );
1103 // eof before reading
1104 memset( buffer, '\0', BUFSIZE );
1105 TESTSCAN( -1, -1, alpha, 29, "%[a-z]", buffer ) );
1106 CHECK_FALSE( memcmp( buffer, "", 1 ) );
1109 // negation - [^...]
1110 memset( buffer, '\0', BUFSIZE );
1111 TESTSCAN( 1, 3, alpha, 0, "%[^d-f]", buffer );
1112 CHECK_FALSE( memcmp( buffer, "abc", 4 ) );
1115 // special bordercase
1118 unsigned char i = 1;
1119 /* Most existing libraries disagree with this test case, so a little
1120 explanation of why PDCLib chose the implementation it did might be
1121 necessary. All references are from ISO/IEC 9899:1999 "Programming
1122 languages - C". Wording critical to the explanation is in UPPERCASE.
1123 Input stream holds "-0xz".
1124 6.4.4.1 Integer constants - states that '0' is a valid (hexa)decimal
1125 constant, whereas '0x' IS NOT.
1126 7.19.6.2 The fscanf function - states...
1127 ...in paragraph 9 that "an INPUT ITEM is defined as the longest
1128 sequence of input characters [...] which is, OR IS A PREFIX OF,
1129 a matching input sequence".
1130 ...in paragraph 10 that "if the INPUT ITEM is not a matching
1131 sequence, the execution of THE DIRECTIVE FAILS; this condition
1132 is a matching failure".
1133 ...in footnote 242) that "fscanf pushes back AT MOST ONE input
1134 character onto the input stream."
1135 ...in paragraph 12 that either of the conversion specifiers d, i,
1136 o, u, or x "matches an [...] integer whose format is the same as
1137 expected for THE SUBJECT SEQUENCE of the [strtol|strtoul]
1139 7.20.1.4 The strtol, strtoll, strtoul, and strtoull functions - states
1140 in paragraph 3 that "the EXPECTED FORM OF THE SUBJECT SEQUENCE is
1141 that of an integer constant AS DESCRIBED IN 6.4.4.1".
1142 These parts of the standard result in the following reasoning:
1143 - The longest sequence of input characters which is a prefix of a
1144 matching input sequence is "-0x" (negative sign, hexadecimal-prefix).
1145 The 'z' is the first character remaining unread as "-0xz" is not a
1146 (prefix of a) matching input sequence. This is according to 7.19.6.2
1148 - "0x", without a valid hexadecimal digit following it, is not a valid
1149 integer constant according to 6.4.4.1.
1150 - "0x" is thus also not of the expected form for a strto[u]l subject
1151 sequence according to 7.20.1.4 paragraph 3. (strto[u]l() would parse
1152 it as zero, but leave the "x" in the final string, i.e. outside the
1154 - "0x" is therefore also not a matching sequence to the i or x
1155 conversion specifier according to 7.19.6.2 paragraph 12.
1156 - The conversion should therefore result in a matching failure
1157 according to 7.19.6.2 paragraph 10.
1159 TESTSCAN( 0, -1, special, 0, "%hhx", &i );
1160 CHECK_EQUAL( i, 1 );
1164 unsigned short i = 1;
1165 TESTSCAN( 0, -1, special, 0, "%hx", &i );
1166 CHECK_EQUAL( i, 1 );
1171 TESTSCAN( 0, -1, special, 0, "%x", &i );
1172 CHECK_EQUAL( i, 1 );