28#define _RWSTD_TEST_SRC
46 ++n_calls_ [MemFun::assign];
47 Base::assign (dst, src);
54 ++n_calls_ [MemFun::eq];
55 return Base::eq (ch1, ch2);
62 ++n_calls_ [MemFun::lt];
63 return Base::lt (ch1, ch2);
70 ++n_calls_ [MemFun::compare];
71 return Base::compare (
s1,
s2,
n);
78 ++n_calls_ [MemFun::length];
79 return Base::length (
s);
87 ++n_calls_ [MemFun::find];
88 return Base::find (
s,
n, ch);
96 ++n_calls_ [MemFun::copy];
97 return Base::copy (dst, src,
n);
105 ++n_calls_ [MemFun::move];
106 return Base::move (dst, src,
n);
112assign (char_type *
s,
size_t n, char_type ch)
114 ++n_calls_ [MemFun::assign];
115 return Base::assign (
s,
n, ch);
123 ++n_calls_ [MemFun::not_eof];
124 return eof () ==
i ? ~i :
i;
132 ++n_calls_ [MemFun::to_char_type];
133 return Base::to_char_type (
i);
141 ++n_calls_ [MemFun::to_int_type];
142 return Base::to_int_type (ch);
149 ++n_calls_ [MemFun::eq_int_type];
150 return Base::eq_int_type (
i1,
i2);
168eof_ = std::char_traits<char>::eof ();
171#ifndef _RWSTD_NO_WCHAR_T
176 ++n_calls_ [MemFun::assign];
177 Base::assign (dst, src);
184 ++n_calls_ [MemFun::eq];
185 return Base::eq (ch1, ch2);
192 ++n_calls_ [MemFun::lt];
193 return Base::lt (ch1, ch2);
200 ++n_calls_ [MemFun::compare];
201 return Base::compare (
s1,
s2,
n);
208 ++n_calls_ [MemFun::length];
209 return Base::length (
s);
217 ++n_calls_ [MemFun::find];
218 return Base::find (
s,
n, ch);
226 ++n_calls_ [MemFun::copy];
227 return Base::copy (dst, src,
n);
235 ++n_calls_ [MemFun::move];
236 return Base::move (dst, src,
n);
242assign (char_type *
s,
size_t n, char_type ch)
244 ++n_calls_ [MemFun::assign];
245 return Base::assign (
s,
n, ch);
253 ++n_calls_ [MemFun::not_eof];
254 return eof () ==
i ? ~i :
i;
262 ++n_calls_ [MemFun::to_char_type];
263 return Base::to_char_type (
i);
271 ++n_calls_ [MemFun::to_int_type];
272 return Base::to_int_type (ch);
279 ++n_calls_ [MemFun::eq_int_type];
280 return Base::eq_int_type (
i1,
i2);
298eof_ = std::char_traits<wchar_t>::eof ();
312 ++n_calls_ [MemFun::assign];
323 ++n_calls_ [MemFun::eq];
325 return c1.f ==
c2.f &&
c1.c ==
c2.c;
333 ++n_calls_ [MemFun::lt];
344 ++n_calls_ [MemFun::compare];
346 for (
size_t i = 0;
i !=
n; ++
i) {
365 ++n_calls_ [MemFun::length];
381 ++n_calls_ [MemFun::find];
384 if (
s->f ==
c.f &&
s->c ==
c.c)
398 ++n_calls_ [MemFun::copy];
400 for (
size_t i = 0;
i !=
n;
i++)
413 ++n_calls_ [MemFun::move];
416 for (
size_t i = 0;
i !=
n; ++
i)
430assign (char_type *
s,
size_t n, char_type
c)
434 ++n_calls_ [MemFun::assign2];
436 for (;
n--;
s [
n] =
c);
446 ++n_calls_ [MemFun::not_eof];
448 if (
i.equal (int_type::eof ())) {
451 return int_type::from_char (
c);
462 ++n_calls_ [MemFun::to_char_type];
472 ++n_calls_ [MemFun::to_int_type];
474 return int_type::from_char (
c);
482 ++n_calls_ [MemFun::eq_int_type];
484 return i1.equal (
i2);
492 ++n_calls_ [MemFun::eof];
494 return int_type::eof ();
504 if (_RWSTD_SIZE_MAX ==
len)
505 len = src ? strlen (src) : 0;
512 memcpy (dst, src,
len);
517 memset (dst, 0,
len);
529_rw_get_char (
const char *src,
const char** end,
size_t *
count)
540 unsigned long ch =
UChar (*src++);
542 if (0 == ch && _RWSTD_SIZE_MAX == *
count) {
549 if (
'<' ==
char (ch) &&
'U' == src [0] && isxdigit (src [1])) {
556 const unsigned long val = strtoul (src + 1, &tmp_end, 16);
557 if (
'>' == *tmp_end) {
563 if (
'@' == src [0] && isdigit (src [1])) {
568 *
count = strtoul (src + 1, &tmp_end, 10);
581_rw_expand (
void *dst,
size_t elemsize,
582 const char *src,
size_t src_len ,
586#ifndef _RWSTD_NO_WCHAR_T
587 typedef wchar_t WChar;
594 ||
sizeof (WChar) == elemsize
604 const void*
const dst_save = dst;
608 size_t bufsize = dst ? dst_len ? *dst_len : _RWSTD_SIZE_MAX : 0;
611 if (_RWSTD_SIZE_MAX == src_len)
612 src_len = strlen (src);
616 for (
const char *psrc = src; ; ) {
618 size_t count = src_len;
620 const unsigned long ch = _rw_get_char (psrc, &end, &
count);
622 const size_t nchars = size_t (end - psrc);
630 if (bufsize - buflen <=
count) {
632 bufsize = (bufsize +
count) * 2;
640 case sizeof (WChar):
tmp = new WChar [bufsize];
break;
642 default:
tmp =
new char [bufsize];
break;
646 memcpy (
tmp, dst, buflen * elemsize);
649 if (dst != dst_save) {
651 case sizeof (WChar): delete[] (WChar*)dst;
break;
653 default:
delete[] (
char*)dst;
break;
659 pnext = (
char*)dst + buflen * elemsize;
662 if (
sizeof (WChar) == elemsize) {
664 ((WChar*)pnext)[
i] = WChar (ch);
666 else if (
sizeof (
UserChar) == elemsize) {
667 for (
size_t i = 0;
i !=
count; ++
i) {
672 else if (ch < 0x80U) {
680 pnext = (
char*)pnext +
count * elemsize;
688 const char*
const pnext_start = pnext;
693 for (
size_t i = 0;
i !=
count; ++
i) {
695 *pnext++ =
UChar (0xc0U | (ch >> 6));
696 *pnext++ =
UChar (0x80U | (ch & 0x3fU));
699 else if (ch < 0x10000U) {
700 *pnext++ =
UChar (0xe0U | (ch >> 12));
701 *pnext++ =
UChar (0x80U | (ch >> 6 & 0x3fU));
702 *pnext++ =
UChar (0x80U | (ch & 0x3fU));
705 else if (ch < 0x200000U) {
706 *pnext++ =
UChar (0xf0U | (ch >> 18));
707 *pnext++ =
UChar (0x80U | (ch >> 12 & 0x3fU));
708 *pnext++ =
UChar (0x80U | (ch >> 6 & 0x3fU));
709 *pnext++ =
UChar (0x80U | (ch & 0x3fU));
712 else if (ch < 0x4000000U) {
713 *pnext++ =
UChar (0xf8U | (ch >> 24));
714 *pnext++ =
UChar (0x80U | (ch >> 18 & 0x3fU));
715 *pnext++ =
UChar (0x80U | (ch >> 12 & 0x3fU));
716 *pnext++ =
UChar (0x80U | (ch >> 6 & 0x3fU));
717 *pnext++ =
UChar (0x80U | (ch & 0x3fU));
721 *pnext++ =
UChar (0xfcU | (ch >> 30));
722 *pnext++ =
UChar (0x80U | (ch >> 24 & 0x3fU));
723 *pnext++ =
UChar (0x80U | (ch >> 18 & 0x3fU));
724 *pnext++ =
UChar (0x80U | (ch >> 12 & 0x3fU));
725 *pnext++ =
UChar (0x80U | (ch >> 6 & 0x3fU));
726 *pnext++ =
UChar (0x80U | (ch & 0x3fU));
735 pnext = (
char*)pnext +
count * elemsize;
739 memset (pnext, 0, elemsize);
757 void*
const result = _rw_expand (dst,
sizeof *dst, src, src_len, dst_len);
789 if (0 ==
s1 || 0 == *
s1)
795 _rw_get_char (
p1, &
p1, &
n);
808 for (
unsigned long ch1, ch2;
count <
len; ) {
812 ch1 = _rw_get_char (
p1, &
p1, &
n1);
817 ch2 = _rw_get_char (
p2, &
p2, &
n2);
839 if (_RWSTD_SIZE_MAX ==
len && 0 == ch1)
847#ifndef _RWSTD_NO_WCHAR_T
854 if (_RWSTD_SIZE_MAX ==
len)
855 len = src ? strlen (src) : 0;
863 for (
size_t i = 0; ; ++
i) {
874 memset (dst, 0,
len *
sizeof *dst);
884rw_expand (
wchar_t *dst,
const char *src,
size_t src_len ,
887 void*
const result = _rw_expand (dst,
sizeof *dst, src, src_len, dst_len);
898 if (_RWSTD_SIZE_MAX ==
len) {
912 for (
size_t i = 0; ; ++
i) {
918 dst [
i] = char (
UChar (src [
i]));
923 memset (dst, 0,
len);
949 const wchar_t*
p2 =
s2;
958 for (
unsigned long ch1, ch2;
count <
len; ) {
962 ch1 = _rw_get_char (
p1, &
p1, &
n1);
987 if (_RWSTD_SIZE_MAX ==
len &&
L'\0' == ch1)
1002 if (_RWSTD_SIZE_MAX ==
len)
1003 len = src ? strlen (src) : 0;
1011 for (
size_t i = 0; ; ++
i) {
1023 memset (dst, 0,
len *
sizeof *dst);
1036 void*
const result = _rw_expand (dst,
sizeof *dst, src, src_len, dst_len);
1047 if (_RWSTD_SIZE_MAX ==
len) {
1061 for (
size_t i = 0; ; ++
i) {
1067 dst [
i] = char (src [
i].
c);
1072 memset (dst, 0,
len);
1097 const char*
p1 =
s1;
1113 ch1 = _rw_get_char (
p1, &
p1, &
n1);
1130 else if (
n2 <=
n1) {
1138 if (_RWSTD_SIZE_MAX ==
len &&
L'\0' == ch1)
1148_rw_fmtstringv (
char **pbuf,
size_t *pbufsize,
const char *fmt, va_list va)
1162 static int nested_call;
1164 if (nested_call ||
'/' != fmt [0])
1165 return _RWSTD_INT_MIN;
1171 bool fl_pound =
false;
1193 pva =
va_arg (va, va_list*);
1201 elemsize =
va_arg (*pva,
int);
1204 else if (isdigit (
UChar (*fmt))) {
1207 const int arg = int (strtol (fmt, &end, 10));
1218 if (
'*' == *++fmt) {
1220 pva =
va_arg (va, va_list*);
1229 nelems =
va_arg (*pva,
int);
1232 else if (isdigit (
UChar (*fmt))) {
1234 nelems = int (strtol (fmt, &end, 10));
1241 pva =
va_arg (va, va_list*);
1248 if (
'G' != fmt [0] ||
's' != fmt [1] ||
'\0' != fmt [2]) {
1256 return _RWSTD_INT_MIN;
1261 const UPtr beg = {
va_arg (*pva,
char*) };
1266 const char**
const pparam =
va_arg (va,
const char**);
1275 const size_t buflen_0 = *pbuf ? strlen (*pbuf) : 0;
1285 if (-1 == elemsize || 1 == elemsize) {
1287 nelems = beg.pc ? int (strlen (beg.pc)) : 0;
1289 nbytes =
rw_asnprintf (pbuf, pbufsize,
"%{+}%{#*s}", nelems, beg.pc);
1291 else if (_RWSTD_WCHAR_SIZE == elemsize) {
1293 nbytes =
rw_asnprintf (pbuf, pbufsize,
"%{+}%{#ls}", beg.pwc);
1298 else if (
sizeof (
UserChar) ==
size_t (elemsize)) {
1304 char smallbuf [256];
1305 const size_t len = nelems < 0 ?
rw_match (0, beg.puc) : size_t (nelems);
1306 char*
const pb =
len <
sizeof smallbuf ? smallbuf :
new char [
len + 1];
1313 nelems, beg.pc ? pb : beg.pc);
1320 "*** %%{/Gs}: bad element size: %d ***",
1327 const size_t buflen_1 = *pbuf ? strlen (*pbuf) : 0;
1332 RW_ASSERT (buflen_1 == buflen_0 + nbytes);
1342_rw_fmtstring (
char **pbuf,
size_t *pbufsize,
const char *fmt, ...)
1347 const int nbytes = _rw_fmtstringv (pbuf, pbufsize, fmt, va);
1359 static int format_init =
rw_printf (
"%{+!}", _rw_fmtstring);
void count(T, T, const U &,...)
#define va_start(va, name)
#define _RWSTD_VA_COPY(va_dst, va_src)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_STATIC_CAST(T, x)
_TEST_EXPORT size_t rw_match(const char *s1, const char *s2, size_t len)
_TEST_EXPORT char * rw_expand(char *dst, const char *src, size_t src_len, size_t *dst_len)
_TEST_EXPORT char * rw_narrow(char *dst, const char *src, size_t len)
_TEST_EXPORT char * rw_widen(char *dst, const char *src, size_t len)
_TEST_EXPORT int rw_printf(const char *,...)
_TEST_EXPORT int rw_asnprintf(char **pbuf, _RWSTD_SIZE_T *pbufsize, const char *fmt,...)
Base::char_type char_type
Base::char_type char_type