50# define _RWSTD_EINVAL EINVAL
53# define _RWSTD_EINVAL 22
58#if defined (_RWSTD_NO_STRTOF) && !defined (_RWSTD_NO_STRTOF_IN_LIBC)
60# undef _RWSTD_NO_STRTOF
62extern "C" float strtof (
const char*,
char**);
66#if defined (_RWSTD_NO_STRTOLD) && !defined (_RWSTD_NO_STRTOLD_IN_LIBC)
68# undef _RWSTD_NO_STRTOLD
70extern "C" long double strtold (
const char*,
char**);
78# pragma warning (disable: 4146)
85typedef unsigned char UChar;
88#ifndef _RWSTD_NO_OBJECT_MANGLING
99extern const float __rw_flt_infinity;
100extern const double __rw_dbl_infinity;
102#ifndef _RWSTD_NO_LONG_DOUBLE
104extern const long double __rw_ldbl_infinity;
137__rw_check_grouping (
const char *grps, _RWSTD_SIZE_T ngrps,
138 const char *grping, _RWSTD_SIZE_T ngrpings)
140 if (!ngrps || !ngrpings)
147 _RWSTD_SIZE_T grpn = ngrpings;
150 while (grpn-- != ngrpings && !grping [grpn]);
154 const _RWSTD_SIZE_T grphi = (_RWSTD_SIZE_T)(-1) == grpn ? 0 : grpn;
158 typedef const UChar* PCUChar;
166 typedef const void*
PVoid;
170 if (*
g > *
e || !*
g) {
173 grpn = 0
U - (grpn + 1U);
182 grpn = 0
U - (grpn + 1U);
202 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
204 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
206 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
208 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
210 9, 9, 9, 5, 6, 9, 9, 9, 9, 1, 9, 9, 4, 7, 9, 9,
212 9, 9, 9, 9, 9, 9, 2, 9, 3, 9, 9, 9, 9, 9, 9, 9,
214 9, 9, 9, 5, 6, 9, 9, 9, 9, 1, 9, 9, 4, 7, 9, 9,
216 9, 9, 9, 9, 9, 9, 2, 9, 3, 9, 9, 9, 9, 9, 9, 9,
218 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
219 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
220 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
221 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
222 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
223 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
224 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
225 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
229static const int __rw_roman_digits[] = {
231 -1, 1, 5, 10, 50, 100, 500, 1000, -1, -1
238static unsigned long __rw_get_roman (
const char *
str)
242#define ROMAN_DIGIT(c) __rw_roman_digits [__rw_roman_inxs [UChar (c)]]
244 unsigned long val = 0;
250 if (digit_1 < digit_2)
263template <
class FloatT>
265__rw_validate (FloatT
val, FloatT fmin, FloatT finf,
char sign,
int &err)
274 else if (
val > (fmin)) {
281 val =
'-' == sign ? -(fmin) : (fmin);
293__rw_get_num (
void *pval,
const char *
buf,
int type,
int flags,
294 const char *groups, _RWSTD_SIZE_T ngroups,
295 const char *grouping, _RWSTD_SIZE_T ngroupings)
303 if (!(type & __rw_facet::_C_floating)) {
314#ifdef _RWSTD_LONG_LONG
330 val.ul = _RW::__rw_strtoul (
buf, &err, 10);
335 val.ul = __rw_get_roman (
buf + 1);
340 else if (__rw_facet::_C_ullong == type) {
342#ifdef _RWSTD_LONG_LONG
344 val.ull = _RW::__rw_strtoull (
buf, &err,
base);
348 _RWSTD_ASSERT (!
"logic error: unsigned long long not configured");
352 else if (__rw_facet::_C_llong == type) {
354#ifdef _RWSTD_LONG_LONG
364 else if (type & __rw_facet::_C_signed || __rw_facet::_C_bool == type) {
367 else if (__rw_facet::_C_pvoid == type) {
369#if defined (_RWSTD_LONG_LONG) && _RWSTD_PTR_SIZE > _RWSTD_LONG_SIZE
371 val.ull = _RW::__rw_strtoull (
buf, &err,
base);
386 case __rw_facet::_C_bool:
387 if (0 ==
val.l || 1 ==
val.l) {
395 case __rw_facet::_C_ushort:
397 if (
val.ul > _RWSTD_USHRT_MAX) {
398 val.ul = _RWSTD_USHRT_MAX;
403 val.ul = _RWSTD_USHRT_MAX -
val.ul + 1;
410 case __rw_facet::_C_short:
412 if (
val.l < _RWSTD_SHRT_MIN) {
413 val.l = long (_RWSTD_SHRT_MIN);
416 else if (
val.l > _RWSTD_SHRT_MAX) {
417 val.l = long (_RWSTD_SHRT_MAX);
425 case __rw_facet::_C_uint:
429#if _RWSTD_UINT_MAX < _RWSTD_ULONG_MAX
431 if (
val.ul > _RWSTD_UINT_MAX)
435 if (
val.ul == _RWSTD_ULONG_MAX &&
ERANGE == err)
440 val.ul = _RWSTD_UINT_MAX;
444 val.ul = _RWSTD_UINT_MAX -
val.ul + 1;
450 case __rw_facet::_C_int:
454#if _RWSTD_UINT_MAX < _RWSTD_ULONG_MAX
456 if (
val.l < _RWSTD_INT_MIN) {
457 val.l = long (_RWSTD_INT_MIN);
460 else if (
val.l > _RWSTD_INT_MAX) {
461 val.l = long (_RWSTD_INT_MAX);
468 if (_RWSTD_LONG_MIN ==
val.l)
469 val.l = long (_RWSTD_INT_MIN);
470 else if (_RWSTD_LONG_MAX ==
val.l)
471 val.l = long (_RWSTD_INT_MAX);
479 case __rw_facet::_C_ulong:
483 case __rw_facet::_C_long:
487#ifdef _RWSTD_LONG_LONG
489 case __rw_facet::_C_ullong:
493 case __rw_facet::_C_llong:
499 case __rw_facet::_C_pvoid:
501#if defined (_RWSTD_LONG_LONG) && _RWSTD_PTR_SIZE > _RWSTD_LONG_SIZE
528 const int errno_save = errno;
536 case __rw_facet::_C_float: {
538#ifndef _RWSTD_NO_STRTOF
551 __rw_setlocale
loc (
"C", _RWSTD_LC_NUMERIC);
565 __rw_validate (
f,
float (_RWSTD_FLT_MIN),
566 __rw_flt_infinity, *
buf, err);
586 __rw_setlocale
loc (
"C", _RWSTD_LC_NUMERIC);
596 if (
d < -
double (_RWSTD_FLT_MAX)) {
599 d = -__rw_flt_infinity;
602 else if (
d >
double (_RWSTD_FLT_MAX)) {
605 d = __rw_flt_infinity;
608 else if (
d > 0.0 &&
d <
double (_RWSTD_FLT_MIN)) {
614 else if (d < 0.0 && d > -
double (_RWSTD_FLT_MIN)) {
631#ifdef _RWSTD_NO_STRTOLD
632# if DBL_DIG == LDBL_DIG && DBL_MAX_EXP == LDBL_MAX_EXP
637# define LDBL_SAME_AS_DBL
639 case __rw_facet::_C_ldouble:
644 case __rw_facet::_C_double: {
655 __rw_setlocale
loc (
"C", _RWSTD_LC_NUMERIC);
669 __rw_validate (
d,
double (_RWSTD_DBL_MIN),
670 __rw_dbl_infinity, *
buf, err);
675#ifndef LDBL_SAME_AS_DBL
677 case __rw_facet::_C_ldouble: {
679 typedef long double LDbl;
681# ifndef _RWSTD_NO_LONG_DOUBLE
685# ifndef _RWSTD_NO_STRTOLD
689# if !defined (_RWSTD_OS_HP_UX) || !defined (_LONG_DOUBLE)
715 && (
'0' == *
buf ||
'.' == *
buf
716 || 43 == __rw_digit_map [
UChar (*
buf)])) {
719 if ( 0.0 == strtod (
buf, &tmpend)
720 &&
'\0' == *tmpend && 0 == errno)
734 __rw_setlocale
loc (
"C", _RWSTD_LC_NUMERIC);
736# if !defined (_RWSTD_OS_HP_UX) || !defined (_LONG_DOUBLE)
760 const char*
const fmt =
761 __rw_get_stdio_fmat (fmatbuf, type,
flags, -1 );
765 const int n = sscanf (
buf, fmt, pval);
779 __rw_validate (ld,
LDbl (_RWSTD_LDBL_MIN),
780 __rw_ldbl_infinity, *
buf, err);
797 if ( *grouping && ngroups > 1
798 && 0 > __rw_check_grouping (groups, ngroups, grouping, ngroupings)
799 || !*grouping && ngroups > 1)
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_IOS_FAILBIT
#define _RWSTD_IOS_SHOWBASE
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_IOS_BASEOFF
#define _RWSTD_CONST_CAST(T, x)
#define _RWSTD_IOS_SHOWPOS
#define _RWSTD_IOS_SHOWPOINT