82static int rw_opt_no_errno = 0;
83static int rw_opt_no_grouping = 0;
84static int rw_opt_no_widen = 0;
85static int rw_opt_no_uflow = 0;
92struct Ctype: std::ctype<charT>
94 typedef std::ctype<charT>
Base;
106 case '0':
c =
'9';
break;
107 case '1':
c =
'8';
break;
108 case '2':
c =
'7';
break;
109 case '3':
c =
'6';
break;
110 case '4':
c =
'5';
break;
111 case '5':
c =
'4';
break;
112 case '6':
c =
'3';
break;
113 case '7':
c =
'2';
break;
114 case '8':
c =
'1';
break;
115 case '9':
c =
'0';
break;
124 return Base::do_widen (lo, hi, dst);
128template <
class charT>
148 static void set_names (
const char *fname,
const char *tname) {
165template <
class charT>
169 typedef typename std::numpunct<charT>::char_type
char_type;
207template <
class charT,
class Traits>
208struct Ios: std::basic_ios<charT, Traits>
213template <
class charT,
class Traits>
214struct Streambuf: std::basic_streambuf<charT, Traits>
216 typedef std::basic_streambuf<charT, Traits>
Base;
226 return this->gptr () - this->eback ();
230template <
class charT,
class InputIterator>
231struct NumGet: std::num_get<charT, InputIterator>
248template <
class charT,
class nativeT>
259 const char *grouping =
"")
261 typedef std::char_traits<charT>
Traits;
266 rw_note (0, __FILE__, __LINE__,
"test on line %d disabled",
lineno);
270 if (*grouping &&
'%' != *grouping && rw_opt_no_grouping) {
274 rw_note (0, __FILE__, __LINE__,
275 "grouping test on line %d disabled",
lineno);
285 std::ios_base &iob = io;
287 io.imbue (std::locale (io.getloc (),
288 (
const std::numpunct<charT>*)&pun));
290 io.flags (std::ios_base::fmtflags (
flags));
301 err_expect & std::ios::failbit || *grouping ?
val : nativeT (!
val);
304 static charT wstr_buf [32767];
309 static char nbuf [
sizeof wstr_buf /
sizeof *wstr_buf];
315 if (
'%' == *
str && 0 < std::sprintf (nbuf,
str,
val))
320 std::ios_base::iostate err = std::ios_base::goodbit;
322 const charT *plast = pnext + std::char_traits<charT>::length (pnext);
324 std::ptrdiff_t consumed;
329 plast = ng.
get (pnext, plast, iob, err,
x);
330 consumed = plast - pnext;
335 typedef std::istreambuf_iterator<charT, Traits> IStreambufIter;
339 IStreambufIter sbitnext (&
sb);
340 IStreambufIter sbitlast;
343 sbitlast = ng.
get (sbitnext, sbitlast, iob, err,
x);
344 consumed =
sb.gptr_off ();
351 UserIter uitnext (pnext, pnext, plast);
352 UserIter uitlast (plast, pnext, plast);
355 uitlast = ng.
get (uitnext, uitlast, iob, err,
x);
356 consumed = uitlast.cur_ - uitnext.cur_;
364 int success = -1 == eat_expect || consumed == eat_expect;
369 "line %d: num_get<%s, %s>::get (%#s, ..., %s&); "
371 "%{?}grouping = %#s; %{;}"
372 "ate %td, expected %d",
373 __LINE__, cname, iname,
str, tname,
375 *grouping &&
'%' != *grouping, grouping,
376 consumed, eat_expect);
378 const nativeT val_max =
pmax ? *(nativeT*)
pmax :
val;
388 "line %d: num_get<%s, %s>::get (%{*Ac}, ..., %s&); "
390 "%{?}grouping = %#s; %{;}"
392 "expected %s%{?} <= %s %{;} "
394 __LINE__, cname, iname,
int (
sizeof *
str),
str, tname,
396 *grouping &&
'%' != *grouping, grouping,
406 if (*grouping &&
'%' == *grouping) {
412 const char*
const scanspec = grouping;
414 nativeT
y = nativeT ();
416 const int n = std::sscanf (
str, scanspec, &
y);
419 !( (err & std::ios::failbit &&
n > 0)
420 || (!(err & std::ios::failbit) && 1 !=
n)
426 "line %d: num_get<%s, %s>::get (%#s, ..., %s&); "
427 "got %s, but scanf (..., \"%s\", ...) extracted %s "
428 "and returned %d; fmtflags = %{If}, iostate = %{Is}",
429 __LINE__, cname, iname,
str, tname,
441template <
class nativeT>
452 const char *grouping =
"")
457 val,
str, eat_expect,
flags, err_expect, grouping);
460 val,
str, eat_expect,
flags, err_expect, grouping);
465 val,
str, eat_expect,
flags, err_expect, grouping);
475#define boolalpha std::ios_base::boolalpha
476#define dec std::ios_base::dec
477#define fixed std::ios_base::fixed
478#define hex std::ios_base::hex
479#define internal std::ios_base::internal
480#define left std::ios_base::left
481#define oct std::ios_base::oct
482#define right std::ios_base::right
483#define scientific std::ios_base::scientific
484#define showbase std::ios_base::showbase
485#define showpoint std::ios_base::showpoint
486#define showpos std::ios_base::showpos
487#define skipws std::ios_base::skipws
488#define unitbuf std::ios_base::unitbuf
489#define uppercase std::ios_base::uppercase
490#define bin std::ios_base::bin
491#define adjustfield std::ios_base::adjustfield
492#define basefield std::ios_base::basefield
493#define floatfield std::ios_base::floatfield
494#define nolock std::ios_base::nolock
495#define nolockbuf std::ios_base::nolockbuf
497#define Bad std::ios_base::badbit
498#define Eof std::ios_base::eofbit
499#define Fail std::ios_base::failbit
500#define Good std::ios_base::goodbit
505#define T __LINE__, ctype, cname, itype, iname
510 IterType itype,
const char *iname, numT)
517 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&) and errno",
518 cname, iname, tname);
520 const int errnos[] = {
521 ERANGE, -4, -3, -2, -1, 0, 1, 2, 3, 4,
527#define TEST_ERRNO(val) \
528 for (i = 0; i != sizeof errnos / sizeof *errnos; ++i) { \
529 errno = errnos [i]; \
530 TEST (T, numT (val), _RWSTD_STR (val), \
531 int (sizeof (_RWSTD_STR (val))) -1, 0, Eof); \
532 rw_assert (errnos [i] == errno, 0, __LINE__, \
533 "%d. errno unexpectedly changed from %d to %d", \
534 i, errnos [i], errno); \
539 numT minus_one = numT (~0);
552 if (minus_one >
zero)
574 const char*
const tname =
"bool";
576 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&)",
577 cname, iname, tname);
666 TEST (
T,
false,
"0;0", 3, 0,
Eof,
"\1");
667 TEST (
T,
false,
"+0;0", 4, 0,
Eof,
"\1");
668 TEST (
T,
false,
"-0;0", 4, 0,
Eof,
"\1");
669 TEST (
T,
false,
"0;0;0", 5, 0,
Eof,
"\1");
670 TEST (
T,
false,
"0;0;0;0", 7, 0,
Eof,
"\1");
671 TEST (
T,
true,
"01", 2, 0,
Eof,
"\2");
672 TEST (
T,
true,
"0;01", 4, 0,
Eof,
"\2");
673 TEST (
T,
true,
"00;01", 5, 0,
Eof,
"\2");
674 TEST (
T,
true,
"0;01", 4, 0,
Eof,
"\2");
675 TEST (
T,
false,
"00;0", 4, 0,
Eof,
"\1\2");
676 TEST (
T,
false,
"0;00;0", 6, 0,
Eof,
"\1\2\3");
677 TEST (
T,
false,
"000;00;0", 8, 0,
Eof,
"\1\2\3");
678 TEST (
T,
false,
"0;000;00;0", 10, 0,
Eof,
"\1\2\3");
679 TEST (
T,
true,
"00;1", 4, 0,
Eof,
"\1\2");
680 TEST (
T,
true,
"0;00;1", 6, 0,
Eof,
"\1\2\3");
681 TEST (
T,
true,
"000;00;1", 8, 0,
Eof,
"\1\2\3");
682 TEST (
T,
true,
"0;000;00;1", 10, 0,
Eof,
"\1\2\3");
683 TEST (
T,
true,
"+0;000;00;1", 11, 0,
Eof,
"\1\2\3");
700 TEST (
T,
false,
"0;;", 2, 0,
Fail,
"\1");
701 TEST (
T,
false,
";0;0", 0, 0,
Fail,
"\1");
702 TEST (
T,
false,
";01", 0, 0,
Fail,
"\2");
704 TEST (
T,
false,
"01;;", 3, 0,
Fail,
"\2");
705 TEST (
T,
false,
";;0;01", 0, 0,
Fail,
"\2");
706 TEST (
T,
false,
"00;;01", 3, 0,
Fail,
"\2");
707 TEST (
T,
false,
"00;;;01", 3, 0,
Fail,
"\2");
708 TEST (
T,
false,
";;11", 0, 0,
Fail,
"\3");
709 TEST (
T,
false,
"+;;12", 1, 0,
Fail,
"\3");
710 TEST (
T,
false,
"-;;13", 1, 0,
Fail,
"\3");
711 TEST (
T,
false,
"01;;4", 3, 0,
Fail,
"\3");
814#ifndef _RWSTD_NO_EXT_NUM_GET
817 const char*
const tname =
"short";
819 rw_info (0, 0, 0,
"extension: std::num_get<%s, %s>::get (..., %s&)",
820 cname, iname, tname);
823 TEST (
T,
short (0),
"%hi", 1, 0,
Eof,
"%hi");
824 TEST (
T,
short (0),
"%ho", 1, 0,
Eof,
"%hi");
825 TEST (
T,
short (0),
"%hx", 1, 0,
Eof,
"%hi");
826 TEST (
T,
short (0),
"%#hx", 1, 0,
Eof,
"%hi");
828 TEST (
T,
short (1),
"%hi", 1, 0,
Eof,
"%hi");
832 rw_info (0, 0, 0,
"extension: base 1 (Roman)");
834#define BASE(n) ((n) << _RWSTD_IOS_BASEOFF)
855 TEST (
T,
short (4567),
"MMMMDLXVII", 10,
BASE (1),
Eof);
856 TEST (
T,
short (4999),
"MMMMCMXCIX", 10,
BASE (1),
Eof);
867 rw_info (0, 0, 0,
"extension: base 2 (ios_base::bin, binary)");
893 rw_info (0, 0, 0,
"extension: base 3");
907 if (rw_opt_no_errno) {
908 rw_note (0, 0, 0,
"errno test disabled");
911 test_errno (ctype, cname, itype, iname,
short ());
929#ifndef _RWSTD_NO_EXT_NUM_GET
932 const char*
const tname =
"int";
934 rw_info (0, 0, 0,
"extension: std::num_get<%s, %s>::get (..., %s&)",
935 cname, iname, tname);
940 TEST (
T, 0,
"%#x", 1, 0,
Eof,
"%i");
942 if (rw_opt_no_errno) {
943 rw_note (0, 0, 0,
"errno test disabled");
946 test_errno (ctype, cname, itype, iname,
int ());
966 const char*
const tname =
"long";
968 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&)",
969 cname, iname, tname);
1055 TEST (
T, 1L,
"1", 1, 0,
Eof,
"%li");
1056 TEST (
T, 12L,
"12", 2, 0,
Eof,
"%li");
1057 TEST (
T, 123L,
"123", 3, 0,
Eof,
"%li");
1058 TEST (
T, 1234L,
"1234", 4, 0,
Eof,
"%li");
1059 TEST (
T, 12345L,
"12345", 5, 0,
Eof,
"%li");
1060 TEST (
T, 123456L,
"123456", 6, 0,
Eof,
"%li");
1061 TEST (
T, 1234567L,
"1234567", 7, 0,
Eof,
"%li");
1062 TEST (
T, 12345678L,
"12345678", 8, 0,
Eof,
"%li");
1063 TEST (
T, 134217728L,
"134217728", 9, 0,
Eof,
"%li");
1064 TEST (
T, 134217728L,
"%li", 9, 0,
Eof,
"%li");
1065 TEST (
T, ~0
L,
"%li", -1, 0,
Eof,
"%li");
1066 TEST (
T, 10L,
"%li", -1, 0,
Eof,
"%li");
1069 TEST (
T, 01234567
L,
"01234567", 8, 0,
Eof,
"%li");
1070 TEST (
T, 0x1234567L,
"0x1234567", 9, 0,
Eof,
"%li");
1071 TEST (
T, 0X79aBcDeFL,
"0X79aBcDeF", 10, 0,
Eof,
"%li");
1073 TEST (
T, 01234567
L,
"+01234567", 9, 0,
Eof,
"%li");
1074 TEST (
T, 0x1234567L,
"+0x1234567", 10, 0,
Eof,
"%li");
1075 TEST (
T, -01234567
L,
"-01234567", 9, 0,
Eof,
"%li");
1076 TEST (
T, -0x1234567L,
"-0x1234567", 10, 0,
Eof,
"%li");
1078 TEST (
T, 0xaL,
"0x00000000000000a", 17, 0,
Eof,
"%li");
1079 TEST (
T, 0xabL,
"0x000000000000ab", 16, 0,
Eof,
"%li");
1080 TEST (
T, 0xabcL,
"0x0000000000abc", 15, 0,
Eof,
"%li");
1081 TEST (
T, 0xabcdL,
"0x00000000abcd", 14, 0,
Eof,
"%li");
1082 TEST (
T, 0xabcdeL,
"0x000000abcde", 13, 0,
Eof,
"%li");
1083 TEST (
T, 0xabcdefL,
"0x0000abcdef", 12, 0,
Eof,
"%li");
1084 TEST (
T, 0xabcdef0L,
"0x00abcdef0", 11, 0,
Eof,
"%li");
1085 TEST (
T, 0xabcdef1L,
"0xabcdef1", 9, 0,
Eof,
"%li");
1099 TEST (
T, 2345678L,
"2345678", 7,
dec,
Eof,
"%ld");
1100 TEST (
T, 23456789L,
"23456789", 8,
dec,
Eof,
"%ld");
1101 TEST (
T, 134217728L,
"134217728", 9,
dec,
Eof,
"%ld");
1111 TEST (
T, -345678L,
"-00345678", 9,
dec,
Eof,
"%ld");
1112 TEST (
T, 3456789L,
"+03456789", 9,
dec,
Eof,
"%ld");
1121 TEST (
T, 2147483647L,
"2147483647;", 10,
dec,
Good,
"\0");
1122 TEST (
T, 214748364L,
"214748364;7", 9,
dec,
Good,
"\0");
1123 TEST (
T, 21474836L,
"21474836;47", 8,
dec,
Good,
"\0");
1133 TEST (
T, 2147483647L,
"2147483647", 10,
dec,
Eof,
"\1");
1134 TEST (
T, 2147483647L,
"2;1;4;7;4;8;3;6;4;7", 19,
dec,
Eof,
"\1");
1135 TEST (
T, 2147483646L,
"21;47;48;36;46", 14,
dec,
Eof,
"\2");
1136 TEST (
T, 2147483645L,
"2;147;483;645", 13,
dec,
Eof,
"\3");
1137 TEST (
T, 2147483644L,
"21;4748;3644", 12,
dec,
Eof,
"\4");
1138 TEST (
T, 2147483643L,
"21474;83643", 11,
dec,
Eof,
"\5");
1139 TEST (
T, 2147483642L,
"2147;483642", 11,
dec,
Eof,
"\6");
1140 TEST (
T, 2147483641L,
"214;7483641", 11,
dec,
Eof,
"\7");
1141 TEST (
T, 2147483640L,
"21;47483640", 11,
dec,
Eof,
"\10");
1142 TEST (
T, 2147483639L,
"2;147483639", 11,
dec,
Eof,
"\11");
1143 TEST (
T, 2147483638L,
"2147483638", 10,
dec,
Eof,
"\12");
1145 TEST (
T, 2147483637L,
"2;14;74;83;63;7", 15,
dec,
Eof,
"\1\2");
1146 TEST (
T, 2147483636L,
"214;748;363;6", 13,
dec,
Eof,
"\1\3");
1147 TEST (
T, 2147483635L,
"2;1474;8363;5", 13,
dec,
Eof,
"\1\4");
1148 TEST (
T, 2147483634L,
"2147;48363;4", 12,
dec,
Eof,
"\1\5");
1149 TEST (
T, 2147483633L,
"214;748363;3", 12,
dec,
Eof,
"\1\6");
1150 TEST (
T, 2147483632L,
"21;4748363;2", 12,
dec,
Eof,
"\1\7");
1151 TEST (
T, 2147483631L,
"2;14748363;1", 12,
dec,
Eof,
"\1\10");
1152 TEST (
T, 2147483630L,
"214748363;0", 11,
dec,
Eof,
"\1\11");
1154 TEST (
T, 2147483629L,
"2;147;483;62;9", 14,
dec,
Eof,
"\1\2\3");
1155 TEST (
T, 2147483628L,
"2;1;4;7;4;83;628", 16,
dec,
Eof,
"\3\2\1");
1156 TEST (
T, 2147483627L,
"2;147;483;627", 13,
dec,
Eof,
"\3\3\3");
1157 TEST (
T, 2147483626L,
"+2147;483;626", 13,
dec,
Eof,
"\3\3\4");
1159 for (
int i = 256;
i >= 0;
i -= 32) {
1162 static const char many_groups[] = {
1166 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1167 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1168 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1169 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1170 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1171 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1172 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1173 "0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;"
1177 static const int NC = int (
sizeof many_groups - 1);
1179 const int nfail =
TEST (
T, 1L, many_groups +
i, NC -
i,
dec,
Eof,
"\1");
1210 TEST (
T, 0xABCDEL,
"A;B;C;D;E", 9,
hex,
Eof,
"\1");
1212 TEST (
T, 0xABCDEFL,
"A;B;C;D;E;F", 11,
hex,
Eof,
"\1");
1213 TEST (
T, 0xABCDEFL,
"a;B;c;D;e;F", 11,
hex,
Eof,
"\1");
1214 TEST (
T, 0xABCDEFL,
"+A;B;C;D;E;F", 12,
hex,
Eof,
"\1");
1215 TEST (
T, -0xABCDEFL,
"-A;B;C;D;E;F", 12,
hex,
Eof,
"\1");
1216 TEST (
T, 0xABCDEFL,
"0xA;B;C;D;E;F", 13,
hex,
Eof,
"\1");
1217 TEST (
T, 0xABCDEFL,
"+0xA;B;C;D;E;F", 14,
hex,
Eof,
"\1");
1218 TEST (
T, -0xABCDEFL,
"-0xA;B;C;D;E;F", 14,
hex,
Eof,
"\1");
1221 TEST (
T, 2147483624L,
"21;474;83624; ", 13,
dec,
Fail,
"\5\3");
1222 TEST (
T, 2147483623L,
"21;47;483623 ", 12,
dec,
Fail,
"\6\3");
1223 TEST (
T, 2147483622L,
"21;47483622 ", 11,
dec,
Fail,
"\7\3");
1224 TEST (
T, 2147483621L,
"214;748362;1 ", 12,
dec,
Fail,
"\7\3");
1225 TEST (
T, 2147483619L,
"2;147;483;619 ", 13,
dec,
Fail,
"\1");
1226 TEST (
T, 2147483618L,
"2147;48;36;18 ", 13,
dec,
Fail,
"\2");
1227 TEST (
T, 2147483617L,
"2147;483;617 ", 12,
dec,
Fail,
"\3");
1228 TEST (
T, 2147483616L,
"21;47483616 ", 11,
dec,
Fail,
"\4");
1229 TEST (
T, 2147483615L,
"21;47;4836;15 ", 13,
dec,
Fail,
"\2\2");
1230 TEST (
T, 2147483614L,
"21474;836;14 ", 12,
dec,
Fail,
"\2\3");
1233 TEST (
T, 2147483625L,
";214;748;3625 ", 0,
dec,
Fail,
"\4\3");
1234 TEST (
T, 2147483620L,
"+214;;7483620 ", 5,
dec,
Fail,
"\7\4");
1238 TEST (
T, 2147483618L,
"214.74836.18", 12,
dec,
Eof,
"\2\5");
1241 TEST (
T, 2147483617L,
"2A14A7483A617", 13,
dec,
Eof,
"\3\4\2");
1250 TEST (
T, 2147483617L,
"21-47-4-83-617", 14,
dec,
Eof,
"\3\2\1\2");
1251 TEST (
T, -2147483616L,
"-214-748-3616 ", 13,
dec,
Good,
"\4\3\3");
1254 TEST (
T, 2147483615L,
"2+147+48+3+615", 14,
dec,
Eof,
"\3\1\2\3");
1257 TEST (
T, 2147483614L,
"+21+4748361+4 ", 13,
dec,
Good,
"\1\7\2");
1261 TEST (
T, 2147483613L,
"21047048306013", 14,
dec,
Eof,
"\2\1\3\2");
1264 TEST (
T, 24748362L,
"2147483612", 10,
dec,
Eof,
"\1\6");
1272#if LONG_MAX == 0x7fffL
1273 const char lmin[] =
"-32768";
1274 const char lmin_minus_1[] =
"-32769";
1275 const char lmin_minus_2[] =
"-32770";
1276 const char lmin_minus_3[] =
"-32771";
1278 const char lmax[] =
"32767";
1279 const char lmax_plus_1[] =
"32768";
1280 const char lmax_plus_2[] =
"32769";
1281 const char lmax_plus_3[] =
"32770";
1282 const char lmax_x_f[] =
"0x7ffff";
1284 const char vflow_1[] =
"";
1285#elif LONG_MAX == 0x7fffffffL
1286 const char lmin[] =
"-2147483648";
1287 const char lmin_minus_1[] =
"-2147483649";
1288 const char lmin_minus_2[] =
"-2147483650";
1289 const char lmin_minus_3[] =
"-2147483651";
1291 const char lmax[] =
"2147483647";
1292 const char lmax_plus_1[] =
"2147483648";
1293 const char lmax_plus_2[] =
"2147483649";
1294 const char lmax_plus_3[] =
"2147483650";
1295 const char lmax_x_f[] =
"0x7ffffffff";
1296 const char vflow_1[] =
"";
1297#elif LONG_MAX > 0x7fffffffL
1298 const char lmin[] =
"-9223372036854775808";
1299 const char lmin_minus_1[] =
"-9223372036854775809";
1300 const char lmin_minus_2[] =
"-9223372036854775810";
1301 const char lmin_minus_3[] =
"-9223372036854775811";
1303 const char lmax[] =
"9223372036854775807";
1304 const char lmax_plus_1[] =
"9223372036854775808";
1305 const char lmax_plus_2[] =
"9223372036854775809";
1306 const char lmax_plus_3[] =
"9223372036854775810";
1307 const char lmax_x_f[] =
"0x7ffffffffffffffff";
1308 const char vflow_1[] =
"";
1312 const char lmin[] =
"-999999999999999999990";
1313 const char lmin_minus_1[] =
"-999999999999999999991";
1314 const char lmin_minus_2[] =
"-999999999999999999992";
1315 const char lmin_minus_3[] =
"-999999999999999999993";
1317 const char lmax[] =
"0";
1318 const char lmax_plus_1[] =
"999999999999999999997";
1319 const char lmax_plus_2[] =
"999999999999999999998";
1320 const char lmax_plus_3[] =
"999999999999999999999";
1321 const char lmax_x_f[] =
"0xfffffffffffffffff";
1322 const char vflow_1[] =
"999999999999999999990";
1325#define INTSIZE(x) _RWSTD_STATIC_CAST(int, sizeof (x))
1347 "errno unexpectedly changed from %d (%{#*m}) to %d (%{#m})",
1350 rw_info (0, 0, 0,
"extension: base 1 (Roman)");
1352#define BASE(n) ((n) << _RWSTD_IOS_BASEOFF)
1385 rw_info (0, 0, 0,
"extension: base 2 (ios_base::bin, binary)");
1411 rw_info (0, 0, 0,
"extension: base 3");
1425 rw_info (0, 0, 0,
"extension: base 4");
1442 rw_info (0, 0, 0,
"extension: base 5");
1462 if (rw_opt_no_errno) {
1463 rw_note (0, 0, 0,
"errno test disabled");
1466 test_errno (ctype, cname, itype, iname,
long ());
1481 const char*
const tname =
"unsigned long";
1483 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&)",
1484 cname, iname, tname);
1500 TEST (
T, 1078UL,
"1078", 4, 0,
Eof);
1503 TEST (
T, 65535UL,
"65535", 5, 0,
Eof);
1507#if ULONG_MAX == 0xffffUL
1508 const char ulmax[] =
"65535";
1509 const char ulmax_plus_1[] =
"65536";
1510 const char ulmax_plus_2[] =
"65537";
1511 const char ulmax_plus_3[] =
"65538";
1512 const char ulmax_x_f[] =
"0xfffff";
1513 const char vflow_1[] =
"131061";
1514#elif ULONG_MAX == 0xffffffffUL
1515 const char ulmax[] =
"4294967295";
1516 const char ulmax_plus_1[] =
"4294967296";
1517 const char ulmax_plus_2[] =
"4294967297";
1518 const char ulmax_plus_3[] =
"4294967298";
1519 const char ulmax_x_f[] =
"0xfffffffff";
1520 const char vflow_1[] =
"8589934581";
1521#elif ULONG_MAX > 0xffffffffUL
1522 const char ulmax[] =
"18446744073709551615";
1523 const char ulmax_plus_1[] =
"18446744073709551616";
1524 const char ulmax_plus_2[] =
"18446744073709551617";
1525 const char ulmax_plus_3[] =
"18446744073709551618";
1526 const char ulmax_x_f[] =
"0xfffffffffffffffff";
1527 const char vflow_1[] =
"36893488147419103221";
1530 const char ulmax[] =
"0";
1531 const char ulmax_plus_1[] =
"999999999999999999997";
1532 const char ulmax_plus_2[] =
"999999999999999999998";
1533 const char ulmax_plus_3[] =
"999999999999999999999";
1534 const char ulmax_x_f[] =
"0xfffffffffffffffff";
1535 const char vflow_1[] =
"999999999999999999990";
1552 "errno unexpectedly changed from %d (%{#*m}) to %d (%{#m})",
1555 if (rw_opt_no_errno) {
1556 rw_note (0, 0, 0,
"errno test disabled");
1559 test_errno (ctype, cname, itype, iname, (
unsigned long)0);
1572# ifndef _RWSTD_NO_LONG_LONG
1574 const char*
const tname =
"long long";
1576 rw_info (0, 0, 0,
"extension: std::num_get<%s, %s>::get (..., %s&)",
1577 cname, iname, tname);
1580# define LL(number) number ## LL
1583# define LL(number) number ## I64
1593 TEST (
T,
LL ( 1234567),
"1234567", 7, 0,
Eof);
1594 TEST (
T,
LL ( 12345678),
"12345678", 8, 0,
Eof);
1595 TEST (
T,
LL ( 123456789),
"123456789", 9, 0,
Eof);
1596 TEST (
T,
LL ( 1234567890),
"1234567890", 10, 0,
Eof);
1597 TEST (
T,
LL ( 12345678901),
"12345678901", 11, 0,
Eof);
1598 TEST (
T,
LL ( 123456789012),
"123456789012", 12, 0,
Eof);
1599 TEST (
T,
LL ( 1234567890123),
"1234567890123", 13, 0,
Eof);
1600 TEST (
T,
LL ( 12345678901234),
"12345678901234", 14, 0,
Eof);
1601 TEST (
T,
LL ( 123456789012345),
"123456789012345", 15, 0,
Eof);
1602 TEST (
T,
LL ( 1234567890123456),
"1234567890123456", 16, 0,
Eof);
1603 TEST (
T,
LL ( 12345678901234567),
"12345678901234567", 17, 0,
Eof);
1604 TEST (
T,
LL ( 123456789012345678),
"123456789012345678", 18, 0,
Eof);
1605 TEST (
T,
LL (1234567890123456789),
"1234567890123456789", 19, 0,
Eof);
1633 TEST (
T, +
LL ( 123456),
"+123456", 7, 0,
Eof);
1634 TEST (
T, +
LL ( 1234567),
"+1234567", 8, 0,
Eof);
1635 TEST (
T, +
LL ( 12345678),
"+12345678", 9, 0,
Eof);
1636 TEST (
T, +
LL ( 123456789),
"+123456789", 10, 0,
Eof);
1637 TEST (
T, +
LL ( 1234567890),
"+1234567890", 11, 0,
Eof);
1638 TEST (
T, +
LL ( 12345678901),
"+12345678901", 12, 0,
Eof);
1639 TEST (
T, +
LL ( 123456789012),
"+123456789012", 13, 0,
Eof);
1640 TEST (
T, +
LL ( 1234567890123),
"+1234567890123", 14, 0,
Eof);
1641 TEST (
T, +
LL ( 12345678901234),
"+12345678901234", 15, 0,
Eof);
1642 TEST (
T, +
LL ( 123456789012345),
"+123456789012345", 16, 0,
Eof);
1643 TEST (
T, +
LL ( 1234567890123456),
"+1234567890123456", 17, 0,
Eof);
1644 TEST (
T, +
LL ( 12345678901234567),
"+12345678901234567", 18, 0,
Eof);
1645 TEST (
T, +
LL ( 123456789012345678),
"+123456789012345678", 19, 0,
Eof);
1646 TEST (
T, +
LL (1234567890123456789),
"+1234567890123456789", 20, 0,
Eof);
1674 TEST (
T, -
LL ( 123456),
"-123456", 7, 0,
Eof);
1675 TEST (
T, -
LL ( 1234567),
"-1234567", 8, 0,
Eof);
1676 TEST (
T, -
LL ( 12345678),
"-12345678", 9, 0,
Eof);
1677 TEST (
T, -
LL ( 123456789),
"-123456789", 10, 0,
Eof);
1678 TEST (
T, -
LL ( 1234567890),
"-1234567890", 11, 0,
Eof);
1679 TEST (
T, -
LL ( 12345678901),
"-12345678901", 12, 0,
Eof);
1680 TEST (
T, -
LL ( 123456789012),
"-123456789012", 13, 0,
Eof);
1681 TEST (
T, -
LL ( 1234567890123),
"-1234567890123", 14, 0,
Eof);
1682 TEST (
T, -
LL ( 12345678901234),
"-12345678901234", 15, 0,
Eof);
1683 TEST (
T, -
LL ( 123456789012345),
"-123456789012345", 16, 0,
Eof);
1684 TEST (
T, -
LL ( 1234567890123456),
"-1234567890123456", 17, 0,
Eof);
1685 TEST (
T, -
LL ( 12345678901234567),
"-12345678901234567", 18, 0,
Eof);
1686 TEST (
T, -
LL ( 123456789012345678),
"-123456789012345678", 19, 0,
Eof);
1687 TEST (
T, -
LL (1234567890123456789),
"-1234567890123456789", 20, 0,
Eof);
1710 TEST (
T, +
LL (9223372036854775807),
"+9223372036854775807", 20, 0,
Eof);
1718 TEST (
T, -
LL (9223372036854775807) - 1,
"-9223372036854775808", 20, 0,
Eof);
1733 TEST (
T,
LL ( 0x123456789abc),
"123456789abc", 12,
hex,
Eof);
1734 TEST (
T,
LL ( 0x123456789abcd),
"123456789abcd", 13,
hex,
Eof);
1735 TEST (
T,
LL ( 0x123456789abcde),
"123456789abcde", 14,
hex,
Eof);
1736 TEST (
T,
LL ( 0x123456789abcdef),
"123456789abcdef", 15,
hex,
Eof);
1737 TEST (
T,
LL ( 0x123456789abcdef0),
"123456789abcdef0", 16,
hex,
Eof);
1750 TEST (
T,
LL ( 0x123456789ab),
"0x123456789ab", 13,
hex,
Eof);
1751 TEST (
T,
LL ( 0x123456789abc),
"0x123456789abc", 14,
hex,
Eof);
1752 TEST (
T,
LL ( 0x123456789abcd),
"0x123456789abcd", 15,
hex,
Eof);
1753 TEST (
T,
LL ( 0x123456789abcde),
"0x123456789abcde", 16,
hex,
Eof);
1754 TEST (
T,
LL ( 0x123456789abcdef),
"0x123456789abcdef", 17,
hex,
Eof);
1755 TEST (
T,
LL ( 0x123456789abcdef0),
"0x123456789abcdef0", 18,
hex,
Eof);
1808 TEST (
T, +
LL ( 0x123456789ab),
"+123456789ab", 12,
hex,
Eof);
1809 TEST (
T, +
LL ( 0x123456789abc),
"+123456789abc", 13,
hex,
Eof);
1810 TEST (
T, +
LL ( 0x123456789abcd),
"+123456789abcd", 14,
hex,
Eof);
1811 TEST (
T, +
LL ( 0x123456789abcde),
"+123456789abcde", 15,
hex,
Eof);
1812 TEST (
T, +
LL ( 0x123456789abcdef),
"+123456789abcdef", 16,
hex,
Eof);
1813 TEST (
T, +
LL ( 0x123456789abcdef0),
"+123456789abcdef0", 17,
hex,
Eof);
1825 TEST (
T, +
LL ( 0x123456789a),
"+0x123456789a", 13,
hex,
Eof);
1826 TEST (
T, +
LL ( 0x123456789ab),
"+0x123456789ab", 14,
hex,
Eof);
1827 TEST (
T, +
LL ( 0x123456789abc),
"+0x123456789abc", 15,
hex,
Eof);
1828 TEST (
T, +
LL ( 0x123456789abcd),
"+0x123456789abcd", 16,
hex,
Eof);
1829 TEST (
T, +
LL ( 0x123456789abcde),
"+0x123456789abcde", 17,
hex,
Eof);
1830 TEST (
T, +
LL ( 0x123456789abcdef),
"+0x123456789abcdef", 18,
hex,
Eof);
1831 TEST (
T, +
LL ( 0x123456789abcdef0),
"+0x123456789abcdef0", 19,
hex,
Eof);
1833 TEST (
T, +
LL ( 0x0),
"+00000000000000000000", 21,
hex,
Eof);
1865 TEST (
T, -
LL ( 0x123456789ab),
"-123456789ab", 12,
hex,
Eof);
1866 TEST (
T, -
LL ( 0x123456789abc),
"-123456789abc", 13,
hex,
Eof);
1867 TEST (
T, -
LL ( 0x123456789abcd),
"-123456789abcd", 14,
hex,
Eof);
1868 TEST (
T, -
LL ( 0x123456789abcde),
"-123456789abcde", 15,
hex,
Eof);
1869 TEST (
T, -
LL ( 0x123456789abcdef),
"-123456789abcdef", 16,
hex,
Eof);
1870 TEST (
T, -
LL ( 0x123456789abcdef0),
"-123456789abcdef0", 17,
hex,
Eof);
1872 TEST (
T, -
LL ( 0x0),
"-00000000000000000000", 21,
hex,
Eof);
1893 if (rw_opt_no_errno) {
1894 rw_note (0, 0, 0,
"errno test disabled");
1897 test_errno (ctype, cname, itype, iname, (
long long)0);
1911#ifndef NO_GET_ULLONG
1912# ifndef _RWSTD_NO_LONG_LONG
1914 const char*
const tname =
"unsigned long long";
1916 rw_info (0, 0, 0,
"extension: std::num_get<%s, %s>::get (..., %s&)",
1917 cname, iname, tname);
1920# define ULL(number) number ## ULL
1923# define ULL(number) number ## UI64
1935 TEST (
T,
ULL ( 123456789),
"123456789", 9, 0,
Eof);
1936 TEST (
T,
ULL ( 1234567890),
"1234567890", 10, 0,
Eof);
1937 TEST (
T,
ULL ( 12345678901),
"12345678901", 11, 0,
Eof);
1938 TEST (
T,
ULL ( 123456789012),
"123456789012", 12, 0,
Eof);
1939 TEST (
T,
ULL ( 1234567890123),
"1234567890123", 13, 0,
Eof);
1940 TEST (
T,
ULL ( 12345678901234),
"12345678901234", 14, 0,
Eof);
1941 TEST (
T,
ULL ( 123456789012345),
"123456789012345", 15, 0,
Eof);
1942 TEST (
T,
ULL ( 1234567890123456),
"1234567890123456", 16, 0,
Eof);
1943 TEST (
T,
ULL ( 12345678901234567),
"12345678901234567", 17, 0,
Eof);
1944 TEST (
T,
ULL ( 123456789012345678),
"123456789012345678", 18, 0,
Eof);
1945 TEST (
T,
ULL ( 1234567890123456789),
"1234567890123456789", 19, 0,
Eof);
1975 TEST (
T,
ULL ( 12345678),
"+12345678", 9, 0,
Eof);
1976 TEST (
T,
ULL ( 123456789),
"+123456789", 10, 0,
Eof);
1977 TEST (
T,
ULL ( 1234567890),
"+1234567890", 11, 0,
Eof);
1978 TEST (
T,
ULL ( 12345678901),
"+12345678901", 12, 0,
Eof);
1979 TEST (
T,
ULL ( 123456789012),
"+123456789012", 13, 0,
Eof);
1980 TEST (
T,
ULL ( 1234567890123),
"+1234567890123", 14, 0,
Eof);
1981 TEST (
T,
ULL ( 12345678901234),
"+12345678901234", 15, 0,
Eof);
1982 TEST (
T,
ULL ( 123456789012345),
"+123456789012345", 16, 0,
Eof);
1983 TEST (
T,
ULL ( 1234567890123456),
"+1234567890123456", 17, 0,
Eof);
1984 TEST (
T,
ULL ( 12345678901234567),
"+12345678901234567", 18, 0,
Eof);
1985 TEST (
T,
ULL ( 123456789012345678),
"+123456789012345678", 19, 0,
Eof);
1986 TEST (
T,
ULL ( 1234567890123456789),
"+1234567890123456789", 20, 0,
Eof);
2009 TEST (
T,
ULL (18446744073709551615),
"-1", 2, 0,
Eof);
2010 TEST (
T,
ULL (18446744073709551604),
"-12", 3, 0,
Eof);
2011 TEST (
T,
ULL (18446744073709551493),
"-123", 4, 0,
Eof);
2012 TEST (
T,
ULL (18446744073709550382),
"-1234", 5, 0,
Eof);
2013 TEST (
T,
ULL (18446744073709539271),
"-12345", 6, 0,
Eof);
2014 TEST (
T,
ULL (18446744073709428160),
"-123456", 7, 0,
Eof);
2015 TEST (
T,
ULL (18446744073708317049),
"-1234567", 8, 0,
Eof);
2016 TEST (
T,
ULL (18446744073697205938),
"-12345678", 9, 0,
Eof);
2017 TEST (
T,
ULL (18446744073586094827),
"-123456789", 10, 0,
Eof);
2018 TEST (
T,
ULL (18446744072474983726),
"-1234567890", 11, 0,
Eof);
2019 TEST (
T,
ULL (18446744061363872715),
"-12345678901", 12, 0,
Eof);
2020 TEST (
T,
ULL (18446743950252762604),
"-123456789012", 13, 0,
Eof);
2021 TEST (
T,
ULL (18446742839141661493),
"-1234567890123", 14, 0,
Eof);
2022 TEST (
T,
ULL (18446731728030650382),
"-12345678901234", 15, 0,
Eof);
2023 TEST (
T,
ULL (18446620616920539271),
"-123456789012345", 16, 0,
Eof);
2024 TEST (
T,
ULL (18445509505819428160),
"-1234567890123456", 17, 0,
Eof);
2025 TEST (
T,
ULL (18434398394808317049),
"-12345678901234567", 18, 0,
Eof);
2026 TEST (
T,
ULL (18323287284697205938),
"-123456789012345678", 19, 0,
Eof);
2027 TEST (
T,
ULL (17212176183586094827),
"-1234567890123456789", 20, 0,
Eof);
2030 TEST (
T,
ULL (18446744073709551615),
"-0000000000000000001", 20,
dec,
Eof);
2031 TEST (
T,
ULL (18446744073709551614),
"-000000000000000002", 19,
dec,
Eof);
2032 TEST (
T,
ULL (18446744073709551613),
"-00000000000000003", 18,
dec,
Eof);
2033 TEST (
T,
ULL (18446744073709551612),
"-0000000000000004", 17,
dec,
Eof);
2034 TEST (
T,
ULL (18446744073709551611),
"-000000000000005", 16,
dec,
Eof);
2035 TEST (
T,
ULL (18446744073709551610),
"-00000000000006", 15,
dec,
Eof);
2036 TEST (
T,
ULL (18446744073709551609),
"-0000000000007", 14,
dec,
Eof);
2037 TEST (
T,
ULL (18446744073709551608),
"-000000000008", 13,
dec,
Eof);
2038 TEST (
T,
ULL (18446744073709551607),
"-00000000009", 12,
dec,
Eof);
2039 TEST (
T,
ULL (18446744073709551615),
"-0000000001", 11,
dec,
Eof);
2040 TEST (
T,
ULL (18446744073709551614),
"-000000002", 10,
dec,
Eof);
2049 TEST (
T,
ULL (18446744073709551615),
"18446744073709551615", 20, 0,
Eof);
2050 TEST (
T,
ULL (18446744073709551615),
"018446744073709551615", 21,
dec,
Eof);
2051 TEST (
T,
ULL (18446744073709551615),
"+18446744073709551615", 21, 0,
Eof);
2067 TEST (
T,
ULL ( 0x123456789abcd),
"0x123456789abcd", 15,
hex,
Eof);
2068 TEST (
T,
ULL ( 0x123456789abcde),
"0x123456789abcde", 16,
hex,
Eof);
2069 TEST (
T,
ULL ( 0x123456789abcdef),
"0x123456789abcdef", 17,
hex,
Eof);
2070 TEST (
T,
ULL ( 0x123456789abcdef0),
"0x123456789abcdef0", 18,
hex,
Eof);
2072 if (rw_opt_no_errno) {
2073 rw_note (0, 0, 0,
"errno test disabled");
2076 test_errno (ctype, cname, itype, iname, (
unsigned long long)0);
2087test_pvoid (
CharType ctype,
const char *cname,
2092 const char*
const tname =
"void*";
2094 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&)",
2095 cname, iname, tname);
2097 typedef void*
PVoid;
2108#if defined (_RWSTD_LONG_LONG) && _RWSTD_PTR_SIZE > _RWSTD_LONG_SIZE \
2109 || ULONG_MAX > 0xffffffffUL
2110 const char pvmax[] =
"0xffffffffffffffff";
2111 const char pvmax_plus_1[] =
"0x10000000000000000";
2112#elif ULONG_MAX == 0xffffUL
2113 const char pvmax[] =
"0xffff";
2114 const char pvmax_plus_1[] =
"0x10000";
2115#elif ULONG_MAX == 0xffffffffUL
2116 const char pvmax[] =
"0xffffffff";
2117 const char pvmax_plus_1[] =
"0x100000000";
2120 const char pvmax[] =
"0";
2121 const char pvmax_plus_1[] =
"0xffffffffffffffffffffffffffffffff";
2124#define PVOIDSTR(name) name, INTSIZE (name - 1)
2142template <
class floatT>
2145 floatT,
bool test_locale)
2174 TEST (
T,
F (1.0e+02),
"100", 3, 0,
Eof);
2175 TEST (
T,
F (1.0e+03),
"1000", 4, 0,
Eof);
2176 TEST (
T,
F (1.0e+04),
"10000", 5, 0,
Eof);
2177 TEST (
T,
F (1.0e+05),
"100000", 6, 0,
Eof);
2178 TEST (
T,
F (1.0e+06),
"1000000", 7, 0,
Eof);
2179 TEST (
T,
F (1.0e+07),
"10000000", 8, 0,
Eof);
2180 TEST (
T,
F (1.0e+08),
"100000000", 9, 0,
Eof);
2181 TEST (
T,
F (1.0e+09),
"1000000000", 10, 0,
Eof);
2182 TEST (
T,
F (1.0e+10),
"10000000000", 11, 0,
Eof);
2183 TEST (
T,
F (1.0e+11),
"100000000000", 12, 0,
Eof);
2184 TEST (
T,
F (1.0e+12),
"1000000000000", 13, 0,
Eof);
2185 TEST (
T,
F (1.0e+13),
"10000000000000", 14, 0,
Eof);
2186 TEST (
T,
F (1.0e+14),
"100000000000000", 15, 0,
Eof);
2187 TEST (
T,
F (1.0e+15),
"1000000000000000", 16, 0,
Eof);
2188 TEST (
T,
F (1.0e+16),
"10000000000000000", 17, 0,
Eof);
2189 TEST (
T,
F (1.0e+17),
"100000000000000000", 18, 0,
Eof);
2190 TEST (
T,
F (1.0e+18),
"1000000000000000000", 19, 0,
Eof);
2191 TEST (
T,
F (1.0e+19),
"10000000000000000000", 20, 0,
Eof);
2192 TEST (
T,
F (1.0e+20),
"100000000000000000000", 21, 0,
Eof);
2193 TEST (
T,
F (1.0e+21),
"1000000000000000000000", 22, 0,
Eof);
2194 TEST (
T,
F (1.0e+22),
"10000000000000000000000", 23, 0,
Eof);
2195 TEST (
T,
F (1.0e+23),
"100000000000000000000000", 24, 0,
Eof);
2196 TEST (
T,
F (1.0e+24),
"1000000000000000000000000", 25, 0,
Eof);
2197 TEST (
T,
F (1.0e+25),
"10000000000000000000000000", 26, 0,
Eof);
2198 TEST (
T,
F (1.0e+26),
"100000000000000000000000000", 27, 0,
Eof);
2199 TEST (
T,
F (1.0e+27),
"1000000000000000000000000000", 28, 0,
Eof);
2200 TEST (
T,
F (1.0e+28),
"10000000000000000000000000000", 29, 0,
Eof);
2201 TEST (
T,
F (1.0e+29),
"100000000000000000000000000000", 30, 0,
Eof);
2203#define VALSTR(x) floatT (x), #x, int (std::strlen (#x))
2302 TEST (
T,
F (1.0e+29),
"100000000000000000000000000000", 30, 0,
Eof,
"\1");
2306 "1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0",
2310 "1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0",
2318 TEST (
T,
F (123456.789),
"123;456.789;012", 11, 0,
Good,
"\3");
2319 TEST (
T,
F (123456.780),
"123;456.78;9012", 10, 0,
Good,
"\3");
2320 TEST (
T,
F (123456.700),
"123;456.7;89012", 9, 0,
Good,
"\3");
2321 TEST (
T,
F (123456.000),
"123;456.;789012", 8, 0,
Good,
"\3");
2322 TEST (
T,
F (123456
e+1),
"123;456e+1;2345", 10, 0,
Good,
"\3");
2323 TEST (
T,
F (123456
e+2),
"123;456e2;34567", 9, 0,
Good,
"\3");
2324 TEST (
T,
F (123456
e+3),
"123456e3;456789", 8, 0,
Good,
"\3");
2325 TEST (
T,
F (123456.e+2),
"123;456.e+2;345", 11, 0,
Good,
"\3");
2326 TEST (
T,
F (123456.e+3),
"123;456.e3;4567", 10, 0,
Good,
"\3");
2327 TEST (
T,
F (123456.e+4),
"123456.e4;56789", 9, 0,
Good,
"\3");
2367 TEST (
T,
F ( 123
e+4),
"123e+4", 6, 0,
Eof,
"\1");
2368 TEST (
T,
F ( 124
e+5),
"124e+5", 6, 0,
Eof,
"\1");
2369 TEST (
T,
F (+125
e+6),
"+125e+6", 7, 0,
Eof,
"\1");
2370 TEST (
T,
F (-126
e+7),
"-126e+7", 7, 0,
Eof,
"\1");
2371 TEST (
T,
F (-127
e-8),
"-127e-8", 7, 0,
Eof,
"\1");
2375 TEST (
T,
F ( 123
e-4),
"123e-4", 6, 0,
Eof,
"\1");
2376 TEST (
T,
F ( 124
e-5),
"124e-5", 6, 0,
Eof,
"\1");
2377 TEST (
T,
F (+125
e-6),
"+125e-6", 7, 0,
Eof,
"\1");
2378 TEST (
T,
F (+126
e-7),
"+126e-7", 7, 0,
Eof,
"\1");
2379 TEST (
T,
F (+127
e+8),
"+127e+8", 7, 0,
Eof,
"\1");
2395 const std::lconv*
const conv = std::localeconv ();
2400 if (conv->decimal_point &&
'.' != *conv->decimal_point) {
2402 "num_get<%s, %s>::get(..., %s&) when "
2403 "LC_NUMERIC=\"%s\"",
2404 cname, iname, tname,
name);
2409 TEST (
T,
F ( 1.2e+34),
"1.2e+34", 7, 0,
Eof);
2410 TEST (
T,
F (+1.3e+33),
"+1.3e+33", 8, 0,
Eof);
2411 TEST (
T,
F (-1.4e+32),
"-1.4e+32", 8, 0,
Eof);
2412 TEST (
T,
F ( 0.5e+31),
".5e+31", 6, 0,
Eof);
2413 TEST (
T,
F (+0.6e+30),
"+.6e+30", 7, 0,
Eof);
2414 TEST (
T,
F (-0.7e+29),
"-.7e+29", 7, 0,
Eof);
2421 "num_get<%s, %s>::get (..., %s&) known to fail when "
2422 "LC_NUMERIC is set to a locale where decimal_point != '.'",
2423 cname, iname, tname);
2427 if (rw_opt_no_errno) {
2428 rw_note (0, 0, 0,
"errno test disabled");
2431 test_errno (ctype, cname, itype, iname, floatT ());
2440test_flt_uflow (
CharType ctype,
const char *cname,
2446 "std::num_get<%s, %s>::get (..., float&) on underflow",
2450 static float val = 0;
2464 "correct sign after positive underflow");
2468 "correct sign after negative underflow");
2493 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., float&) on overflow",
2496 const float inf = std::numeric_limits<float>::infinity ();
2528# ifdef _RWSTD_LDBL_MAX
2530 std::ios_base::iostate state =
Fail;
2534 if (0 == std::strpbrk (
_RWSTD_STRSTR (_RWSTD_LDBL_MAX),
"Ll"))
2559 const char*
const tname =
"float";
2561 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&)",
2562 cname, iname, tname);
2566# if !defined (_RWSTD_NO_STRTOF) || !defined (_RWSTD_NO_STRTOF_IN_LIBC) \
2567 || !defined (_RWSTD_NO_STRTOD) || !defined (_RWSTD_NO_STRTOD_IN_LIBC)
2569 const bool test_locale =
true;
2573 const bool test_locale =
false;
2583 if (*
str >=
'0' && *
str <=
'9') {
2595 if (rw_opt_no_uflow) {
2596 rw_note (0, 0, 0,
"underflow test disabled");
2599 test_flt_uflow (ctype, cname, itype, iname);
2617 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., double&) on underflow",
2636 if (1.23456789e-309L <
DBL_MIN) {
2641 if (1.234567e-409L <
DBL_MIN) {
2646 if (1.234567e-999L <
DBL_MIN) {
2654# ifdef _RWSTD_LDBL_MAX
2656 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., double&) on overflow",
2659 const double inf = std::numeric_limits<double>::infinity ();
2699 const char*
const tname =
"double";
2701 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&)",
2702 cname, iname, tname);
2704# if !defined (_RWSTD_NO_STRTOD) || !defined (_RWSTD_NO_STRTOD_IN_LIBC)
2706 const bool test_locale =
true;
2710 const bool test_locale =
false;
2716 if (rw_opt_no_uflow) {
2717 rw_note (0, 0, 0,
"underflow test disabled");
2734test_ldbl_uflow (
CharType ctype,
const char *cname,
2740 "std::num_get<%s, %s>::get (..., long double&) on underflow",
2759 const char fmt[] =
"%Lg";
2761 long double ld = 0.0;
2762 if (1 == std::sscanf (
"3.456789e-4932", fmt, &ld) && ld <
LDBL_MIN) {
2767 if (1 == std::sscanf (
"3.456789e-9999", fmt, &ld) && ld <
LDBL_MIN) {
2775# ifdef _RWSTD_LDBL_MAX
2778 "std::num_get<%s, %s>::get (..., long double&) on overflow",
2781 const double inf = std::numeric_limits<long double>::infinity ();
2783 TEST (
T, inf,
"9.999999e+9876543210", 20, 0,
Eof |
Fail);
2784 TEST (
T, -inf,
"-9.999999e+9876543210", 21, 0,
Eof |
Fail);
2804# ifndef _RWSTD_NO_LONG_DOUBLE
2806 const char*
const tname =
"long double";
2808 rw_info (0, 0, 0,
"std::num_get<%s, %s>::get (..., %s&)",
2809 cname, iname, tname);
2811# if !defined (_RWSTD_NO_STRTOLD) || !defined (_RWSTD_NO_STRTOLD_IN_LIBC)
2813 const bool test_locale =
true;
2817 const bool test_locale =
false;
2823 long double long_val;
2825 char long_str [_RWSTD_LDBL_MAX_10_EXP + 2];
2826 std::memset (long_str,
'0',
sizeof long_str);
2827 long_str [
sizeof long_str - 1] =
'\0';
2834# if _RWSTD_LDBL_MAX_10_EXP >= 38
2837 start = &(long_str [
sizeof long_str - 40] =
'1');
2842 long_str [
sizeof long_str - 40] =
'0';
2847# if _RWSTD_LDBL_MAX_10_EXP >= 128
2850 start = &(long_str [
sizeof long_str - 130] =
'1');
2855 long_str [
sizeof long_str - 130] =
'0';
2859# if _RWSTD_LDBL_MAX_10_EXP >= 308
2862 start = &(long_str [
sizeof long_str - 310] =
'1');
2867 long_str [
sizeof long_str - 310] =
'0';
2874# define CAT(a, b) CONCAT (a, b)
2875# define CONCAT(a, b) a ## b
2879 long_val =
CAT (
CAT (1.0
e+, _RWSTD_LDBL_MAX_10_EXP),
L);
2885 if (rw_opt_no_uflow) {
2886 rw_note (0, 0, 0,
"underflow test disabled");
2889 test_ldbl_uflow (ctype, cname, itype, iname);
2907#define TEST(T, tname) \
2908 if (rw_enabled (tname)) \
2909 test_ ## T (ctype, cname, itype, iname); \
2911 rw_note (0, __FILE__, __LINE__, "%s test disabled", tname)
2913#ifndef _RWSTD_NO_BOOL
2914 TEST (
bool,
"bool");
2917 TEST (shrt,
"short");
2919 TEST (
long,
"long");
2920 TEST (ulong,
"unsigned long");
2922#ifndef _RWSTD_NO_LONG_LONG
2924 TEST (llong,
"long long");
2925 TEST (ullong,
"unsigned long long");
2929 TEST (pvoid,
"void*");
2931 TEST (flt,
"float");
2932 TEST (dbl,
"double");
2933 TEST (ldbl,
"long double");
2944 static const char*
const inames[] = {
2945 "char*",
"istreambuf_iterator<char>",
"InputIter<char>"
2950 rw_note (0, __FILE__, __LINE__,
"char test disabled");
2952#ifndef _RWSTD_NO_WCHAR_T
2955 static const char*
const inames[] = {
2956 "wchar_t*",
"istreambuf_iterator<wchar_t>",
"InputIter<wchar_t>"
2961 rw_note (0, __FILE__, __LINE__,
"wchar_t test disabled");
2965 rw_note (0, __FILE__, __LINE__,
2966 "wchar_t test disabled: _RWSTD_NO_WCHAR_T #defined");
2973 static const char*
const inames[] = {
2974 "UserChar*",
"istreambuf_iterator<UserChar>",
"InputIter<UserChar>"
2979 rw_note (0, __FILE__, __LINE__,
"UserChar test disabled");
3001 return rw_test (argc, argv, __FILE__,
3002 "lib.locale.num.get",
3009 &rw_opt_no_grouping,
void test_dbl_uflow(CharType ctype, const char *cname, IterType itype, const char *iname)
void test_floating_point(CharType ctype, const char *cname, IterType itype, const char *iname, floatT, bool test_locale)
void test_errno(CharType ctype, const char *cname, IterType itype, const char *iname, numT)
void run_tests(ForwardIterator dummy_iter, const T *, const char *predname)
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)
void test_ulong(CharT *, Traits *, const char *cname, const char *tname)
void test_ullong(CharT *, Traits *, const char *cname, const char *tname)
void test_shrt(CharT *, Traits *, const char *cname, const char *tname)
void test_dbl(CharT *, Traits *, const char *cname, const char *tname)
void test_long(CharT *, Traits *, const char *cname, const char *tname)
void test_flt(CharT *, Traits *, const char *cname, const char *tname)
void test_llong(CharT *, Traits *, const char *cname, const char *tname)
void test_ldbl(CharT *, Traits *, const char *cname, const char *tname)
void test_int(CharT *, Traits *, const char *cname, const char *tname)
void test_bool(CharT *, Traits *, const char *cname, const char *tname)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_CONST_CAST(T, x)
const char * type_name() const
_TEST_EXPORT char * rw_widen(char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX)
_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)
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
static const char * falsename_
static charT decimal_point_[2]
static charT thousands_sep_[2]
static int n_thousands_sep_
static const char * grouping_[2]
static void set_names(const char *fname, const char *tname)
static char decimal_point_
static char thousands_sep_
static const char * truename_
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
std::ptrdiff_t gptr_off() const
std::basic_streambuf< charT, Traits > Base
Streambuf(const charT *gbeg, const charT *gend)