31# define ushort __rw_ushort
32# define uint __rw_uint
33# define ulong __rw_ulong
34# include <sys/types.h>
59static int rw_opt_enable_num_get = 0;
60static int rw_opt_no_errno = 0;
61static int rw_opt_no_grouping = 0;
62static int rw_opt_no_widen = 0;
68struct Ctype: std::ctype<charT>
70 typedef std::ctype<charT>
Base;
82 case '0':
c =
'9';
break;
83 case '1':
c =
'8';
break;
84 case '2':
c =
'7';
break;
85 case '3':
c =
'6';
break;
86 case '4':
c =
'5';
break;
87 case '5':
c =
'4';
break;
88 case '6':
c =
'3';
break;
89 case '7':
c =
'2';
break;
90 case '8':
c =
'1';
break;
91 case '9':
c =
'0';
break;
100 return Base::do_widen (lo, hi, dst);
104template <
class charT>
112template <
class charT>
113struct Punct: std::numpunct<charT>
115 typedef typename std::numpunct<charT>::char_type
char_type;
158template <
class charT>
161template <
class charT>
164template <
class charT>
167template <
class charT>
170template <
class charT>
173template <
class charT>
176template <
class charT>
182template <
class charT>
183struct Ios: std::basic_ios<charT>
189template <
class charT>
193template <
class charT>
194struct NumPut: std::num_put<charT, charT*>
196 typedef std::num_put<charT, charT*>
Base;
210#ifndef _RWSTD_NO_BOOL
215 return Base::do_put (it,
f,
fill,
v);
223 return Base::do_put (it,
f,
fill,
v);
228 unsigned long v)
const {
230 return Base::do_put (it,
f,
fill,
v);
233#ifdef _RWSTD_LONG_LONG
240 return Base::do_put (it,
f,
fill,
v);
248 return Base::do_put (it,
f,
fill,
v);
256 return Base::do_put (it,
f,
fill,
v);
259#ifndef _RWSTD_NO_LONG_DOUBLE
263 long double v)
const {
265 return Base::do_put (it,
f,
fill,
v);
272 const void *
v)
const {
274 return Base::do_put (it,
f,
fill,
v);
281template <
class charT>
286template <
class charT,
class T>
293 std::streamsize prec,
294 std::streamsize width,
296 const char *grouping,
299 T val_expect =
T () )
302 rw_note (0, __FILE__, __LINE__,
"test on line %d disabled",
lineno);
314 ios.imbue (std::locale (ios.getloc (), (
const std::numpunct<charT>*)&pun));
316 ios.flags (std::ios_base::fmtflags (
flags));
317 ios.precision (prec);
321#if defined (_RWSTD_LDBL_MAX_10_EXP)
323 charT buf [_RWSTD_LDBL_MAX_10_EXP + 2] = { 0 };
333 typedef unsigned char UChar;
336 const charT*
const bufend = np.put (
buf, ios, wfill,
val);
341 static int width_fail = 0;
345 "line %d: num_put<%s>::put (..., %s = %s) "
346 "failed to reset width from %d; width() = %d",
347 __LINE__, cname, tname,
TOSTR (
val),
355 char cbuf [
sizeof buf /
sizeof *
buf] = {
'\0' };
358 std::sprintf (cbuf,
str,
val);
363 std::size_t
len = std::strlen (
str);
365 if ( (
'e' == cbuf [
len - 5] ||
'E' == cbuf [
len - 5])
366 && (
'-' == cbuf [
len - 4] ||
'+' == cbuf [
len - 4])
367 && (
'0' == cbuf [
len - 3])) {
368 cbuf [
len - 3] = cbuf [
len - 2];
369 cbuf [
len - 2] = cbuf [
len - 1];
370 cbuf [
len - 1] = cbuf [
len];
378 "line %d: num_put<%s>::put (..., %s = %s) "
379 "wrote %{*Ac}, expected %{*Ac}, "
380 "flags = %{If}, precision = %d"
381 "%{?}, grouping = \"%#s\"%{;}",
382 __LINE__, cname, tname,
TOSTR (
val),
385 grouping && *grouping, grouping);
392 if (!rw_opt_enable_num_get)
402 for ( ; *next ==
fill; ++next);
434 std::ios_base::iostate err = std::ios_base::goodbit;
436 if (-1 == err_expect) {
454 err_expect =
T (1) ==
T (2) &&
flags & std::ios::boolalpha
457 ? std::ios::eofbit : std::ios::goodbit;
462 last = ng.
get (next, bufend, ios, err,
x);
466 "line %d: num_get<%s>::get (%s, ..., %s&) "
468 "%{?}grouping = \"%#s\", %{;}"
469 "iostate = %{Is}, expected %{Is}",
473 grouping && *grouping, grouping,
478 "line %d: num_get<%s>::get (%s, ..., %s&) got %s, "
479 "expected %s, flags = %{If}, "
480 "%{?}grouping = \"%#s\", %{;}",
485 grouping && *grouping, grouping);
499template <
class charT>
500struct Streambuf: std::basic_streambuf<charT, std::char_traits<charT> > { };
502template <
class charT>
513 const std::num_put<charT> np;
517#define DIRECT_USE_TEST(T) \
518 np.put (std::ostreambuf_iterator<charT>(&sb), ios, charT (), (T)0)
520#ifndef _RWSTD_NO_BOOL
530#ifndef _RWSTD_NO_LONG_DOUBLE
543#define boolalpha std::ios_base::boolalpha
544#define dec std::ios_base::dec
545#define fixed std::ios_base::fixed
546#define hex std::ios_base::hex
547#define internal std::ios_base::internal
548#define left std::ios_base::left
549#define oct std::ios_base::oct
550#define right std::ios_base::right
551#define scientific std::ios_base::scientific
552#define showbase std::ios_base::showbase
553#define showpoint std::ios_base::showpoint
554#define showpos std::ios_base::showpos
555#define skipws std::ios_base::skipws
556#define unitbuf std::ios_base::unitbuf
557#define uppercase std::ios_base::uppercase
558#define bin std::ios_base::bin
559#define adjustfield std::ios_base::adjustfield
560#define basefield std::ios_base::basefield
561#define floatfield std::ios_base::floatfield
562#define nolock std::ios_base::nolock
563#define nolockbuf std::ios_base::nolockbuf
565#define Bad std::ios_base::badbit
566#define Eof std::ios_base::eofbit
567#define Fail std::ios_base::failbit
568#define Good std::ios_base::goodbit
571template <
class charT>
574#ifndef _RWSTD_NO_BOOL
576 rw_info (0, 0, __LINE__,
"std::num_put<%s>::put (..., bool)", cname);
578 const char*
const tname =
"bool";
580 static const charT boolnames[][4] = {
581 {
'y',
'e',
's',
'\0' }, {
'n',
'o',
'.',
'\0' },
584 {
'+',
'1',
'\0' }, {
'-',
'2',
'\0' },
585 {
'-',
'+',
'1',
'\0' }, {
'+',
'-',
'0',
'\0' },
586 {
'\001',
'\0' }, {
'\0' }
596#define T charT (), cname, tname, __LINE__
599 TEST (
T,
false, 0, 0, 0,
' ',
"",
"0");
600 TEST (
T,
true, 0, 0, 0,
' ',
"",
"1");
602 TEST (
T,
false, 0, 0, 0,
' ',
"",
"%d");
603 TEST (
T,
true, 0, 0, 0,
' ',
"",
"%d");
608 TEST (
T,
false,
oct, 0, 0,
' ',
"",
"%o");
609 TEST (
T,
true,
oct, 0, 0,
' ',
"",
"%o");
611 TEST (
T,
false,
dec, 0, 0,
' ',
"",
"%d");
612 TEST (
T,
true,
dec, 0, 0,
' ',
"",
"%d");
614 TEST (
T,
false,
hex, 0, 0,
' ',
"",
"%x");
615 TEST (
T,
true,
hex, 0, 0,
' ',
"",
"%x");
617 rw_info (0, 0, __LINE__,
"std::ios::boolalpha");
667 TEST (
T,
false,
boolalpha |
internal, 0,4,
',',
"",
",,,,");
668 TEST (
T,
true,
boolalpha |
internal, 0,4,
',',
"",
",,,\001");
676template <
class charT>
679 const char*
const tname =
"long";
681 rw_info (0, 0, __LINE__,
"std::num_put<%s>::put (..., %s)", cname, tname);
686#define LONG_MIN _RWSTD_LONG_MIN
689#define LONG_MAX _RWSTD_LONG_MAX
692#define GET_FAIL (Eof | Fail), LONG_MAX
696 rw_info (0, 0, __LINE__,
"std::ios::fmtflags ()");
698 TEST (
T, 0
L, 0, 0, 0,
' ',
"",
"%ld");
699 TEST (
T, 1L, 0, 0, 0,
' ',
"",
"%ld");
700 TEST (
T, 2L, 0, 0, 0,
' ',
"",
"%ld");
701 TEST (
T, -3L, 0, 0, 0,
' ',
"",
"%ld");
702 TEST (
T, 12L, 0, 0, 0,
' ',
"",
"%ld");
703 TEST (
T, -13L, 0, 0, 0,
' ',
"",
"%ld");
704 TEST (
T, 345L, 0, 0, 0,
' ',
"",
"%ld");
705 TEST (
T, -456L, 0, 0, 0,
' ',
"",
"%ld");
706 TEST (
T, 6789L, 0, 0, 0,
' ',
"",
"%ld");
707 TEST (
T, -7890L, 0, 0, 0,
' ',
"",
"%ld");
708 TEST (
T, 98765L, 0, 0, 0,
' ',
"",
"%ld");
709 TEST (
T, -98766L, 0, 0, 0,
' ',
"",
"%ld");
715 rw_info (0, 0, __LINE__,
"std::ios::dec");
718 TEST (
T, 1L,
dec, 0, 0,
' ',
"",
"%ld");
719 TEST (
T, 2L,
dec, 0, 0,
' ',
"",
"%ld");
720 TEST (
T, 12L,
dec, 0, 0,
' ',
"",
"%ld");
721 TEST (
T, 345L,
dec, 0, 0,
' ',
"",
"%ld");
722 TEST (
T, 6789L,
dec, 0, 0,
' ',
"",
"%ld");
723 TEST (
T, 98765L,
dec, 0, 0,
' ',
"",
"%ld");
726 TEST (
T, ~0
L,
dec, 0, 0,
' ',
"",
"%ld");
727 TEST (
T, -1L,
dec, 0, 0,
' ',
"",
"%ld");
728 TEST (
T, -2L,
dec, 0, 0,
' ',
"",
"%ld");
729 TEST (
T, -12L,
dec, 0, 0,
' ',
"",
"%ld");
730 TEST (
T, -345L,
dec, 0, 0,
' ',
"",
"%ld");
731 TEST (
T, -6789L,
dec, 0, 0,
' ',
"",
"%ld");
732 TEST (
T, -98765L,
dec, 0, 0,
' ',
"",
"%ld");
735 rw_info (0, 0, __LINE__,
"std::ios::dec | std::ios::showbase");
743 rw_info (0, 0, __LINE__,
"std::ios::dec | std::ios::showpos");
752 "std::ios::dec | std::ios::showbase | std::ios::showpos");
761 rw_info (0, 0, __LINE__,
"std::ios::dec | std::ios::left");
769 TEST (
T, 123456L,
dec |
left, 0, 10,
' ',
"",
"%-10ld");
770 TEST (
T, 1234567L,
dec |
left, 0, 10,
' ',
"",
"%-10ld");
771 TEST (
T, 12345678L,
dec |
left, 0, 10,
' ',
"",
"%-10ld");
772 TEST (
T, 123456789L,
dec |
left, 0, 10,
' ',
"",
"%-10ld");
779 TEST (
T, -12345L,
dec |
left, 0, 10,
' ',
"",
"-12345 ");
780 TEST (
T, -123456L,
dec |
left, 0, 10,
' ',
"",
"-123456 ");
781 TEST (
T, -1234567L,
dec |
left, 0, 10,
' ',
"",
"-1234567 ");
782 TEST (
T, -12345678L,
dec |
left, 0, 10,
' ',
"",
"-12345678 ");
783 TEST (
T, -123456789L,
dec |
left, 0, 10,
' ',
"",
"-123456789");
786 TEST (
T, -1L,
dec |
left, 0, 10,
'#',
"",
"-1########");
787 TEST (
T, -12L,
dec |
left, 0, 10,
'@',
"",
"-12@@@@@@@");
788 TEST (
T, -123L,
dec |
left, 0, 10,
'*',
"",
"-123******");
789 TEST (
T, -1234L,
dec |
left, 0, 10,
'=',
"",
"-1234=====");
790 TEST (
T, -12345L,
dec |
left, 0, 10,
'.',
"",
"-12345....");
791 TEST (
T, -123456L,
dec |
left, 0, 10,
',',
"",
"-123456,,,");
792 TEST (
T, -1234567L,
dec |
left, 0, 10,
'-',
"",
"-1234567--");
793 TEST (
T, -12345678L,
dec |
left, 0, 10,
'+',
"",
"-12345678+");
794 TEST (
T, -123456789L,
dec |
left, 0, 10,
';',
"",
"-123456789");
800 TEST (
T, 1234L,
dec |
left, 0, 14,
' ',
"\2",
"12,34 ");
801 TEST (
T, 12345L,
dec |
left, 0, 14,
' ',
"\2",
"1,23,45 ");
802 TEST (
T, 123456L,
dec |
left, 0, 14,
' ',
"\2",
"12,34,56 ");
803 TEST (
T, 1234567L,
dec |
left, 0, 14,
' ',
"\2",
"1,23,45,67 ");
804 TEST (
T, 12345678L,
dec |
left, 0, 14,
' ',
"\2",
"12,34,56,78 ");
805 TEST (
T, 123456789L,
dec |
left, 0, 14,
' ',
"\2",
"1,23,45,67,89 ");
806 TEST (
T, 123456789L,
dec |
left, 0, 14,
',',
"\2",
"1,23,45,67,89,");
810 TEST (
T, 123L,
dec |
left, 0, 14,
' ',
"\2\1\3",
"1,23 ");
811 TEST (
T, 1234L,
dec |
left, 0, 14,
' ',
"\2\1\3",
"1,2,34 ");
812 TEST (
T, 12345L,
dec |
left, 0, 14,
' ',
"\2\1\3",
"12,3,45 ");
813 TEST (
T, 123456L,
dec |
left, 0, 14,
' ',
"\2\1\3",
"123,4,56 ");
814 TEST (
T, 1234567L,
dec |
left, 0, 14,
' ',
"\2\1\3",
"1,234,5,67 ");
815 TEST (
T, 12345678L,
dec |
left, 0, 14,
' ',
"\2\1\3",
"12,345,6,78 ");
816 TEST (
T, 123456789L,
dec |
left, 0, 14,
' ',
"\2\1\3",
"123,456,7,89 ");
817 TEST (
T, 123456789L,
dec |
left, 0, 14,
'0',
"\2\1\3",
"123,456,7,8900");
820 TEST (
T, -12L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-1,2 ");
821 TEST (
T, -123L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-12,3 ");
822 TEST (
T, -1234L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-1,23,4 ");
823 TEST (
T, -12345L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-12,34,5 ");
824 TEST (
T, -123456L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-123,45,6 ");
825 TEST (
T, -1234567L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-1,234,56,7 ");
826 TEST (
T, -12345678L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-12,345,67,8 ");
827 TEST (
T, -123456789L,
dec |
left, 0, 14,
' ',
"\1\2\3",
"-123,456,78,9 ");
828 TEST (
T, -123456789L,
dec |
left, 0, 14,
' ',
"\3\1\2",
"-1,23,45,6,789");
830 TEST (
T, -123456780L,
dec |
left, 0, 14,
' ',
"\x1",
"-1,2,3,4,5,6,7,8,0");
832 TEST (
T, -123456781L,
dec |
left, 0, 14,
' ',
"\x2",
"-1,23,45,67,81");
833 TEST (
T, -123456782L,
dec |
left, 0, 14,
' ',
"\x3",
"-123,456,782 ");
834 TEST (
T, -123456783L,
dec |
left, 0, 14,
' ',
"\x4",
"-1,2345,6783 ");
835 TEST (
T, -123456784L,
dec |
left, 0, 14,
' ',
"\x5",
"-1234,56784 ");
836 TEST (
T, -123456785L,
dec |
left, 0, 14,
' ',
"\x6",
"-123,456785 ");
837 TEST (
T, -123456786L,
dec |
left, 0, 14,
' ',
"\x7",
"-12,3456786 ");
838 TEST (
T, -123456787L,
dec |
left, 0, 14,
' ',
"\x8",
"-1,23456787 ");
839 TEST (
T, -123456788L,
dec |
left, 0, 14,
' ',
"\x9",
"-123456788 ");
841#ifndef _RWSTD_NO_EXT_BIN_IO
843 rw_info (0, 0, __LINE__,
"std::ios::dec | std::ios::bin [extension]");
845 TEST (
T, 33333333L,
bin |
dec, 0, 0,
' ',
"",
"%ld");
851 rw_info (0, 0, __LINE__,
"std::ios::oct");
854 TEST (
T, 1L,
oct, 0, 0,
' ',
"",
"%lo");
855 TEST (
T, 2L,
oct, 0, 0,
' ',
"",
"%lo");
856 TEST (
T, 12L,
oct, 0, 0,
' ',
"",
"%lo");
857 TEST (
T, 345L,
oct, 0, 0,
' ',
"",
"%lo");
858 TEST (
T, 6789L,
oct, 0, 0,
' ',
"",
"%lo");
859 TEST (
T, 98765L,
oct, 0, 0,
' ',
"",
"%lo");
874 rw_info (0, 0, __LINE__,
"std::ios::oct | std::ios::dec");
878 rw_info (0, 0, __LINE__,
"std::ios::oct | std::ios::showbase");
886 rw_info (0, 0, __LINE__,
"std::ios::oct | std::ios::showpos");
896 "std::ios::oct | std::ios::showbase | std::ios::showpos");
907#ifndef _RWSTD_NO_EXT_BIN_IO
909 rw_info (0, 0, __LINE__,
"std::ios::oct | std::ios::bin [extension]");
911 TEST (
T, 22222222L,
bin |
oct, 0, 0,
' ',
"",
"%ld");
917 rw_info (0, 0, __LINE__,
"std::ios::hex");
920 TEST (
T, 1L,
hex, 0, 0,
' ',
"",
"%lx");
921 TEST (
T, 2L,
hex, 0, 0,
' ',
"",
"%lx");
922 TEST (
T, 12L,
hex, 0, 0,
' ',
"",
"%lx");
923 TEST (
T, 345L,
hex, 0, 0,
' ',
"",
"%lx");
924 TEST (
T, 6789L,
hex, 0, 0,
' ',
"",
"%lx");
925 TEST (
T, 98765L,
hex, 0, 0,
' ',
"",
"%lx");
940 rw_info (0, 0, __LINE__,
"std::ios::hex | std::ios::uppercase");
948 rw_info (0, 0, __LINE__,
"std::ios::hex | std::ios::showbase");
955 "std::ios::hex | std::ios::uppercase | std::ios::showbase");
961 rw_info (0, 0, __LINE__,
"std::ios::hex | std::ios::oct");
966 rw_info (0, 0, __LINE__,
"std::ios::hex | std::ios::dec");
970 rw_info (0, 0, __LINE__,
"std::ios::hex | std::ios::dec | std::ios::oct");
974#ifndef _RWSTD_NO_EXT_BIN_IO
976 rw_info (0, 0, __LINE__,
"std::ios::hex | std::ios::bin [extension]");
978 TEST (
T, 44444444L,
bin |
hex, 0, 0,
' ',
"",
"%ld");
980 rw_info (0, 0, __LINE__,
"std::ios::hex | std::ios::dec | "
981 "std::ios::oct | std::ios::bin [extension]");
992 "std::ios::fixed with negative precision [extension]");
994 TEST (
T, 987654321L, 0, -1, 0,
' ',
"",
"987654321");
995 TEST (
T, 987654322L,
fixed, 0, 0,
' ',
"",
"987654322");
996 TEST (
T, 987654323L,
fixed, -1, 0,
' ',
"",
"98765432*3");
997 TEST (
T, -987654323L,
fixed, -1, 0,
' ',
"",
"-98765432*3");
998 TEST (
T, 987654324L,
fixed, -2, 0,
' ',
"",
"9876543*24");
999 TEST (
T, -987654324L,
fixed, -2, 0,
' ',
"",
"-9876543*24");
1000 TEST (
T, 987654325L,
fixed, -3, 0,
' ',
"",
"987654*325");
1001 TEST (
T, -987654325L,
fixed, -3, 0,
' ',
"",
"-987654*325");
1002 TEST (
T, 987654326L,
fixed, -4, 0,
' ',
"",
"98765*4326");
1003 TEST (
T, -987654326L,
fixed, -4, 0,
' ',
"",
"-98765*4326");
1004 TEST (
T, 987654327L,
fixed, -5, 0,
' ',
"",
"9876*54327");
1005 TEST (
T, -987654327L,
fixed, -5, 0,
' ',
"",
"-9876*54327");
1006 TEST (
T, 987654328L,
fixed, -6, 0,
' ',
"",
"987*654328");
1007 TEST (
T, -987654328L,
fixed, -6, 0,
' ',
"",
"-987*654328");
1008 TEST (
T, 987654329L,
fixed, -7, 0,
' ',
"",
"98*7654329");
1009 TEST (
T, -987654329L,
fixed, -7, 0,
' ',
"",
"-98*7654329");
1010 TEST (
T, 987654330L,
fixed, -8, 0,
' ',
"",
"9*87654330");
1011 TEST (
T, -987654330L,
fixed, -8, 0,
' ',
"",
"-9*87654330");
1012 TEST (
T, 987654331L,
fixed, -9, 0,
' ',
"",
"0*987654331");
1013 TEST (
T, -987654331L,
fixed, -9, 0,
' ',
"",
"-0*987654331");
1014 TEST (
T, 987654332L,
fixed, -10, 0,
' ',
"",
"0*0987654332");
1015 TEST (
T, -987654332L,
fixed, -10, 0,
' ',
"",
"-0*0987654332");
1016 TEST (
T, 987654333L,
fixed, -11, 0,
' ',
"",
"0*00987654333");
1017 TEST (
T, -987654333L,
fixed, -11, 0,
' ',
"",
"-0*00987654333");
1018 TEST (
T, 0
L,
fixed, -12, 0,
' ',
"",
"0*000000000000");
1023#if CHAR_MAX == UCHAR_MAX
1024# define GROUPING "\2\1\xff"
1026# define GROUPING "\2\1\x7f"
1034#if CHAR_MAX == UCHAR_MAX
1035# define GROUPING "\2\3\xff"
1037# define GROUPING "\2\3\x7f"
1047 rw_info (0, 0, __LINE__,
"std::ios::right");
1055 TEST (
T, 1234567L,
dec |
right, 0, 10,
' ',
"",
" 1234567");
1056 TEST (
T, 12345678L,
dec |
right, 0, 10,
' ',
"",
" 12345678");
1057 TEST (
T, 123456789L,
dec |
right, 0, 10,
' ',
"",
" 123456789");
1058 TEST (
T, 123456789L,
dec |
right, 0, 10,
'0',
"",
"0123456789");
1059 TEST (
T, 123456789L,
dec |
right, 0, 10,
'+',
"",
"+123456789");
1060 TEST (
T, 123456789L,
dec |
right, 0, 10,
'-',
"",
"-123456789");
1082 TEST (
T, 01234567
L,
oct |
right, 0, 10,
' ',
"\2",
"1,23,45,67");
1083 TEST (
T, 012345670
L,
oct |
right, 0, 10,
' ',
"\2",
"12,34,56,70");
1086#define flags hex | showbase | internal
1087#define FLAGS flags | uppercase
1090 rw_info (0, 0, __LINE__,
"std::ios::internal");
1091 TEST (
T, 0X1L,
FLAGS, 0, 10,
' ',
"",
"0X 1");
1092 TEST (
T, 0x12L,
flags, 0, 10,
' ',
"",
"0x 12");
1093 TEST (
T, 0X123L,
FLAGS, 0, 10,
' ',
"",
"0X 123");
1094 TEST (
T, 0x1234L,
flags, 0, 10,
' ',
"",
"0x 1234");
1095 TEST (
T, 0X12345L,
FLAGS, 0, 10,
' ',
"",
"0X 12345");
1096 TEST (
T, 0x123abcL,
flags, 0, 10,
' ',
"",
"0x 123abc");
1097 TEST (
T, 0x123abcL,
flags, 0, 10,
'0',
"",
"0x00123abc");
1098 TEST (
T, 0X1234ABCL,
FLAGS, 0, 10,
' ',
"",
"0X 1234ABC");
1099 TEST (
T, 0X12345678L,
FLAGS, 0, 10,
' ',
"",
"0X12345678");
1100 TEST (
T, 0X12345678L,
FLAGS, 0, 10,
'0',
"",
"0X12345678");
1103 TEST (
T, 0X1L,
FLAGS, 0, 10,
' ',
"\1\2",
"0X 1");
1104 TEST (
T, 0x12L,
flags, 0, 10,
' ',
"\1\2",
"0x 1,2");
1105 TEST (
T, 0X123L,
FLAGS, 0, 10,
' ',
"\1\2",
"0X 12,3");
1106 TEST (
T, 0x1234L,
flags, 0, 10,
' ',
"\1\2",
"0x 1,23,4");
1107 TEST (
T, 0X12345L,
FLAGS, 0, 10,
' ',
"\1\2",
"0X 12,34,5");
1108 TEST (
T, 0X12345L,
FLAGS, 0, 10,
',',
"\1\2",
"0X,12,34,5");
1109 TEST (
T, 0x123abcL,
flags, 0, 10,
' ',
"\1\2",
"0x1,23,ab,c");
1110 TEST (
T, 0X1234ABCL,
FLAGS, 0, 10,
' ',
"\1\2",
"0X12,34,AB,C");
1111 TEST (
T, 0X12345678L,
FLAGS, 0, 10,
' ',
"\1\2",
"0X1,23,45,67,8");
1112 TEST (
T, 0X12345678L,
FLAGS, 0, 10,
'0',
"\1\2",
"0X1,23,45,67,8");
1116#define FLAGS dec | showpos | internal
1121 TEST (
T, +12L,
FLAGS, 0, 10,
' ',
"",
"+ 12");
1122 TEST (
T, -123L,
FLAGS, 0, 10,
' ',
"",
"- 123");
1123 TEST (
T, +1234L,
FLAGS, 0, 10,
' ',
"",
"+ 1234");
1124 TEST (
T, -12345L,
FLAGS, 0, 10,
' ',
"",
"- 12345");
1125 TEST (
T, +123456L,
FLAGS, 0, 10,
' ',
"",
"+ 123456");
1126 TEST (
T, -1234567L,
FLAGS, 0, 10,
' ',
"",
"- 1234567");
1127 TEST (
T, +12345678L,
FLAGS, 0, 10,
' ',
"",
"+ 12345678");
1128 TEST (
T, -123456789L,
FLAGS, 0, 10,
'0',
"",
"-123456789");
1130 TEST (
T, +1L,
FLAGS, 0, 10,
'-',
"",
"+--------1");
1131 TEST (
T, -12L,
FLAGS, 0, 10,
'-',
"",
"--------12");
1132 TEST (
T, +123L,
FLAGS, 0, 10,
'+',
"",
"+++++++123");
1133 TEST (
T, -1234L,
FLAGS, 0, 10,
'+',
"",
"-+++++1234");
1134 TEST (
T, +12345L,
FLAGS, 0, 10,
'0',
"",
"+000012345");
1135 TEST (
T, -123456L,
FLAGS, 0, 10,
'1',
"",
"-111123456");
1136 TEST (
T, +1234567L,
FLAGS, 0, 10,
'2',
"",
"+221234567");
1137 TEST (
T, -12345678L,
FLAGS, 0, 10,
'3',
"",
"-312345678");
1138 TEST (
T, +123456789L,
FLAGS, 0, 10,
'4',
"",
"+123456789");
1140#ifndef _RWSTD_NO_EXT_BIN_IO
1143 rw_info (0, 0, __LINE__,
"std::ios::bin [extension]");
1145 TEST (
T, 0
L,
bin, 0, 16,
'.',
"\4",
"...............0");
1146 TEST (
T, 1L,
bin, 0, 16,
'.',
"\4",
"...............1");
1147 TEST (
T, 2L,
bin, 0, 16,
'.',
"\4",
"..............10");
1148 TEST (
T, 3L,
bin, 0, 16,
'.',
"\4",
"..............11");
1149 TEST (
T, 4L,
bin, 0, 16,
'.',
"\4",
".............100");
1150 TEST (
T, 5L,
bin, 0, 16,
'.',
"\4",
".............101");
1151 TEST (
T, 6L,
bin, 0, 16,
'.',
"\4",
".............110");
1152 TEST (
T, 7L,
bin, 0, 16,
'.',
"\4",
".............111");
1153 TEST (
T, 8L,
bin, 0, 16,
'.',
"\4",
"............1000");
1154 TEST (
T, 9L,
bin, 0, 16,
'.',
"\4",
"............1001");
1155 TEST (
T, 0x0aL,
bin, 0, 16,
'.',
"\4",
"............1010");
1156 TEST (
T, 0x0bL,
bin, 0, 16,
'.',
"\4",
"............1011");
1157 TEST (
T, 0x0cL,
bin, 0, 16,
'.',
"\4",
"............1100");
1158 TEST (
T, 0x0dL,
bin, 0, 16,
'.',
"\4",
"............1101");
1159 TEST (
T, 0x0eL,
bin, 0, 16,
'.',
"\4",
"............1110");
1160 TEST (
T, 0x0fL,
bin, 0, 16,
'.',
"\4",
"............1111");
1162 TEST (
T, 0xf0L,
bin, 0, 16,
'.',
"\4",
".......1111,0000");
1163 TEST (
T, 0xf1L,
bin, 0, 16,
'.',
"\4",
".......1111,0001");
1164 TEST (
T, 0xf2L,
bin, 0, 16,
'.',
"\4",
".......1111,0010");
1165 TEST (
T, 0xf3L,
bin, 0, 16,
'.',
"\4",
".......1111,0011");
1166 TEST (
T, 0xf4L,
bin, 0, 16,
'.',
"\4",
".......1111,0100");
1167 TEST (
T, 0xf5L,
bin, 0, 16,
'.',
"\4",
".......1111,0101");
1169 TEST (
T, 0x12345678L,
bin, 0, 0,
'.',
"\4",
1170 "1,0010,0011,0100,0101,0110,0111,1000");
1172 TEST (
T, 0xfedcba98L,
bin, 0, 0,
'\0',
"\010",
1173 "11111110,11011100,10111010,10011000");
1179#define BASE(n) int (unsigned (n) << _RWSTD_IOS_BASEOFF)
1186 rw_info (0, 0, __LINE__,
"base 1 (Roman), and 2 through 36 [extension]");
1188 TEST (
T, 1234L,
BASE ( 0), 0, 0,
'\0',
"",
"1234");
1189 TEST (
T, 1234L,
BASE ( 1), 0, 0,
'\0',
"",
"mccxxxiv");
1190 TEST (
T, 0x1234L,
BASE ( 2), 0, 0,
'\0',
"",
"1001000110100");
1193 TEST (
T, 1234L,
dec |
BASE (10), 0, 0,
'\0',
"",
"1234");
1194 TEST (
T, 0x1234L,
hex |
BASE (16), 0, 0,
'\0',
"",
"1234");
1196 TEST (
T, 1234L,
BASE ( 2), 0, 0,
'\0',
"",
"10011010010");
1197 TEST (
T, 1234L,
BASE ( 3), 0, 0,
'\0',
"",
"1200201");
1198 TEST (
T, 1234L,
BASE ( 4), 0, 0,
'\0',
"",
"103102");
1199 TEST (
T, 1234L,
BASE ( 5), 0, 0,
'\0',
"",
"14414");
1200 TEST (
T, 1234L,
BASE ( 6), 0, 0,
'\0',
"",
"5414");
1201 TEST (
T, 1234L,
BASE ( 7), 0, 0,
'\0',
"",
"3412");
1202 TEST (
T, 1234L,
BASE ( 9), 0, 0,
'\0',
"",
"1621");
1204 TEST (
T, 1234L,
dec |
BASE (10), 0, 0,
'\0',
"",
"1234");
1206 TEST (
T, 1234L,
BASE (11), 0, 0,
'\0',
"",
"a22");
1207 TEST (
T, 1234L,
BASE (12), 0, 0,
'\0',
"",
"86a");
1208 TEST (
T, 1234L,
BASE (13), 0, 0,
'\0',
"",
"73c");
1209 TEST (
T, 1234L,
BASE (14), 0, 0,
'\0',
"",
"642");
1210 TEST (
T, 1234L,
BASE (15), 0, 0,
'\0',
"",
"574");
1212 TEST (
T, 1234L,
hex |
BASE (16), 0, 0,
'\0',
"",
"4d2");
1214 TEST (
T, 1234L,
BASE (17), 0, 0,
'\0',
"",
"44a");
1215 TEST (
T, 1234L,
BASE (18), 0, 0,
'\0',
"",
"3ea");
1216 TEST (
T, 1234L,
BASE (19), 0, 0,
'\0',
"",
"37i");
1217 TEST (
T, 1234L,
BASE (20), 0, 0,
'\0',
"",
"31e");
1218 TEST (
T, 1234L,
BASE (21), 0, 0,
'\0',
"",
"2gg");
1219 TEST (
T, 1234L,
BASE (22), 0, 0,
'\0',
"",
"2c2");
1220 TEST (
T, 1234L,
BASE (23), 0, 0,
'\0',
"",
"27f");
1221 TEST (
T, 1234L,
BASE (24), 0, 0,
'\0',
"",
"23a");
1222 TEST (
T, 1234L,
BASE (25), 0, 0,
'\0',
"",
"1o9");
1223 TEST (
T, 1234L,
BASE (26), 0, 0,
'\0',
"",
"1lc");
1224 TEST (
T, 1234L,
BASE (27), 0, 0,
'\0',
"",
"1ij");
1225 TEST (
T, 1234L,
BASE (28), 0, 0,
'\0',
"",
"1g2");
1226 TEST (
T, 1234L,
BASE (29), 0, 0,
'\0',
"",
"1dg");
1227 TEST (
T, 1234L,
BASE (30), 0, 0,
'\0',
"",
"1b4");
1228 TEST (
T, 1234L,
BASE (31), 0, 0,
'\0',
"",
"18p");
1229 TEST (
T, 1234L,
BASE (32), 0, 0,
'\0',
"",
"16i");
1230 TEST (
T, 1234L,
BASE (33), 0, 0,
'\0',
"",
"14d");
1231 TEST (
T, 1234L,
BASE (34), 0, 0,
'\0',
"",
"12a");
1232 TEST (
T, 1234L,
BASE (35), 0, 0,
'\0',
"",
"109");
1233 TEST (
T, 1234L,
BASE (36), 0, 0,
'\0',
"",
"ya");
1237 TEST (
T, 1L,
BASE (1), 0, 0,
'\0',
"",
"i");
1238 TEST (
T, 2L,
BASE (1), 0, 0,
'\0',
"",
"ii");
1239 TEST (
T, 3L,
BASE (1), 0, 0,
'\0',
"",
"iii");
1240 TEST (
T, 4L,
BASE (1), 0, 0,
'\0',
"",
"iv");
1241 TEST (
T, 5L,
BASE (1), 0, 0,
'\0',
"",
"v");
1242 TEST (
T, 6L,
BASE (1), 0, 0,
'\0',
"",
"vi");
1243 TEST (
T, 7L,
BASE (1), 0, 0,
'\0',
"",
"vii");
1244 TEST (
T, 8L,
BASE (1), 0, 0,
'\0',
"",
"viii");
1245 TEST (
T, 9L,
BASE (1), 0, 0,
'\0',
"",
"ix");
1246 TEST (
T, 10L,
BASE (1), 0, 0,
'\0',
"",
"x");
1247 TEST (
T, 50L,
BASE (1), 0, 0,
'\0',
"",
"l");
1248 TEST (
T, 100L,
BASE (1), 0, 0,
'\0',
"",
"c");
1249 TEST (
T, 500L,
BASE (1), 0, 0,
'\0',
"",
"d");
1250 TEST (
T, 1000L,
BASE (1), 0, 0,
'\0',
"",
"m");
1251 TEST (
T, 49L,
BASE (1), 0, 0,
'\0',
"",
"xlix");
1252 TEST (
T, 88L,
BASE (1), 0, 0,
'\0',
"",
"lxxxviii");
1253 TEST (
T, 99L,
BASE (1), 0, 0,
'\0',
"",
"xcix");
1254 TEST (
T, 1999L,
BASE (1), 0, 0,
'\0',
"",
"mcmxcix");
1255 TEST (
T, 2000L,
BASE (1), 0, 0,
'\0',
"",
"mm");
1256 TEST (
T, 2001L,
BASE (1), 0, 0,
'\0',
"",
"mmi");
1257 TEST (
T, 4999L,
BASE (1), 0, 0,
'\0',
"",
"mmmmcmxcix");
1258 TEST (
T, 5000L,
BASE (1), 0, 0,
'\0',
"",
"5000");
1260 TEST (
T, 1492L,
BASE (1), 0, 10,
'*',
"",
"***mcdxcii");
1268template <
class charT>
1271 const char*
const tname =
"unsigned long";
1273 rw_info (0, 0, __LINE__,
"std::num_put<%s>::put (..., %s)", cname, tname);
1275 typedef unsigned long ULong;
1278 rw_info (0, 0, __LINE__,
"std::ios::dec");
1280 TEST (
T, 0UL,
dec, 0, 0,
' ',
"",
"%lu");
1283 rw_info (0, 0, __LINE__,
"std::ios::dec | std::ios::shopos");
1290 rw_info (0, 0, __LINE__,
"std::ios::oct");
1308 TEST (
T, 1UL,
oct, 0, 0,
' ',
"",
"%lo");
1309 TEST (
T, ~0UL,
oct, 0, 0,
' ',
"",
"%lo");
1313 rw_info (0, 0, __LINE__,
"std::ios::hex");
1330 TEST (
T, 1UL,
hex, 0, 0,
' ',
"",
"%lx");
1331 TEST (
T, ~0UL,
hex, 0, 0,
' ',
"",
"%lx");
1338template <
class charT>
1341 const char*
const tname =
"long long";
1343 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s)", cname, tname);
1345#ifndef _RWSTD_NO_LONG_LONG
1347# define STDIO_FMAT "%" _RWSTD_LLONG_PRINTF_PREFIX "d"
1350# define LL(number) number ## LL
1353# define LL(number) number ## I64
1379# define FLAGS hex | showbase | internal
1382# define OPTS FLAGS, 0, 20, ' ', "\1\2\3\4\1\2\3\4"
1393 TEST (
T,
LL (0x12345678),
OPTS,
"0x 12,345,67,8");
1394 TEST (
T,
LL (0x123456789),
OPTS,
"0x 123,456,78,9");
1395 TEST (
T,
LL (0x123456789a),
OPTS,
"0x 1234,567,89,a");
1396 TEST (
T,
LL (0x123456789ab),
OPTS,
"0x 1,2345,678,9a,b");
1397 TEST (
T,
LL (0x123456789abc),
OPTS,
"0x 1,2,3456,789,ab,c");
1398 TEST (
T,
LL (0x123456789abcd),
OPTS,
"0x12,3,4567,89a,bc,d");
1399 TEST (
T,
LL (0x123456789abcde),
OPTS,
"0x1,23,4,5678,9ab,cd,e");
1400 TEST (
T,
LL (0x123456789abcdef),
OPTS,
"0x12,34,5,6789,abc,de,f");
1401 TEST (
T,
LL (0x123456789abcdef0),
OPTS,
"0x123,45,6,789a,bcd,ef,0");
1405 rw_note (0, 0, __LINE__,
"num_put<%s>::put (..., %s) not exercised, "
1406 "macro _RWSTD_NO_LONG_LONG #defined",
1415template <
class charT>
1418 const char*
const tname =
"unsigned long long";
1420 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s)", cname, tname);
1422#ifndef _RWSTD_NO_LONG_LONG
1424 rw_warn (0, 0, __LINE__,
"num_put<%s>::put (..., %s) not exercised",
1429 rw_note (0, 0, __LINE__,
"num_put<%s>::put (..., %s) not exercised, "
1430 "macro _RWSTD_NO_LONG_LONG #defined",
1443template <
class charT,
class floatT>
1446 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s) formatting "
1447 "infinities", cname, tname);
1450 const floatT inf = 1 /
zero;
1464 TEST (
T, inf, 0, 0, 0,
' ',
"",
"inf");
1469 TEST (
T, -inf, 0, 0, 0,
' ',
"",
"-inf");
1474 TEST (
T, inf, 0, 1, 0,
' ',
"",
"inf");
1479 TEST (
T, -inf, 0, 1, 0,
' ',
"",
"-inf");
1484 TEST (
T, inf, 0, 3, 0,
' ',
"",
"inf");
1489 TEST (
T, -inf, 0, 3, 0,
' ',
"",
"-inf");
1494 TEST (
T, inf, 0, 4, 0,
' ',
"",
"inf");
1499 TEST (
T, -inf, 0, 4, 0,
' ',
"",
"-inf");
1504 TEST (
T, inf, 0, 9, 0,
' ',
"",
"inf");
1509 TEST (
T, -inf, 0, 9, 0,
' ',
"",
"-inf");
1514 TEST (
T, inf, 0, 0, 1,
' ',
"",
"inf");
1519 TEST (
T, -inf, 0, 0, 1,
' ',
"",
"-inf");
1524 TEST (
T, inf, 0, 0, 3,
' ',
"",
"inf");
1529 TEST (
T, -inf, 0, 0, 3,
' ',
"",
"-inf");
1534 TEST (
T, inf, 0, 0, 4,
' ',
"",
" inf");
1539 TEST (
T, -inf, 0, 0, 4,
' ',
"",
"-inf");
1544 TEST (
T, inf, 0, 0, 8,
' ',
"",
" inf");
1549 TEST (
T, -inf, 0, 0, 8,
' ',
"",
" -inf");
1554 TEST (
T, inf,
left, 0, 9,
' ',
"",
"inf ");
1559 TEST (
T, -inf,
left, 0, 9,
' ',
"",
"-inf ");
1569 TEST (
T, -inf,
right, 0, 9,
' ',
"",
" -inf");
1577 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s) formatting "
1578 "NaN's", cname, tname);
1586 const floatT nan = 0 /
zero;
1588 TEST (
T, nan, 0, 0, 0,
' ',
"",
"nan");
1593 TEST (
T, -nan, 0, 0, 0,
' ',
"",
"-nan");
1598 TEST (
T, nan, 0, 1, 0,
' ',
"",
"nan");
1603 TEST (
T, -nan, 0, 1, 0,
' ',
"",
"-nan");
1608 TEST (
T, nan, 0, 3, 0,
' ',
"",
"nan");
1613 TEST (
T, -nan, 0, 3, 0,
' ',
"",
"-nan");
1618 TEST (
T, nan, 0, 4, 0,
' ',
"",
"nan");
1623 TEST (
T, -nan, 0, 4, 0,
' ',
"",
"-nan");
1628 TEST (
T, nan, 0, 9, 0,
' ',
"",
"nan");
1633 TEST (
T, -nan, 0, 9, 0,
' ',
"",
"-nan");
1638 TEST (
T, nan, 0, 0, 1,
' ',
"",
"nan");
1643 TEST (
T, -nan, 0, 0, 1,
' ',
"",
"-nan");
1648 TEST (
T, nan, 0, 0, 3,
' ',
"",
"nan");
1653 TEST (
T, -nan, 0, 0, 3,
' ',
"",
"-nan");
1658 TEST (
T, nan, 0, 0, 4,
' ',
"",
" nan");
1663 TEST (
T, -nan, 0, 0, 4,
' ',
"",
"-nan");
1668 TEST (
T, nan, 0, 0, 5,
' ',
"",
" nan");
1673 TEST (
T, -nan, 0, 0, 5,
' ',
"",
" -nan");
1678 TEST (
T, nan, 0, 0, 8,
' ',
"",
" nan");
1683 TEST (
T, -nan, 0, 0, 8,
' ',
"",
" -nan");
1688 TEST (
T, nan,
left, 0, 9,
' ',
"",
"nan ");
1693 TEST (
T, -nan,
left, 0, 9,
' ',
"",
"-nan ");
1703 TEST (
T, -nan,
right, 0, 9,
' ',
"",
" -nan");
1710 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s) formatting "
1711 "NaN's disabled due to platform bugs", cname, tname);
1719template <
class charT>
1722 const char*
const tname =
"double";
1724 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s)", cname, tname);
1728 TEST (
T, 0.0, 0, 0, 0,
' ',
"",
"%.0g");
1729 TEST (
T, -0.0, 0, 0, 0,
' ',
"",
"%.0g");
1730 TEST (
T, 1.0, 0, 0, 0,
' ',
"",
"%.0g");
1731 TEST (
T, 1.0, 0, 0, 0,
' ',
"",
"1");
1732 TEST (
T, -1.0, 0, 0, 0,
' ',
"",
"%.0g");
1733 TEST (
T, -1.0, 0, 0, 0,
' ',
"",
"-1");
1734 TEST (
T, 1.1, 0, 0, 0,
' ',
"",
"%.0g");
1735 TEST (
T, 1.1, 0, 0, 0,
' ',
"",
"1");
1736 TEST (
T, -1.1, 0, 0, 0,
' ',
"",
"%.0g");
1737 TEST (
T, -1.1, 0, 0, 0,
' ',
"",
"-1");
1749#define CAT(a, b) CONCAT (a, b)
1750#define CONCAT(a, b) a ## b
1752 const double d =
CAT (1.0
e+, _RWSTD_DBL_MAX_10_EXP);
1759 const std::streamsize prec = std::streamsize (
DBL_DIG + 3);
1760 std::sprintf (stdiofmt,
"%%.%dg",
int (prec));
1776 const std::lconv*
const conv = std::localeconv ();
1781 if (conv->decimal_point &&
'.' != *conv->decimal_point)
1788 TEST (
T, 12345.678900,
fixed, 6, 0,
' ',
"\000",
"12345*678900");
1789 TEST (
T, 123456.78900,
fixed, 5, 0,
' ',
"\002",
"12/34/56*78900");
1790 TEST (
T, 1234567.8900,
fixed, 4, 0,
' ',
"\003",
"1/234/567*8900");
1794 TEST (
T, 12345678.900,
fixed, 3, 0,
' ',
"\004",
"1234/5678.900");
1805template <
class charT>
1808#ifndef _RWSTD_NO_LONG_DOUBLE
1810 const char*
const tname =
"long double";
1812 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s) "
1813 "[sizeof (long double) = %u]",
1814 cname, tname,
sizeof (
long double));
1816 typedef long double LDbl;
1820 TEST (
T, 0.0L, 0, 0, 0,
' ',
"",
"%.0Lg");
1821 TEST (
T, 1.0L, 0, 0, 0,
' ',
"",
"%.0Lg");
1822 TEST (
T, 2.1L, 0, 0, 0,
' ',
"",
"%.0Lg");
1823 TEST (
T, -3.2L, 0, 0, 0,
' ',
"",
"%.0Lg");
1824 TEST (
T, -4.3L, 0, 0, 0,
' ',
"",
"%.0Lg");
1826 TEST (
T, 1.0e+10L, 0, 0, 0,
' ',
"",
"%.0Lg");
1827 TEST (
T, 2.0e+20L, 0, 0, 0,
' ',
"",
"%.0Lg");
1828 TEST (
T, 4.0e+30L, 0, 0, 0,
' ',
"",
"%.0Lg");
1830 TEST (
T, 1.0e-10L, 0, 0, 0,
' ',
"",
"%.0Lg");
1831 TEST (
T, 2.0e-20L, 0, 0, 0,
' ',
"",
"%.0Lg");
1832 TEST (
T, 4.0e-30L, 0, 0, 0,
' ',
"",
"%.0Lg");
1854 const std::streamsize prec = std::streamsize (
LDBL_DIG + 3);
1862 const long double Pi = 3.14159265358979323846L;
1867 TEST (
T, Pi, 0, 32, 0,
' ',
"",
"%.32Lg");
1878#define Showpos(f) (showpos | f)
1886#define SHOWPOS(f) (showpos | uppercase | f)
1894#define Showpoint(f) (showpoint | f)
1902#define SHOWPOINT(f) (showpoint | uppercase | f)
1909#define Showall(f) (showpoint | showpos | f)
1917#define SHOWALL(f) (showpoint | showpos | uppercase | f)
1926 TEST (
T, Pi, 0, 0, 0,
' ',
"",
"%.0Lg",
Eof, 3.0L);
1927 TEST (
T, Pi, 0, 1, 0,
' ',
"",
"%.1Lg",
Eof, 3.0L);
1928 TEST (
T, Pi, 0, 2, 0,
' ',
"",
"%.2Lg",
Eof, 3.1L);
1929 TEST (
T, Pi, 0, 3, 0,
' ',
"",
"%.3Lg",
Eof, 3.14L);
1930 TEST (
T, Pi, 0, 10, 0,
' ',
"",
"%.10Lg",
Eof, 3.141592654L);
1935 TEST (
T, Pi, 0, -1, 0,
' ',
"",
"%Lg");
1936 TEST (
T, Pi, 0, -9, 0,
' ',
"",
"%Lg");
1942 TEST (
T, Pi,
fixed, 10, 0,
' ',
"",
"%.10Lf",
Eof, 3.1415926536L);
1953 TEST (
T, Pi,
fixed, -8, 0,
' ',
"",
"0.00000003");
1958#define CAT(a, b) CONCAT (a, b)
1959#define CONCAT(a, b) a ## b
1961 const long double ld =
CAT (
CAT (1.0
e+, _RWSTD_LDBL_MAX_10_EXP),
L);
1980template <
class charT>
1983 const char*
const tname =
"const void*";
1985 rw_info (0, 0, 0,
"std::num_put<%s>::put (..., %s)", cname, tname);
1987 typedef void*
PVoid;
1995 TEST (
T,
PVoid ( 1), 0, 0, 0,
' ',
"",
"%p");
2002 TEST (
T,
PVoid ( 0), 0, 0, 0,
' ',
"\1",
"0");
2003 TEST (
T,
PVoid ( 1), 0, 0, 0,
' ',
"\1",
"%p");
2006 TEST (
T,
PVoid ( ~0
L), 0, 0, 0,
' ',
"\1\3",
"%p");
2018#ifdef _RWSTD_LLONG_MAX
2019# if _RWSTD_LLONG_SIZE <= _RWSTD_PTR_SIZE
2021 TEST (
T,
PVoid (_RWSTD_LLONG_MAX), 0, 0, 0,
' ',
"",
"%p");
2022 TEST (
T,
PVoid (_RWSTD_ULLONG_MAX), 0, 0, 0,
' ',
"",
"%p");
2032template <
class charT>
2035 const char*
const tname =
"long";
2038 "std::num_put<%s>::put (..., %s) and errno", cname, tname);
2045 TEST (
T, 12345L, 0, 0, 0,
' ',
"",
"12345");
2047 "errno unexpectedly changed from %d to %{#m} (%m)", -1);
2050 TEST (
T, 12346L, 0, 0, 0,
' ',
"",
"12346");
2052 "errno unexpectedly changed from %d to %{#m} (%m)", -0);
2055 TEST (
T, 12347L, 0, 0, 0,
' ',
"",
"12347");
2057 "errno unexpectedly changed from %d to %{#m} (%m)", 1);
2060 TEST (
T, 12348L, 0, 0, 0,
' ',
"",
"12348");
2062 "errno unexpectedly changed from %d to %{#m} (%m)", 2);
2065 TEST (
T, 12349L, 0, 0, 0,
' ',
"",
"12349");
2067 "errno unexpectedly changed from %d to %{#m} (%m)", 3);
2070 TEST (
T, 12350L, 0, 0, 0,
' ',
"",
"12350");
2072 "errno unexpectedly changed from %d to %{#m} (%m)", 4);
2075 TEST (
T, 12351L, 0, 0, 0,
' ',
"",
"12351");
2077 "errno unexpectedly changed from %{#m} to %{#m} (%m)",
ERANGE);
2080 TEST (
T, 12352L, 0, 0, 0,
' ',
"",
"12352");
2082 "errno unexpectedly changed from %d to %{#m} (%m)",
Bad);
2085 TEST (
T, 12353L, 0, 0, 0,
' ',
"",
"12353");
2087 "errno unexpectedly changed from %d to %{#m} (%m)",
Eof);
2090 TEST (
T, 12354L, 0, 0, 0,
' ',
"",
"12354");
2092 "errno unexpectedly changed from %d to %{#m} (%m)",
Fail);
2109 "std::num_put<char>::put (..., long) calls ctype<char>::widen()");
2111 static const struct {
2113 std::streamsize width;
2118 { 0, 0, 0, 1,
"9" },
2119 { 1, 0, 0, 1,
"8" },
2120 { 11, 0, 0, 1,
"88" },
2121 { 12, 0, 0, 2,
"87" },
2122 { 123, 0, 0, 3,
"876" },
2123 { 111, 0, 0, 1,
"888" },
2124 { -1234, 0, 0, 5,
"-8765" },
2125 { 12121, 0, 0, 2,
"87878" },
2126 { 12345, 0,
showpos, 6,
"+87654" },
2129 { 0x2345678, 10,
hex |
showbase, 9,
" 9x7654321" },
2133 for (
unsigned i = 0;
i !=
sizeof data /
sizeof *
data; ++
i) {
2145 ios.imbue (std::locale (ios.getloc (), (
const std::ctype<char>*)&ctp));
2147 ios.flags (std::ios_base::fmtflags (
data [
i].
flags));
2148 ios.width (
data [
i].width);
2158 "%d. num_put<char>::do_put (..., %d) called "
2159 "ctype<char>::do_widen() %d times, %d expected; "
2160 "flags = %{If}, width = %d",
i,
data [
i].
val,
2165 "%d. num_put<char>::do_put (..., %d) produced %s, "
2166 "expected \"%{#*s}\"; "
2167 "flags = %{If}, width = %d",
2191 ios.imbue (std::locale (ios.getloc (), (
const std::numpunct<char>*)&pun));
2197 ios.setf (std::ios::fmtflags ());
2207 *np.put (
buf, ios,
'\0', 123456789L) =
'\0';
2210 rw_assert (0 == std::strcmp (
buf,
"1,2,3,4,5,6,7,8,9"), 0, __LINE__,
2211 "num_put<char>::do_put (..., 123456789) produced \"%s\", "
2212 "expected \"%s\"",
buf,
"1,2,3,4,5,6,7,8,9");
2216 "num_put<char>::do_put (..., 123456789) failed to call "
2217 "numpunct<char>::do_thousands_sep()");
2223 ios.imbue (std::locale (ios.getloc (),
2236 *np.put (
buf, ios,
'\0', 123456790L) =
'\0';
2239 rw_assert (0 == std::strcmp (
buf,
"1,23,45,67,90"), 0, __LINE__,
2240 "num_put<char>::do_put (..., 123456790) produced \"%s\", "
2241 "expected \"%s\"",
buf,
"1,23,45,67,90");
2246 "num_put<char>::do_put (..., 123456790) failed to call "
2247 "numpunct<char>::do_thousands_sep()");
2255 ios.imbue (std::locale::classic ());
2264template <
class charT>
2268 const std::num_put<charT, charT*> &np = put;
2272 ios.flags (std::ios_base::fmtflags ());
2274#define Abs(i) ((i) < 0 ? (-i) : (i))
2276#define ASSERT(T, N, T2, tname, t2name) \
2279 const int expect = N + put.ncalls_ [put.test_ ## T]; \
2280 const int expect_2 = !N + put.ncalls_ [put.test_ ## T2]; \
2282 const charT* const end = np.put (buf, ios, charT (), (T)0); \
2283 rw_assert (end == buf + 1, 0, __LINE__, \
2284 "line %d: num_put<%s>::put (..., %s = 0) " \
2285 "return value", __LINE__, cname, tname); \
2286 const int ncalls = put.ncalls_ [put.test_ ## T]; \
2287 const int ncalls_2 = put.ncalls_ [put.test_ ## T2]; \
2288 rw_assert (expect == ncalls, 0, __LINE__, \
2289 "line %d: num_put<%s>::put (..., %s) called " \
2290 "do_put(..., %s) %d times, expected %d", \
2291 __LINE__, cname, tname, \
2292 tname, Abs (ncalls - expect - N), N); \
2297 if (put.test_ ## T != put.test_ ## T2) \
2298 rw_assert (expect_2 == ncalls_2, 0, __LINE__, \
2299 "line %d: num_put<%s>::put (..., %s) called " \
2300 "do_put(..., %s) %d times, expected %d", \
2301 __LINE__, cname, tname, \
2302 t2name, Abs (expect_2 - ncalls_2 - !N), !N); \
2305 typedef unsigned short ushort;
2306 typedef unsigned int uint;
2307 typedef unsigned long ulong;
2316#ifndef _RWSTD_NO_BOOL
2317 ASSERT (
bool, 1,
bool,
"bool",
"bool");
2320 ASSERT (
long, 1,
long,
"long",
"long");
2321 ASSERT (ulong, 1, ulong,
"unsigned long",
"unsigned long");
2323#if defined (_RWSTD_LONG_LONG) && !defined (_RWSTD_NO_EXT_NUM_PUT)
2328 ASSERT (llong, 1, llong,
"long long",
"long long");
2329 ASSERT (ullong, 1, ullong,
"unsigned long long",
"unsigned long long");
2333 ASSERT (
double, 1,
double,
"double",
"double");
2335#ifndef _RWSTD_NO_LONG_DOUBLE
2337 typedef long double ldouble;
2339 ASSERT (ldouble, 1, ldouble,
"long double",
"long double");
2343 typedef const void* pvoid;
2344 ASSERT (pvoid, 1, pvoid,
"const void*",
"const void*");
2349template <
class charT>
2357#define TEST(T, tname) \
2358 if (rw_enabled (#T)) \
2359 T ## _test (charT (), cname); \
2361 rw_note (0, __FILE__, __LINE__, "%s test disabled", \
2362 tname && *tname ? tname : #T)
2364#ifndef _RWSTD_NO_BOOL
2380 TEST (ulong,
"unsigned long");
2382#ifndef _RWSTD_NO_LONG_LONG
2384 TEST (llong,
"long long");
2385 TEST (ullong,
"unsigned long long");
2392 TEST (dbl,
"dbouble");
2394#ifndef _RWSTD_NO_LONG_DOUBLE
2396 TEST (ldbl,
"long double");
2400 TEST (pvoid,
"void*");
2402 if (rw_opt_no_errno)
2403 rw_note (0, __FILE__, __LINE__,
"errno test disabled");
2413 if (rw_opt_no_widen) {
2414 rw_note (0, 0, 0,
"widen test disabled");
2420 if (rw_opt_no_grouping) {
2421 rw_note (0, 0, 0,
"grouping test disabled");
2430 rw_note (0, __FILE__, __LINE__,
"char test disabled");
2432#ifndef _RWSTD_NO_WCHAR_T
2437 rw_note (0, __FILE__, __LINE__,
"wchar_t test disabled");
2448 return rw_test (argc, argv, __FILE__,
2449 "lib.locale.num.put",
2451 "|-enable-num_get# "
2455 &rw_opt_enable_num_get,
2457 &rw_opt_no_grouping,
void ldbl_test(charT, const char *cname)
#define ASSERT(T, N, T2, tname, t2name)
void dbl_test(charT, const char *cname)
void numput_virtuals_test(charT, const char *cname)
#define DIRECT_USE_TEST(T)
void ulong_test(charT, const char *cname)
void errno_test(charT, const char *cname)
void bool_test(charT, const char *cname)
void llong_test(charT, const char *cname)
void run_tests(charT, const char *cname)
void ullong_test(charT, const char *cname)
void direct_use_test(charT, const char *cname)
void pvoid_test(charT, const char *cname)
void long_test(charT, const char *cname)
void inf_nan_test(charT, floatT, const char *cname, const char *tname)
void do_test(int line, const char *src, std::size_t resoff, ForwardIterator dummy_iter, const T *, const char *predname)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define _RWSTD_LDBL_PRINTF_PREFIX
#define _RWSTD_UNUSED(arg)
_TEST_EXPORT int rw_enabled(const char *name)
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)
_TEST_EXPORT char * rw_locales(int=_UNUSED_CAT, const char *=0, bool=true)
_TEST_EXPORT int rw_strncmp(const char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX, int=CMP_NULTERM)
Base::char_type char_type
virtual const char_type * do_widen(const char *lo, const char *hi, char_type *dst) const
virtual char_type do_widen(char c) const
iter_type get(iter_type, iter_type, std::ios_base &, std::ios_base::iostate &,...) const
virtual iter_type do_put(iter_type it, std::ios_base &f, char_type fill, bool v) const
std::num_put< charT, charT * > Base
virtual iter_type do_put(iter_type it, std::ios_base &f, char_type fill, long v) const
virtual iter_type do_put(iter_type it, std::ios_base &f, char_type fill, double v) const
virtual iter_type do_put(iter_type it, std::ios_base &f, char_type fill, long double v) const
virtual iter_type do_put(iter_type it, std::ios_base &f, char_type fill, unsigned long v) const
NumPut(std::size_t ref=0)
virtual iter_type do_put(iter_type it, std::ios_base &f, char_type fill, const void *v) const
Base::char_type char_type
Base::iter_type iter_type
static const char_type * truename_
static const char_type * falsename_
static char_type decimal_point_
std::numpunct< charT >::char_type char_type
virtual string_type do_truename() const
static int n_thousands_sep_
static const char * grouping_
static char_type thousands_sep_
std::numpunct< charT >::string_type string_type
virtual string_type do_falsename() const
virtual char_type do_decimal_point() const
virtual std::string do_grouping() const
virtual char_type do_thousands_sep() const
Base::char_type char_type
Base::string_type string_type