100db7afdSDavid E. O'Brien // Stream buffer classes -*- C++ -*- 200db7afdSDavid E. O'Brien 3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 400db7afdSDavid E. O'Brien // Free Software Foundation, Inc. 500db7afdSDavid E. O'Brien // 600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free 700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the 800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the 900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option) 1000db7afdSDavid E. O'Brien // any later version. 1100db7afdSDavid E. O'Brien 1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful, 1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of 1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1500db7afdSDavid E. O'Brien // GNU General Public License for more details. 1600db7afdSDavid E. O'Brien 1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along 1800db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free 19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 2000db7afdSDavid E. O'Brien // USA. 2100db7afdSDavid E. O'Brien 2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software 2300db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate 2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile 2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this 2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by 2700db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however 2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by 2900db7afdSDavid E. O'Brien // the GNU General Public License. 3000db7afdSDavid E. O'Brien 31*f8a1b7d9SAlexander Kabaev /** @file streambuf 32*f8a1b7d9SAlexander Kabaev * This is a Standard C++ Library header. 33*f8a1b7d9SAlexander Kabaev */ 34*f8a1b7d9SAlexander Kabaev 3500db7afdSDavid E. O'Brien // 3600db7afdSDavid E. O'Brien // ISO C++ 14882: 27.5 Stream buffers 3700db7afdSDavid E. O'Brien // 3800db7afdSDavid E. O'Brien 39*f8a1b7d9SAlexander Kabaev #ifndef _GLIBXX_STREAMBUF 40*f8a1b7d9SAlexander Kabaev #define _GLIBXX_STREAMBUF 1 4100db7afdSDavid E. O'Brien 4200db7afdSDavid E. O'Brien #pragma GCC system_header 4300db7afdSDavid E. O'Brien 4400db7afdSDavid E. O'Brien #include <bits/c++config.h> 4500db7afdSDavid E. O'Brien #include <iosfwd> 4600db7afdSDavid E. O'Brien #include <bits/localefwd.h> 4700db7afdSDavid E. O'Brien #include <bits/ios_base.h> 48*f8a1b7d9SAlexander Kabaev #include <bits/cpp_type_traits.h> 49*f8a1b7d9SAlexander Kabaev #include <ext/type_traits.h> 5000db7afdSDavid E. O'Brien 51*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std) 52*f8a1b7d9SAlexander Kabaev 531b86b14eSAlexander Kabaev /** 541b86b14eSAlexander Kabaev * @if maint 551b86b14eSAlexander Kabaev * Does stuff. 561b86b14eSAlexander Kabaev * @endif 571b86b14eSAlexander Kabaev */ 5800db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 5900db7afdSDavid E. O'Brien streamsize 60*f8a1b7d9SAlexander Kabaev __copy_streambufs_eof(basic_streambuf<_CharT, _Traits>*, 61*f8a1b7d9SAlexander Kabaev basic_streambuf<_CharT, _Traits>*, bool&); 6200db7afdSDavid E. O'Brien 631b86b14eSAlexander Kabaev /** 641b86b14eSAlexander Kabaev * @brief The actual work of input and output (interface). 651b86b14eSAlexander Kabaev * 661b86b14eSAlexander Kabaev * This is a base class. Derived stream buffers each control a 671b86b14eSAlexander Kabaev * pair of character sequences: one for input, and one for output. 681b86b14eSAlexander Kabaev * 691b86b14eSAlexander Kabaev * Section [27.5.1] of the standard describes the requirements and 701b86b14eSAlexander Kabaev * behavior of stream buffer classes. That section (three paragraphs) 711b86b14eSAlexander Kabaev * is reproduced here, for simplicity and accuracy. 721b86b14eSAlexander Kabaev * 731b86b14eSAlexander Kabaev * -# Stream buffers can impose various constraints on the sequences 741b86b14eSAlexander Kabaev * they control. Some constraints are: 751b86b14eSAlexander Kabaev * - The controlled input sequence can be not readable. 761b86b14eSAlexander Kabaev * - The controlled output sequence can be not writable. 771b86b14eSAlexander Kabaev * - The controlled sequences can be associated with the contents of 781b86b14eSAlexander Kabaev * other representations for character sequences, such as external 791b86b14eSAlexander Kabaev * files. 801b86b14eSAlexander Kabaev * - The controlled sequences can support operations @e directly to or 811b86b14eSAlexander Kabaev * from associated sequences. 821b86b14eSAlexander Kabaev * - The controlled sequences can impose limitations on how the 831b86b14eSAlexander Kabaev * program can read characters from a sequence, write characters to 841b86b14eSAlexander Kabaev * a sequence, put characters back into an input sequence, or alter 851b86b14eSAlexander Kabaev * the stream position. 861b86b14eSAlexander Kabaev * . 871b86b14eSAlexander Kabaev * -# Each sequence is characterized by three pointers which, if non-null, 881b86b14eSAlexander Kabaev * all point into the same @c charT array object. The array object 891b86b14eSAlexander Kabaev * represents, at any moment, a (sub)sequence of characters from the 901b86b14eSAlexander Kabaev * sequence. Operations performed on a sequence alter the values 911b86b14eSAlexander Kabaev * stored in these pointers, perform reads and writes directly to or 921b86b14eSAlexander Kabaev * from associated sequences, and alter "the stream position" and 931b86b14eSAlexander Kabaev * conversion state as needed to maintain this subsequence relationship. 941b86b14eSAlexander Kabaev * The three pointers are: 951b86b14eSAlexander Kabaev * - the <em>beginning pointer</em>, or lowest element address in the 961b86b14eSAlexander Kabaev * array (called @e xbeg here); 971b86b14eSAlexander Kabaev * - the <em>next pointer</em>, or next element address that is a 981b86b14eSAlexander Kabaev * current candidate for reading or writing (called @e xnext here); 991b86b14eSAlexander Kabaev * - the <em>end pointer</em>, or first element address beyond the 1001b86b14eSAlexander Kabaev * end of the array (called @e xend here). 1011b86b14eSAlexander Kabaev * . 1021b86b14eSAlexander Kabaev * -# The following semantic constraints shall always apply for any set 1031b86b14eSAlexander Kabaev * of three pointers for a sequence, using the pointer names given 1041b86b14eSAlexander Kabaev * immediately above: 1051b86b14eSAlexander Kabaev * - If @e xnext is not a null pointer, then @e xbeg and @e xend shall 1061b86b14eSAlexander Kabaev * also be non-null pointers into the same @c charT array, as 1071b86b14eSAlexander Kabaev * described above; otherwise, @e xbeg and @e xend shall also be null. 1081b86b14eSAlexander Kabaev * - If @e xnext is not a null pointer and @e xnext < @e xend for an 1091b86b14eSAlexander Kabaev * output sequence, then a <em>write position</em> is available. 1101b86b14eSAlexander Kabaev * In this case, @e *xnext shall be assignable as the next element 1111b86b14eSAlexander Kabaev * to write (to put, or to store a character value, into the sequence). 1121b86b14eSAlexander Kabaev * - If @e xnext is not a null pointer and @e xbeg < @e xnext for an 1131b86b14eSAlexander Kabaev * input sequence, then a <em>putback position</em> is available. 1141b86b14eSAlexander Kabaev * In this case, @e xnext[-1] shall have a defined value and is the 1151b86b14eSAlexander Kabaev * next (preceding) element to store a character that is put back 1161b86b14eSAlexander Kabaev * into the input sequence. 1171b86b14eSAlexander Kabaev * - If @e xnext is not a null pointer and @e xnext< @e xend for an 1181b86b14eSAlexander Kabaev * input sequence, then a <em>read position</em> is available. 1191b86b14eSAlexander Kabaev * In this case, @e *xnext shall have a defined value and is the 1201b86b14eSAlexander Kabaev * next element to read (to get, or to obtain a character value, 1211b86b14eSAlexander Kabaev * from the sequence). 1221b86b14eSAlexander Kabaev */ 12300db7afdSDavid E. O'Brien template<typename _CharT, typename _Traits> 12400db7afdSDavid E. O'Brien class basic_streambuf 12500db7afdSDavid E. O'Brien { 12600db7afdSDavid E. O'Brien public: 1271b86b14eSAlexander Kabaev //@{ 1281b86b14eSAlexander Kabaev /** 1291b86b14eSAlexander Kabaev * These are standard types. They permit a standardized way of 1301b86b14eSAlexander Kabaev * referring to names of (or names dependant on) the template 1311b86b14eSAlexander Kabaev * parameters, which are specific to the implementation. 1321b86b14eSAlexander Kabaev */ 13300db7afdSDavid E. O'Brien typedef _CharT char_type; 13400db7afdSDavid E. O'Brien typedef _Traits traits_type; 13500db7afdSDavid E. O'Brien typedef typename traits_type::int_type int_type; 13600db7afdSDavid E. O'Brien typedef typename traits_type::pos_type pos_type; 13700db7afdSDavid E. O'Brien typedef typename traits_type::off_type off_type; 1381b86b14eSAlexander Kabaev //@} 13900db7afdSDavid E. O'Brien 1401b86b14eSAlexander Kabaev //@{ 1411b86b14eSAlexander Kabaev /** 1421b86b14eSAlexander Kabaev * @if maint 143ffeaf689SAlexander Kabaev * This is a non-standard type. 1441b86b14eSAlexander Kabaev * @endif 1451b86b14eSAlexander Kabaev */ 14600db7afdSDavid E. O'Brien typedef basic_streambuf<char_type, traits_type> __streambuf_type; 1471b86b14eSAlexander Kabaev //@} 14800db7afdSDavid E. O'Brien 14900db7afdSDavid E. O'Brien friend class basic_ios<char_type, traits_type>; 15000db7afdSDavid E. O'Brien friend class basic_istream<char_type, traits_type>; 15100db7afdSDavid E. O'Brien friend class basic_ostream<char_type, traits_type>; 15200db7afdSDavid E. O'Brien friend class istreambuf_iterator<char_type, traits_type>; 15300db7afdSDavid E. O'Brien friend class ostreambuf_iterator<char_type, traits_type>; 15400db7afdSDavid E. O'Brien 15500db7afdSDavid E. O'Brien friend streamsize 156*f8a1b7d9SAlexander Kabaev __copy_streambufs_eof<>(__streambuf_type*, __streambuf_type*, bool&); 157*f8a1b7d9SAlexander Kabaev 158*f8a1b7d9SAlexander Kabaev template<typename _CharT2> 159*f8a1b7d9SAlexander Kabaev friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, 160*f8a1b7d9SAlexander Kabaev _CharT2*>::__type 161*f8a1b7d9SAlexander Kabaev __copy_aux(istreambuf_iterator<_CharT2>, 162*f8a1b7d9SAlexander Kabaev istreambuf_iterator<_CharT2>, _CharT2*); 163*f8a1b7d9SAlexander Kabaev 164*f8a1b7d9SAlexander Kabaev template<typename _CharT2> 165*f8a1b7d9SAlexander Kabaev friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, 166*f8a1b7d9SAlexander Kabaev istreambuf_iterator<_CharT2> >::__type 167*f8a1b7d9SAlexander Kabaev find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>, 168*f8a1b7d9SAlexander Kabaev const _CharT2&); 169*f8a1b7d9SAlexander Kabaev 170*f8a1b7d9SAlexander Kabaev template<typename _CharT2, typename _Traits2> 171*f8a1b7d9SAlexander Kabaev friend basic_istream<_CharT2, _Traits2>& 172*f8a1b7d9SAlexander Kabaev operator>>(basic_istream<_CharT2, _Traits2>&, _CharT2*); 173*f8a1b7d9SAlexander Kabaev 174*f8a1b7d9SAlexander Kabaev template<typename _CharT2, typename _Traits2, typename _Alloc> 175*f8a1b7d9SAlexander Kabaev friend basic_istream<_CharT2, _Traits2>& 176*f8a1b7d9SAlexander Kabaev operator>>(basic_istream<_CharT2, _Traits2>&, 177*f8a1b7d9SAlexander Kabaev basic_string<_CharT2, _Traits2, _Alloc>&); 178*f8a1b7d9SAlexander Kabaev 179*f8a1b7d9SAlexander Kabaev template<typename _CharT2, typename _Traits2, typename _Alloc> 180*f8a1b7d9SAlexander Kabaev friend basic_istream<_CharT2, _Traits2>& 181*f8a1b7d9SAlexander Kabaev getline(basic_istream<_CharT2, _Traits2>&, 182*f8a1b7d9SAlexander Kabaev basic_string<_CharT2, _Traits2, _Alloc>&, _CharT2); 18300db7afdSDavid E. O'Brien 18400db7afdSDavid E. O'Brien protected: 1851b86b14eSAlexander Kabaev //@{ 1861b86b14eSAlexander Kabaev /** 1871b86b14eSAlexander Kabaev * @if maint 1881b86b14eSAlexander Kabaev * This is based on _IO_FILE, just reordered to be more consistent, 1891b86b14eSAlexander Kabaev * and is intended to be the most minimal abstraction for an 1901b86b14eSAlexander Kabaev * internal buffer. 1911b86b14eSAlexander Kabaev * - get == input == read 1921b86b14eSAlexander Kabaev * - put == output == write 1931b86b14eSAlexander Kabaev * @endif 1941b86b14eSAlexander Kabaev */ 19500db7afdSDavid E. O'Brien char_type* _M_in_beg; // Start of get area. 19600db7afdSDavid E. O'Brien char_type* _M_in_cur; // Current read area. 19700db7afdSDavid E. O'Brien char_type* _M_in_end; // End of get area. 19800db7afdSDavid E. O'Brien char_type* _M_out_beg; // Start of put area. 19900db7afdSDavid E. O'Brien char_type* _M_out_cur; // Current put area. 20000db7afdSDavid E. O'Brien char_type* _M_out_end; // End of put area. 20100db7afdSDavid E. O'Brien 2021b86b14eSAlexander Kabaev /** 2031b86b14eSAlexander Kabaev * @if maint 2041b86b14eSAlexander Kabaev * Current locale setting. 2051b86b14eSAlexander Kabaev * @endif 2061b86b14eSAlexander Kabaev */ 20700db7afdSDavid E. O'Brien locale _M_buf_locale; 20800db7afdSDavid E. O'Brien 20900db7afdSDavid E. O'Brien public: 2101b86b14eSAlexander Kabaev /// Destructor deallocates no buffer space. 21100db7afdSDavid E. O'Brien virtual ~basic_streambuf()21200db7afdSDavid E. O'Brien ~basic_streambuf() 213ffeaf689SAlexander Kabaev { } 21400db7afdSDavid E. O'Brien 2151b86b14eSAlexander Kabaev // [27.5.2.2.1] locales 2161b86b14eSAlexander Kabaev /** 2171b86b14eSAlexander Kabaev * @brief Entry point for imbue(). 2181b86b14eSAlexander Kabaev * @param loc The new locale. 2191b86b14eSAlexander Kabaev * @return The previous locale. 2201b86b14eSAlexander Kabaev * 2211b86b14eSAlexander Kabaev * Calls the derived imbue(loc). 2221b86b14eSAlexander Kabaev */ 22300db7afdSDavid E. O'Brien locale pubimbue(const locale & __loc)22400db7afdSDavid E. O'Brien pubimbue(const locale &__loc) 22500db7afdSDavid E. O'Brien { 22600db7afdSDavid E. O'Brien locale __tmp(this->getloc()); 22700db7afdSDavid E. O'Brien this->imbue(__loc); 228ffeaf689SAlexander Kabaev _M_buf_locale = __loc; 22900db7afdSDavid E. O'Brien return __tmp; 23000db7afdSDavid E. O'Brien } 23100db7afdSDavid E. O'Brien 2321b86b14eSAlexander Kabaev /** 2331b86b14eSAlexander Kabaev * @brief Locale access. 2341b86b14eSAlexander Kabaev * @return The current locale in effect. 2351b86b14eSAlexander Kabaev * 2361b86b14eSAlexander Kabaev * If pubimbue(loc) has been called, then the most recent @c loc 2371b86b14eSAlexander Kabaev * is returned. Otherwise the global locale in effect at the time 2381b86b14eSAlexander Kabaev * of construction is returned. 2391b86b14eSAlexander Kabaev */ 24000db7afdSDavid E. O'Brien locale getloc()24100db7afdSDavid E. O'Brien getloc() const 24261e268fbSAlexander Kabaev { return _M_buf_locale; } 24300db7afdSDavid E. O'Brien 2441b86b14eSAlexander Kabaev // [27.5.2.2.2] buffer management and positioning 2451b86b14eSAlexander Kabaev //@{ 2461b86b14eSAlexander Kabaev /** 2471b86b14eSAlexander Kabaev * @brief Entry points for derived buffer functions. 2481b86b14eSAlexander Kabaev * 2491b86b14eSAlexander Kabaev * The public versions of @c pubfoo dispatch to the protected 2501b86b14eSAlexander Kabaev * derived @c foo member functions, passing the arguments (if any) 2511b86b14eSAlexander Kabaev * and returning the result unchanged. 2521b86b14eSAlexander Kabaev */ 25300db7afdSDavid E. O'Brien __streambuf_type* pubsetbuf(char_type * __s,streamsize __n)25400db7afdSDavid E. O'Brien pubsetbuf(char_type* __s, streamsize __n) 25500db7afdSDavid E. O'Brien { return this->setbuf(__s, __n); } 25600db7afdSDavid E. O'Brien 25700db7afdSDavid E. O'Brien pos_type 25800db7afdSDavid E. O'Brien pubseekoff(off_type __off, ios_base::seekdir __way, 25900db7afdSDavid E. O'Brien ios_base::openmode __mode = ios_base::in | ios_base::out) 26000db7afdSDavid E. O'Brien { return this->seekoff(__off, __way, __mode); } 26100db7afdSDavid E. O'Brien 26200db7afdSDavid E. O'Brien pos_type 26300db7afdSDavid E. O'Brien pubseekpos(pos_type __sp, 26400db7afdSDavid E. O'Brien ios_base::openmode __mode = ios_base::in | ios_base::out) 26500db7afdSDavid E. O'Brien { return this->seekpos(__sp, __mode); } 26600db7afdSDavid E. O'Brien 26700db7afdSDavid E. O'Brien int pubsync()26800db7afdSDavid E. O'Brien pubsync() { return this->sync(); } 2691b86b14eSAlexander Kabaev //@} 27000db7afdSDavid E. O'Brien 2711b86b14eSAlexander Kabaev // [27.5.2.2.3] get area 2721b86b14eSAlexander Kabaev /** 2731b86b14eSAlexander Kabaev * @brief Looking ahead into the stream. 2741b86b14eSAlexander Kabaev * @return The number of characters available. 2751b86b14eSAlexander Kabaev * 2761b86b14eSAlexander Kabaev * If a read position is available, returns the number of characters 2771b86b14eSAlexander Kabaev * available for reading before the buffer must be refilled. 2781b86b14eSAlexander Kabaev * Otherwise returns the derived @c showmanyc(). 2791b86b14eSAlexander Kabaev */ 28000db7afdSDavid E. O'Brien streamsize in_avail()28100db7afdSDavid E. O'Brien in_avail() 28200db7afdSDavid E. O'Brien { 283ffeaf689SAlexander Kabaev const streamsize __ret = this->egptr() - this->gptr(); 284ffeaf689SAlexander Kabaev return __ret ? __ret : this->showmanyc(); 28500db7afdSDavid E. O'Brien } 28600db7afdSDavid E. O'Brien 2871b86b14eSAlexander Kabaev /** 2881b86b14eSAlexander Kabaev * @brief Getting the next character. 2891b86b14eSAlexander Kabaev * @return The next character, or eof. 2901b86b14eSAlexander Kabaev * 2911b86b14eSAlexander Kabaev * Calls @c sbumpc(), and if that function returns 2921b86b14eSAlexander Kabaev * @c traits::eof(), so does this function. Otherwise, @c sgetc(). 2931b86b14eSAlexander Kabaev */ 29400db7afdSDavid E. O'Brien int_type snextc()29500db7afdSDavid E. O'Brien snextc() 29600db7afdSDavid E. O'Brien { 297ffeaf689SAlexander Kabaev int_type __ret = traits_type::eof(); 298ffeaf689SAlexander Kabaev if (__builtin_expect(!traits_type::eq_int_type(this->sbumpc(), 299ffeaf689SAlexander Kabaev __ret), true)) 300ffeaf689SAlexander Kabaev __ret = this->sgetc(); 301ffeaf689SAlexander Kabaev return __ret; 30200db7afdSDavid E. O'Brien } 30300db7afdSDavid E. O'Brien 3041b86b14eSAlexander Kabaev /** 3051b86b14eSAlexander Kabaev * @brief Getting the next character. 3061b86b14eSAlexander Kabaev * @return The next character, or eof. 3071b86b14eSAlexander Kabaev * 3081b86b14eSAlexander Kabaev * If the input read position is available, returns that character 3091b86b14eSAlexander Kabaev * and increments the read pointer, otherwise calls and returns 3101b86b14eSAlexander Kabaev * @c uflow(). 3111b86b14eSAlexander Kabaev */ 31200db7afdSDavid E. O'Brien int_type sbumpc()313ffeaf689SAlexander Kabaev sbumpc() 314ffeaf689SAlexander Kabaev { 315ffeaf689SAlexander Kabaev int_type __ret; 316ffeaf689SAlexander Kabaev if (__builtin_expect(this->gptr() < this->egptr(), true)) 317ffeaf689SAlexander Kabaev { 318ffeaf689SAlexander Kabaev __ret = traits_type::to_int_type(*this->gptr()); 319ffeaf689SAlexander Kabaev this->gbump(1); 320ffeaf689SAlexander Kabaev } 321ffeaf689SAlexander Kabaev else 322ffeaf689SAlexander Kabaev __ret = this->uflow(); 323ffeaf689SAlexander Kabaev return __ret; 324ffeaf689SAlexander Kabaev } 32500db7afdSDavid E. O'Brien 3261b86b14eSAlexander Kabaev /** 3271b86b14eSAlexander Kabaev * @brief Getting the next character. 3281b86b14eSAlexander Kabaev * @return The next character, or eof. 3291b86b14eSAlexander Kabaev * 3301b86b14eSAlexander Kabaev * If the input read position is available, returns that character, 3311b86b14eSAlexander Kabaev * otherwise calls and returns @c underflow(). Does not move the 3321b86b14eSAlexander Kabaev * read position after fetching the character. 3331b86b14eSAlexander Kabaev */ 33400db7afdSDavid E. O'Brien int_type sgetc()33500db7afdSDavid E. O'Brien sgetc() 33600db7afdSDavid E. O'Brien { 33700db7afdSDavid E. O'Brien int_type __ret; 338ffeaf689SAlexander Kabaev if (__builtin_expect(this->gptr() < this->egptr(), true)) 339ffeaf689SAlexander Kabaev __ret = traits_type::to_int_type(*this->gptr()); 34000db7afdSDavid E. O'Brien else 34100db7afdSDavid E. O'Brien __ret = this->underflow(); 34200db7afdSDavid E. O'Brien return __ret; 34300db7afdSDavid E. O'Brien } 34400db7afdSDavid E. O'Brien 3451b86b14eSAlexander Kabaev /** 3461b86b14eSAlexander Kabaev * @brief Entry point for xsgetn. 3471b86b14eSAlexander Kabaev * @param s A buffer area. 3481b86b14eSAlexander Kabaev * @param n A count. 3491b86b14eSAlexander Kabaev * 3501b86b14eSAlexander Kabaev * Returns xsgetn(s,n). The effect is to fill @a s[0] through 3511b86b14eSAlexander Kabaev * @a s[n-1] with characters from the input sequence, if possible. 3521b86b14eSAlexander Kabaev */ 35300db7afdSDavid E. O'Brien streamsize sgetn(char_type * __s,streamsize __n)35400db7afdSDavid E. O'Brien sgetn(char_type* __s, streamsize __n) 35500db7afdSDavid E. O'Brien { return this->xsgetn(__s, __n); } 35600db7afdSDavid E. O'Brien 3571b86b14eSAlexander Kabaev // [27.5.2.2.4] putback 3581b86b14eSAlexander Kabaev /** 3591b86b14eSAlexander Kabaev * @brief Pushing characters back into the input stream. 3601b86b14eSAlexander Kabaev * @param c The character to push back. 3611b86b14eSAlexander Kabaev * @return The previous character, if possible. 3621b86b14eSAlexander Kabaev * 3631b86b14eSAlexander Kabaev * Similar to sungetc(), but @a c is pushed onto the stream instead 3641b86b14eSAlexander Kabaev * of "the previous character". If successful, the next character 3651b86b14eSAlexander Kabaev * fetched from the input stream will be @a c. 3661b86b14eSAlexander Kabaev */ 36700db7afdSDavid E. O'Brien int_type sputbackc(char_type __c)368ffeaf689SAlexander Kabaev sputbackc(char_type __c) 369ffeaf689SAlexander Kabaev { 370ffeaf689SAlexander Kabaev int_type __ret; 371ffeaf689SAlexander Kabaev const bool __testpos = this->eback() < this->gptr(); 372ffeaf689SAlexander Kabaev if (__builtin_expect(!__testpos || 373ffeaf689SAlexander Kabaev !traits_type::eq(__c, this->gptr()[-1]), false)) 374ffeaf689SAlexander Kabaev __ret = this->pbackfail(traits_type::to_int_type(__c)); 375ffeaf689SAlexander Kabaev else 376ffeaf689SAlexander Kabaev { 377ffeaf689SAlexander Kabaev this->gbump(-1); 378ffeaf689SAlexander Kabaev __ret = traits_type::to_int_type(*this->gptr()); 379ffeaf689SAlexander Kabaev } 380ffeaf689SAlexander Kabaev return __ret; 381ffeaf689SAlexander Kabaev } 38200db7afdSDavid E. O'Brien 3831b86b14eSAlexander Kabaev /** 3841b86b14eSAlexander Kabaev * @brief Moving backwards in the input stream. 3851b86b14eSAlexander Kabaev * @return The previous character, if possible. 3861b86b14eSAlexander Kabaev * 3871b86b14eSAlexander Kabaev * If a putback position is available, this function decrements the 3881b86b14eSAlexander Kabaev * input pointer and returns that character. Otherwise, calls and 3891b86b14eSAlexander Kabaev * returns pbackfail(). The effect is to "unget" the last character 3901b86b14eSAlexander Kabaev * "gotten". 3911b86b14eSAlexander Kabaev */ 39200db7afdSDavid E. O'Brien int_type sungetc()393ffeaf689SAlexander Kabaev sungetc() 394ffeaf689SAlexander Kabaev { 395ffeaf689SAlexander Kabaev int_type __ret; 396ffeaf689SAlexander Kabaev if (__builtin_expect(this->eback() < this->gptr(), true)) 397ffeaf689SAlexander Kabaev { 398ffeaf689SAlexander Kabaev this->gbump(-1); 399ffeaf689SAlexander Kabaev __ret = traits_type::to_int_type(*this->gptr()); 400ffeaf689SAlexander Kabaev } 401ffeaf689SAlexander Kabaev else 402ffeaf689SAlexander Kabaev __ret = this->pbackfail(); 403ffeaf689SAlexander Kabaev return __ret; 404ffeaf689SAlexander Kabaev } 40500db7afdSDavid E. O'Brien 4061b86b14eSAlexander Kabaev // [27.5.2.2.5] put area 4071b86b14eSAlexander Kabaev /** 4081b86b14eSAlexander Kabaev * @brief Entry point for all single-character output functions. 4091b86b14eSAlexander Kabaev * @param c A character to output. 4101b86b14eSAlexander Kabaev * @return @a c, if possible. 4111b86b14eSAlexander Kabaev * 4121b86b14eSAlexander Kabaev * One of two public output functions. 4131b86b14eSAlexander Kabaev * 4141b86b14eSAlexander Kabaev * If a write position is available for the output sequence (i.e., 4151b86b14eSAlexander Kabaev * the buffer is not full), stores @a c in that position, increments 4161b86b14eSAlexander Kabaev * the position, and returns @c traits::to_int_type(c). If a write 4171b86b14eSAlexander Kabaev * position is not available, returns @c overflow(c). 4181b86b14eSAlexander Kabaev */ 41900db7afdSDavid E. O'Brien int_type sputc(char_type __c)420ffeaf689SAlexander Kabaev sputc(char_type __c) 421ffeaf689SAlexander Kabaev { 422ffeaf689SAlexander Kabaev int_type __ret; 423ffeaf689SAlexander Kabaev if (__builtin_expect(this->pptr() < this->epptr(), true)) 424ffeaf689SAlexander Kabaev { 425ffeaf689SAlexander Kabaev *this->pptr() = __c; 426ffeaf689SAlexander Kabaev this->pbump(1); 427ffeaf689SAlexander Kabaev __ret = traits_type::to_int_type(__c); 428ffeaf689SAlexander Kabaev } 429ffeaf689SAlexander Kabaev else 430ffeaf689SAlexander Kabaev __ret = this->overflow(traits_type::to_int_type(__c)); 431ffeaf689SAlexander Kabaev return __ret; 432ffeaf689SAlexander Kabaev } 43300db7afdSDavid E. O'Brien 4341b86b14eSAlexander Kabaev /** 4351b86b14eSAlexander Kabaev * @brief Entry point for all single-character output functions. 4361b86b14eSAlexander Kabaev * @param s A buffer read area. 4371b86b14eSAlexander Kabaev * @param n A count. 4381b86b14eSAlexander Kabaev * 4391b86b14eSAlexander Kabaev * One of two public output functions. 4401b86b14eSAlexander Kabaev * 4411b86b14eSAlexander Kabaev * 4421b86b14eSAlexander Kabaev * Returns xsputn(s,n). The effect is to write @a s[0] through 4431b86b14eSAlexander Kabaev * @a s[n-1] to the output sequence, if possible. 4441b86b14eSAlexander Kabaev */ 44500db7afdSDavid E. O'Brien streamsize sputn(const char_type * __s,streamsize __n)44600db7afdSDavid E. O'Brien sputn(const char_type* __s, streamsize __n) 44700db7afdSDavid E. O'Brien { return this->xsputn(__s, __n); } 44800db7afdSDavid E. O'Brien 44900db7afdSDavid E. O'Brien protected: 4501b86b14eSAlexander Kabaev /** 4511b86b14eSAlexander Kabaev * @brief Base constructor. 4521b86b14eSAlexander Kabaev * 4531b86b14eSAlexander Kabaev * Only called from derived constructors, and sets up all the 4541b86b14eSAlexander Kabaev * buffer data to zero, including the pointers described in the 4551b86b14eSAlexander Kabaev * basic_streambuf class description. Note that, as a result, 4561b86b14eSAlexander Kabaev * - the class starts with no read nor write positions available, 4571b86b14eSAlexander Kabaev * - this is not an error 4581b86b14eSAlexander Kabaev */ basic_streambuf()45900db7afdSDavid E. O'Brien basic_streambuf() 460ffeaf689SAlexander Kabaev : _M_in_beg(0), _M_in_cur(0), _M_in_end(0), 461ca6500fcSAlexander Kabaev _M_out_beg(0), _M_out_cur(0), _M_out_end(0), 462ffeaf689SAlexander Kabaev _M_buf_locale(locale()) 46300db7afdSDavid E. O'Brien { } 46400db7afdSDavid E. O'Brien 4651b86b14eSAlexander Kabaev // [27.5.2.3.1] get area access 4661b86b14eSAlexander Kabaev //@{ 4671b86b14eSAlexander Kabaev /** 4681b86b14eSAlexander Kabaev * @brief Access to the get area. 4691b86b14eSAlexander Kabaev * 4701b86b14eSAlexander Kabaev * These functions are only available to other protected functions, 4711b86b14eSAlexander Kabaev * including derived classes. 4721b86b14eSAlexander Kabaev * 4731b86b14eSAlexander Kabaev * - eback() returns the beginning pointer for the input sequence 4741b86b14eSAlexander Kabaev * - gptr() returns the next pointer for the input sequence 4751b86b14eSAlexander Kabaev * - egptr() returns the end pointer for the input sequence 4761b86b14eSAlexander Kabaev */ 47700db7afdSDavid E. O'Brien char_type* eback()47800db7afdSDavid E. O'Brien eback() const { return _M_in_beg; } 47900db7afdSDavid E. O'Brien 48000db7afdSDavid E. O'Brien char_type* gptr()48100db7afdSDavid E. O'Brien gptr() const { return _M_in_cur; } 48200db7afdSDavid E. O'Brien 48300db7afdSDavid E. O'Brien char_type* egptr()48400db7afdSDavid E. O'Brien egptr() const { return _M_in_end; } 4851b86b14eSAlexander Kabaev //@} 48600db7afdSDavid E. O'Brien 4871b86b14eSAlexander Kabaev /** 4881b86b14eSAlexander Kabaev * @brief Moving the read position. 4891b86b14eSAlexander Kabaev * @param n The delta by which to move. 4901b86b14eSAlexander Kabaev * 4911b86b14eSAlexander Kabaev * This just advances the read position without returning any data. 4921b86b14eSAlexander Kabaev */ 49300db7afdSDavid E. O'Brien void gbump(int __n)49400db7afdSDavid E. O'Brien gbump(int __n) { _M_in_cur += __n; } 49500db7afdSDavid E. O'Brien 4961b86b14eSAlexander Kabaev /** 4971b86b14eSAlexander Kabaev * @brief Setting the three read area pointers. 4981b86b14eSAlexander Kabaev * @param gbeg A pointer. 4991b86b14eSAlexander Kabaev * @param gnext A pointer. 5001b86b14eSAlexander Kabaev * @param gend A pointer. 5011b86b14eSAlexander Kabaev * @post @a gbeg == @c eback(), @a gnext == @c gptr(), and 5021b86b14eSAlexander Kabaev * @a gend == @c egptr() 5031b86b14eSAlexander Kabaev */ 50400db7afdSDavid E. O'Brien void setg(char_type * __gbeg,char_type * __gnext,char_type * __gend)50500db7afdSDavid E. O'Brien setg(char_type* __gbeg, char_type* __gnext, char_type* __gend) 50600db7afdSDavid E. O'Brien { 50700db7afdSDavid E. O'Brien _M_in_beg = __gbeg; 50800db7afdSDavid E. O'Brien _M_in_cur = __gnext; 50900db7afdSDavid E. O'Brien _M_in_end = __gend; 51000db7afdSDavid E. O'Brien } 51100db7afdSDavid E. O'Brien 5121b86b14eSAlexander Kabaev // [27.5.2.3.2] put area access 5131b86b14eSAlexander Kabaev //@{ 5141b86b14eSAlexander Kabaev /** 5151b86b14eSAlexander Kabaev * @brief Access to the put area. 5161b86b14eSAlexander Kabaev * 5171b86b14eSAlexander Kabaev * These functions are only available to other protected functions, 5181b86b14eSAlexander Kabaev * including derived classes. 5191b86b14eSAlexander Kabaev * 5201b86b14eSAlexander Kabaev * - pbase() returns the beginning pointer for the output sequence 5211b86b14eSAlexander Kabaev * - pptr() returns the next pointer for the output sequence 5221b86b14eSAlexander Kabaev * - epptr() returns the end pointer for the output sequence 5231b86b14eSAlexander Kabaev */ 52400db7afdSDavid E. O'Brien char_type* pbase()52500db7afdSDavid E. O'Brien pbase() const { return _M_out_beg; } 52600db7afdSDavid E. O'Brien 52700db7afdSDavid E. O'Brien char_type* pptr()52800db7afdSDavid E. O'Brien pptr() const { return _M_out_cur; } 52900db7afdSDavid E. O'Brien 53000db7afdSDavid E. O'Brien char_type* epptr()53100db7afdSDavid E. O'Brien epptr() const { return _M_out_end; } 5321b86b14eSAlexander Kabaev //@} 53300db7afdSDavid E. O'Brien 5341b86b14eSAlexander Kabaev /** 5351b86b14eSAlexander Kabaev * @brief Moving the write position. 5361b86b14eSAlexander Kabaev * @param n The delta by which to move. 5371b86b14eSAlexander Kabaev * 5381b86b14eSAlexander Kabaev * This just advances the write position without returning any data. 5391b86b14eSAlexander Kabaev */ 54000db7afdSDavid E. O'Brien void pbump(int __n)54100db7afdSDavid E. O'Brien pbump(int __n) { _M_out_cur += __n; } 54200db7afdSDavid E. O'Brien 5431b86b14eSAlexander Kabaev /** 5441b86b14eSAlexander Kabaev * @brief Setting the three write area pointers. 5451b86b14eSAlexander Kabaev * @param pbeg A pointer. 5461b86b14eSAlexander Kabaev * @param pend A pointer. 5471b86b14eSAlexander Kabaev * @post @a pbeg == @c pbase(), @a pbeg == @c pptr(), and 5481b86b14eSAlexander Kabaev * @a pend == @c epptr() 5491b86b14eSAlexander Kabaev */ 55000db7afdSDavid E. O'Brien void setp(char_type * __pbeg,char_type * __pend)55100db7afdSDavid E. O'Brien setp(char_type* __pbeg, char_type* __pend) 55200db7afdSDavid E. O'Brien { 55300db7afdSDavid E. O'Brien _M_out_beg = _M_out_cur = __pbeg; 55400db7afdSDavid E. O'Brien _M_out_end = __pend; 55500db7afdSDavid E. O'Brien } 55600db7afdSDavid E. O'Brien 5571b86b14eSAlexander Kabaev // [27.5.2.4] virtual functions 5581b86b14eSAlexander Kabaev // [27.5.2.4.1] locales 5591b86b14eSAlexander Kabaev /** 5601b86b14eSAlexander Kabaev * @brief Changes translations. 5611b86b14eSAlexander Kabaev * @param loc A new locale. 5621b86b14eSAlexander Kabaev * 5631b86b14eSAlexander Kabaev * Translations done during I/O which depend on the current locale 5641b86b14eSAlexander Kabaev * are changed by this call. The standard adds, "Between invocations 5651b86b14eSAlexander Kabaev * of this function a class derived from streambuf can safely cache 5661b86b14eSAlexander Kabaev * results of calls to locale functions and to members of facets 567ffeaf689SAlexander Kabaev * so obtained." 568ffeaf689SAlexander Kabaev * 569ffeaf689SAlexander Kabaev * @note Base class version does nothing. 5701b86b14eSAlexander Kabaev */ 57100db7afdSDavid E. O'Brien virtual void imbue(const locale &)572ffeaf689SAlexander Kabaev imbue(const locale&) 573ffeaf689SAlexander Kabaev { } 57400db7afdSDavid E. O'Brien 5751b86b14eSAlexander Kabaev // [27.5.2.4.2] buffer management and positioning 5761b86b14eSAlexander Kabaev /** 5771b86b14eSAlexander Kabaev * @brief Maniuplates the buffer. 5781b86b14eSAlexander Kabaev * 5791b86b14eSAlexander Kabaev * Each derived class provides its own appropriate behavior. See 5801b86b14eSAlexander Kabaev * the next-to-last paragraph of 5811b86b14eSAlexander Kabaev * http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#2 for 5821b86b14eSAlexander Kabaev * more on this function. 5831b86b14eSAlexander Kabaev * 5841b86b14eSAlexander Kabaev * @note Base class version does nothing, returns @c this. 5851b86b14eSAlexander Kabaev */ 58600db7afdSDavid E. O'Brien virtual basic_streambuf<char_type,_Traits>* setbuf(char_type *,streamsize)58700db7afdSDavid E. O'Brien setbuf(char_type*, streamsize) 58800db7afdSDavid E. O'Brien { return this; } 58900db7afdSDavid E. O'Brien 5901b86b14eSAlexander Kabaev /** 5911b86b14eSAlexander Kabaev * @brief Alters the stream positions. 5921b86b14eSAlexander Kabaev * 5931b86b14eSAlexander Kabaev * Each derived class provides its own appropriate behavior. 5941b86b14eSAlexander Kabaev * @note Base class version does nothing, returns a @c pos_type 5951b86b14eSAlexander Kabaev * that represents an invalid stream position. 5961b86b14eSAlexander Kabaev */ 59700db7afdSDavid E. O'Brien virtual pos_type 59800db7afdSDavid E. O'Brien seekoff(off_type, ios_base::seekdir, 59900db7afdSDavid E. O'Brien ios_base::openmode /*__mode*/ = ios_base::in | ios_base::out) 60000db7afdSDavid E. O'Brien { return pos_type(off_type(-1)); } 60100db7afdSDavid E. O'Brien 6021b86b14eSAlexander Kabaev /** 6031b86b14eSAlexander Kabaev * @brief Alters the stream positions. 6041b86b14eSAlexander Kabaev * 6051b86b14eSAlexander Kabaev * Each derived class provides its own appropriate behavior. 6061b86b14eSAlexander Kabaev * @note Base class version does nothing, returns a @c pos_type 6071b86b14eSAlexander Kabaev * that represents an invalid stream position. 6081b86b14eSAlexander Kabaev */ 60900db7afdSDavid E. O'Brien virtual pos_type 61000db7afdSDavid E. O'Brien seekpos(pos_type, 61100db7afdSDavid E. O'Brien ios_base::openmode /*__mode*/ = ios_base::in | ios_base::out) 61200db7afdSDavid E. O'Brien { return pos_type(off_type(-1)); } 61300db7afdSDavid E. O'Brien 6141b86b14eSAlexander Kabaev /** 6151b86b14eSAlexander Kabaev * @brief Synchronizes the buffer arrays with the controlled sequences. 6161b86b14eSAlexander Kabaev * @return -1 on failure. 6171b86b14eSAlexander Kabaev * 6181b86b14eSAlexander Kabaev * Each derived class provides its own appropriate behavior, 6191b86b14eSAlexander Kabaev * including the definition of "failure". 6201b86b14eSAlexander Kabaev * @note Base class version does nothing, returns zero. 6211b86b14eSAlexander Kabaev */ 62200db7afdSDavid E. O'Brien virtual int sync()62300db7afdSDavid E. O'Brien sync() { return 0; } 62400db7afdSDavid E. O'Brien 6251b86b14eSAlexander Kabaev // [27.5.2.4.3] get area 6261b86b14eSAlexander Kabaev /** 6271b86b14eSAlexander Kabaev * @brief Investigating the data available. 6281b86b14eSAlexander Kabaev * @return An estimate of the number of characters available in the 6291b86b14eSAlexander Kabaev * input sequence, or -1. 6301b86b14eSAlexander Kabaev * 6311b86b14eSAlexander Kabaev * "If it returns a positive value, then successive calls to 6321b86b14eSAlexander Kabaev * @c underflow() will not return @c traits::eof() until at least that 6331b86b14eSAlexander Kabaev * number of characters have been supplied. If @c showmanyc() 6341b86b14eSAlexander Kabaev * returns -1, then calls to @c underflow() or @c uflow() will fail." 6351b86b14eSAlexander Kabaev * [27.5.2.4.3]/1 6361b86b14eSAlexander Kabaev * 6371b86b14eSAlexander Kabaev * @note Base class version does nothing, returns zero. 6381b86b14eSAlexander Kabaev * @note The standard adds that "the intention is not only that the 6391b86b14eSAlexander Kabaev * calls [to underflow or uflow] will not return @c eof() but 6401b86b14eSAlexander Kabaev * that they will return "immediately". 6411b86b14eSAlexander Kabaev * @note The standard adds that "the morphemes of @c showmanyc are 6421b86b14eSAlexander Kabaev * "es-how-many-see", not "show-manic". 6431b86b14eSAlexander Kabaev */ 64400db7afdSDavid E. O'Brien virtual streamsize showmanyc()64500db7afdSDavid E. O'Brien showmanyc() { return 0; } 64600db7afdSDavid E. O'Brien 6471b86b14eSAlexander Kabaev /** 6481b86b14eSAlexander Kabaev * @brief Multiple character extraction. 6491b86b14eSAlexander Kabaev * @param s A buffer area. 6501b86b14eSAlexander Kabaev * @param n Maximum number of characters to assign. 6511b86b14eSAlexander Kabaev * @return The number of characters assigned. 6521b86b14eSAlexander Kabaev * 6531b86b14eSAlexander Kabaev * Fills @a s[0] through @a s[n-1] with characters from the input 6541b86b14eSAlexander Kabaev * sequence, as if by @c sbumpc(). Stops when either @a n characters 6551b86b14eSAlexander Kabaev * have been copied, or when @c traits::eof() would be copied. 6561b86b14eSAlexander Kabaev * 6571b86b14eSAlexander Kabaev * It is expected that derived classes provide a more efficient 6581b86b14eSAlexander Kabaev * implementation by overriding this definition. 6591b86b14eSAlexander Kabaev */ 66000db7afdSDavid E. O'Brien virtual streamsize 66100db7afdSDavid E. O'Brien xsgetn(char_type* __s, streamsize __n); 66200db7afdSDavid E. O'Brien 6631b86b14eSAlexander Kabaev /** 6641b86b14eSAlexander Kabaev * @brief Fetches more data from the controlled sequence. 6651b86b14eSAlexander Kabaev * @return The first character from the <em>pending sequence</em>. 6661b86b14eSAlexander Kabaev * 6671b86b14eSAlexander Kabaev * Informally, this function is called when the input buffer is 6681b86b14eSAlexander Kabaev * exhausted (or does not exist, as buffering need not actually be 6691b86b14eSAlexander Kabaev * done). If a buffer exists, it is "refilled". In either case, the 6701b86b14eSAlexander Kabaev * next available character is returned, or @c traits::eof() to 6711b86b14eSAlexander Kabaev * indicate a null pending sequence. 6721b86b14eSAlexander Kabaev * 6731b86b14eSAlexander Kabaev * For a formal definiton of the pending sequence, see a good text 6741b86b14eSAlexander Kabaev * such as Langer & Kreft, or [27.5.2.4.3]/7-14. 6751b86b14eSAlexander Kabaev * 6761b86b14eSAlexander Kabaev * A functioning input streambuf can be created by overriding only 6771b86b14eSAlexander Kabaev * this function (no buffer area will be used). For an example, see 6781b86b14eSAlexander Kabaev * http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#6 6791b86b14eSAlexander Kabaev * 6801b86b14eSAlexander Kabaev * @note Base class version does nothing, returns eof(). 6811b86b14eSAlexander Kabaev */ 68200db7afdSDavid E. O'Brien virtual int_type underflow()68300db7afdSDavid E. O'Brien underflow() 68400db7afdSDavid E. O'Brien { return traits_type::eof(); } 68500db7afdSDavid E. O'Brien 6861b86b14eSAlexander Kabaev /** 6871b86b14eSAlexander Kabaev * @brief Fetches more data from the controlled sequence. 6881b86b14eSAlexander Kabaev * @return The first character from the <em>pending sequence</em>. 6891b86b14eSAlexander Kabaev * 6901b86b14eSAlexander Kabaev * Informally, this function does the same thing as @c underflow(), 6911b86b14eSAlexander Kabaev * and in fact is required to call that function. It also returns 6921b86b14eSAlexander Kabaev * the new character, like @c underflow() does. However, this 6931b86b14eSAlexander Kabaev * function also moves the read position forward by one. 6941b86b14eSAlexander Kabaev */ 69500db7afdSDavid E. O'Brien virtual int_type uflow()69600db7afdSDavid E. O'Brien uflow() 69700db7afdSDavid E. O'Brien { 69800db7afdSDavid E. O'Brien int_type __ret = traits_type::eof(); 699ffeaf689SAlexander Kabaev const bool __testeof = traits_type::eq_int_type(this->underflow(), 700ffeaf689SAlexander Kabaev __ret); 701ffeaf689SAlexander Kabaev if (!__testeof) 70200db7afdSDavid E. O'Brien { 703ffeaf689SAlexander Kabaev __ret = traits_type::to_int_type(*this->gptr()); 704ffeaf689SAlexander Kabaev this->gbump(1); 70500db7afdSDavid E. O'Brien } 70600db7afdSDavid E. O'Brien return __ret; 70700db7afdSDavid E. O'Brien } 70800db7afdSDavid E. O'Brien 7091b86b14eSAlexander Kabaev // [27.5.2.4.4] putback 7101b86b14eSAlexander Kabaev /** 7111b86b14eSAlexander Kabaev * @brief Tries to back up the input sequence. 7121b86b14eSAlexander Kabaev * @param c The character to be inserted back into the sequence. 7131b86b14eSAlexander Kabaev * @return eof() on failure, "some other value" on success 7141b86b14eSAlexander Kabaev * @post The constraints of @c gptr(), @c eback(), and @c pptr() 7151b86b14eSAlexander Kabaev * are the same as for @c underflow(). 7161b86b14eSAlexander Kabaev * 7171b86b14eSAlexander Kabaev * @note Base class version does nothing, returns eof(). 7181b86b14eSAlexander Kabaev */ 71900db7afdSDavid E. O'Brien virtual int_type 72000db7afdSDavid E. O'Brien pbackfail(int_type /* __c */ = traits_type::eof()) 72100db7afdSDavid E. O'Brien { return traits_type::eof(); } 72200db7afdSDavid E. O'Brien 72300db7afdSDavid E. O'Brien // Put area: 7241b86b14eSAlexander Kabaev /** 7251b86b14eSAlexander Kabaev * @brief Multiple character insertion. 7261b86b14eSAlexander Kabaev * @param s A buffer area. 7271b86b14eSAlexander Kabaev * @param n Maximum number of characters to write. 7281b86b14eSAlexander Kabaev * @return The number of characters written. 7291b86b14eSAlexander Kabaev * 7301b86b14eSAlexander Kabaev * Writes @a s[0] through @a s[n-1] to the output sequence, as if 7311b86b14eSAlexander Kabaev * by @c sputc(). Stops when either @a n characters have been 7321b86b14eSAlexander Kabaev * copied, or when @c sputc() would return @c traits::eof(). 7331b86b14eSAlexander Kabaev * 7341b86b14eSAlexander Kabaev * It is expected that derived classes provide a more efficient 7351b86b14eSAlexander Kabaev * implementation by overriding this definition. 7361b86b14eSAlexander Kabaev */ 73700db7afdSDavid E. O'Brien virtual streamsize 73800db7afdSDavid E. O'Brien xsputn(const char_type* __s, streamsize __n); 73900db7afdSDavid E. O'Brien 7401b86b14eSAlexander Kabaev /** 7411b86b14eSAlexander Kabaev * @brief Consumes data from the buffer; writes to the 7421b86b14eSAlexander Kabaev * controlled sequence. 7431b86b14eSAlexander Kabaev * @param c An additional character to consume. 7441b86b14eSAlexander Kabaev * @return eof() to indicate failure, something else (usually 7451b86b14eSAlexander Kabaev * @a c, or not_eof()) 7461b86b14eSAlexander Kabaev * 7471b86b14eSAlexander Kabaev * Informally, this function is called when the output buffer is full 7481b86b14eSAlexander Kabaev * (or does not exist, as buffering need not actually be done). If a 7491b86b14eSAlexander Kabaev * buffer exists, it is "consumed", with "some effect" on the 7501b86b14eSAlexander Kabaev * controlled sequence. (Typically, the buffer is written out to the 7511b86b14eSAlexander Kabaev * sequence verbatim.) In either case, the character @a c is also 7521b86b14eSAlexander Kabaev * written out, if @a c is not @c eof(). 7531b86b14eSAlexander Kabaev * 7541b86b14eSAlexander Kabaev * For a formal definiton of this function, see a good text 7551b86b14eSAlexander Kabaev * such as Langer & Kreft, or [27.5.2.4.5]/3-7. 7561b86b14eSAlexander Kabaev * 7571b86b14eSAlexander Kabaev * A functioning output streambuf can be created by overriding only 7581b86b14eSAlexander Kabaev * this function (no buffer area will be used). 7591b86b14eSAlexander Kabaev * 7601b86b14eSAlexander Kabaev * @note Base class version does nothing, returns eof(). 7611b86b14eSAlexander Kabaev */ 76200db7afdSDavid E. O'Brien virtual int_type 76300db7afdSDavid E. O'Brien overflow(int_type /* __c */ = traits_type::eof()) 76400db7afdSDavid E. O'Brien { return traits_type::eof(); } 76500db7afdSDavid E. O'Brien 766ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_DEPRECATED 7671b86b14eSAlexander Kabaev // Annex D.6 76800db7afdSDavid E. O'Brien public: 7691b86b14eSAlexander Kabaev /** 7701b86b14eSAlexander Kabaev * @brief Tosses a character. 7711b86b14eSAlexander Kabaev * 7721b86b14eSAlexander Kabaev * Advances the read pointer, ignoring the character that would have 7731b86b14eSAlexander Kabaev * been read. 7741b86b14eSAlexander Kabaev * 7751b86b14eSAlexander Kabaev * See http://gcc.gnu.org/ml/libstdc++/2002-05/msg00168.html 7761b86b14eSAlexander Kabaev * 7771b86b14eSAlexander Kabaev * @note This function has been deprecated by the standard. You 778ffeaf689SAlexander Kabaev * must define @c _GLIBCXX_DEPRECATED to make this visible; see 7791b86b14eSAlexander Kabaev * c++config.h. 7801b86b14eSAlexander Kabaev */ 78100db7afdSDavid E. O'Brien void stossc()78200db7afdSDavid E. O'Brien stossc() 78300db7afdSDavid E. O'Brien { 784ffeaf689SAlexander Kabaev if (this->gptr() < this->egptr()) 785ffeaf689SAlexander Kabaev this->gbump(1); 78600db7afdSDavid E. O'Brien else 78700db7afdSDavid E. O'Brien this->uflow(); 78800db7afdSDavid E. O'Brien } 78900db7afdSDavid E. O'Brien #endif 79000db7afdSDavid E. O'Brien 79100db7afdSDavid E. O'Brien private: 792ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 793ffeaf689SAlexander Kabaev // Side effect of DR 50. basic_streambuf(const __streambuf_type & __sb)794ffeaf689SAlexander Kabaev basic_streambuf(const __streambuf_type& __sb) 795ffeaf689SAlexander Kabaev : _M_in_beg(__sb._M_in_beg), _M_in_cur(__sb._M_in_cur), 796ffeaf689SAlexander Kabaev _M_in_end(__sb._M_in_end), _M_out_beg(__sb._M_out_beg), 797ffeaf689SAlexander Kabaev _M_out_cur(__sb._M_out_cur), _M_out_end(__sb._M_out_cur), 798ffeaf689SAlexander Kabaev _M_buf_locale(__sb._M_buf_locale) 799ffeaf689SAlexander Kabaev { } 80000db7afdSDavid E. O'Brien 80100db7afdSDavid E. O'Brien __streambuf_type& 80200db7afdSDavid E. O'Brien operator=(const __streambuf_type&) { return *this; }; 80300db7afdSDavid E. O'Brien }; 804*f8a1b7d9SAlexander Kabaev 805*f8a1b7d9SAlexander Kabaev // Explicit specialization declarations, defined in src/streambuf.cc. 806*f8a1b7d9SAlexander Kabaev template<> 807*f8a1b7d9SAlexander Kabaev streamsize 808*f8a1b7d9SAlexander Kabaev __copy_streambufs_eof(basic_streambuf<char>* __sbin, 809*f8a1b7d9SAlexander Kabaev basic_streambuf<char>* __sbout, bool& __ineof); 810*f8a1b7d9SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T 811*f8a1b7d9SAlexander Kabaev template<> 812*f8a1b7d9SAlexander Kabaev streamsize 813*f8a1b7d9SAlexander Kabaev __copy_streambufs_eof(basic_streambuf<wchar_t>* __sbin, 814*f8a1b7d9SAlexander Kabaev basic_streambuf<wchar_t>* __sbout, bool& __ineof); 815*f8a1b7d9SAlexander Kabaev #endif 816*f8a1b7d9SAlexander Kabaev 817*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 81800db7afdSDavid E. O'Brien 819ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_EXPORT_TEMPLATE 82000db7afdSDavid E. O'Brien # include <bits/streambuf.tcc> 82100db7afdSDavid E. O'Brien #endif 82200db7afdSDavid E. O'Brien 823ffeaf689SAlexander Kabaev #endif /* _GLIBCXX_STREAMBUF */ 824