Reverting merge from trunk
[official-gcc.git] / libstdc++-v3 / testsuite / 22_locale / codecvt / in / wchar_t / 9.cc
blobf1c798d9a23068ab2dfd2246655d84c4adb58cf3
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 one source character at a time for UTF-8
45 void test09()
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 = e_lit;
82 const ext_type* efrom_next;
83 const int_type i_lit[] = {
84 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc,
85 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
86 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, L'!',
87 L'"', L'#', L'$', L'%', L'&', L'\'', L'(', L')', L'*', L'+',
88 L',', L'-', L'.', L'/', L'0', L'1', L'2', L'3', L'4', L'5',
89 L'6', L'7', L'8', L'9', L':', L';', L'<', L'=', L'>', L'?',
90 L'@', L'}', L'~', 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
91 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
92 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
93 0x9a, 0x9b, 0x9c, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x100,
94 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109,
95 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x110, 0x111, 0x112,
96 0x113, 0x114, 0x115, 0x116, 0x117, 0x118, 0x119, 0x7f8, 0x7f9,
97 0x7fa, 0x7fb, 0x7fc, 0x7fd, 0x7fe, 0x7ff, 0x800, 0x801, 0x802,
98 0x803, 0x804, 0x805, 0x806, 0x807, 0x808, 0x809, 0x80a, 0x80b,
99 0x80c, 0x80d, 0x80e, 0x80f, 0x810, 0x811, 0x812, 0x813, 0x814,
100 0x815, 0x816, 0x817, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, L'@',
101 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
102 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000,
103 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000,
104 0x20000000, 0x40000000, 0x0
107 int esize = strlen(e_lit);
108 int isize = wcslen(i_lit);
109 int_type* i_arr = new int_type[esize + 1];
110 int_type* i_ref = new int_type[esize + 1];
111 wmemset(i_arr, 0xdeadbeef, esize + 1);
112 wmemset(i_ref, 0xdeadbeef, esize + 1);
113 int_type* ito = i_arr;
114 int_type* ito_next;
116 locale loc = locale("en_US.UTF-8");
117 locale::global(loc);
118 const w_codecvt* cvt = &use_facet<w_codecvt>(loc);
120 // in
121 w_codecvt::state_type state01;
122 zero_state(state01);
123 result r1 = codecvt_base::error;
125 for (int i = 0; i <= esize; ++i)
127 r1 = cvt->in(state01, efrom, e_lit + i, efrom_next,
128 ito, i_arr + esize, ito_next);
130 // It it not clear if partial should ever be returned here
131 // (see DR 382).
132 VERIFY( r1 == codecvt_base::ok || r1 == codecvt_base::partial );
133 VERIFY( efrom_next >= efrom );
134 VERIFY( efrom_next <= e_lit + i );
135 VERIFY( ito_next >= ito );
136 VERIFY( ito_next <= i_arr + isize );
137 VERIFY( !int_traits::compare(i_arr, i_lit, ito_next - i_arr) );
138 VERIFY( !int_traits::compare(ito_next, i_ref,
139 i_arr + esize + 1 - ito_next) );
141 efrom = efrom_next;
142 ito = ito_next;
145 VERIFY( r1 == codecvt_base::ok );
146 VERIFY( efrom_next == e_lit + esize );
147 VERIFY( ito_next == i_arr + isize );
149 delete [] i_arr;
150 delete [] i_ref;
153 int main ()
155 test09();
156 return 0;