]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/ext/codecvt/wchar_t.cc
Update copyright years in libstdc++-v3/
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / ext / codecvt / wchar_t.cc
CommitLineData
4ffe6e87
BK
1// { dg-require-iconv "UCS-2BE" }
2// { dg-require-iconv "UCS-4BE" }
3
985287b8 4// 2000-08-23 Benjamin Kosnik <bkoz@cygnus.com>
ae658d47 5
aa118a03 6// Copyright (C) 2000-2014 Free Software Foundation, Inc.
ae658d47
BK
7//
8// This file is part of the GNU ISO C++ Library. This library is free
9// software; you can redistribute it and/or modify it under the
10// terms of the GNU General Public License as published by the
748086b7 11// Free Software Foundation; either version 3, or (at your option)
ae658d47
BK
12// any later version.
13
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17// GNU General Public License for more details.
18
19// You should have received a copy of the GNU General Public License along
748086b7
JJ
20// with this library; see the file COPYING3. If not see
21// <http://www.gnu.org/licenses/>.
ae658d47
BK
22
23// 22.2.1.5 - Template class codecvt [lib.locale.codecvt]
24
25#include <locale>
fe413112 26#include <testsuite_hooks.h>
4ffe6e87 27#include <ext/codecvt_specializations.h>
ae658d47 28
4ffe6e87
BK
29// Partial specialization using encoding_state.
30// codecvt<unicode_t, wchar_t, encoding_state>
ae658d47
BK
31void test01()
32{
f13a69ec 33 using namespace std;
ae658d47 34 typedef codecvt_base::result result;
4ffe6e87 35 typedef unsigned short int_type;
ae658d47 36 typedef wchar_t ext_type;
4ffe6e87
BK
37 typedef __gnu_cxx::encoding_state state_type;
38 typedef codecvt<int_type, ext_type, state_type> unicode_codecvt;
ae658d47
BK
39 typedef char_traits<int_type> int_traits;
40 typedef char_traits<ext_type> ext_traits;
41
11f10e6b 42 bool test __attribute__((unused)) = true;
985287b8 43 int size = 23;
10cbfb51
UW
44 char e_lit_base[96] __attribute__((aligned(__alignof__(ext_type)))) =
45 {
5847ec93
PC
46 char(0x00), char(0x00), char(0x00), char(0x62), char(0x00), char(0x00),
47 char(0x00), char(0x6c), char(0x00), char(0x00), char(0x00), char(0x61),
48 char(0x00), char(0x00), char(0x00), char(0x63), char(0x00), char(0x00),
49 char(0x00), char(0x6b), char(0x00), char(0x00), char(0x00), char(0x20),
50 char(0x00), char(0x00), char(0x00), char(0x70), char(0x00), char(0x00),
51 char(0x00), char(0x65), char(0x00), char(0x00), char(0x00), char(0x61),
52 char(0x00), char(0x00), char(0x00), char(0x72), char(0x00), char(0x00),
53 char(0x00), char(0x6c), char(0x00), char(0x00), char(0x00), char(0x20),
54 char(0x00), char(0x00), char(0x00), char(0x6a), char(0x00), char(0x00),
55 char(0x00), char(0x61), char(0x00), char(0x00), char(0x00), char(0x73),
56 char(0x00), char(0x00), char(0x00), char(0x6d), char(0x00), char(0x00),
57 char(0x00), char(0x69), char(0x00), char(0x00), char(0x00), char(0x6e),
58 char(0x00), char(0x00), char(0x00), char(0x65), char(0x00), char(0x00),
59 char(0x00), char(0x20), char(0x00), char(0x00), char(0x00), char(0x74),
60 char(0x00), char(0x00), char(0x00), char(0x65), char(0x00), char(0x00),
61 char(0x00), char(0x61), char(0x00), char(0x00), char(0x00), char(0xa0)
985287b8 62 };
10cbfb51 63 const ext_type* e_lit = reinterpret_cast<ext_type*>(e_lit_base);
ae658d47 64
10cbfb51 65 char i_lit_base[48] __attribute__((aligned(__alignof__(int_type)))) =
7dc08a20 66 {
5847ec93
PC
67 char(0x00), char(0x62), char(0x00), char(0x6c), char(0x00), char(0x61),
68 char(0x00), char(0x63), char(0x00), char(0x6b), char(0x00), char(0x20),
69 char(0x00), char(0x70), char(0x00), char(0x65), char(0x00), char(0x61),
70 char(0x00), char(0x72), char(0x00), char(0x6c), char(0x00), char(0x20),
71 char(0x00), char(0x6a), char(0x00), char(0x61), char(0x00), char(0x73),
72 char(0x00), char(0x6d), char(0x00), char(0x69), char(0x00), char(0x6e),
73 char(0x00), char(0x65), char(0x00), char(0x20), char(0x00), char(0x74),
74 char(0x00), char(0x65), char(0x00), char(0x61), char(0x00), char(0xa0)
ae658d47 75 };
10cbfb51 76 const int_type* i_lit = reinterpret_cast<int_type*>(i_lit_base);
ae658d47
BK
77
78 const ext_type* efrom_next;
79 const int_type* ifrom_next;
80 ext_type* e_arr = new ext_type[size + 1];
81 ext_type* eto_next;
82 int_type* i_arr = new int_type[size + 1];
83 int_type* ito_next;
84
85 // construct a locale object with the specialized facet.
86 locale loc(locale::classic(), new unicode_codecvt);
87 // sanity check the constructed locale has the specialized facet.
88 VERIFY( has_facet<unicode_codecvt>(loc) );
4ffe6e87 89 const unicode_codecvt& cvt = use_facet<unicode_codecvt>(loc);
ae658d47
BK
90
91 // in
af779169
BK
92 // unicode_codecvt::state_type state01("UCS-2BE", "UCS-4BE", 0xfeff, 0);
93 unicode_codecvt::state_type state01("UCS-2BE", "UCS-4BE", 0, 0);
ae658d47 94 result r1 = cvt.in(state01, e_lit, e_lit + size, efrom_next,
7dc08a20 95 i_arr, i_arr + size + 1, ito_next);
ae658d47
BK
96 VERIFY( r1 == codecvt_base::ok );
97 VERIFY( !int_traits::compare(i_arr, i_lit, size) );
98 VERIFY( efrom_next == e_lit + size );
99 VERIFY( ito_next == i_arr + size );
100
101 // out
af779169 102 unicode_codecvt::state_type state02("UCS-2BE", "UCS-4BE", 0, 0);
ae658d47 103 result r2 = cvt.out(state02, i_lit, i_lit + size, ifrom_next,
11f10e6b
BK
104 e_arr, e_arr + size, eto_next);
105 VERIFY( r2 == codecvt_base::ok ); // XXX?
ae658d47
BK
106 VERIFY( !ext_traits::compare(e_arr, e_lit, size) );
107 VERIFY( ifrom_next == i_lit + size );
108 VERIFY( eto_next == e_arr + size );
109
110 // unshift
111 ext_traits::copy(e_arr, e_lit, size);
af779169 112 unicode_codecvt::state_type state03("UCS-2BE", "UCS-4BE", 0, 0);
ae658d47
BK
113 result r3 = cvt.unshift(state03, e_arr, e_arr + size, eto_next);
114 VERIFY( r3 == codecvt_base::noconv );
115 VERIFY( !ext_traits::compare(e_arr, e_lit, size) );
116 VERIFY( eto_next == e_arr );
117
118 int i = cvt.encoding();
119 VERIFY( i == 0 );
120
121 VERIFY( !cvt.always_noconv() );
122
af779169 123 unicode_codecvt::state_type state04("UCS-2BE", "UCS-4BE", 0, 0);
ae658d47
BK
124 int j = cvt.length(state03, e_lit, e_lit + size, 5);
125 VERIFY( j == 5 );
126
127 int k = cvt.max_length();
128 VERIFY( k == 1 );
129
130 delete [] e_arr;
131 delete [] i_arr;
132}
133
134int main ()
135{
136 test01();
ae658d47
BK
137 return 0;
138}
33590f13 139