Reverting merge from trunk
[official-gcc.git] / libstdc++-v3 / testsuite / 22_locale / codecvt / in / wchar_t / 8.cc
blobadc82d65bf41460e946276a0e89c89d9f300da89
1 // { dg-require-namedlocale "en_US.UTF-8" }
3 // 2003-02-06 Petur Runolfsson <peturr02@ru.is>
5 // Copyright (C) 2003-2013 Free Software Foundation, Inc.
6 //
7 // This file is part of the GNU ISO C++ Library. This library is free
8 // software; you can redistribute it and/or modify it under the
9 // terms of the GNU General Public License as published by the
10 // Free Software Foundation; either version 3, or (at your option)
11 // any later version.
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License along
19 // with this library; see the file COPYING3. If not see
20 // <http://www.gnu.org/licenses/>.
22 // 22.2.1.5 - Template class codecvt [lib.locale.codecvt]
24 #include <locale>
25 #include <cstring>
26 #include <testsuite_hooks.h>
28 // Need to explicitly set the state(mbstate_t) to zero.
29 // How to do this is not specified by the ISO C99 standard, so we
30 // might need to add some operators to make the intuiative case
31 // work:
32 // w_codecvt::state_type state00;
33 // state00 = 0;
34 // or, can use this explicit "C" initialization:
35 // w_codecvt::state_type state01 = {0, 0};
36 // .. except Ulrich says: Use memset. Always use memset. Feel the force...
37 void
38 zero_state(std::mbstate_t& state)
39 { std::memset(&state, 0, sizeof(std::mbstate_t)); }
41 // Required instantiation
42 // codecvt<wchar_t, char, mbstate_t>
44 // Test UTF-8 with output buffer larger than needed.
45 void test08()
47 using namespace std;
48 typedef codecvt<wchar_t, char, mbstate_t> w_codecvt;
49 typedef codecvt_base::result result;
50 typedef wchar_t int_type;
51 typedef char ext_type;
52 typedef char_traits<wchar_t> int_traits;
54 bool test __attribute__((unused)) = true;
55 const ext_type* e_lit =
56 "\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13"
57 "\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20!\"#$%&"
58 "'()*+,-./0123456789:;<=>?@}~\x7f\xc2\x80\xc2\x81\xc2\x82\xc2"
59 "\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a"
60 "\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f\xc2\x90\xc2\x91\xc2"
61 "\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99"
62 "\xc2\x9a\xc2\x9b\xc2\x9c\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3"
63 "\xbe\xc3\xbf\xc4\x80\xc4\x81\xc4\x82\xc4\x83\xc4\x84\xc4\x85"
64 "\xc4\x86\xc4\x87\xc4\x88\xc4\x89\xc4\x8a\xc4\x8b\xc4\x8c\xc4"
65 "\x8d\xc4\x8e\xc4\x8f\xc4\x90\xc4\x91\xc4\x92\xc4\x93\xc4\x94"
66 "\xc4\x95\xc4\x96\xc4\x97\xc4\x98\xc4\x99\xdf\xb8\xdf\xb9\xdf"
67 "\xba\xdf\xbb\xdf\xbc\xdf\xbd\xdf\xbe\xdf\xbf\xe0\xa0\x80\xe0"
68 "\xa0\x81\xe0\xa0\x82\xe0\xa0\x83\xe0\xa0\x84\xe0\xa0\x85\xe0"
69 "\xa0\x86\xe0\xa0\x87\xe0\xa0\x88\xe0\xa0\x89\xe0\xa0\x8a\xe0"
70 "\xa0\x8b\xe0\xa0\x8c\xe0\xa0\x8d\xe0\xa0\x8e\xe0\xa0\x8f\xe0"
71 "\xa0\x90\xe0\xa0\x91\xe0\xa0\x92\xe0\xa0\x93\xe0\xa0\x94\xe0"
72 "\xa0\x95\xe0\xa0\x96\xe0\xa0\x97\x1\x2\x4\x8\x10\x20@\xc2\x80"
73 "\xc4\x80\xc8\x80\xd0\x80\xe0\xa0\x80\xe1\x80\x80\xe2\x80\x80"
74 "\xe4\x80\x80\xe8\x80\x80\xf0\x90\x80\x80\xf0\xa0\x80\x80\xf1"
75 "\x80\x80\x80\xf2\x80\x80\x80\xf4\x80\x80\x80\xf8\x88\x80\x80"
76 "\x80\xf8\x90\x80\x80\x80\xf8\xa0\x80\x80\x80\xf9\x80\x80\x80"
77 "\x80\xfa\x80\x80\x80\x80\xfc\x84\x80\x80\x80\x80\xfc\x88\x80"
78 "\x80\x80\x80\xfc\x90\x80\x80\x80\x80\xfc\xa0\x80\x80\x80\x80"
79 "\xfd\x80\x80\x80\x80\x80";
81 const ext_type* efrom_next;
82 const int_type i_lit[] = {
83 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc,
84 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
85 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, L'!',
86 L'"', L'#', L'$', L'%', L'&', L'\'', L'(', L')', L'*', L'+',
87 L',', L'-', L'.', L'/', L'0', L'1', L'2', L'3', L'4', L'5',
88 L'6', L'7', L'8', L'9', L':', L';', L'<', L'=', L'>', L'?',
89 L'@', L'}', L'~', 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
90 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
91 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
92 0x9a, 0x9b, 0x9c, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x100,
93 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109,
94 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x110, 0x111, 0x112,
95 0x113, 0x114, 0x115, 0x116, 0x117, 0x118, 0x119, 0x7f8, 0x7f9,
96 0x7fa, 0x7fb, 0x7fc, 0x7fd, 0x7fe, 0x7ff, 0x800, 0x801, 0x802,
97 0x803, 0x804, 0x805, 0x806, 0x807, 0x808, 0x809, 0x80a, 0x80b,
98 0x80c, 0x80d, 0x80e, 0x80f, 0x810, 0x811, 0x812, 0x813, 0x814,
99 0x815, 0x816, 0x817, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, L'@',
100 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
101 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000,
102 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000,
103 0x20000000, 0x40000000, 0x0
106 int esize = strlen(e_lit);
107 int isize = wcslen(i_lit);
108 int_type* i_arr = new int_type[esize + 1];
109 int_type* i_ref = new int_type[esize + 1];
110 wmemset(i_arr, 0xdeadbeef, esize + 1);
111 wmemset(i_ref, 0xdeadbeef, esize + 1);
112 int_type* ito_next;
114 locale loc = locale("en_US.UTF-8");
115 locale::global(loc);
116 const w_codecvt* cvt = &use_facet<w_codecvt>(loc);
118 // in
119 w_codecvt::state_type state01;
120 zero_state(state01);
121 result r1 = cvt->in(state01, e_lit, e_lit + esize, efrom_next,
122 i_arr, i_arr + esize, ito_next);
123 VERIFY( r1 == codecvt_base::ok );
124 VERIFY( efrom_next == e_lit + esize );
125 VERIFY( ito_next == i_arr + isize );
126 VERIFY( !int_traits::compare(i_arr, i_lit, isize) );
127 VERIFY( !int_traits::compare(ito_next, i_ref, esize + 1 - isize) );
129 delete [] i_arr;
130 delete [] i_ref;
133 int main ()
135 test08();
136 return 0;