]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/27_io/basic_istream/getline/char/2.cc
Licensing changes to GPLv3 resp. GPLv3 with GCC Runtime Exception.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 27_io / basic_istream / getline / char / 2.cc
CommitLineData
23cac885
BK
1// 1999-08-11 bkoz
2
748086b7 3// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2009 Free Software Foundation
23cac885
BK
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
748086b7 8// Free Software Foundation; either version 3, or (at your option)
23cac885
BK
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
748086b7
JJ
17// with this library; see the file COPYING3. If not see
18// <http://www.gnu.org/licenses/>.
23cac885
BK
19
20// 27.6.1.3 unformatted input functions
23cac885 21
b80115c4 22#include <cstring> // for strlen
23cac885
BK
23#include <istream>
24#include <sstream>
23cac885
BK
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
11f10e6b 48 bool test __attribute__((unused)) = true;
23cac885
BK
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)
11f10e6b 88 VERIFY(ifs.gcount() == static_cast<std::streamsize>(std::strlen(tmp) + 1) );
23cac885
BK
89 continue;
90 }
91 }
92}
93
94int
95main()
96{
97 test05();
98 return 0;
99}