1// 2001-05-21 Benjamin Kosnik <bkoz@redhat.com> 2 3// Copyright (C) 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// The ARM simulator does not provide support for "fstat", which 22// causes "in_avail" to return an incorrect value. 23// { dg-do run { xfail arm*-*-elf arm*-*-eabi } } 24 25// 27.8.1.4 Overridden virtual functions 26 27#include <fstream> 28#include <testsuite_hooks.h> 29#include <testsuite_io.h> 30 31// @require@ %-*.tst %-*.txt 32// @diff@ %-*.tst %*.txt 33 34const char name_01[] = "sgetn.txt"; // file with data in it 35const char name_03[] = "tmp_sgetn_2io.tst"; // empty file, need to create 36 37// Test overloaded virtual functions. 38void test05() 39{ 40 using namespace std; 41 using namespace __gnu_test; 42 typedef filebuf::int_type int_type; 43 typedef filebuf::traits_type traits_type; 44 45 bool test __attribute__((unused)) = true; 46 47 streamsize strmsz_1, strmsz_2; 48 char carray1[13] = ""; 49 char carray2[8192] = ""; 50 int_type c1, c4; 51 52 // streamsize sgetn(char_type *s, streamsize n) 53 // streamsize xsgetn(char_type *s, streamsize n) 54 // assign up to n chars to s from input sequence, indexing in_cur as 55 // approp and returning the number of chars assigned 56 57 // in | out 1 58 { 59 constraint_filebuf fb_03; 60 fb_03.pubsetbuf(0, 0); 61 fb_03.open(name_03, ios_base::out | ios_base::in | ios_base::trunc); 62 VERIFY( fb_03.unbuffered() ); 63 strmsz_1 = fb_03.sgetn(carray1, 10); 64 VERIFY( strmsz_1 == 0 ); 65 VERIFY( fb_03.unbuffered() ); 66 } 67 68 // in | out 2 69 { 70 constraint_filebuf fb_01; 71 fb_01.pubsetbuf(0, 0); 72 fb_01.open(name_01, ios_base::in | ios_base::out); 73 VERIFY( fb_01.unbuffered() ); 74 strmsz_1 = fb_01.in_avail(); 75 strmsz_2 = fb_01.sgetn(carray1, 10); 76 VERIFY( strmsz_2 == 10 ); 77 strmsz_2 = fb_01.in_avail(); 78 VERIFY( strmsz_1 > strmsz_2 ); 79 c1 = fb_01.sgetc(); 80 VERIFY( c1 == 'b' ); 81 strmsz_1 = fb_01.in_avail(); 82 strmsz_2 = fb_01.sgetn(carray2, 8181 + 5); 83 VERIFY( 8181 == strmsz_2 - 5 ); 84 c4 = fb_01.sgetc(); // buffer should have underflowed from above. 85 VERIFY( c4 == 'h' ); 86 strmsz_1 = fb_01.in_avail(); 87 VERIFY( strmsz_1 > 0 ); 88 strmsz_2 = fb_01.sgetn(carray2, 65 + 5); 89 VERIFY( 65 == strmsz_2 ); //at the end of the actual file 90 VERIFY( fb_01.unbuffered() ); 91 } 92} 93 94int main() 95{ 96 test05(); 97 return 0; 98} 99