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