123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- // { dg-require-iconv "UCS-2BE" }
- // { dg-require-iconv "UCS-4BE" }
- // 2000-08-23 Benjamin Kosnik <bkoz@cygnus.com>
- // Copyright (C) 2000-2022 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING3. If not see
- // <http://www.gnu.org/licenses/>.
- // 22.2.1.5 - Template class codecvt [lib.locale.codecvt]
- #include <locale>
- #include <testsuite_hooks.h>
- #include <ext/codecvt_specializations.h>
- // Partial specialization using encoding_state.
- // codecvt<unicode_t, wchar_t, encoding_state>
- void test01()
- {
- using namespace std;
- typedef codecvt_base::result result;
- typedef unsigned short int_type;
- typedef wchar_t ext_type;
- typedef __gnu_cxx::encoding_state state_type;
- typedef codecvt<int_type, ext_type, state_type> unicode_codecvt;
- typedef char_traits<int_type> int_traits;
- typedef char_traits<ext_type> ext_traits;
- int size = 23;
- char e_lit_base[96] __attribute__((aligned(__alignof__(ext_type)))) =
- {
- char(0x00), char(0x00), char(0x00), char(0x62), char(0x00), char(0x00),
- char(0x00), char(0x6c), char(0x00), char(0x00), char(0x00), char(0x61),
- char(0x00), char(0x00), char(0x00), char(0x63), char(0x00), char(0x00),
- char(0x00), char(0x6b), char(0x00), char(0x00), char(0x00), char(0x20),
- char(0x00), char(0x00), char(0x00), char(0x70), char(0x00), char(0x00),
- char(0x00), char(0x65), char(0x00), char(0x00), char(0x00), char(0x61),
- char(0x00), char(0x00), char(0x00), char(0x72), char(0x00), char(0x00),
- char(0x00), char(0x6c), char(0x00), char(0x00), char(0x00), char(0x20),
- char(0x00), char(0x00), char(0x00), char(0x6a), char(0x00), char(0x00),
- char(0x00), char(0x61), char(0x00), char(0x00), char(0x00), char(0x73),
- char(0x00), char(0x00), char(0x00), char(0x6d), char(0x00), char(0x00),
- char(0x00), char(0x69), char(0x00), char(0x00), char(0x00), char(0x6e),
- char(0x00), char(0x00), char(0x00), char(0x65), char(0x00), char(0x00),
- char(0x00), char(0x20), char(0x00), char(0x00), char(0x00), char(0x74),
- char(0x00), char(0x00), char(0x00), char(0x65), char(0x00), char(0x00),
- char(0x00), char(0x61), char(0x00), char(0x00), char(0x00), char(0xa0)
- };
- const ext_type* e_lit = reinterpret_cast<ext_type*>(e_lit_base);
- char i_lit_base[48] __attribute__((aligned(__alignof__(int_type)))) =
- {
- char(0x00), char(0x62), char(0x00), char(0x6c), char(0x00), char(0x61),
- char(0x00), char(0x63), char(0x00), char(0x6b), char(0x00), char(0x20),
- char(0x00), char(0x70), char(0x00), char(0x65), char(0x00), char(0x61),
- char(0x00), char(0x72), char(0x00), char(0x6c), char(0x00), char(0x20),
- char(0x00), char(0x6a), char(0x00), char(0x61), char(0x00), char(0x73),
- char(0x00), char(0x6d), char(0x00), char(0x69), char(0x00), char(0x6e),
- char(0x00), char(0x65), char(0x00), char(0x20), char(0x00), char(0x74),
- char(0x00), char(0x65), char(0x00), char(0x61), char(0x00), char(0xa0)
- };
- const int_type* i_lit = reinterpret_cast<int_type*>(i_lit_base);
- const ext_type* efrom_next;
- const int_type* ifrom_next;
- ext_type* e_arr = new ext_type[size + 1];
- ext_type* eto_next;
- int_type* i_arr = new int_type[size + 1];
- int_type* ito_next;
- // construct a locale object with the specialized facet.
- locale loc(locale::classic(), new unicode_codecvt);
- // sanity check the constructed locale has the specialized facet.
- VERIFY( has_facet<unicode_codecvt>(loc) );
- const unicode_codecvt& cvt = use_facet<unicode_codecvt>(loc);
- // in
- // unicode_codecvt::state_type state01("UCS-2BE", "UCS-4BE", 0xfeff, 0);
- unicode_codecvt::state_type state01("UCS-2BE", "UCS-4BE", 0, 0);
- result r1 = cvt.in(state01, e_lit, e_lit + size, efrom_next,
- i_arr, i_arr + size + 1, ito_next);
- VERIFY( r1 == codecvt_base::ok );
- VERIFY( !int_traits::compare(i_arr, i_lit, size) );
- VERIFY( efrom_next == e_lit + size );
- VERIFY( ito_next == i_arr + size );
- // out
- unicode_codecvt::state_type state02("UCS-2BE", "UCS-4BE", 0, 0);
- result r2 = cvt.out(state02, i_lit, i_lit + size, ifrom_next,
- e_arr, e_arr + size, eto_next);
- VERIFY( r2 == codecvt_base::ok ); // XXX?
- VERIFY( !ext_traits::compare(e_arr, e_lit, size) );
- VERIFY( ifrom_next == i_lit + size );
- VERIFY( eto_next == e_arr + size );
- // unshift
- ext_traits::copy(e_arr, e_lit, size);
- unicode_codecvt::state_type state03("UCS-2BE", "UCS-4BE", 0, 0);
- result r3 = cvt.unshift(state03, e_arr, e_arr + size, eto_next);
- VERIFY( r3 == codecvt_base::noconv );
- VERIFY( !ext_traits::compare(e_arr, e_lit, size) );
- VERIFY( eto_next == e_arr );
- int i = cvt.encoding();
- VERIFY( i == 0 );
- VERIFY( !cvt.always_noconv() );
- unicode_codecvt::state_type state04("UCS-2BE", "UCS-4BE", 0, 0);
- int j = cvt.length(state03, e_lit, e_lit + size, 5);
- VERIFY( j == 5 );
- int k = cvt.max_length();
- VERIFY( k == 1 );
- delete [] e_arr;
- delete [] i_arr;
- }
- int main ()
- {
- test01();
- return 0;
- }
|