39# define _XOPEN_SOURCE 500
41# include <sys/types.h>
45#if defined (__SUNPRO_CC) && __SUNPRO_CC <= 0x540
62# if !defined (LC_MESSAGES)
63# define LC_MESSAGES _RWSTD_LC_MESSAGES
79#define MAX_STR_SIZE 16
81#define LOCALES "{{en-US,de-DE,fr-FR,es-ES}-*-{ISO-8859-*,UTF-8,CP125?}," \
82 "{ja-JP-*-{EUC-JP,SHIFT_JIS,UTF-8,CP125?}}," \
83 "{zh-CN-*-{GB*,UTF-8,CP125?}}," \
84 "{ru-RU-*-{KOI*,UTF-8,CP125?}}}"
88#define BEGIN_LOCALE_LOOP(num, locname, loop_cntrl) \
89 if (!locale_list) locale_list = rw_locale_query (LC_CTYPE, LOCALES); \
90 for (const char* locname = locale_list; \
91 locname && *locname; locname += std::strlen (locname) + 1) { \
93 const std::locale loc (locname); \
94 const std::ctype<char> &ctc = \
95 _STD_USE_FACET (std::ctype<char>, loc); \
96 _RWSTD_UNUSED (ctc); \
97 const std::ctype<charT> &ctp = \
98 _STD_USE_FACET (std::ctype<charT>, loc); \
99 for (int loop_cntrl = 0; loop_cntrl < int (num); loop_cntrl++)
101#define END_LOCALE_LOOP(locname) \
104 rw_assert (0, 0, __LINE__, \
105 "locale (\"%s\") threw an exception", locname); \
113#define ALPHA std::ctype_base::alpha
114#define UPPER std::ctype_base::upper
115#define LOWER std::ctype_base::lower
116#define DIGIT std::ctype_base::digit
117#define SPACE std::ctype_base::space
118#define CNTRL std::ctype_base::cntrl
119#define PUNCT std::ctype_base::punct
120#define XDIGIT std::ctype_base::xdigit
121#define GRAPH std::ctype_base::graph
122#define PRINT std::ctype_base::print
128 return (std::isalpha)(
UChar (ch));
133 return (std::isspace)(
UChar (ch));
138 return (std::isprint)(
UChar (ch));
143 return (std::iscntrl)(
UChar (ch));
148 return (std::isupper)(
UChar (ch));
153 return (std::islower)(
UChar (ch));
158 return (std::isdigit)(
UChar (ch));
163 return (std::ispunct)(
UChar (ch));
168 return (std::isxdigit)(
UChar (ch));
173 return (std::isalnum)(
UChar (ch));
178 return (std::isgraph)(
UChar (ch));
183 return std::tolower (
UChar (ch));
188 return (std::toupper)(
UChar (ch));
191std::ctype_base::mask
libc_mask (
int mask,
char ch,
const char *locname)
193 char curlocname [256];
196 std::strcpy (curlocname, std::setlocale (
LC_CTYPE, 0));
198 if (0 == std::setlocale (
LC_CTYPE, locname))
199 return std::ctype_base::mask ();
206 if (mask &
ALPHA && (std::isalpha)(
c))
208 if (mask &
CNTRL && (std::iscntrl)(
c))
210 if (mask &
DIGIT && (std::isdigit)(
c))
212 if (mask &
GRAPH && (std::isgraph)(
c))
214 if (mask &
LOWER && (std::islower)(
c))
216 if (mask &
PRINT && (std::isprint)(
c))
218 if (mask &
PUNCT && (std::ispunct)(
c))
220 if (mask &
SPACE && (std::isspace)(
c))
222 if (mask &
UPPER && (std::isupper)(
c))
224 if (mask &
XDIGIT && (std::isxdigit)(
c))
228 std::setlocale (
LC_CTYPE, curlocname);
230 return std::ctype_base::mask (
result);
233inline bool libc_is (std::ctype_base::mask mask,
char ch,
const char *locname)
235 const std::ctype_base::mask
m =
libc_mask (mask, ch, locname);
237 return 0 != (
m & mask);
242 return std::strlen (
s1);
247 int ret = std::strcoll (
s1,
s2);
248 return ret ? ret > 0 ? 1 : -1 : 0;
251const char*
narrow (
char *dst,
const char *src)
253 if (src == dst || !src || !dst)
256 std::memcpy (dst, src, std::strlen (src) + 1);
261const char*
widen (
char *dst,
const char *src)
263 if (src == dst || !src || !dst)
266 std::memcpy (dst, src, std::strlen (src) + 1);
271char widen (
char,
char ch,
const char*)
283bool cond1 (std::ctype_base::mask mask,
char ch,
const char *locname)
285 char curlocname [256];
286 std::strcpy (curlocname, std::setlocale (
LC_CTYPE, 0));
288 if (0 == std::setlocale (
LC_CTYPE, locname))
298#ifndef _RWSTD_NO_BTOWC
300 const std::wint_t wc = std::btowc (
UChar (ch));
302#elif !defined (_RWSTD_NO_MBSTOWCS)
305 const std::wint_t wc = 1 == std::mbstowcs (&
tmp, &ch, 1) ?
tmp :
WEOF;
309 const std::wint_t wc =
WEOF;
316 std::setlocale (
LC_CTYPE, curlocname);
324bool cond3 (std::ctype_base::mask,
char,
const char*)
330#ifndef _RWSTD_NO_WCHAR_T
334 return (std::iswalpha)(ch);
339 return (std::iswspace)(ch);
344 return (std::iswprint)(ch);
349 return (std::iswcntrl)(ch);
354 return (std::iswupper)(ch);
359 return (std::iswlower)(ch);
364 return (std::iswdigit)(ch);
369 return (std::iswpunct)(ch);
374 return (std::iswxdigit)(ch);
379 return (std::iswalnum)(ch);
384 return (std::iswgraph)(ch);
389 return (std::towlower)(ch);
394 return (std::towupper)(ch);
399 return std::wcslen (
s1);
404 int ret = std::wcscmp (
s1,
s2);
405 return ret ? ret > 0 ? 1 : -1 : 0;
409const char*
narrow (
char *dst,
const wchar_t *src)
411 static char buf [4096];
419 std::size_t
len = std::wcslen (src);
423 len = std::wcstombs (dst, src,
sizeof buf /
sizeof *
buf);
425 if (std::size_t (-1) ==
len)
432const wchar_t*
widen (
wchar_t *dst,
const char *src)
434 static wchar_t buf [4096];
442 std::size_t
len = std::strlen (src);
446 len = std::mbstowcs (dst, src,
sizeof buf /
sizeof *
buf);
448 if (std::size_t (-1) ==
len)
454std::ctype_base::mask
libc_mask (
int mask,
wchar_t ch,
const char *locname)
456 char curlocname [256];
459 std::strcpy (curlocname, std::setlocale (
LC_CTYPE, 0));
461 if (0 == std::setlocale (
LC_CTYPE, locname))
462 return std::ctype_base::mask ();
467 if (mask &
ALPHA && (std::iswalpha)(ch))
469 if (mask &
CNTRL && (std::iswcntrl)(ch))
471 if (mask &
DIGIT && (std::iswdigit)(ch))
473 if (mask &
GRAPH && (std::iswgraph)(ch))
475 if (mask &
LOWER && (std::iswlower)(ch))
477 if (mask &
PRINT && (std::iswprint)(ch))
479 if (mask &
PUNCT && (std::iswpunct)(ch))
481 if (mask &
SPACE && (std::iswspace)(ch))
483 if (mask &
UPPER && (std::iswupper)(ch))
485 if (mask &
XDIGIT && (std::iswxdigit)(ch))
489 std::setlocale (
LC_CTYPE, curlocname);
491 return std::ctype_base::mask (
result);
494bool libc_is (std::ctype_base::mask mask,
wchar_t ch,
const char *locname)
496 const std::ctype_base::mask
m =
libc_mask (mask, ch, locname);
498 return 0 != (
m & mask);
501wchar_t widen (
wchar_t,
char ch,
const char *locname)
503 char curlocname [256];
504 std::strcpy (curlocname, std::setlocale (
LC_CTYPE, 0));
506 if (0 == std::setlocale (
LC_CTYPE, locname))
511#ifndef _RWSTD_NO_BTOWC
515#elif !defined (_RWSTD_NO_MBTOWC)
517 if (1 != std::mbtowc (&
result, &ch, 1))
527 std::setlocale (
LC_CTYPE, curlocname);
532char narrow (
wchar_t ch,
const char *locname)
534 char curlocname [256];
535 std::strcpy (curlocname, std::setlocale (
LC_CTYPE, 0));
537 if (0 == std::setlocale (
LC_CTYPE, locname))
542#ifndef _RWSTD_NO_WCTOB
544 result [0] = std::wctob (ch);
546#elif !defined (_RWSTD_NO_WCTOMB)
548 if (1 != std::wctomb (
result, ch))
558 std::setlocale (
LC_CTYPE, curlocname);
563bool cond3 (std::ctype_base::mask mask,
wchar_t ch,
const char *locname)
565 char curlocname [256];
566 std::strcpy (curlocname, std::setlocale (
LC_CTYPE, 0));
568 if (0 == std::setlocale (
LC_CTYPE, locname))
571#ifndef _RWSTD_NO_WCTOB
573 const int byte = std::wctob (ch);
575#elif !defined (_RWSTD_NO_WCTOMB)
578 const int byte = 1 == std::wctomb (
buf, ch) ?
buf [0] :
EOF;
582 const int byte =
EOF;
589 std::setlocale (
LC_CTYPE, curlocname);
597template <
class charT>
604 for (std::size_t
i = 0;
i <
size;
i++){
618template <
class charT>
643 for (std::size_t
i = 0;
i <
size ;
i++) {
648 libc_result |=
ALPHA;
650 libc_result |=
PRINT;
652 libc_result |=
SPACE;
654 libc_result |=
CNTRL;
656 libc_result |=
UPPER;
658 libc_result |=
LOWER;
660 libc_result |=
DIGIT;
662 libc_result |=
PUNCT;
666 libc_result |=
GRAPH;
668 rw_assert (vec [
i] == libc_result, 0, __LINE__,
669 "ctype<%s>::is(%{*Ac}, ..., v) in locale(%#s) "
670 "at offset %zu; got %{LC} expected %{LC}\n",
671 cname,
int (
sizeof *
str),
str,
672 locname,
i, vec [
i], libc_result);
679template <
class charT>
682 rw_info (0, 0, __LINE__,
"std::ctype<%s>::tolower(%1$s)", cname);
698 rw_assert (lch == (ctp.tolower)(ch), 0, __LINE__,
699 "ctype<%s>::tolower(%{#lc}) == %{#lc}, got %{#lc} "
701 cname, ch, lch, (ctp.tolower)(ch), locname);
705 "tolower<%s>(%{#lc}, locale(%#s)) == %{#lc}, got %{#lc}",
706 cname, ch, locname, lch, (std::tolower)(ch,
loc));
709 rw_info (0, 0, __LINE__,
"std::ctype<%s>::toupper(%1$s)", cname);
716 std::setlocale (
LC_CTYPE, locname2);
725 rw_assert (uch == (ctp.toupper)(ch), 0, __LINE__,
726 "ctype<%s>::toupper(%{#lc}) == %{#lc}, got %{#lc} "
728 cname, ch, uch, (ctp.toupper)(ch), locname2);
732 "toupper<%s>(%{#lc}, locale(%#s)) == %{#lc}, got %{#lc}",
733 cname, ch, locname2, uch, (std::toupper)(ch,
loc));
739template <
class charT>
742 rw_info (0, 0, __LINE__,
"std::ctype<%s>::scan_is(), scan_not()", cname);
790 for (i = 0; i < size; i++) { \
791 if (libc_is##what (str [i])) { \
796 success = what##_is != (str + size) || 0 == first \
797 || *what##_is != first; \
798 rw_assert (success, 0, __LINE__, \
799 "ctype<%s>::scan_is(" #what ", %{#lc}) " \
800 "== %{*Ac}, got %{*Ac} in locale (%#s)", \
801 cname, int (sizeof *str), first, \
802 int (sizeof *what##_is), what##_is, \
806 for (i = 0; i < size; i++) { \
807 if (!libc_is##what (str[i])) { \
808 first_not = (str[i]); \
812 success = what##_not != (str + size) || 0 == first_not \
813 || *what##_not == first_not; \
814 rw_assert (success, 0, __LINE__, \
815 "ctype<%s>::scan_not(" #what ", %{#lc}) " \
816 "== %{*Ac}, got %{*Ac} in locale (%#s)", \
817 cname, int (sizeof *str), first, \
818 int (sizeof *what##_not), what##_not, \
839template <
class charT>
873 "std::ctype<%s>::narrow(%1$s), widen(char)",
877 "std::ctype<%s>::narrow(const %1$s*, const %1$s*, char*), "
878 "widen(const char*, const char*, %1$s*)", cname);
886 if (!(ctc.is (what, c) || !ctp.is (what, ctp.widen (c)))) { \
887 rw_assert (!cond1 (what, c, locname), 0, __LINE__, \
888 "ctype<char>::is (" STR (what) ", %{#lc})" \
889 " || !ctype<%1$s>::is (" STR (what) ", " \
890 "ctype<%s>::widen (%{#lc}) = %{#lc})" \
891 " returned false in locale(%#s)", \
892 c, cname, c, ctp.widen (c), locname); \
899 if ( ctp.narrow (ch, dfault) != dfault \
900 && !(ctp.is (what, ch) || !ctc.is (what, ctp.narrow (ch, dfault)))) { \
901 rw_assert (!cond3 (what, ch, locname), 0, __LINE__, \
902 "ctype<%s>::is (" STR (what) ", %{#lc})" \
903 " || !ctype<char>::is (" STR (what) ", " \
904 "ctype<%1$s>::narrow (%{#lc}, %{#c}) = %{#lc})" \
905 " returned false in locale(%#s)", cname, \
906 ch, cname, ch, dfault, ctp.narrow (ch, '\0'), \
911 char c_locname [256];
912 std::strcpy (c_locname, std::setlocale (
LC_ALL, 0));
916#if defined (_RWSTD_OS_SUNOS) && _RWSTD_OS_MAJOR == 5 && _RWSTD_OS_MINOR <= 10
920 if ( 0 == std::strncmp (
"zh_HK.BIG5", locname, 10)
921 || 0 == std::strncmp (
"zh_TW.BIG5", locname, 10))
928 const char*
const curlocname = std::setlocale (
LC_ALL, 0);
930 rw_assert (!std::strcmp (c_locname, curlocname), 0, __LINE__,
931 "setlocale(LC_ALL, 0) == \"%s\", got \"%s\"",
932 c_locname, curlocname);
935 const char c = char (
i);
951 char dfault =
c ?
'\0' :
'\1';
952 const charT ret = ctp.widen (ctp.narrow (ch, dfault));
954 if (ret !=
charT (dfault) && ret != ch) {
957 "ctype<%s>::widen (ctype<%1$s>::narrow "
958 "(%{#lc}, %{#c})) == %{#c}; got %{#c} "
960 cname, ch, dfault, ch, ret, locname);
998 wide_chars [
j] = ctp.widen (
char (
j));
999 narrow_chars [
j] = ctp.narrow (wide_chars [
j], dfault);
1000 narrow_in [
j] = ctp.widen (
char (
j));
1001 widen_in [
j] = char (
j);
1012 ctp.narrow (narrow_in,
1018 !std::memcmp (narrow_chars, narrow_out,
sizeof narrow_chars);
1021 "ctype<%s>::narrow (%{*.*Ac}\", ... , %#c) "
1022 "== %{.*Ac}, got %{.Ac} in locale (%#s)", cname,
1023 int (
sizeof *narrow_in),
UCHAR_MAX, narrow_in, dfault,
1029 ctp.widen (widen_in,
1033 success = !std::memcmp (wide_chars, widen_out,
sizeof wide_chars);
1036 "ctype<%s>::widen (%{.*Ac}, ...) == "
1037 "%{*.*Ac}, got %{*.*Ac} in locale (%#s)",
1039 int (
sizeof *wide_chars),
UCHAR_MAX, wide_chars,
1040 int (
sizeof *wide_chars),
UCHAR_MAX, widen_out,
1049template <
class charT>
1056 static char is_C [80];
1057 static char is_CXX [80];
1058 static char is_CXX2 [80];
1060 rw_info (0, 0, __LINE__,
"std::ctype<%s>::is(mask, %1$s)", cname);
1065 const UChar uch = ch;
1072 std::setlocale (
LC_CTYPE, locname);
1075 libc_is##what (ch) \
1076 ? (void)std::strcat (is_C, #what" ") : (void)0;
1090 ctp.is (std::ctype_base::what, ch) \
1091 ? (void)std::strcat (is_CXX, #what" ") : (void)0; \
1092 (std::is##what)(ch, loc) \
1093 ? (void)std::strcat (is_CXX2, #what" ") : (void)0;
1103 rw_assert (0 == std::strcmp (is_C, is_CXX), 0, __LINE__,
1104 "ctype<%s>::is(..., %{#lc}) in locale(%#s) "
1105 "expected to hold for { %s}, got { %s}",
1106 cname, uch, locname, is_C, is_CXX);
1109 rw_assert (0 == std::strcmp (is_C, is_CXX2), 0, __LINE__,
1110 "is* (%{#lc}, locale (%#s)) expected to hold for "
1112 uch, locname, is_C, is_CXX2);
1118 static const std::ctype_base::mask masks[] = {
1129 static const int required [
sizeof masks /
sizeof *masks] = {
1145 static const int allowed [
sizeof masks /
sizeof *masks] = {
1161 static const int disallowed [
sizeof masks /
sizeof *masks] = {
1176 std::ctype_base::mask
m;
1177 ctp.is (&ch, &ch + 1, &
m);
1180 int all_allowed = 0;
1181 int all_disallowed = 0;
1183 for (std::size_t
k = 0;
k !=
sizeof masks /
sizeof *masks; ++
k) {
1186 const int bit =
m & masks [
k];
1190 if ((bit & required [
k]) && (
m & required [
k]) != required [
k]) {
1194 missing |= ~(
m & required [
k]) & required [
k];
1200 all_allowed |= required [
k] | allowed [
k];
1201 all_disallowed |= disallowed [
k];
1222 "mask of %{#lc} in locale(%#s) "
1223 "is missing bits %{LC}: %{LC}",
1224 ch, locname, missing,
m);
1227 if (
m & ~all_allowed) {
1233 "mask of %{#lc} in locale (%#s) "
1234 "contains extra bits %{LC}: %{LC}",
1235 ch, locname,
m & ~all_allowed,
m);
1238 if (
m & all_disallowed) {
1244 "mask of %{#lc} in locale (%s#) "
1245 "contains disallowed bits { %s }: { %s }",
1246 ch, locname,
m & all_disallowed,
m);
1256template <
class charT>
1268template <
class charT>
1270 const std::ctype<charT> &ct,
1271 const char*
str, std::ctype_base::mask mask,
1272 int expected_idx,
int fwiden = 0)
1275 charT wstrbuf [256];
1276 charT* wstr = wstrbuf;
1283 ct.widen (
str,
str + std::strlen (
str), wstrbuf);
1286 &wstr [expected_idx] == ct.scan_is (mask, wstr, wstr +
c_strlen (wstr));
1289 "ctype<%s>::scan_is() returned an unexpected value",
1296template <
class charT>
1298 const std::ctype<charT> &ct,
1299 const char*
str, std::ctype_base::mask mask,
1300 int expected_idx,
int fwiden = 0)
1303 charT wstrbuf [256];
1304 charT* wstr = wstrbuf;
1311 ct.widen (
str,
str + std::strlen (
str), wstrbuf);
1314 &wstr[expected_idx] == ct.scan_not (mask, wstr, wstr +
c_strlen (wstr));
1317 "ctype<%s>::scan_not() returned an unexpected value",
1324template <
class charT>
1326 const std::ctype<charT> &ct,
1327 const char *locname)
1330 "std::ctype<%s>::tolower(%1$s) toupper(%1$s) in locale(%#s)",
1336#define TEST(lower, upper) \
1337 success = ct.widen (upper) == ct.toupper (ct.widen (lower)); \
1338 rw_assert (success, 0, __LINE__, \
1339 "ctype<%s>::toupper(%d) == %d, got %d", cname, \
1340 lower, upper, ct.toupper((charT)lower)); \
1341 success = ct.widen (lower) == ct.tolower (ct.widen (upper)); \
1342 rw_assert (success, 0, __LINE__, \
1343 "ctype<%s>::tolower(%d) == %d, got %d", \
1344 cname, upper, lower, ct.tolower((charT)upper))
1350 if (
sizeof(
charT) > 1) {
1351 TEST (
'\xa0',
'\xa1');
1359template <
class charT>
1361 const std::ctype<charT> &ct,
const char *locname)
1364 rw_info (0, 0, __LINE__,
"std::ctype<%s>::is(mask, %1$s) in locale(%#s)",
1368#define TEST(ch, m) \
1369 rw_assert (ct.is (m, ch), 0, __LINE__, \
1370 "ctype<%s>::is(%d, %d) failed", cname, m, ch)
1438 if (
sizeof (
charT) > 1) {
1460template <
class charT>
1469 const char cmap_1[] = {
1470 "<code_set_name> \"ANSI_X3.4-1968\"\n"
1608 const char loc_1[] = {
1611 "# <A> <B> <C> MYANMAR LETTER KHA\n"
1612 "upper <U0041>;<U0042>;<U0043>;<U1001>\n"
1613 " <a> <b> <c> MYANMAR LETTER KA\n"
1614 "lower <U0061>;<U0062>;<U0063>;<U1000>\n"
1615 "alpha <U0061>;<U0062>;<U0063>;<U0041>;"
1616 "<U0042>;<U0043>;<U1000>;<U1001>\n"
1617 "digit <U0031>;<U0032>;<U0033>;<U1002>\n"
1621 "punct <U0021>; <U0022>\n"
1622 "graph <U0041>;<U0042>;<U0043>;<U0061>;<U0062>;<U0063>;"
1623 "<U1000>;<U1001>;<U1002>;<U1003>;<U1004>;<U1005>;"
1624 "<U0031>;<U0032>;<U0033>;<U0020>;<U0021>;<U0022>\n"
1625 "print <U0041>;<U0042>;<U0043>;"
1626 "<U0061>;<U0062>;<U0063>;"
1627 "<U1000>;<U1001>;<U1002>;<U1003>;<U1004>;<U1005>;"
1628 "<U0031>;<U0032>;<U0033>;<U0020>;<U0021>;<U0022>\n"
1629 "xdigit <U0041>;<U0042>;<U0043>;<U0061>;<U0062>;"
1630 "<U0063>;<U0031>;<U0032>;<U0033>\n"
1631 "toupper (<U0061>,<U0041>);(<U0062>,<U0042>);"
1632 "(<U0063>,<U0043>);(<U1000>,<U1001>)\n"
1633 "tolower (<U0041>,<U0061>);(<U0042>,<U0062>);"
1634 "(<U0043>,<U0063>);(<U1001>,<U1000>)\n"
1641 if (!
rw_error (0 != locname, 0, __LINE__,
1645 const std::locale
loc (locname);
1647 const std::ctype<charT> &ct =
1650 ct._C_opts |= ct._C_use_libstd;
1651 ct._C_opts &= ~ct._C_use_libc;
1658 "std::ctype<%s>::scan_is(const %1$s*, const %1$s, mask*) "
1659 "in locale(%#s)", cname, locname);
1668 if (
sizeof(
charT) > 1) {
1674 "std::ctype<%s>::scan_not(const %1$s*, const %1$s, mask*) "
1675 "in locale(%#s)", cname, locname);
1682 if (
sizeof(
charT) > 1) {
1695#ifndef _RWSTD_NO_WCHAR_T
1701#ifndef _RWSTD_NO_WCHAR_T
1712 return rw_test (argc, argv, __FILE__,
1713 "lib.category.ctype",
int libc_iscntrl(char ch)
#define END_LOCALE_LOOP(locname)
char libc_tolower(char ch)
char libc_toupper(char ch)
int libc_isgraph(char ch)
int libc_islower(char ch)
int libc_ispunct(char ch)
void test_libstd_scan_not(charT, const char *cname, const std::ctype< charT > &ct, const char *str, std::ctype_base::mask mask, int expected_idx, int fwiden=0)
void test_is(charT, const char *cname)
int libc_isdigit(char ch)
#define TEST(lower, upper)
const char * widen(char *dst, const char *src)
bool libc_is(std::ctype_base::mask mask, char ch, const char *locname)
int libc_isupper(char ch)
void test_libstd_scan_is(charT, const char *cname, const std::ctype< charT > &ct, const char *str, std::ctype_base::mask mask, int expected_idx, int fwiden=0)
int libc_isalpha(char ch)
int libc_isxdigit(char ch)
void test_toupper_tolower(charT, const char *cname)
void test_scan(charT, const char *cname)
int libc_isalnum(char ch)
bool cond3(std::ctype_base::mask, char, const char *)
const char * narrow(char *dst, const char *src)
#define BEGIN_LOCALE_LOOP(num, locname, loop_cntrl)
std::size_t c_strlen(const char *s1)
void test_libstd(charT, const char *cname)
int libc_isspace(char ch)
void test_libstd_mask(charT, const char *cname, const std::ctype< charT > &ct, const char *locname)
std::ctype_base::mask libc_mask(int mask, char ch, const char *locname)
void test_libc(charT, const char *cname)
void test_is_ch(charT, const char *cname)
void gen_str(charT *str, std::size_t size)
int libc_isprint(char ch)
void test_libstd_toupper_tolower(charT, const char *cname, const std::ctype< charT > &ct, const char *locname)
void test_narrow_widen(charT, const char *cname)
bool cond1(std::ctype_base::mask mask, char ch, const char *locname)
int c_strcmp(const char *s1, const char *s2)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define _STD_HAS_FACET(type, arg)
#define _STD_USE_FACET(type, arg)
#define _RWSTD_ASSERT(ignore)
_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 int rw_error(int, const char *, int, const char *,...)
_TEST_EXPORT const char * rw_create_locale(const char *, const char *)