44#ifndef _RWSTD_NO_SNPRINTF
48# define _SNPRINTF(buf, size, fmt, arg) \
49 snprintf (buf, size, _RWSTD_CONST_CAST (char*, fmt), arg)
51# ifndef _RWSTD_NO_SNPRINTF_IN_LIBC
54# define snprintf _RWSTD_LIBC_SYM (snprintf)
55# define _SNPRINTF(buf, size, fmt, arg) snprintf (buf, size, fmt, arg)
60snprintf (
char*, _RWSTD_SIZE_T,
const char*, ...)
_LIBC_THROWS ();
65# define _SNPRINTF(buf, ignore, fmt, arg) sprintf (buf, fmt, arg)
72static const char __rw_digits[] =
73 "0123456789abcdefghijklmnopqrstuvwxyz"
74 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
78__rw_fmat_infinite (
char *
buf,
size_t bufsize,
double val,
unsigned flags)
96 const char str [] =
"iInNfF";
111 const char str [] =
"nNaAqQsS";
127#ifdef _RWSTD_LONG_LONG
135__rw_btoa (
char *
buf, _ULLong
i,
unsigned base)
139 const _RWSTD_SIZE_T dig = _STD::numeric_limits<_ULLong>::digits + 0
U;
142 const char*
const begin =
end;
154 const _RWSTD_SIZE_T
len = begin -
end;
163__rw_dtoa (
char *
buf, _ULLong
i,
unsigned flags)
167 const _RWSTD_SIZE_T dig10 = _STD::numeric_limits<_ULLong>::digits10 + 2U;
170 const char*
const begin =
end;
179 *--
end = __rw_digits [
i -
tmp * 10];
186 const _RWSTD_SIZE_T
len = begin -
end;
194static inline _RWSTD_SIZE_T
195__rw_dtoa (
char *
buf, _LLong
i,
unsigned flags)
198 flags &= ~_RWSTD_IOS_SHOWPOS;
208__rw_itoa (
char *
buf, _ULLong
i,
unsigned flags)
211 __rw_digits + 36 : __rw_digits;
221 case 1: bits = 1;
break;
222 case 3: bits = 2;
break;
240 case 31: bits = 5;
break;
245 return __rw_btoa (
buf,
i,
unsigned (
base));
250 (_STD::numeric_limits<_ULLong>::digits + bits - 1) / bits;
263 const int dig = int ((
i & (
base <<
j * bits)) >>
j * bits);
267 *
end++ = pdigs [dig];
274static inline _RWSTD_SIZE_T
275__rw_itoa (
char *
buf, _LLong
i,
unsigned flags)
288__rw_btoa (
char *
buf,
unsigned long i,
unsigned base)
292 const _RWSTD_SIZE_T dig = _STD::numeric_limits<unsigned long>::digits + 0
U;
295 const char*
const begin =
end;
307 const _RWSTD_SIZE_T
len = begin -
end;
315static inline _RWSTD_SIZE_T
316__rw_dtoa (
char *
buf,
unsigned long i,
unsigned flags)
320 const _RWSTD_SIZE_T dig10 =
321 _STD::numeric_limits<unsigned long>::digits10 + 2U;
324 const char*
const begin =
end;
333 *--
end = __rw_digits [
i -
tmp * 10];
342 const _RWSTD_SIZE_T
len = begin -
end;
350static inline _RWSTD_SIZE_T
351__rw_dtoa (
char *
buf,
long i,
unsigned flags)
354 flags &= ~_RWSTD_IOS_SHOWPOS;
366__rw_utor (
char *
buf,
unsigned long i,
unsigned flags)
369 static const char lit [] =
"ivxlcdmIVXLCDM";
371 if (0 ==
i ||
i > 4999)
376 const char *begin =
buf;
378 for (;
i >= 1000;
i -= 1000)
381 for (
unsigned long j = 0, ord = 100;
j != 6;
j += 2, ord /= 10) {
385 if (
i >= (fact = 9 * ord)) {
386 *
buf++ = pdigs [4 -
j];
387 *
buf++ = pdigs [6 -
j];
390 else if (
i >= (fact = 5 * ord)) {
391 *
buf++ = pdigs [5 -
j];
392 for (
i -= fact;
i >= ord;
i -= ord)
393 *
buf++ = pdigs [4 -
j];
395 else if (
i >= (fact = 4 * ord)) {
396 *
buf++ = pdigs [4 -
j];
397 *
buf++ = pdigs [5 -
j];
401 for (;
i >= ord;
i -= ord)
402 *
buf++ = pdigs [4 -
j];
411__rw_itoa (
char *
buf,
unsigned long i,
unsigned flags)
414 __rw_digits + 36 : __rw_digits;
423 case unsigned (-1):
case 9:
429 case 1: bits = 1;
break;
430 case 3: bits = 2;
break;
449 return __rw_btoa (
buf,
i, basemask + 1);
458 (_STD::numeric_limits<unsigned long>::digits + bits - 1) / bits;
460 for (
j =
digits - 1; !(
i & (long (basemask) <<
j * bits)); --
j);
466 const unsigned dig = unsigned ((
i >> (
j * bits)) & basemask);
470 *
end++ = pdigs [dig];
477static inline _RWSTD_SIZE_T
478__rw_itoa (
char *
buf,
long i,
unsigned flags)
488__rw_put_groups (
char **pbuf, _RWSTD_SIZE_T
len, _RWSTD_SIZE_T bufsize,
489 const char *
end,
const char *grouping)
498 end = strchr (*pbuf,
'.');
502 end = strchr (*pbuf,
',');
504 end = strpbrk (*pbuf,
"Ee");
513 typedef unsigned char UChar;
517 if (43 == __rw_digit_map [
UChar (*
pd)])
519 else if (
'0' == *
pd) {
522 if (33 == __rw_digit_map [
UChar (*
pd)])
526 _RWSTD_SIZE_T ngrps = 0;
527 _RWSTD_SIZE_T grplen = 0;
530 const char *pg = grouping;
537 grp =
UChar (pg [-1]);
539 else if (_RWSTD_CHAR_MAX == grp) {
558 const bool no_groups =
'\0' == **pbuf;
565 for (
pd = *pbuf + (
len - 1);
pd != *pbuf && ngrps; --
pd) {
571 if ((_RWSTD_SIZE_T)(
end -
pd) == grplen + 1) {
577 if (_RWSTD_CHAR_MAX == *pg)
581 grplen += (*pg ? *pg++ : pg [-1]) + 1;
596 for (
char *ps = *pbuf, *
last = *pbuf; ; ++
pd) {
598 if (
pd == *pbuf +
len) {
618__rw_fix_flt (
char *&
end, _RWSTD_SIZE_T &
len,
630 && (
'.' == beg [1] ||
',' == beg [1])) {
638 const _RWSTD_SIZE_T exp_len =
639 0 > prec ? 7 : (1 < prec ? prec + 1 : 2);
652 if ((
'e' ==
end [-5] ||
'E' ==
end [-5]) &&
'0' ==
end [-3]) {
658 else if (
'#' ==
end [-4]) {
662 if (
'F' ==
end [-1]) {
666 const char str[] =
"iInNfF";
676 const char str[] =
"nNaA";
686 else if (
'#' ==
end [-5]) {
689 const char str[] =
"nNaA";
710 typedef unsigned char UChar;
715 if (43 == __rw_digit_map [
UChar (*beg)]) {
722 switch (__rw_digit_map [
UChar (*beg)]) {
743 else if (28 ==
last) {
760 beg [0] = pstr [cap + 0];
761 beg [1] = pstr [cap + 2];
762 beg [2] = pstr [cap + 4];
763 beg [3] = pstr [cap + 6];
765 end = beg + 3 + (
'\0' != beg [3]);
778__rw_put_num (
char **pbuf, _RWSTD_SIZE_T bufsize,
780 const void *pval,
const char *grouping)
784 char*
const buf = *pbuf;
789 typedef _RWSTD_SIZE_T SizeT;
793 case __rw_facet::_C_bool:
802 case __rw_facet::_C_short:
803 case __rw_facet::_C_int:
804 case __rw_facet::_C_long:
805#if defined (__INTEL_COMPILER) && defined (_WIN64)
806# pragma warning (disable: 810)
809#if defined (__INTEL_COMPILER) && defined (_WIN64)
810# pragma warning (default: 810)
814 case __rw_facet::_C_ushort:
815 case __rw_facet::_C_uint:
816 case __rw_facet::_C_ulong:
822#if defined (__INTEL_COMPILER) && defined (_WIN64)
823# pragma warning (disable: 810)
827#if defined (__INTEL_COMPILER) && defined (_WIN64)
828# pragma warning (default: 810)
832#ifdef _RWSTD_LONG_LONG
834 case __rw_facet::_C_llong:
835 len = __rw_itoa (
buf, *(
const _LLong*)pval,
flags);
838 case __rw_facet::_C_ullong:
839 len = __rw_itoa (
buf, *(
const _ULLong*)pval,
845 case __rw_facet::_C_float | __rw_facet::_C_ptr: {
846 const float fval = *(
const float*)pval;
848 len = __rw_fmat_infinite (*pbuf, bufsize, fval,
flags);
853 fmt = __rw_get_stdio_fmat (fmtbuf, type & ~__rw_facet::_C_ptr,
858 if (
len >= bufsize) {
862 bufsize =
len + 1 ?
len + 1 : bufsize * 2;
863 *pbuf =
new char [bufsize];
880 case __rw_facet::_C_double | __rw_facet::_C_ptr: {
881 const double dval = *(
const double*)pval;
883 len = __rw_fmat_infinite (*pbuf, bufsize, dval,
flags);
888 fmt = __rw_get_stdio_fmat (fmtbuf, type & ~__rw_facet::_C_ptr,
894 if (
len >= bufsize) {
898 bufsize =
len + 1 ?
len + 1 : bufsize * 2;
899 *pbuf =
new char [bufsize];
916#ifndef _RWSTD_NO_LONG_DOUBLE
918 case __rw_facet::_C_ldouble | __rw_facet::_C_ptr: {
919 const long double ldval = *(
const long double*)pval;
921 len = __rw_fmat_infinite (*pbuf, bufsize, ldval,
flags);
926 fmt = __rw_get_stdio_fmat (fmtbuf, type & ~__rw_facet::_C_ptr,
931 if (
len >= bufsize) {
935 bufsize =
len + 1 ?
len + 1 : bufsize * 2;
936 *pbuf =
new char [bufsize];
955 case __rw_facet::_C_pvoid:
957 fmt = __rw_get_stdio_fmat (fmtbuf, type,
flags, prec);
981 const bool sign =
'-' == **pbuf ||
'+' == **pbuf;
983 char*
const beg = *pbuf + sign;
989 const _RWSTD_PTRDIFF_T ndigs =
len - sign;
994 if (-prec >= ndigs) {
1000 nfill = -prec - ndigs + 2;
1015 nmove = SizeT (-prec);
1017 src = beg + (ndigs + prec);
1026 memmove (dst, src, nmove);
1027 memset (beg,
'0', nfill);
1035 if (
len > 1 && *grouping && _RWSTD_CHAR_MAX != *grouping)
1036 len = __rw_put_groups (pbuf,
len, bufsize,
end, grouping);
#define _RWSTD_IOS_BOOLALPHA
#define _RWSTD_IOS_FLOATFIELD
#define _RWSTD_IOS_UPPERCASE
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_STREAMSIZE
#define _RWSTD_IOS_SHOWBASE
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_IOS_BASEOFF
#define _RWSTD_IOS_SCIENTIFIC
#define _RWSTD_IOS_SHOWPOS
bool __rw_isfinite(double)
bool __rw_signbit(double)
#define _SNPRINTF(buf, size, fmt, arg)