1// 1999-10-11 bkoz 2 3// Copyright (C) 1999, 2000, 2001, 2002, 2003 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 2, 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 COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// As a special exception, you may use this file as part of a free software 22// library without restriction. Specifically, if other files instantiate 23// templates or use macros or inline functions from this file, or you compile 24// this file and link it with other files to produce an executable, this 25// file does not by itself cause the resulting executable to be covered by 26// the GNU General Public License. This exception does not however 27// invalidate any other reasons why the executable file might be covered by 28// the GNU General Public License. 29 30// 27.5.2 template class basic_streambuf 31 32#include <cstring> // for memset, memcmp 33#include <streambuf> 34#include <sstream> 35#include <ostream> 36#include <testsuite_hooks.h> 37 38// libstdc++/9424 39class Outbuf_2 : public std::streambuf 40{ 41 char buf[1]; 42 43public: 44 Outbuf_2() 45 { 46 setp(buf, buf + 1); 47 } 48 49 int_type overflow(int_type c) 50 { 51 int_type eof = traits_type::eof(); 52 53 if (pptr() < epptr()) 54 { 55 if (traits_type::eq_int_type(c, eof)) 56 return traits_type::not_eof(c); 57 58 *pptr() = traits_type::to_char_type(c); 59 pbump(1); 60 return c; 61 } 62 63 return eof; 64 } 65}; 66 67class Inbuf_2 : public std::streambuf 68{ 69 static const char buf[]; 70 const char* current; 71 int size; 72 73public: 74 Inbuf_2() 75 { 76 current = buf; 77 size = std::strlen(buf); 78 } 79 80 int_type underflow() 81 { 82 if (current < buf + size) 83 return traits_type::to_int_type(*current); 84 return traits_type::eof(); 85 } 86 87 int_type uflow() 88 { 89 if (current < buf + size) 90 return traits_type::to_int_type(*current++); 91 return traits_type::eof(); 92 } 93}; 94 95const char Inbuf_2::buf[] = "Atteivlis"; 96 97void test12() 98{ 99 bool test __attribute__((unused)) = true; 100 101 Outbuf_2 outbuf2; 102 std::ostream os (&outbuf2); 103 Inbuf_2 inbuf2; 104 os << &inbuf2; 105 VERIFY( inbuf2.sgetc() == 't' ); 106 VERIFY( os.good() ); 107} 108 109int main() 110{ 111 test12(); 112 return 0; 113} 114