Whole document tree sstream.tccGo to the documentation of this file.00001 // String based streams -*- C++ -*- 00002 00003 // Copyright (C) 1997-1999, 2001 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 2, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // You should have received a copy of the GNU General Public License along 00017 // with this library; see the file COPYING. If not, write to the Free 00018 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 00019 // USA. 00020 00021 // As a special exception, you may use this file as part of a free software 00022 // library without restriction. Specifically, if other files instantiate 00023 // templates or use macros or inline functions from this file, or you compile 00024 // this file and link it with other files to produce an executable, this 00025 // file does not by itself cause the resulting executable to be covered by 00026 // the GNU General Public License. This exception does not however 00027 // invalidate any other reasons why the executable file might be covered by 00028 // the GNU General Public License. 00029 00030 // 00031 // ISO C++ 14882: 27.7 String-based streams 00032 // 00033 00034 #ifndef _CPP_BITS_SSTREAM_TCC 00035 #define _CPP_BITS_SSTREAM_TCC 1 00036 00037 #include <bits/std_sstream.h> 00038 00039 namespace std 00040 { 00041 00042 template <class _CharT, class _Traits, class _Alloc> 00043 typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type 00044 basic_stringbuf<_CharT, _Traits, _Alloc>:: 00045 pbackfail(int_type __c) 00046 { 00047 int_type __ret = traits_type::eof(); 00048 bool __testeof = traits_type::eq_int_type(__c, traits_type::eof()); 00049 bool __testpos = _M_in_cur && _M_in_beg < _M_in_cur; 00050 00051 // Try to put back __c into input sequence in one of three ways. 00052 // Order these tests done in is unspecified by the standard. 00053 if (__testpos) 00054 { 00055 if (traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]) 00056 && !__testeof) 00057 { 00058 --_M_in_cur; 00059 __ret = __c; 00060 } 00061 else if (!__testeof) 00062 { 00063 --_M_in_cur; 00064 *_M_in_cur = traits_type::to_char_type(__c); 00065 __ret = __c; 00066 } 00067 else if (__testeof) 00068 { 00069 --_M_in_cur; 00070 __ret = traits_type::not_eof(__c); 00071 } 00072 } 00073 return __ret; 00074 } 00075 00076 template <class _CharT, class _Traits, class _Alloc> 00077 typename basic_stringbuf<_CharT, _Traits, _Alloc>::int_type 00078 basic_stringbuf<_CharT, _Traits, _Alloc>:: 00079 overflow(int_type __c) 00080 { 00081 int_type __ret = traits_type::eof(); 00082 bool __testeof = traits_type::eq_int_type(__c, __ret); 00083 bool __testwrite = _M_out_cur < _M_buf + _M_buf_size; 00084 bool __testout = _M_mode & ios_base::out; 00085 00086 // Try to append __c into output sequence in one of two ways. 00087 // Order these tests done in is unspecified by the standard. 00088 if (__testout) 00089 { 00090 if (!__testeof) 00091 { 00092 __size_type __len = max(_M_buf_size, _M_buf_size_opt); 00093 __len *= 2; 00094 00095 if (__testwrite) 00096 __ret = this->sputc(__c); 00097 else if (__len <= _M_string.max_size()) 00098 { 00099 // Force-allocate, re-sync. 00100 _M_string = this->str(); 00101 _M_string.reserve(__len); 00102 _M_buf_size = static_cast<int_type>(__len); 00103 _M_really_sync(_M_in_cur - _M_in_beg, 00104 _M_out_cur - _M_out_beg); 00105 *_M_out_cur = traits_type::to_char_type(__c); 00106 _M_out_cur_move(1); 00107 __ret = __c; 00108 } 00109 } 00110 else 00111 __ret = traits_type::not_eof(__c); 00112 } 00113 return __ret; 00114 } 00115 00116 template <class _CharT, class _Traits, class _Alloc> 00117 typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type 00118 basic_stringbuf<_CharT, _Traits, _Alloc>:: 00119 seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode) 00120 { 00121 pos_type __ret = pos_type(off_type(-1)); 00122 bool __testin = __mode & ios_base::in && _M_mode & ios_base::in; 00123 bool __testout = __mode & ios_base::out && _M_mode & ios_base::out; 00124 bool __testboth = __testin && __testout && __way != ios_base::cur; 00125 00126 if (_M_buf_size && ((__testin != __testout) || __testboth)) 00127 { 00128 char_type* __beg = _M_buf; 00129 char_type* __curi = NULL; 00130 char_type* __curo = NULL; 00131 char_type* __endi = NULL; 00132 char_type* __endo = NULL; 00133 00134 if (__testin) 00135 { 00136 __curi = this->gptr(); 00137 __endi = this->egptr(); 00138 } 00139 if (__testout) 00140 { 00141 __curo = this->pptr(); 00142 __endo = this->epptr(); 00143 } 00144 00145 off_type __newoffi = 0; 00146 off_type __newoffo = 0; 00147 if (__way == ios_base::cur) 00148 { 00149 __newoffi = __curi - __beg; 00150 __newoffo = __curo - __beg; 00151 } 00152 else if (__way == ios_base::end) 00153 { 00154 __newoffi = __endi - __beg; 00155 __newoffo = __endo - __beg; 00156 } 00157 00158 if (__testin 00159 && __newoffi + __off >= 0 && __endi - __beg >= __newoffi + __off) 00160 { 00161 _M_in_cur = __beg + __newoffi + __off; 00162 __ret = pos_type(__newoffi); 00163 } 00164 if (__testout 00165 && __newoffo + __off >= 0 && __endo - __beg >= __newoffo + __off) 00166 { 00167 _M_out_cur_move(__newoffo + __off - (_M_out_cur - __beg)); 00168 __ret = pos_type(__newoffo); 00169 } 00170 } 00171 return __ret; 00172 } 00173 00174 template <class _CharT, class _Traits, class _Alloc> 00175 typename basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type 00176 basic_stringbuf<_CharT, _Traits, _Alloc>:: 00177 seekpos(pos_type __sp, ios_base::openmode __mode) 00178 { 00179 pos_type __ret = pos_type(off_type(-1)); 00180 off_type __pos = __sp._M_position(); 00181 char_type* __beg = NULL; 00182 char_type* __end = NULL; 00183 bool __testin = __mode & ios_base::in && _M_mode & ios_base::in; 00184 bool __testout = __mode & ios_base::out && _M_mode & ios_base::out; 00185 00186 if (__testin) 00187 { 00188 __beg = this->eback(); 00189 __end = this->egptr(); 00190 } 00191 if (__testout) 00192 { 00193 __beg = this->pbase(); 00194 __end = _M_buf + _M_buf_size; 00195 } 00196 00197 if (0 <= __pos && __pos <= __end - __beg) 00198 { 00199 // Need to set both of these if applicable 00200 if (__testin) 00201 _M_in_cur = _M_in_beg + __pos; 00202 if (__testout) 00203 _M_out_cur_move((__pos) - (_M_out_cur - __beg)); 00204 __ret = pos_type(off_type(__pos)); 00205 } 00206 00207 return __ret; 00208 } 00209 00210 } // namespace std 00211 00212 #endif /* _CPP_BITS_SSTREAM_TCC */ 00213 Generated on Mon Apr 8 03:11:32 2002 for libstdc++-v3 Source by ![]() |