Merge -r 127928:132243 from trunk
[official-gcc.git] / libstdc++-v3 / testsuite / 22_locale / codecvt / in / wchar_t / 9.cc
blob01935eabd9763c81c6dc7bffd16c04be6ecbb230
1 // { dg-require-namedlocale "" }
3 // 2003-02-06 Petur Runolfsson <peturr02@ru.is>
5 // Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation
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 2, 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 COPYING. If not, write to the Free
20 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
21 // USA.
23 // 22.2.1.5 - Template class codecvt [lib.locale.codecvt]
25 #include <locale>
26 #include <cstring>
27 #include <testsuite_hooks.h>
29 // Need to explicitly set the state(mbstate_t) to zero.
30 // How to do this is not specified by the ISO C99 standard, so we
31 // might need to add some operators to make the intuiative case
32 // work:
33 // w_codecvt::state_type state00;
34 // state00 = 0;
35 // or, can use this explicit "C" initialization:
36 // w_codecvt::state_type state01 = {0, 0};
37 // .. except Ulrich says: Use memset. Always use memset. Feel the force...
38 void
39 zero_state(std::mbstate_t& state)
40 { std::memset(&state, 0, sizeof(std::mbstate_t)); }
42 // Required instantiation
43 // codecvt<wchar_t, char, mbstate_t>
45 // Test one source character at a time for UTF-8
46 void test09()
48 using namespace std;
49 typedef codecvt<wchar_t, char, mbstate_t> w_codecvt;
50 typedef codecvt_base::result result;
51 typedef wchar_t int_type;
52 typedef char ext_type;
53 typedef char_traits<wchar_t> int_traits;
55 bool test __attribute__((unused)) = true;
56 const ext_type* e_lit =
57 "\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13"
58 "\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20!\"#$%&"
59 "'()*+,-./0123456789:;<=>?@}~\x7f\xc2\x80\xc2\x81\xc2\x82\xc2"
60 "\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a"
61 "\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f\xc2\x90\xc2\x91\xc2"
62 "\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99"
63 "\xc2\x9a\xc2\x9b\xc2\x9c\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3"
64 "\xbe\xc3\xbf\xc4\x80\xc4\x81\xc4\x82\xc4\x83\xc4\x84\xc4\x85"
65 "\xc4\x86\xc4\x87\xc4\x88\xc4\x89\xc4\x8a\xc4\x8b\xc4\x8c\xc4"
66 "\x8d\xc4\x8e\xc4\x8f\xc4\x90\xc4\x91\xc4\x92\xc4\x93\xc4\x94"
67 "\xc4\x95\xc4\x96\xc4\x97\xc4\x98\xc4\x99\xdf\xb8\xdf\xb9\xdf"
68 "\xba\xdf\xbb\xdf\xbc\xdf\xbd\xdf\xbe\xdf\xbf\xe0\xa0\x80\xe0"
69 "\xa0\x81\xe0\xa0\x82\xe0\xa0\x83\xe0\xa0\x84\xe0\xa0\x85\xe0"
70 "\xa0\x86\xe0\xa0\x87\xe0\xa0\x88\xe0\xa0\x89\xe0\xa0\x8a\xe0"
71 "\xa0\x8b\xe0\xa0\x8c\xe0\xa0\x8d\xe0\xa0\x8e\xe0\xa0\x8f\xe0"
72 "\xa0\x90\xe0\xa0\x91\xe0\xa0\x92\xe0\xa0\x93\xe0\xa0\x94\xe0"
73 "\xa0\x95\xe0\xa0\x96\xe0\xa0\x97\x1\x2\x4\x8\x10\x20@\xc2\x80"
74 "\xc4\x80\xc8\x80\xd0\x80\xe0\xa0\x80\xe1\x80\x80\xe2\x80\x80"
75 "\xe4\x80\x80\xe8\x80\x80\xf0\x90\x80\x80\xf0\xa0\x80\x80\xf1"
76 "\x80\x80\x80\xf2\x80\x80\x80\xf4\x80\x80\x80\xf8\x88\x80\x80"
77 "\x80\xf8\x90\x80\x80\x80\xf8\xa0\x80\x80\x80\xf9\x80\x80\x80"
78 "\x80\xfa\x80\x80\x80\x80\xfc\x84\x80\x80\x80\x80\xfc\x88\x80"
79 "\x80\x80\x80\xfc\x90\x80\x80\x80\x80\xfc\xa0\x80\x80\x80\x80"
80 "\xfd\x80\x80\x80\x80\x80";
82 const ext_type* efrom = e_lit;
83 const ext_type* efrom_next;
84 const int_type i_lit[] = {
85 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc,
86 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
87 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, L'!',
88 L'"', L'#', L'$', L'%', L'&', L'\'', L'(', L')', L'*', L'+',
89 L',', L'-', L'.', L'/', L'0', L'1', L'2', L'3', L'4', L'5',
90 L'6', L'7', L'8', L'9', L':', L';', L'<', L'=', L'>', L'?',
91 L'@', L'}', L'~', 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
92 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
93 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
94 0x9a, 0x9b, 0x9c, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x100,
95 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109,
96 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x110, 0x111, 0x112,
97 0x113, 0x114, 0x115, 0x116, 0x117, 0x118, 0x119, 0x7f8, 0x7f9,
98 0x7fa, 0x7fb, 0x7fc, 0x7fd, 0x7fe, 0x7ff, 0x800, 0x801, 0x802,
99 0x803, 0x804, 0x805, 0x806, 0x807, 0x808, 0x809, 0x80a, 0x80b,
100 0x80c, 0x80d, 0x80e, 0x80f, 0x810, 0x811, 0x812, 0x813, 0x814,
101 0x815, 0x816, 0x817, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, L'@',
102 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
103 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000,
104 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000,
105 0x20000000, 0x40000000, 0x0
108 int esize = strlen(e_lit);
109 int isize = wcslen(i_lit);
110 int_type* i_arr = new int_type[esize + 1];
111 int_type* i_ref = new int_type[esize + 1];
112 wmemset(i_arr, 0xdeadbeef, esize + 1);
113 wmemset(i_ref, 0xdeadbeef, esize + 1);
114 int_type* ito = i_arr;
115 int_type* ito_next;
117 locale loc = locale("en_US.UTF-8");
118 locale::global(loc);
119 const w_codecvt* cvt = &use_facet<w_codecvt>(loc);
121 // in
122 w_codecvt::state_type state01;
123 zero_state(state01);
124 result r1 = codecvt_base::error;
126 for (int i = 0; i <= esize; ++i)
128 r1 = cvt->in(state01, efrom, e_lit + i, efrom_next,
129 ito, i_arr + esize, ito_next);
131 // It it not clear if partial should ever be returned here
132 // (see DR 382).
133 VERIFY( r1 == codecvt_base::ok || r1 == codecvt_base::partial );
134 VERIFY( efrom_next >= efrom );
135 VERIFY( efrom_next <= e_lit + i );
136 VERIFY( ito_next >= ito );
137 VERIFY( ito_next <= i_arr + isize );
138 VERIFY( !int_traits::compare(i_arr, i_lit, ito_next - i_arr) );
139 VERIFY( !int_traits::compare(ito_next, i_ref,
140 i_arr + esize + 1 - ito_next) );
142 efrom = efrom_next;
143 ito = ito_next;
146 VERIFY( r1 == codecvt_base::ok );
147 VERIFY( efrom_next == e_lit + esize );
148 VERIFY( ito_next == i_arr + isize );
150 delete [] i_arr;
151 delete [] i_ref;
154 int main ()
156 test09();
157 return 0;