1*38fd1498Szrj // Input streams operating on strings-*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj // Copyright (C) 2004-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the 7*38fd1498Szrj // terms of the GNU General Public License as published by the 8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj // any later version. 10*38fd1498Szrj 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, 12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj // GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License and 21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj // <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj // 26*38fd1498Szrj // ISO C++ 14882: 27.6.1 Input streams 27*38fd1498Szrj // 28*38fd1498Szrj 29*38fd1498Szrj #ifndef _GLIBCXX_USE_CXX11_ABI 30*38fd1498Szrj // Instantiations in this file use the new SSO std::string ABI unless included 31*38fd1498Szrj // by another file which defines _GLIBCXX_USE_CXX11_ABI=0. 32*38fd1498Szrj # define _GLIBCXX_USE_CXX11_ABI 1 33*38fd1498Szrj #endif 34*38fd1498Szrj #include <istream> 35*38fd1498Szrj #include <string> 36*38fd1498Szrj 37*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default) 38*38fd1498Szrj { 39*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION 40*38fd1498Szrj 41*38fd1498Szrj template<> 42*38fd1498Szrj basic_istream<char>& operator >>(basic_istream<char> & __in,basic_string<char> & __str)43*38fd1498Szrj operator>>(basic_istream<char>& __in, basic_string<char>& __str) 44*38fd1498Szrj { 45*38fd1498Szrj typedef basic_istream<char> __istream_type; 46*38fd1498Szrj typedef __istream_type::int_type __int_type; 47*38fd1498Szrj typedef __istream_type::traits_type __traits_type; 48*38fd1498Szrj typedef __istream_type::__streambuf_type __streambuf_type; 49*38fd1498Szrj typedef __istream_type::__ctype_type __ctype_type; 50*38fd1498Szrj typedef basic_string<char> __string_type; 51*38fd1498Szrj typedef __string_type::size_type __size_type; 52*38fd1498Szrj 53*38fd1498Szrj __size_type __extracted = 0; 54*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 55*38fd1498Szrj __istream_type::sentry __cerb(__in, false); 56*38fd1498Szrj if (__cerb) 57*38fd1498Szrj { 58*38fd1498Szrj __try 59*38fd1498Szrj { 60*38fd1498Szrj __str.erase(); 61*38fd1498Szrj const streamsize __w = __in.width(); 62*38fd1498Szrj const __size_type __n = __w > 0 ? static_cast<__size_type>(__w) 63*38fd1498Szrj : __str.max_size(); 64*38fd1498Szrj const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc()); 65*38fd1498Szrj const __int_type __eof = __traits_type::eof(); 66*38fd1498Szrj __streambuf_type* __sb = __in.rdbuf(); 67*38fd1498Szrj __int_type __c = __sb->sgetc(); 68*38fd1498Szrj 69*38fd1498Szrj while (__extracted < __n 70*38fd1498Szrj && !__traits_type::eq_int_type(__c, __eof) 71*38fd1498Szrj && !__ct.is(ctype_base::space, 72*38fd1498Szrj __traits_type::to_char_type(__c))) 73*38fd1498Szrj { 74*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 75*38fd1498Szrj - __sb->gptr()), 76*38fd1498Szrj streamsize(__n - __extracted)); 77*38fd1498Szrj if (__size > 1) 78*38fd1498Szrj { 79*38fd1498Szrj __size = (__ct.scan_is(ctype_base::space, 80*38fd1498Szrj __sb->gptr() + 1, 81*38fd1498Szrj __sb->gptr() + __size) 82*38fd1498Szrj - __sb->gptr()); 83*38fd1498Szrj __str.append(__sb->gptr(), __size); 84*38fd1498Szrj __sb->__safe_gbump(__size); 85*38fd1498Szrj __extracted += __size; 86*38fd1498Szrj __c = __sb->sgetc(); 87*38fd1498Szrj } 88*38fd1498Szrj else 89*38fd1498Szrj { 90*38fd1498Szrj __str += __traits_type::to_char_type(__c); 91*38fd1498Szrj ++__extracted; 92*38fd1498Szrj __c = __sb->snextc(); 93*38fd1498Szrj } 94*38fd1498Szrj } 95*38fd1498Szrj 96*38fd1498Szrj if (__traits_type::eq_int_type(__c, __eof)) 97*38fd1498Szrj __err |= ios_base::eofbit; 98*38fd1498Szrj __in.width(0); 99*38fd1498Szrj } 100*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 101*38fd1498Szrj { 102*38fd1498Szrj __in._M_setstate(ios_base::badbit); 103*38fd1498Szrj __throw_exception_again; 104*38fd1498Szrj } 105*38fd1498Szrj __catch(...) 106*38fd1498Szrj { 107*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 108*38fd1498Szrj // 91. Description of operator>> and getline() for string<> 109*38fd1498Szrj // might cause endless loop 110*38fd1498Szrj __in._M_setstate(ios_base::badbit); 111*38fd1498Szrj } 112*38fd1498Szrj } 113*38fd1498Szrj if (!__extracted) 114*38fd1498Szrj __err |= ios_base::failbit; 115*38fd1498Szrj if (__err) 116*38fd1498Szrj __in.setstate(__err); 117*38fd1498Szrj return __in; 118*38fd1498Szrj } 119*38fd1498Szrj 120*38fd1498Szrj template<> 121*38fd1498Szrj basic_istream<char>& getline(basic_istream<char> & __in,basic_string<char> & __str,char __delim)122*38fd1498Szrj getline(basic_istream<char>& __in, basic_string<char>& __str, 123*38fd1498Szrj char __delim) 124*38fd1498Szrj { 125*38fd1498Szrj typedef basic_istream<char> __istream_type; 126*38fd1498Szrj typedef __istream_type::int_type __int_type; 127*38fd1498Szrj typedef __istream_type::char_type __char_type; 128*38fd1498Szrj typedef __istream_type::traits_type __traits_type; 129*38fd1498Szrj typedef __istream_type::__streambuf_type __streambuf_type; 130*38fd1498Szrj typedef basic_string<char> __string_type; 131*38fd1498Szrj typedef __string_type::size_type __size_type; 132*38fd1498Szrj 133*38fd1498Szrj __size_type __extracted = 0; 134*38fd1498Szrj const __size_type __n = __str.max_size(); 135*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 136*38fd1498Szrj __istream_type::sentry __cerb(__in, true); 137*38fd1498Szrj if (__cerb) 138*38fd1498Szrj { 139*38fd1498Szrj __try 140*38fd1498Szrj { 141*38fd1498Szrj __str.erase(); 142*38fd1498Szrj const __int_type __idelim = __traits_type::to_int_type(__delim); 143*38fd1498Szrj const __int_type __eof = __traits_type::eof(); 144*38fd1498Szrj __streambuf_type* __sb = __in.rdbuf(); 145*38fd1498Szrj __int_type __c = __sb->sgetc(); 146*38fd1498Szrj 147*38fd1498Szrj while (__extracted < __n 148*38fd1498Szrj && !__traits_type::eq_int_type(__c, __eof) 149*38fd1498Szrj && !__traits_type::eq_int_type(__c, __idelim)) 150*38fd1498Szrj { 151*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 152*38fd1498Szrj - __sb->gptr()), 153*38fd1498Szrj streamsize(__n - __extracted)); 154*38fd1498Szrj if (__size > 1) 155*38fd1498Szrj { 156*38fd1498Szrj const __char_type* __p = __traits_type::find(__sb->gptr(), 157*38fd1498Szrj __size, 158*38fd1498Szrj __delim); 159*38fd1498Szrj if (__p) 160*38fd1498Szrj __size = __p - __sb->gptr(); 161*38fd1498Szrj __str.append(__sb->gptr(), __size); 162*38fd1498Szrj __sb->__safe_gbump(__size); 163*38fd1498Szrj __extracted += __size; 164*38fd1498Szrj __c = __sb->sgetc(); 165*38fd1498Szrj } 166*38fd1498Szrj else 167*38fd1498Szrj { 168*38fd1498Szrj __str += __traits_type::to_char_type(__c); 169*38fd1498Szrj ++__extracted; 170*38fd1498Szrj __c = __sb->snextc(); 171*38fd1498Szrj } 172*38fd1498Szrj } 173*38fd1498Szrj 174*38fd1498Szrj if (__traits_type::eq_int_type(__c, __eof)) 175*38fd1498Szrj __err |= ios_base::eofbit; 176*38fd1498Szrj else if (__traits_type::eq_int_type(__c, __idelim)) 177*38fd1498Szrj { 178*38fd1498Szrj ++__extracted; 179*38fd1498Szrj __sb->sbumpc(); 180*38fd1498Szrj } 181*38fd1498Szrj else 182*38fd1498Szrj __err |= ios_base::failbit; 183*38fd1498Szrj } 184*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 185*38fd1498Szrj { 186*38fd1498Szrj __in._M_setstate(ios_base::badbit); 187*38fd1498Szrj __throw_exception_again; 188*38fd1498Szrj } 189*38fd1498Szrj __catch(...) 190*38fd1498Szrj { 191*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 192*38fd1498Szrj // 91. Description of operator>> and getline() for string<> 193*38fd1498Szrj // might cause endless loop 194*38fd1498Szrj __in._M_setstate(ios_base::badbit); 195*38fd1498Szrj } 196*38fd1498Szrj } 197*38fd1498Szrj if (!__extracted) 198*38fd1498Szrj __err |= ios_base::failbit; 199*38fd1498Szrj if (__err) 200*38fd1498Szrj __in.setstate(__err); 201*38fd1498Szrj return __in; 202*38fd1498Szrj } 203*38fd1498Szrj 204*38fd1498Szrj #ifdef _GLIBCXX_USE_WCHAR_T 205*38fd1498Szrj template<> 206*38fd1498Szrj basic_istream<wchar_t>& getline(basic_istream<wchar_t> & __in,basic_string<wchar_t> & __str,wchar_t __delim)207*38fd1498Szrj getline(basic_istream<wchar_t>& __in, basic_string<wchar_t>& __str, 208*38fd1498Szrj wchar_t __delim) 209*38fd1498Szrj { 210*38fd1498Szrj typedef basic_istream<wchar_t> __istream_type; 211*38fd1498Szrj typedef __istream_type::int_type __int_type; 212*38fd1498Szrj typedef __istream_type::char_type __char_type; 213*38fd1498Szrj typedef __istream_type::traits_type __traits_type; 214*38fd1498Szrj typedef __istream_type::__streambuf_type __streambuf_type; 215*38fd1498Szrj typedef basic_string<wchar_t> __string_type; 216*38fd1498Szrj typedef __string_type::size_type __size_type; 217*38fd1498Szrj 218*38fd1498Szrj __size_type __extracted = 0; 219*38fd1498Szrj const __size_type __n = __str.max_size(); 220*38fd1498Szrj ios_base::iostate __err = ios_base::goodbit; 221*38fd1498Szrj __istream_type::sentry __cerb(__in, true); 222*38fd1498Szrj if (__cerb) 223*38fd1498Szrj { 224*38fd1498Szrj __try 225*38fd1498Szrj { 226*38fd1498Szrj __str.erase(); 227*38fd1498Szrj const __int_type __idelim = __traits_type::to_int_type(__delim); 228*38fd1498Szrj const __int_type __eof = __traits_type::eof(); 229*38fd1498Szrj __streambuf_type* __sb = __in.rdbuf(); 230*38fd1498Szrj __int_type __c = __sb->sgetc(); 231*38fd1498Szrj 232*38fd1498Szrj while (__extracted < __n 233*38fd1498Szrj && !__traits_type::eq_int_type(__c, __eof) 234*38fd1498Szrj && !__traits_type::eq_int_type(__c, __idelim)) 235*38fd1498Szrj { 236*38fd1498Szrj streamsize __size = std::min(streamsize(__sb->egptr() 237*38fd1498Szrj - __sb->gptr()), 238*38fd1498Szrj streamsize(__n - __extracted)); 239*38fd1498Szrj if (__size > 1) 240*38fd1498Szrj { 241*38fd1498Szrj const __char_type* __p = __traits_type::find(__sb->gptr(), 242*38fd1498Szrj __size, 243*38fd1498Szrj __delim); 244*38fd1498Szrj if (__p) 245*38fd1498Szrj __size = __p - __sb->gptr(); 246*38fd1498Szrj __str.append(__sb->gptr(), __size); 247*38fd1498Szrj __sb->__safe_gbump(__size); 248*38fd1498Szrj __extracted += __size; 249*38fd1498Szrj __c = __sb->sgetc(); 250*38fd1498Szrj } 251*38fd1498Szrj else 252*38fd1498Szrj { 253*38fd1498Szrj __str += __traits_type::to_char_type(__c); 254*38fd1498Szrj ++__extracted; 255*38fd1498Szrj __c = __sb->snextc(); 256*38fd1498Szrj } 257*38fd1498Szrj } 258*38fd1498Szrj 259*38fd1498Szrj if (__traits_type::eq_int_type(__c, __eof)) 260*38fd1498Szrj __err |= ios_base::eofbit; 261*38fd1498Szrj else if (__traits_type::eq_int_type(__c, __idelim)) 262*38fd1498Szrj { 263*38fd1498Szrj ++__extracted; 264*38fd1498Szrj __sb->sbumpc(); 265*38fd1498Szrj } 266*38fd1498Szrj else 267*38fd1498Szrj __err |= ios_base::failbit; 268*38fd1498Szrj } 269*38fd1498Szrj __catch(__cxxabiv1::__forced_unwind&) 270*38fd1498Szrj { 271*38fd1498Szrj __in._M_setstate(ios_base::badbit); 272*38fd1498Szrj __throw_exception_again; 273*38fd1498Szrj } 274*38fd1498Szrj __catch(...) 275*38fd1498Szrj { 276*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 277*38fd1498Szrj // 91. Description of operator>> and getline() for string<> 278*38fd1498Szrj // might cause endless loop 279*38fd1498Szrj __in._M_setstate(ios_base::badbit); 280*38fd1498Szrj } 281*38fd1498Szrj } 282*38fd1498Szrj if (!__extracted) 283*38fd1498Szrj __err |= ios_base::failbit; 284*38fd1498Szrj if (__err) 285*38fd1498Szrj __in.setstate(__err); 286*38fd1498Szrj return __in; 287*38fd1498Szrj } 288*38fd1498Szrj #endif 289*38fd1498Szrj 290*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION 291*38fd1498Szrj } // namespace 292