1139749Simp// { dg-require-namedlocale "en_US.ISO-8859-15" } 299440Sbenno 399440Sbenno// 2003-02-06 Petur Runolfsson <peturr02@ru.is> 499440Sbenno 599440Sbenno// Copyright (C) 2003-2015 Free Software Foundation, Inc. 699440Sbenno// 799440Sbenno// This file is part of the GNU ISO C++ Library. This library is free 899440Sbenno// software; you can redistribute it and/or modify it under the 999440Sbenno// terms of the GNU General Public License as published by the 1099440Sbenno// Free Software Foundation; either version 3, or (at your option) 1199440Sbenno// any later version. 1299440Sbenno 1399440Sbenno// This library is distributed in the hope that it will be useful, 1499440Sbenno// but WITHOUT ANY WARRANTY; without even the implied warranty of 1599440Sbenno// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1699440Sbenno// GNU General Public License for more details. 1799440Sbenno 1899440Sbenno// You should have received a copy of the GNU General Public License along 1999440Sbenno// with this library; see the file COPYING3. If not see 2099440Sbenno// <http://www.gnu.org/licenses/>. 2199440Sbenno 2299440Sbenno// 22.2.1.5 - Template class codecvt [lib.locale.codecvt] 2399440Sbenno 2499440Sbenno#include <locale> 2599440Sbenno#include <cstring> 2699440Sbenno#include <testsuite_hooks.h> 2799440Sbenno 2899440Sbenno// Need to explicitly set the state(mbstate_t) to zero. 2999440Sbenno// How to do this is not specified by the ISO C99 standard, so we 3099440Sbenno// might need to add some operators to make the intuiative case 3199440Sbenno// work: 3299440Sbenno// w_codecvt::state_type state00; 3399440Sbenno// state00 = 0; 3499440Sbenno// or, can use this explicit "C" initialization: 3599440Sbenno// w_codecvt::state_type state01 = {0, 0}; 3699440Sbenno// .. except Ulrich says: Use memset. Always use memset. Feel the force... 3799440Sbennovoid 3899440Sbennozero_state(std::mbstate_t& state) 3999440Sbenno{ std::memset(&state, 0, sizeof(std::mbstate_t)); } 4099440Sbenno 4199440Sbenno// Required instantiation 4299440Sbenno// codecvt<wchar_t, char, mbstate_t> 4399440Sbennovoid test03() 4499440Sbenno{ 4599440Sbenno using namespace std; 4699440Sbenno typedef codecvt<wchar_t, char, mbstate_t> w_codecvt; 4799440Sbenno typedef codecvt_base::result result; 4899440Sbenno typedef wchar_t int_type; 4999440Sbenno typedef char ext_type; 5099440Sbenno typedef char_traits<char> ext_traits; 5199440Sbenno 5299440Sbenno bool test __attribute__((unused)) = true; 5399440Sbenno const ext_type* e_lit = 5499440Sbenno "\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13" 5599440Sbenno "\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20!\"#$%&" 5699440Sbenno "'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`" 5799440Sbenno "abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86" 5899440Sbenno "\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95" 5999440Sbenno "\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4" 6099440Sbenno "\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3" 6199440Sbenno "\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2" 6299440Sbenno "\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1" 6399440Sbenno "\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0" 6499440Sbenno "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef" 6599440Sbenno "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe" 6699440Sbenno "\xff"; 6799440Sbenno 6899440Sbenno const int_type i_lit[] = { 6999440Sbenno 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 70129844Smarius 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 71129844Smarius 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, L'!', 72129844Smarius L'"', L'#', L'$', L'%', L'&', L'\'', L'(', L')', L'*', L'+', 7399440Sbenno L',', L'-', L'.', L'/', L'0', L'1', L'2', L'3', L'4', L'5', 7499440Sbenno L'6', L'7', L'8', L'9', L':', L';', L'<', L'=', L'>', L'?', 7599440Sbenno L'@', L'A', L'B', L'C', L'D', L'E', L'F', L'G', L'H', L'I', 7699440Sbenno L'J', L'K', L'L', L'M', L'N', L'O', L'P', L'Q', L'R', L'S', 7799440Sbenno L'T', L'U', L'V', L'W', L'X', L'Y', L'Z', L'[', L'\\', L']', 7899440Sbenno L'^', L'_', L'`', L'a', L'b', L'c', L'd', L'e', L'f', L'g', 7999440Sbenno L'h', L'i', L'j', L'k', L'l', L'm', L'n', L'o', L'p', L'q', 8099440Sbenno L'r', L's', L't', L'u', L'v', L'w', L'x', L'y', L'z', L'{', 8199440Sbenno L'|', L'}', L'~', 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 82129876Sphk 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 8399440Sbenno 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 8499440Sbenno 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 8599440Sbenno 0x20ac, 0xa5, 0x160, 0xa7, 0x161, 0xa9, 0xaa, 0xab, 0xac, 0xad, 8699440Sbenno 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0x17d, 0xb5, 0xb6, 0xb7, 8799440Sbenno 0x17e, 0xb9, 0xba, 0xbb, 0x152, 0x153, 0x178, 0xbf, 0xc0, 0xc1, 8899440Sbenno 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 8999440Sbenno 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 9099440Sbenno 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 91109514Sobrien 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 9299440Sbenno 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 9399440Sbenno 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 9499440Sbenno 0xfe, 0xff, 0x0 9599440Sbenno }; 9699440Sbenno 9799440Sbenno const int_type* ifrom_next; 9899440Sbenno int size = strlen(e_lit); 9999440Sbenno ext_type* e_arr = new ext_type[size + 1]; 10099440Sbenno ext_type* e_ref = new ext_type[size + 1]; 10199440Sbenno memset(e_arr, 0xf0, size + 1); 10299440Sbenno memset(e_ref, 0xf0, size + 1); 10399440Sbenno ext_type* eto_next; 10499440Sbenno 10599440Sbenno locale loc = locale("en_US.ISO-8859-15"); 10699440Sbenno locale::global(loc); 10799440Sbenno const w_codecvt* cvt = &use_facet<w_codecvt>(loc); 10899440Sbenno 10999440Sbenno // out 11099440Sbenno w_codecvt::state_type state02; 11199440Sbenno zero_state(state02); 11299440Sbenno result r2 = cvt->out(state02, i_lit, i_lit + size, ifrom_next, 11399440Sbenno e_arr, e_arr + size, eto_next); 11499440Sbenno VERIFY( r2 == codecvt_base::ok ); 11599440Sbenno VERIFY( ifrom_next == i_lit + size ); 11699440Sbenno VERIFY( eto_next == e_arr + size ); 11799440Sbenno VERIFY( !ext_traits::compare(e_arr, e_lit, size) ); 11899440Sbenno VERIFY( !ext_traits::compare(eto_next, e_ref, 1) ); 11999440Sbenno 12099440Sbenno delete [] e_arr; 12199440Sbenno delete [] e_ref; 12299440Sbenno} 12399440Sbenno 12499440Sbennoint main () 12599440Sbenno{ 12699440Sbenno test03(); 12799440Sbenno return 0; 12899440Sbenno} 12999440Sbenno