1// { dg-require-namedlocale "" } 2 3// 2003-02-06 Petur Runolfsson <peturr02@ru.is> 4 5// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 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 3, or (at your option) 11// any later version. 12 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. 17 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/>. 21 22// 22.2.1.5 - Template class codecvt [lib.locale.codecvt] 23 24#include <locale> 25#include <cstring> 26#include <testsuite_hooks.h> 27 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... 37void 38zero_state(std::mbstate_t& state) 39{ std::memset(&state, 0, sizeof(std::mbstate_t)); } 40 41// Required instantiation 42// codecvt<wchar_t, char, mbstate_t> 43// 44// Test handling of illegal input sequence in UTF-8. 45void test07() 46{ 47 using namespace std; 48 typedef codecvt<wchar_t, char, mbstate_t> w_codecvt; 49 typedef wchar_t int_type; 50 typedef char ext_type; 51 52 bool test __attribute__((unused)) = true; 53 const ext_type* e_lit = "a\xc0\xff"; 54 int size = strlen(e_lit); 55 56 locale loc = locale("en_US.UTF-8"); 57 locale::global(loc); 58 const w_codecvt* cvt = &use_facet<w_codecvt>(loc); 59 60 w_codecvt::state_type state01; 61 zero_state(state01); 62 int i = cvt->length(state01, e_lit, e_lit + size, 1); 63 VERIFY( i == 1 ); 64 65 w_codecvt::state_type state02; 66 zero_state(state02); 67 int j = cvt->length(state02, e_lit, e_lit + size, size); 68 VERIFY( j == 1 ); 69 70 w_codecvt::state_type state03; 71 zero_state(state03); 72 int k = cvt->length(state03, e_lit, e_lit + size, size * 2); 73 VERIFY( k == 1 ); 74} 75 76int main () 77{ 78 test07(); 79 return 0; 80} 81