1// 1999-08-11 bkoz 2 3// Copyright (C) 1999-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.6.1.3 unformatted input functions 21 22#include <cstring> // for strlen 23#include <istream> 24#include <sstream> 25#include <testsuite_hooks.h> 26 27// [patch] bits/istream.tcc - getline(char_type*,streamsize,char_type) 28// http://gcc.gnu.org/ml/libstdc++/2000-07/msg00003.html 29void 30test05() 31{ 32 const char* charray = "\n" 33"a\n" 34"aa\n" 35"aaa\n" 36"aaaa\n" 37"aaaaa\n" 38"aaaaaa\n" 39"aaaaaaa\n" 40"aaaaaaaa\n" 41"aaaaaaaaa\n" 42"aaaaaaaaaa\n" 43"aaaaaaaaaaa\n" 44"aaaaaaaaaaaa\n" 45"aaaaaaaaaaaaa\n" 46"aaaaaaaaaaaaaa\n"; 47 48 bool test __attribute__((unused)) = true; 49 const std::streamsize it = 5; 50 std::streamsize br = 0; 51 char tmp[it]; 52 std::stringbuf sb(charray, std::ios_base::in); 53 std::istream ifs(&sb); 54 std::streamsize blen = std::strlen(charray); 55 VERIFY(!(!ifs)); 56 while(ifs.getline(tmp, it) || ifs.gcount()) 57 { 58 br += ifs.gcount(); 59 if(ifs.eof()) 60 { 61 // Just sanity checks to make sure we've extracted the same 62 // number of chars that were in the streambuf 63 VERIFY(br == blen); 64 // Also, we should only set the failbit if we could 65 // _extract_ no chars from the stream, i.e. the first read 66 // returned EOF. 67 VERIFY(ifs.fail() && ifs.gcount() == 0); 68 } 69 else if(ifs.fail()) 70 { 71 // delimiter not read 72 // 73 // either 74 // -> extracted no characters 75 // or 76 // -> n - 1 characters are stored 77 ifs.clear(ifs.rdstate() & ~std::ios::failbit); 78 VERIFY((ifs.gcount() == 0) || (std::strlen(tmp) == it - 1)); 79 VERIFY(!(!ifs)); 80 continue; 81 } 82 else 83 { 84 // delimiter was read. 85 // 86 // -> strlen(__s) < n - 1 87 // -> delimiter was seen -> gcount() > strlen(__s) 88 VERIFY(ifs.gcount() == static_cast<std::streamsize>(std::strlen(tmp) + 1) ); 89 continue; 90 } 91 } 92} 93 94int 95main() 96{ 97 test05(); 98 return 0; 99} 100