1// 2003-05-03  Petur Runolfsson  <peturr02@ru.is>
2
3// Copyright (C) 2003-2015 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3.  If not see
18// <http://www.gnu.org/licenses/>.
19
20// 27.8.1.4 Overridden virtual functions
21
22#include <fstream>
23#include <locale>
24#include <string>
25#include <testsuite_hooks.h>
26
27// Check that basic_filebuf::underflow() handles
28// codecvt::always_noconv() == false and codecvt::in() == noconv.
29class NoconvCvt : public std::codecvt<char, char, std::mbstate_t>
30{
31protected:
32  virtual bool
33  do_always_noconv() const throw()
34  { return false; }
35
36  virtual result
37  do_in(state_type&, const char* from, const char*, const char*& from_next,
38	char* to, char*, char*& to_next)
39  {
40    from_next = from;
41    to_next = to;
42    return noconv;
43  }
44};
45
46void test01()
47{
48  using namespace std;
49  bool test __attribute__((unused)) = true;
50  const char* name = "filebuf_virtuals-1.txt";
51
52  string str;
53  filebuf fb;
54  filebuf::int_type c1;
55
56  if (fb.open(name, ios_base::in))
57    {
58      while ((c1 = fb.sbumpc()) != EOF)
59	str.push_back(filebuf::traits_type::to_char_type(c1));
60      fb.close();
61    }
62
63  locale loc(locale::classic(), new NoconvCvt);
64  fb.pubimbue(loc);
65
66  if (fb.open(name, ios_base::in))
67    {
68      for (string::iterator i = str.begin(); i != str.end(); ++i)
69	{
70	  c1 = fb.sbumpc();
71	  VERIFY( c1 != filebuf::traits_type::eof() );
72	  VERIFY( c1 == filebuf::traits_type::to_int_type(*i) );
73	}
74      VERIFY( fb.sgetc() == filebuf::traits_type::eof() );
75      fb.close();
76    }
77}
78
79int main()
80{
81  test01();
82  return 0;
83}
84