57#define DEFINE_REPLACEMENT_NEW_AND_DELETE
68#define min(a, b) ((a) < (b) ? (a) : (b))
73#if !defined _RWSTD_NO_WCHAR_T
78 const char* pe, std::size_t srclen)
80# ifndef _RWSTD_NO_MBSRTOWCS
82 return std::mbsrtowcs (pi, &pe, srclen, &state);
87 return std::mbstowcs (pi, pe, srclen);
96 const char* , std::size_t )
101template <
class charT>
104 char* pe, std::size_t srclen)
106# ifndef _RWSTD_NO_WCSRTOMBS
108 return std::wcsrtombs (pe, &pi, srclen, &state);
113 return std::wcstombs (pe, pi, srclen);
121 char* , std::size_t )
130rwtest_mbslen (std::mbstate_t& state,
135 std::size_t total = 0;
138 while (total < cmax && pe < limit)
140#ifndef _RWSTD_NO_MBRLEN
142 ret = std::mbrlen (pe,
min (_RWSTD_MB_LEN_MAX, limit - pe), &state);
147 ret = std::mblen (pe,
min (_RWSTD_MB_LEN_MAX, limit - pe));
151 if (ret >= std::size_t (-2))
165typedef std::codecvt<char,char,std::mbstate_t>
Codecvt;
166typedef std::codecvt_byname<char,char,std::mbstate_t>
CodecvtBn;
168#ifndef _RWSTD_NO_WCHAR_T
169typedef std::codecvt<wchar_t,char,std::mbstate_t>
CodecvtW;
170typedef std::codecvt_byname<wchar_t,char,std::mbstate_t>
CodecvtBnW;
190#ifndef _RWSTD_NO_WCHAR_T
200 "std::codecvt_byname<wchar_t, char, std::mbstate_t>";
226 typedef typename base_type::intern_type
itype;
227 typedef typename base_type::extern_type
etype;
228 typedef typename base_type::state_type
stype;
229 typedef typename std::codecvt_base::result
result;
289#ifndef _RWSTD_NO_WCHAR_T
303template <
class CodeCvtT>
305test_virtuals (
const char* locale_name)
307 rw_info (0, __FILE__, __LINE__,
311 CodeCvtT& cc = pccvt;
313 typedef typename CodeCvtT::intern_type intern_type;
314 typedef typename CodeCvtT::extern_type extern_type;
316 const extern_type* pce = 0;
318 const intern_type* pci = 0;
321 std::mbstate_t st = std::mbstate_t ();
324 cc.out (st, pci, pci, pci, pe, pe, pe );
329 cc.in (st, pce, pce, pce, pi, pi, pi );
334 cc.unshift (st, pe, pe, pe);
349 cc.length (st, pce, pce, 0);
372#ifndef _RWSTD_NO_WCHAR_T
390rwtest_codecvt_result (
int res)
395 static char buf [8][16];
397 static std::size_t
index;
411 static const struct {
415 { std::codecvt_base::ok,
"std::codecvt_base::ok" },
416 { std::codecvt_base::partial,
"std::codecvt_base::partial" },
417 { std::codecvt_base::noconv,
"std::codecvt_base::noconv" },
418 { std::codecvt_base::error,
"std::codecvt_base::error" }
421 for (
unsigned i = 0;
i !=
sizeof results /
sizeof *results; ++
i)
423 return results [
i].str;
425 return rwtest_codecvt_result (
int (
res));
431rwtest_is_C_locale (
const char*
s)
444template <
class CodeCvtT>
446test_libstd_do_in (
const char* locale_name,
const CodeCvtT& cc,
447 const typename CodeCvtT::extern_type* buffe,
448 typename CodeCvtT::intern_type*& buffi,
449 std::size_t sze, std::size_t& szi,
454 typedef typename CodeCvtT::intern_type intern_t;
455 typedef typename CodeCvtT::extern_type extern_t;
457 const extern_t* pe = buffe;
458 const extern_t* pen = buffe;
459 const extern_t* pe_limit = buffe + sze;
462 buffi =
new intern_t [szi];
463 std::memset (buffi, 0, szi *
sizeof (intern_t));
465 intern_t* pi = buffi;
467 intern_t* pi_limit = pi + sze;
470 std::mbstate_t state = std::mbstate_t ();
473 res = cc.in ( state, pe, pe_limit, pen, pi, pi_limit, pin );
478 if (skip_C || std::setlocale (
LC_CTYPE, locale_name) == 0)
481 intern_t* C_buffer =
new intern_t [sze];
482 std::memset (C_buffer, 0, sze *
sizeof (intern_t));
484 intern_t* C_pi = C_buffer;
486 std::mbstate_t C_state = std::mbstate_t ();
490 rwtest_mbstowcs<intern_t> (C_state, C_pi, pen, sze);
491 if (
res != std::codecvt_base::ok || C_res == std::size_t(-1)) {
497 rw_assert (C_res == std::size_t(pin - pi), __FILE__, __LINE__,
498 "(%s) %s::do_in Clib length check:\n"
499 " C library conversion size : %d\n"
500 " std library conversion size : %d\n",
503 rw_assert (0 == std::memcmp (pi, C_pi, C_res), __FILE__, __LINE__,
504 "(%s) %s::do_in data check failed against C library conversion",
511#define CCVT_MAX_LOCALE 5
512#define CCVT_MB_CUR_MIN 1
513#define CCVT_MB_CUR_MAX 6
515template <
class CodeCvtT>
517test_libstd_do_out (
const char* locale_name,
const CodeCvtT& cc,
518 typename CodeCvtT::extern_type*& buffe,
519 const typename CodeCvtT::intern_type* buffi,
520 std::size_t& sze, std::size_t szi,
525 typedef typename CodeCvtT::intern_type intern_t;
526 typedef typename CodeCvtT::extern_type extern_t;
529 std::mbstate_t state = std::mbstate_t ();
533 extern_t* pe = buffe;
537 const intern_t* pi = buffi;
538 const intern_t* pin = buffi;
539 const intern_t* pi_limit = pi + szi;
542 res = cc.out ( state, pi, pi_limit, pin, pe, pe_limit, pen );
545 if (skip_C || std::setlocale (
LC_CTYPE, locale_name) == 0) {
551 extern_t* C_pe = C_buffer;
553 std::mbstate_t C_state = std::mbstate_t ();
557 if (C_res == std::size_t(-1)) {
563 rw_assert (C_res == std::size_t(pen - pe), __FILE__, __LINE__,
564 "(%s) %s::do_out Clib length check\n"
565 " C library conversion size : %d\n"
566 " std library conversion size : %d\n",
570 rw_assert (0 == std::memcmp (pe, C_pe, C_res), __FILE__, __LINE__,
571 "(%s) %s::do_out Clib data check failed "
572 "against C library conversion",
578template <
class CodeCvtT>
580test_libstd_do_unshift (
const CodeCvtT& cc,
581 std::mbstate_t& state,
582 typename CodeCvtT::extern_type* buffe,
587 typedef typename CodeCvtT::intern_type intern_t;
588 typedef typename CodeCvtT::extern_type extern_t;
590 extern_t* pe = buffe;
591 extern_t* pen = buffe;
592 extern_t* pe_limit = buffe + sze;
594 res = cc.unshift (state, pe, pe_limit, pen);
598template <
class CodeCvtT>
600test_libstd_do_always_noconv (
const CodeCvtT& cc,
bool&
res)
602 res = cc.always_noconv ();
606template <
class CodeCvtT>
608test_libstd_do_max_length (
const CodeCvtT& cc, std::size_t&
res )
610 res = cc.max_length ();
614template <
class CodeCvtT>
616test_libstd_do_length (
const char* locale_name,
const CodeCvtT& cc,
617 const typename CodeCvtT::extern_type* buffe,
618 std::size_t& sze,
bool skip_C)
621 typedef CodecvtBnW::intern_type intern_t;
622 typedef CodecvtBnW::extern_type extern_t;
625 std::mbstate_t state = std::mbstate_t ();
630 sze = cc.length ( state, pe, pe_limit, sze );
635 std::mbstate_t C_state = std::mbstate_t ();
638 rwtest_mbslen ( C_state, pe, pe_limit, sze );
640 rw_assert (sze == C_res, __FILE__, __LINE__,
641 "(%s) %s::do_length; "
642 "check against C library result failed :\n"
643 " C library result : %d\n"
644 " std library result : %d",
649template <
class CodeCvtT>
651test_libstd_do_encoding (
const CodeCvtT& cc, std::size_t& sze)
653 sze = cc.encoding ();
659template <
class CodeCvtT>
661test_libstd_codecvt (
const char* locale_name,
const CodeCvtT& cc,
662 const char* fname,
bool skip_C,
666 bool always_noconv_res,
667 std::size_t encoding_res,
668 std::size_t length_res,
669 std::size_t max_length_res)
672 typedef typename CodeCvtT::intern_type intern_t;
673 typedef typename CodeCvtT::extern_type extern_t;
676 std::mbstate_t state = std::mbstate_t ();
679 extern_t* ebuffer = 0;
680 intern_t* ibuffer = 0;
681 extern_t* eebuffer = 0;
683 std::size_t elength = 0;
684 std::size_t ilength = 0;
685 std::size_t eelength = 0;
690 if (!ebuffer || !elength) {
692 "failed to read from %s", fname);
703 std::sprintf (fcall,
"%s::in(..., %p, %p, 0, %p, %p, 0)",
705 (
const void*)ebuffer, (
const void*)(ebuffer + elength),
706 (
const void*)ibuffer, (
const void*)(ibuffer + ilength));
709 test_libstd_do_in<CodeCvtT> (locale_name, cc,
710 ebuffer, ibuffer, elength, ilength,
711 skip_C,
res, res_sz);
715 "%s == %s, got %s in locale(\"%s\")",
717 rwtest_codecvt_result (in_res),
718 rwtest_codecvt_result (
res),
723 if (
res == std::codecvt_base::noconv) {
724 rw_assert (res_sz == 0, __FILE__, __LINE__,
725 "%s expected size 0 for %s, got %d instead "
726 "in locale(\"%s\")", fcall,
727 rwtest_codecvt_result (
res), res_sz, locale_name);
731 for (std::size_t
i = 0;
i < elength;
i++)
732 ibuffer [
i] = intern_t (ebuffer [
i]);
736 rw_assert (ilength == in_res_sz && ilength == res_sz,
738 "%s: conversion size: expected %d, got %d in locale(\"%s\")",
739 fcall, in_res_sz, ilength, locale_name);
743 test_libstd_do_out<CodeCvtT> (locale_name, cc,
744 eebuffer, ibuffer, eelength, ilength,
745 skip_C,
res, res_sz);
749 "(%s) %s::do_out() == %s, got %s",
751 rwtest_codecvt_result (out_res), rwtest_codecvt_result (
res));
753 if (
res == std::codecvt_base::noconv) {
754 rw_assert (res_sz == 0, __FILE__, __LINE__,
755 "(%s) %s::do_out expected size 0 for %s, got %d instead",
757 rwtest_codecvt_result (
res), res_sz);
761 for (std::size_t
i = 0;
i < eelength;
i++)
762 eebuffer [
i] = extern_t (ibuffer [
i]);
765 rw_assert (eelength == out_res_sz && eelength == res_sz,
767 "(%s) %s::do_out conversion size: expected %d, got %d",
774 if (std::memcmp (ebuffer, eebuffer,
min (elength, eelength))) {
776 if (ebuffer [
cmp] != eebuffer [
cmp])
780 rw_assert (elength == eelength, __FILE__, __LINE__,
781 "(%s) %s round-trip check size mismatch : "
782 " expected size %d , got size %d",
786 rw_assert (0 == std::memcmp (ebuffer, eebuffer,
787 min (elength, eelength)),
789 "(%s) %s round-trip check content mismatch : at index %d",
794 std::size_t tmp_len = 16;
795 state = std::mbstate_t ();
797 test_libstd_do_unshift<CodeCvtT> (cc, state,
tmp, tmp_len,
res);
801 "(%s) %s::do_unshift; expected %s, got %s",
803 rwtest_codecvt_result (unshift_res),
804 rwtest_codecvt_result (
res));
806 rw_assert (tmp_len == 0, __FILE__, __LINE__,
807 "(%s) %s::do_unshift; expected 0 length unshift sequence, "
811 test_libstd_do_always_noconv<CodeCvtT> (cc, bres);
812 rw_assert (bres == always_noconv_res, __FILE__, __LINE__,
813 "(%s) %s::do_always_noconv expected %s, got %s",
815 always_noconv_res?
"true":
"false", bres?
"true":
"false");
818 test_libstd_do_max_length<CodeCvtT> (cc, ires);
820 rw_assert (ires == max_length_res, __FILE__, __LINE__,
821 "(%s) %s::do_max_length expected %d, got %d",
823 max_length_res, ires);
827 test_libstd_do_length<CodeCvtT> (locale_name, cc,
828 ebuffer, ires, skip_C);
830 rw_assert (ires == length_res, __FILE__, __LINE__,
831 "(%s) %s::do_length expected %d, got %d",
836 test_libstd_do_encoding<CodeCvtT> (cc, ires);
838 rw_assert (ires == encoding_res, __FILE__, __LINE__,
839 "(%s) %s::do_encoding expected %d, got %d",
852static unsigned int endian_test = 1;
853static bool big_endian = *(
unsigned char*)&endian_test == 0;
856rwtest_iconv_open (
bool ucs4,
const char* enc)
858 static const char*
const ucs4_aliases [] = {
859 "UCS-4LE",
"UCS-4",
"UCS4",
"ucs4", 0
862 static const char*
const ucs2_aliases [] = {
863 "UCS-2LE",
"UCS-2",
"UCS2",
"ucs2", 0
866 const char*
const* pucs = ucs4 ? ucs4_aliases : ucs2_aliases;
873 iconv_t
id = iconv_t (-1);
875 for (;
id == iconv_t (-1) && *pucs && **pucs; pucs++)
876 id = iconv_open (*pucs, enc);
883rwtest_iconv_convert (iconv_t fd,
884 const char*
in, std::size_t in_sz,
885 wchar_t*
out, std::size_t& out_sz)
895 std::size_t
tmp = out_sz++ + 1;
897# if defined _RWSTD_NO_ICONV_CONST_CHAR
900 const char* par1 =
in;
904 std::size_t
res = iconv (fd, &par1, &in_sz, &par2, &out_sz);
905 if (
res == std::size_t (-1))
908 out_sz = (
tmp + 1 - out_sz) /
sizeof (
wchar_t);
923 const char* native_locname,
924 const char* ebuffer, std::size_t elength,
925 wchar_t* ibuffer, std::size_t& ilength)
932 const char*
const old_locale = std::setlocale (
LC_CTYPE, native_locname);
948 std::mbstate_t state = std::mbstate_t ();
961 const char*
const codeset = nl_langinfo (CODESET);
963 ilength = std::size_t (-1);
967 const iconv_t
id = rwtest_iconv_open (
true, codeset);
969 if (iconv_t (-1) ==
id)
970 ilength = std::size_t (-1);
972 rwtest_iconv_convert (
id, ebuffer, elength, ibuffer, ilength);
985 std::setlocale (
LC_CTYPE, old_locale);
987 if (std::size_t (-1) == ilength) {
999 static const char*
const encs [] = {
1000 "native",
"UCS-4",
"UCS-2",
"invalid"
1017bmatch (
const char* mem1,
const char* mem2, std::size_t
nchars)
1019 if (std::memcmp (mem1, mem2,
nchars)) {
1021 for (std::size_t
i = 0;
i !=
nchars; ++
i)
1022 if (mem1 [
i] != mem2 [
i])
1030bmatch (
const wchar_t* mem1,
const wchar_t* mem2, std::size_t
nchars)
1032 if (std::size_t (-1) ==
nchars) {
1034 return bmatch ((
char*)0, (
char*)0, 0);
1037 if (std::memcmp (mem1, mem2,
nchars *
sizeof *mem1)) {
1039 for (std::size_t
i = 0;
i !=
nchars; ++
i)
1040 if (mem1 [
i] != mem2 [
i])
1048test_ucs_modifier (
const char* locale_name,
1050 const char* native_locname,
1054 std::size_t in_res_sz)
1059 wchar_t* ibuf_native = 0;
1062 std::size_t elen = 0;
1063 std::size_t ilen = 0;
1064 std::size_t ilen_native = 0;
1073 ibuf =
new wchar_t [ilen];
1074 std::memset (ibuf, 0, ilen *
sizeof *ibuf);
1079 ibuf_native =
new wchar_t [ilen_native + 1];
1080 std::memset (ibuf_native, 0, (ilen_native + 1) *
sizeof *ibuf_native);
1082 const char* from = ebuf;
1083 const char* from_next = ebuf;
1084 const char* from_limit = ebuf + elen;
1086 wchar_t* to_next = ibuf;
1087 wchar_t* to_limit = ibuf + elen;
1090 std::mbstate_t state = std::mbstate_t ();
1092 rw_info (0, __FILE__, __LINE__,
"locale(\"%s\")", locale_name);
1094 const std::codecvt_base::result
res =
1095 cc.in (state, from, from_limit, from_next, to, to_limit, to_next);
1097 ilen = to_next - to;
1099 if (
res != in_res || in_res_sz != std::size_t (to_next - to)) {
1101 "(%s) EXT -> INT conversion using codecvt failed:\n"
1102 " result : %s\n expected size %d, got %d",
1103 locale_name, rwtest_codecvt_result (
res),
1104 in_res_sz, to_next - to);
1106 delete [] ibuf_native;
1113 if (!rwtest_convert_to_internal (conv, native_locname, ebuf, elen,
1114 ibuf_native, ilen_native)) {
1115 delete [] ibuf_native;
1122 "(%s) EXT -> INT conversion using %s "
1123 "(%s internally) failed",
1125 (conv ==
use_libc) ?
"mbstowcs()" :
"iconv()",
1126 rwtest_internal_type (conv));
1128 delete [] ibuf_native;
1134 rw_assert (ilen_native == ilen, __FILE__, __LINE__,
1135 "(%s) EXT -> INT length check (%s internally):\n"
1136 " size of native encoding: %d\n"
1137 " size of codecvt encoding: %d\n",
1138 locale_name, rwtest_internal_type (conv),
1141 if (ilen_native == ilen) {
1142 const std::size_t diff = bmatch (to, ibuf_native, ilen);
1144 rw_assert (diff >= ilen, __FILE__, __LINE__,
1145 "codecvt<wchar_t, char, mbstate_t>::in() mismatch "
1146 "at character %u of %u: '%s' != '%s'; in locale(\"%s\")",
1147 diff, ilen, ibuf_native [diff],
1148 to [diff], locale_name);
1151 delete [] ibuf_native;
1168template <
class CodeCvtT>
1176 typedef typename CodeCvtT::intern_type intern_type;
1177 typedef typename CodeCvtT::extern_type extern_type;
1178 typedef typename CodeCvtT::state_type state_type;
1183 std::memset (&state, -1,
sizeof state);
1185 intern_type
in = intern_type ();
1186 intern_type* in_0 = &
in;
1187 intern_type* in_1 = &
in + 1;
1188 intern_type* in_2 = 0;
1189 const intern_type* const_in_2 = 0;
1191 extern_type ext = extern_type ();
1192 extern_type* ext_0 = &ext;
1193 extern_type* ext_1 = &ext + 1;
1194 extern_type* ext_2 = 0;
1195 const extern_type* const_ext_2 = 0;
1209#define TEST(resultT, result, fname, args) \
1210 if (0 == setjmp (jmp_env)) { \
1211 std::signal (SIGABRT, SIGABRT_handler); \
1212 const resultT res = cvt.fname args; \
1213 rw_assert (!expect_abort && result == res, __FILE__, __LINE__, \
1214 "%s::%s (state_type&, ...) failed to " \
1215 "detect an invalid state argument", \
1216 TypeName<CodeCvtT>::name, #fname); \
1218 rw_assert (expect_abort, __FILE__, __LINE__, \
1219 "%s::%s (state_type&, ...) called abort() instead " \
1220 "of gracefully indicating an invalid state argument", \
1221 TypeName<CodeCvtT>::name, #fname)
1223 const std::codecvt_base::result
error = std::codecvt_base::error;
1225 TEST (std::codecvt_base::result, error,
1226 in, (state, ext_0, ext_1, const_ext_2, in_0, in_1, in_2));
1228 TEST (std::codecvt_base::result, error,
1229 out, (state, in_0, in_1, const_in_2, ext_0, ext_1, ext_2));
1231 TEST (std::codecvt_base::result, error,
1232 unshift, (state, ext_0, ext_1, ext_2));
1235 length, (state, ext_0, ext_1, 0));
1239#define TEST(resultT, result, fname, args) \
1240 if (0 == setjmp (jmp_env)) { \
1241 std::signal (SIGABRT, SIGABRT_handler); \
1242 const resultT res = cvt.fname args; \
1243 rw_assert (result == res, __FILE__, __LINE__, \
1244 "%s::%s (state_type&, (char_type*)0, ...) == %s, " \
1245 "got %s (NULL pointer test)", \
1246 TypeName<CodeCvtT>::name, #fname, \
1247 rwtest_codecvt_result (result), \
1248 rwtest_codecvt_result (res)); \
1250 rw_assert (expect_abort, __FILE__, __LINE__, \
1251 "%s::%s (state_type&, (char_type*)0, ...) " \
1252 "unexpectedly called abort() (NULL pointer test)", \
1253 TypeName<CodeCvtT>::name, #fname)
1256 std::memset (&state, 0,
sizeof state);
1259 std::codecvt_base::result
result =
1260 sizeof (intern_type) ==
sizeof (
char)
1261 ? std::codecvt_base::noconv : std::codecvt_base::ok;
1264 in, (state, 0, 0, const_ext_2, 0, 0, in_2));
1267 out, (state, 0, 0, const_in_2, 0, 0, ext_2));
1269 TEST (std::codecvt_base::result, std::codecvt_base::noconv,
1270 unshift, (state, 0, 0, ext_2));
1273 length, (state, 0, 0, 0));
1279test_invalid_args (
const char* locname)
1282 rw_info (0, __FILE__, __LINE__,
1286 rw_info (0, __FILE__, __LINE__,
1290 char non_c_locname [256];
1291 *non_c_locname =
'\0';
1294 loc += std::strlen (
loc) + 1) {
1295 if ( std::strcmp (
"C",
loc) && std::strcmp (
"POSIX",
loc)
1297 std::setlocale (
LC_ALL,
"C");
1298 std::strcpy (non_c_locname,
loc);
1303 if (*non_c_locname) {
1307 rw_info (0, __FILE__, __LINE__,
1308 "Testing libc based %s with invalid arguments "
1309 "in locale(\"%s\")",
1314 rw_info (0, __FILE__, __LINE__,
1315 "Testing libc based %s with invalid arguments "
1316 "in locale(\"%s\")",
1325 rw_info (0, __FILE__, __LINE__,
1326 "Testing libstd %s with invalid arguments",
1331 rw_info (0, __FILE__, __LINE__,
1332 "Testing libstd %s with invalid arguments",
1341template <
class internT>
1344 const char* sext, std::size_t ext_len, std::size_t ext_num,
1345 const internT* sint, std::size_t int_len, std::size_t int_num,
1346 std::codecvt_base::result expect)
1352 std::strcpy (namebuf,
name);
1355 const char* locale_name = 0;
1359 const char* codecvt_name = 0;
1362 const char*
const mod = std::strrchr (
name,
'@');
1364 if (mod &&
'U' == mod [1] &&
'C' == mod [2] &&
'S' == mod [3]) {
1366 namebuf [mod -
name] =
'\0';
1367 locale_name = namebuf;
1368 codecvt_name = namebuf + (mod -
name) + 1;
1376 if ( !std::strcmp (namebuf,
"UTF-8")
1377 || !std::strcmp (namebuf,
"utf-8")) {
1378 codecvt_name = namebuf;
1382 locale_name = namebuf;
1384 typedef std::codecvt<internT, char, std::mbstate_t> Cvt;
1385 typedef std::codecvt_byname<internT, char, std::mbstate_t> CvtByname;
1392 loc = std::locale (locale_name);
1398 "locale(\"%s\") unexpectedly threw an exception; "
1400 envvar ? envvar :
"(null)");
1411 const Cvt* pcvt = 0;
1415 pcvt =
new CvtByname (codecvt_name);
1421 "codecvt_byname<%s, char, mbstate_t>(\"%s\") "
1422 "unexpectedly threw an exception; "
1424 codecvt_name, envvar ? envvar :
"(null)");
1430 loc = std::locale (
loc, pcvt);
1434 "locale combining ctor unexpectedly threw "
1442 if (std::size_t (-1) == ext_len)
1443 ext_len = sext ? std::strlen (sext) : 0;
1446 if (std::size_t (-1) == int_len)
1447 int_len = sint ? std::char_traits<internT>::length (sint) : 0;
1450 const Cvt &
cvt = std::use_facet<Cvt>(
loc);
1452 std::mbstate_t state;
1453 std::memset (&state, 0,
sizeof state);
1457 static char fcall [4096];
1460 ||
'o' ==
which) && std::codecvt_base::ok == expect) {
1468 const char* ext_lo = sext;
1469 const char* ext_hi = sext + ext_len;
1470 const char* ext_nxt = 0;
1472 internT* int_lo =
new internT [int_len + 1];
1473 internT* int_hi = int_lo + int_len;
1474 internT* int_nxt = 0;
1476 std::memset (int_lo, 0, (int_len + 1) *
sizeof *int_lo);
1480 const char* pextstr = sext;
1481 if (sext [ext_len]) {
1482 char*
const tmp =
new char [ext_len + 1];
1483 std::memcpy (
tmp, sext, ext_len);
1484 tmp [ext_len] =
'\0';
1488 std::sprintf (fcall,
"codecvt<%s, char, mbstate_t>::in"
1489 "(..., %p = %s, %p, %p, %p, %p, %p)",
1491 (
const void*)ext_lo, pextstr,
1492 (
const void*)ext_hi, (
const void*)ext_nxt,
1493 (
const void*)int_lo, (
const void*)int_hi,
1494 (
const void*)int_nxt);
1496 if (pextstr != sext) {
1501 std::codecvt_base::result
res;
1505 ext_lo, ext_hi, ext_nxt,
1506 int_lo, int_hi, int_nxt);
1510 "%d. %s unexpectedly threw an exception",
1515 if (expect !=
res) {
1517 "%d. %s == %s, got %s", __LINE__, fcall,
1518 rwtest_codecvt_result (expect),
1519 rwtest_codecvt_result (
res));
1523 if (ext_nxt != ext_lo + ext_num) {
1526 "%d. %s; from_next == %p, got %p (at offset %d)",
1527 __LINE__, fcall, ext_lo + ext_num, ext_nxt,
1532 if (int_nxt != int_lo + int_num) {
1535 "%d. %s; to_next == %p, got %p (at offset %d)",
1536 __LINE__, fcall, int_lo + int_num, int_nxt,
1540 if (std::codecvt_base::error !=
res) {
1544 const int cmp = std::memcmp (int_lo, sint, int_len);
1548 "%d. %s -> %s, expected %s", __LINE__, fcall,
1557 ||
'i' ==
which) && std::codecvt_base::ok == expect) {
1565 char* ext_lo =
new char [ext_len + 1];
1566 char* ext_hi = ext_lo + ext_len;
1569 std::memset (ext_lo, 0, ext_len + 1);
1571 const internT* int_lo = sint;
1572 const internT* int_hi = int_lo + int_len;
1573 const internT* int_nxt = 0;
1576 if (
sizeof (internT) ==
sizeof (
char))
1577 fmt =
"codecvt<char, char, mbstate_t>::out"
1578 "(..., %p = %s, %p, %p, %p, %p, %p)";
1579 else if (
sizeof (internT) ==
sizeof (
wchar_t))
1580 fmt =
"codecvt<wchar_t, char, mbstate_t>::out"
1581 "(..., %p = L%ls, %p, %p, %p, %p, %p)";
1583 std::sprintf (fcall, fmt, (
const void*)int_lo,
1584 int_lo, (
const void*)int_hi,
1585 (
const void*)int_nxt, (
const void*)ext_lo,
1586 (
const void*)ext_hi, (
const void*)ext_nxt);
1588 std::codecvt_base::result
res;
1592 int_lo, int_hi, int_nxt,
1593 ext_lo, ext_hi, ext_nxt);
1597 "%d. %s unexpectedly threw an exception",
1602 if (expect !=
res) {
1604 "%d. %s == %s, got %s", __LINE__, fcall,
1605 rwtest_codecvt_result (expect),
1606 rwtest_codecvt_result (
res));
1610 if (int_nxt != int_lo + int_num) {
1613 "%d. %s; from_next == %p, got %p (at offset %d)",
1614 __LINE__, fcall, int_lo + int_num, int_nxt,
1619 if (ext_nxt != ext_lo + ext_num) {
1622 "%d. %s; to_next == %p, got %p (at offset %d)",
1623 __LINE__, fcall, ext_lo + ext_num, ext_nxt,
1627 if (std::codecvt_base::error !=
res) {
1631 const int cmp = std::memcmp (ext_lo, sext, ext_len);
1636 "%d. %s -> %s, expected %s", __LINE__, fcall,
1653create_codecvt (
unsigned mb_min,
1655 const char* charmap,
1656 const char* charset_name = 0)
1666 std::sprintf (cm_pathname,
"%s" SLASH "%s.cm",
1669 std::sprintf (cm_pathname,
1670 "%s" SLASH "codecvt-%u-%u.%d.cm",
1674 std::FILE*
pf = std::fopen (cm_pathname,
"w");
1679 std::fprintf (
pf,
"<code_set_name> %s\n", charset_name);
1681 std::fprintf (
pf,
"<code_set_name> codecvt-%u-%u.%d\n",
1682 mb_min, mb_max, call_no);
1684 std::fprintf (
pf,
"<escape_char> /\n");
1686 std::fprintf (
pf,
"<mb_cur_min> %u\n", mb_min);
1687 std::fprintf (
pf,
"<mb_cur_max> %u\n\n\n", mb_max);
1688 std::fprintf (
pf,
"CHARMAP\n");
1689 std::fprintf (
pf, charmap);
1690 std::fprintf (
pf,
"\nEND CHARMAP\n");
1697 std::strcat (src_pathname,
SLASH "dummy.src");
1700 if (!(
pf = std::fopen (src_pathname,
"w")))
1705 std::fprintf (
pf,
"LC_CTYPE\nEND LC_CTYPE\n");
1710 char locale_fname[32];
1711 std::sprintf (locale_fname,
1713 mb_min, mb_max, call_no);
1725 const char*
const locname =
1727 src_pathname, cm_pathname, locale_fname);
1729 call_no += !!locname;
1742find_locale (
const char* locname,
const char* codeset)
1744 static const struct {
1745 const char* locnames [16];
1746 const char* codesets [16];
1751 "de_DE.iso88591",
"de_DE.ISO8859-1",
"de_DE",
"DEU",
"de", 0
1755 "ISO-88591",
"ISO_8859-1",
"ISO8859-1",
"iso88591",
"iso1", 0
1761 "fr_FR.iso88591",
"fr_FR.ISO8859-1",
"fr_FR",
"FRA",
"fr", 0
1764 "ISO-88591",
"ISO_8859-1",
"ISO8859-1",
"iso88591",
"iso1", 0
1768 "ja_JP.SJIS",
"japanese.sjis",
"JPN", 0
1771 "Shift-JIS",
"SJIS",
"SHIFT-JIS",
"SHIFT_JIS",
"shift-jis",
1778 "ja_JP.eucJP",
"ja_JP.EUC",
"ja_JP.eucjp", 0
1781 "eucjp",
"eucJP",
"euc_jp",
"euc",
"ujis", 0
1786 const char*
name = std::setlocale (
LC_ALL, locname);
1788 std::size_t
inx = std::size_t (-1);
1793 for (std::size_t
i = 0;
i !=
sizeof aliases /
sizeof *aliases; ++
i) {
1794 if (!aliases [
i].locnames [0])
1797 if (!std::strcmp (locname, aliases [
i].locnames [0])) {
1803 if (std::size_t (-1) !=
inx) {
1807 for (std::size_t
j = 1; aliases [
inx].locnames [
j]; ++
j) {
1808 if (!aliases [
inx].locnames [
j])
1811 if (std::setlocale (
LC_ALL, aliases [
inx].locnames [
j])) {
1819#ifndef _RWSTD_NO_NL_LANGINFO
1822 const char*
const cset = nl_langinfo (CODESET);
1824 if (codeset && std::strcmp (codeset, cset)) {
1830 for (std::size_t
j = 0; aliases [
inx].codesets [
j]; ++
j) {
1832 if (!std::strcmp (aliases [
inx].codesets [
j], cset)) {
1833 std::setlocale (
LC_ALL,
"C");
1840 std::setlocale (
LC_ALL,
"C");
1851 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
1852 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
1853 "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
1854 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
1855 "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
1856 "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
1857 "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
1858 "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
1860 "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
1861 "\x90\x91\x92\x93\x94\x95\x96\x97\x89\x99\x9a\x9b\x9c\x9d\x9e\x9f"
1862 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
1863 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
1864 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
1865 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
1866 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
1867 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
1877find_interesting_locale (
char*
buf, std::size_t bufsize)
1879 std::memset (
buf, 0, bufsize);
1881 const char*
name = 0;
1883 const char*
const buf_save =
buf;
1890 wchar_t wide_ascii [
sizeof ext_ascii] = { 0 };
1894 const std::size_t
nchars =
1903 for (std::size_t
i = 0;
i !=
nchars; ++
i) {
1905 typedef unsigned char UChar;
1910 if (
unsigned (uc) !=
unsigned (wide_ascii [
i])) {
1918 if (
buf != buf_save)
1926template <
class internT>
1928test_inout (
const char* tname)
1931 const std::codecvt_base::result
error = std::codecvt_base::error;
1932 const std::codecvt_base::result noconv = std::codecvt_base::noconv;
1933 const std::codecvt_base::result ok = std::codecvt_base::ok;
1934 const std::codecvt_base::result partial = std::codecvt_base::partial;
1938 const char* locname = 0;
1943 rw_info (0, __FILE__, __LINE__,
1944 "std::codecvt<%s, char, mbstate_t>::in() "
1945 "in a generated locale", tname);
1947 rw_info (0, __FILE__, __LINE__,
1948 "std::codecvt<%s, char, mbstate_t>::out() "
1949 "in a generated locale", tname);
1953 rw_info (0, __FILE__, __LINE__,
"<mb_cur_max> 1");
1955 locname = create_codecvt (1, 1,
1966#
if _RWSTD_WCHAR_T_MAX > 0xffffU
1967 "<U12345678> /x78\n"
1968 "<U0DEDBEEF> /x79\n"
1977 "failed to generate locale");
1981#define DO_TEST(io, src, ext_len, ext_num, dst, int_len, int_num, res) \
1982 test_inout (io, __LINE__, locname, src, ext_len, ext_num, \
1983 dst, int_len, int_num, res)
1986#define TEST_IN(src, ext_len, ext_num, dst, int_len, int_num, res) \
1987 DO_TEST ('I', src, ext_len, ext_num, dst, int_len, int_num, res)
1990#define TEST_OUT(src, ext_len, ext_num, dst, int_len, int_num, res) \
1991 DO_TEST ('O', src, ext_len, ext_num, dst, int_len, int_num, res)
1995#define TEST_IN_OUT(src, ext_len, ext_num, dst, int_len, int_num, res) \
1996 DO_TEST ('i', src, ext_len, ext_num, dst, int_len, int_num, res)
2000#define TEST_OUT_IN(src, ext_len, ext_num, dst, int_len, int_num, res) \
2001 DO_TEST ('o', src, ext_len, ext_num, dst, int_len, int_num, res)
2028#if _RWSTD_WCHAR_T_MAX > 0xffffU
2033 TEST_IN_OUT (
"0123x", 5, 5,
L"\0ABC\x12345678", 5, 5, ok);
2034 TEST_IN_OUT (
"123y", 4, 4,
L"ABC\x0dedbeef", 4, 4, ok);
2049 rw_info (0, __FILE__, __LINE__,
"<mb_cur_max> 2");
2051 locname = create_codecvt (1, 2,
2054 "<U0041> /x31/x61\n"
2056 "<U0043> /x33/x62\n"
2058 "<U0045> /x35/x63\n"
2060 "<U005A> /x00/x00");
2064 "failed to generate locale");
2081 TEST_IN (
"3", 1, 0,
L"", 1, 0, partial);
2085 TEST_IN_OUT (
"01a23b45", 8, 7,
L"\0ABCD", 5, 5, partial);
2087 TEST_IN_OUT (
"01a23c45c", 9, 4,
L"\0ABCDE", 6, 3, error);
2090 rw_info (0, __FILE__, __LINE__,
"<mb_cur_max> 6");
2092 locname = create_codecvt (1, 6,
2095 "<U0041> /x30/x31\n"
2096 "<U0042> /x31/x32/x33\n"
2097 "<U0043> /x32/x33/x34/x35\n"
2098 "<U0044> /x33/x34/x35/x36/x37\n"
2099 "<U0045> /x34/x35/x36/x37/x38/x39\n"
2100 "<U005A> /x00/x00/x00");
2103 rw_assert (
false, __FILE__, __LINE__,
"failed to generate locale");
2114 TEST_IN_OUT (
"456789012345", 12, 12,
L"EAC", 3, 3, ok);
2124#ifndef _RWSTD_NO_NL_LANGINFO
2127 const char*
const interesting_locale_name =
2128 find_interesting_locale (chars,
sizeof chars);
2130 if (interesting_locale_name) {
2132 std::setlocale (
LC_ALL, interesting_locale_name);
2133 const char*
const codeset = nl_langinfo (CODESET);
2135 rw_info (0, __FILE__, __LINE__,
2136 "<code_set_name> %s (locale(\"%s\"))",
2137 codeset, interesting_locale_name);
2139 typedef unsigned char UChar;
2141 char charmap [
sizeof chars * 40];
2145 for (
const char* pc = chars; *pc; ++pc) {
2146 std::sprintf (charmap + std::strlen (charmap),
2147 "<U%04X> /x%02x\n",
UChar (*pc),
UChar (*pc));
2150 locname = create_codecvt (1, 1, charmap, codeset);
2154 "failed to generate locale");
2158 wchar_t wchars [
sizeof chars];
2159 std::mbstowcs (wchars, chars, std::strlen (chars));
2161 std::setlocale (
LC_ALL,
"C");
2163 for (std::size_t
i = 0; chars [
i]; ++
i) {
2165 const char cs [] = { chars [
i],
'\0' };
2166 const wchar_t ws [] = { wchars [
i], 0 };
2175 const char*
const names[] = {
2182 "UTF-8",
"UTF-8@UCS",
2184#if _RWSTD_WCHAR_T_MAX > 0xffffU
2190 "utf-8",
"utf-8@UCS",
2192#if _RWSTD_WCHAR_T_MAX > 0xffffU
2199 for (std::size_t
i = 0;
i !=
sizeof names /
sizeof *names; ++
i) {
2200 locname = names [
i];
2202 rw_info (0, __FILE__, __LINE__,
2203 "codecvt_byname<wchar_t, char, mbstate_t>"
2204 "(\"%s\")", locname);
2207 const bool strict_mode =
'U' == *locname;
2216 TEST_IN (
"\x80", 1, 0,
L"", 1, 0, error);
2217 TEST_IN (
"\x81", 1, 0,
L"", 1, 0, error);
2218 TEST_IN (
"\x82", 1, 0,
L"", 1, 0, error);
2219 TEST_IN (
"\xc1", 1, 0,
L"", 1, 0, error);
2231 TEST_IN_OUT (
"\xe0\xa4\x81", 3, 3,
L"\x0901", 1, 1, ok);
2232 TEST_IN_OUT (
"\xe3\x8f\xbe", 3, 3,
L"\x33fe", 1, 1, ok);
2233 TEST_IN_OUT (
"\xe3\x90\x80", 3, 3,
L"\x3400", 1, 1, ok);
2234 TEST_IN_OUT (
"\xe3\x91\x80", 3, 3,
L"\x3440", 1, 1, ok);
2242 TEST_IN (
"\xc0\x80", 2, 0,
L"", 1, 0, error);
2243 TEST_IN (
"\xe0\x80\x80", 3, 0,
L"", 1, 0, error);
2244 TEST_IN (
"\xf0\x80\x80\x80", 4, 0,
L"", 1, 0, error);
2245 TEST_IN (
"\xf8\x80\x80\x80\x80", 5, 0,
L"", 1, 0, error);
2246 TEST_IN (
"\xfc\x80\x80\x80\x80\x80", 6, 0,
L"", 1, 0, error);
2249 TEST_IN (
"\xc0\x8a", 2, 0,
L"", 1, 0, error);
2250 TEST_IN (
"\xe0\x80\x8a", 3, 0,
L"", 1, 0, error);
2251 TEST_IN (
"\xf0\x80\x80\x8a", 4, 0,
L"", 1, 0, error);
2252 TEST_IN (
"\xf8\x80\x80\x80\x8a", 5, 0,
L"", 1, 0, error);
2253 TEST_IN (
"\xfc\x80\x80\x80\x80\x8a", 6, 0,
L"", 1, 0, error);
2258 TEST_OUT (
"", 8, 0,
L"\xd800", 1, 0, error);
2259 TEST_OUT (
"", 8, 0,
L"\xd801", 1, 0, error);
2260 TEST_OUT (
"", 8, 0,
L"\xdffe", 1, 0, error);
2261 TEST_OUT (
"", 8, 0,
L"\xdfff", 1, 0, error);
2262 TEST_OUT (
"", 8, 0,
L"\xfffe", 1, 0, error);
2263 TEST_OUT (
"", 8, 0,
L"\xffff", 1, 0, error);
2267 TEST_IN (
"\xc2\x01", 2, 0,
L"", 1, 0, error);
2268 TEST_IN (
"\xc2\xff", 2, 0,
L"", 1, 0, error);
2276 TEST_IN (
"\xc2\x01", 2, 2,
L"\x3081", 1, 1, ok);
2277 TEST_IN (
"\xc2\xff", 2, 2,
L"\x30bf", 1, 1, ok);
2280 TEST_OUT (
"\xe3\x82\x81", 3, 3,
L"\x3081", 1, 1, ok);
2281 TEST_OUT (
"\xe3\x82\xbf", 3, 3,
L"\x30bf", 1, 1, ok);
2286 TEST_IN_OUT (
"\xc2\x80", 2, 2,
L"\x00000080", 1, 1, ok);
2287 TEST_IN_OUT (
"\xdf\xbf", 2, 2,
L"\x000007ff", 1, 1, ok);
2289 TEST_IN_OUT (
"\xe0\xa0\x80", 3, 3,
L"\x00000800", 1, 1, ok);
2291#if _RWSTD_WCHAR_T_MAX > 0xffffU
2293 TEST_IN_OUT (
"\xf0\x90\x8c\x80", 4, 4,
L"\x00010300", 1, 1, ok);
2294 TEST_IN_OUT (
"\xf0\x90\x8c\x81", 4, 4,
L"\x00010301", 1, 1, ok);
2295 TEST_IN_OUT (
"\xf4\x8f\xbf\x80", 4, 4,
L"\x0010ffc0", 1, 1, ok);
2297 TEST_IN_OUT (
"\xf0\x90\x80\x80", 4, 4,
L"\x0010000", 1, 1, ok);
2298 TEST_IN_OUT (
"\xf8\x88\x80\x80\x80", 5, 5,
L"\x0200000", 1, 1, ok);
2299 TEST_IN_OUT (
"\xfc\x84\x80\x80\x80\x80", 6, 6,
L"\x4000000", 1, 1, ok);
2308test_ascii (
const char *locname,
const char* native_locname)
2313 rw_info (0, __FILE__, __LINE__,
2314 "Testing conversion of Extended ASCII range in "
2315 "locale(\"%s\") against the native locale \"%s\"",
2316 locname, native_locname);
2320 const std::size_t ext_num =
sizeof ext_ascii - 2;
2321 std::size_t int_num = ext_num;
2324 if (rwtest_convert_to_internal (
use_libc, native_locname,
2328 wascii [int_num] =
L'\0';
2330 test_inout (
'i', __LINE__, locname,
2331 ext_ascii + 1, ext_num, ext_num, wascii, int_num, int_num,
2332 std::codecvt_base::ok);
2342 if (rwtest_convert_to_internal (
use_libc, native_locname,
2345 wascii [int_num] =
L'\0';
2347 test_inout (
'i', __LINE__, locname,
2349 wascii, int_num, int_num,
2350 std::codecvt_base::ok);
2371 test_inout (*
this,
char ());
2375 test_inout<wchar_t> (
"wchar_t");
2377 test_virtuals<Codecvt> (0);
2378 test_virtuals<CodecvtW> (
"C");
2380#ifndef _RWSTD_NO_WCHAR_T
2382 test_virtuals<CodecvtBn> (
"C");
2383 test_virtuals<CodecvtBnW> (
"C");
2387#define TEST_UCS_MODIFIER(T, mod, enc, locname, f, i, is) \
2389 char locname_mod [256]; \
2391 std::sprintf (locname_mod, "%s@%s", locname, (mod)); \
2393 std::sprintf (locname_mod, "%s", locname); \
2396 const CodecvtBnW cc (locname_mod, 1); \
2397 std::locale loc = std::locale (std::locale::classic (), &cc); \
2399 cc._C_opts |= cc._C_use_libstd; \
2400 cc._C_opts &= ~cc._C_use_libc; \
2401 test_ucs_modifier (locname_mod, enc, s, cc, f, i, is); \
2404 rw_assert (false, __FILE__, __LINE__, \
2405 "unexpected exception in locale test %s", \
2410#define TEST_LIBSTD(L,T,C,c,f,s,i,is,o,os,ur,ar,er,lr,mr) \
2412 test_libstd_codecvt<T>(L,c,f,s,i,is,o,os,ur,ar,er,lr,mr); \
2414 rw_assert (false, __FILE__, __LINE__, \
2415 "unexpected exception in conversion using %s " \
2416 "(locale %s)", C ? "C library" : "std library", L); \
2419#define TEST_CONVERSION(T,L,C,f,s,i,is,o,os,ur,er,ar,lr,mr) \
2423 loc = std::locale (L); \
2425 rw_assert (false, __FILE__, __LINE__, \
2426 "locale(\"%s\") unexpectedly threw an " \
2427 "exception; " LOCALE_ROOT_ENVAR " = %s", L, \
2432 const T &cc = create_##T (loc); \
2434 cc._C_opts |= cc._C_use_libstd; \
2435 cc._C_opts &= ~cc._C_use_libc; \
2436 TEST_LIBSTD (L,T,C,cc,f,s,i,is,o,os,ur,ar,er,lr,mr); \
2438 if (C == true && rwtest_is_C_locale (f)) { \
2439 cc._C_opts &= ~cc._C_use_libstd; \
2440 cc._C_opts |= cc._C_use_libc; \
2441 TEST_LIBSTD(L,T,C,cc,f,s,i,is,o,os,ur,ar,er,lr,mr); \
2444 rw_assert (false, __FILE__, __LINE__, \
2445 "unexpected exception in locale test %s", L); \
2450 static const struct {
2451 const char* src_name;
2452 const char* charmap_name;
2453 const char* locale_name;
2456 std::size_t encoding;
2457 std::size_t max_length;
2461 {
"de_DE",
"ISO-8859-1",
"de_DE.ISO-8859-1", 6826, 6826, 1, 1 },
2462 {
"fr_FR",
"ISO-8859-1",
"fr_FR.ISO-8859-1", 3920, 3920, 1, 1 },
2464 {
"ja_JP",
"Shift_JIS" ,
"ja_JP.Shift_JIS", 25115, 13001, 0, 2 },
2466 {
"ja_JP",
"EUC-JP" ,
"ja_JP.EUC-JP", 20801, 14299, 0, 3 },
2467 {
"ja_JP",
"UTF-8" ,
"ja_JP.UTF-8", 25056, 12000, 0, 6 },
2471 { 0, 0, 0, 0, 0, 0, 0 }
2476 rw_info (0, __FILE__, __LINE__,
2477 "Testing locale databases - file conversions.");
2480 int first_good_locale = -1;
2482 const char*
const topdir = std::getenv (
"TOPDIR");
2483 if (!topdir || !*topdir) {
2485 "environment variable TOPDIR not set or empty");
2488 for (std::size_t
i = 0;
locales [
i].src_name;
i++) {
2493 const char*
const locname =
2504 const char*
const native_locname =
2508 test_ascii (
locales [
i].locale_name, native_locname);
2510 std::fprintf (
stderr,
"*** failed to find a native locale to match"
2511 " locale(\"%s\"), skipping Extended ASCII conversion"
2512 " test\n",
locales [
i].locale_name);
2515#define TESTS_ETC_PATH "tests" SLASH "etc"
2519 std::strcpy (pathname, topdir);
2521 std::strcat (pathname,
locales [
i].locale_name);
2522 std::strcat (pathname,
".in");
2524 const char*
const s = pathname;
2528 std::codecvt_base::noconv,
locales [
i].nbytes,
2529 std::codecvt_base::noconv,
locales [
i].nbytes,
2530 std::codecvt_base::noconv, 1,
2535 std::codecvt_base::noconv,
locales [
i].nbytes,
2536 std::codecvt_base::noconv,
locales [
i].nbytes,
2537 std::codecvt_base::noconv, 1,
2540#ifndef _RWSTD_NO_WCHAR_T
2544 std::codecvt_base::ok,
locales [
i].nbytes,
2545 std::codecvt_base::ok,
locales [
i].nbytes,
2546 std::codecvt_base::noconv, 1,
2552 std::codecvt_base::ok,
locales [
i].nbytes,
2553 std::codecvt_base::noconv,
locales [
i].encoding,
2559 if (-1 == first_good_locale)
2566# if !defined __GLIBC__ \
2567 || __GLIBC__ == 2 && __GLIBC_MINOR__ > 1 \
2573 locales [
i].locale_name,
s, std::codecvt_base::ok,
2580 use_UCS4 == which_ucs ?
"UCS-4" :
"UCS-2", which_ucs,
2585 locales [
i].locale_name,
s, std::codecvt_base::ok,
2595 test_invalid_args (-1 == first_good_locale ?
2596 (
char*)0 :
locales [first_good_locale].locale_name);
2605 return rw_test (argc, argv, __FILE__,
2606 "[lib.locale.codecvt]",
std::Nested::test_mbstate_t test_mbstate_t
const CodecvtBn & create_CodecvtBn(const std::locale &loc)
#define TEST_CONVERSION(T, L, C, f, s, i, is, o, os, ur, er, ar, lr, mr)
#define TEST(resultT, result, fname, args)
#define TEST_UCS_MODIFIER(T, mod, enc, locname, f, i, is)
_RWSTD_SPECIALIZED_FUNCTION std::size_t rwtest_mbstowcs< char >(std::mbstate_t &, char *, const char *, std::size_t)
#define TEST_IN(src, ext_len, ext_num, dst, int_len, int_num, res)
std::codecvt< char, char, std::mbstate_t > Codecvt
const Codecvt & create_Codecvt(const std::locale &)
std::size_t rwtest_wcstombs(std::mbstate_t &state, const charT *pi, char *pe, std::size_t srclen)
_RWSTD_SPECIALIZED_FUNCTION std::size_t rwtest_wcstombs< char >(std::mbstate_t &, const char *, char *, std::size_t)
std::codecvt_base::result CodecvtResult
const CodecvtW & create_CodecvtW(const std::locale &)
void SIGABRT_handler(int)
std::codecvt_byname< char, char, std::mbstate_t > CodecvtBn
const CodecvtBnW & create_CodecvtBnW(const std::locale &loc)
#define TEST_IN_OUT(src, ext_len, ext_num, dst, int_len, int_num, res)
std::size_t rwtest_mbstowcs(std::mbstate_t &state, T *pi, const char *pe, std::size_t srclen)
std::codecvt_byname< wchar_t, char, std::mbstate_t > CodecvtBnW
std::codecvt< wchar_t, char, std::mbstate_t > CodecvtW
#define TEST_OUT(src, ext_len, ext_num, dst, int_len, int_num, res)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define _RWSTD_SPECIALIZED_CLASS
#define _RWSTD_REINTERPRET_CAST(T, x)
#define _RWSTD_UNUSED(arg)
#define _RWSTD_STATIC_CAST(T, x)
#define _STD_USE_FACET(type, arg)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_CONST_CAST(T, x)
#define _RWSTD_SPECIALIZED_FUNCTION
const struct @19 locales[]
@ error
throw a parse_error exception in case of a tag
_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_assert(int, const char *, int, const char *,...)
_TEST_EXPORT void * rw_fread(const char *, _RWSTD_SIZE_T *=0, const char *="r")
#define LOCALE_ROOT_ENVAR
_TEST_EXPORT const char * rw_set_locale_root()
_TEST_EXPORT const char * rw_localedef(const char *, const char *, const char *, const char *)
_TEST_EXPORT char * rw_locale_query(int=_UNUSED_CAT, const char *=0, _RWSTD_SIZE_T=0)
result do_out(stype &, const itype *, const itype *, const itype *&, etype *, etype *, etype *&) const
result do_unshift(stype &, etype *, etype *, etype *&) const
int do_encoding() const _THROWS(())
std::codecvt_base::result result
result do_in(stype &, const etype *, const etype *, const etype *&, itype *, itype *, itype *&) const
base_type::state_type stype
base_type::extern_type etype
base_type::intern_type itype
std::codecvt< charT, char, std::mbstate_t > Codecvt
virtual ~CodecvtDerived()
int do_max_length() const _THROWS(())
CodecvtDerived(const char *)
bool do_always_noconv() const _THROWS(())
int do_length(stype &, const etype *, const etype *, std::size_t) const