xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/ext/vstring.tcc (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // Versatile string -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
4*e4b17023SJohn Marino // Free Software Foundation, Inc.
5*e4b17023SJohn Marino //
6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino // any later version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino // GNU General Public License for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino /** @file ext/vstring.tcc
27*e4b17023SJohn Marino  *  This is an internal header file, included by other library headers.
28*e4b17023SJohn Marino  *  Do not attempt to use it directly. @headername{ext/vstring.h}
29*e4b17023SJohn Marino  */
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino #ifndef _VSTRING_TCC
32*e4b17023SJohn Marino #define _VSTRING_TCC 1
33*e4b17023SJohn Marino 
34*e4b17023SJohn Marino #pragma GCC system_header
35*e4b17023SJohn Marino 
36*e4b17023SJohn Marino #include <bits/cxxabi_forced.h>
37*e4b17023SJohn Marino 
38*e4b17023SJohn Marino namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
39*e4b17023SJohn Marino {
40*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
41*e4b17023SJohn Marino 
42*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
43*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
44*e4b17023SJohn Marino     const typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
45*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::npos;
46*e4b17023SJohn Marino 
47*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
48*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
49*e4b17023SJohn Marino     void
50*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
resize(size_type __n,_CharT __c)51*e4b17023SJohn Marino     resize(size_type __n, _CharT __c)
52*e4b17023SJohn Marino     {
53*e4b17023SJohn Marino       const size_type __size = this->size();
54*e4b17023SJohn Marino       if (__size < __n)
55*e4b17023SJohn Marino 	this->append(__n - __size, __c);
56*e4b17023SJohn Marino       else if (__n < __size)
57*e4b17023SJohn Marino 	this->_M_erase(__n, __size - __n);
58*e4b17023SJohn Marino     }
59*e4b17023SJohn Marino 
60*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
61*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
62*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>&
63*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_append(const _CharT * __s,size_type __n)64*e4b17023SJohn Marino     _M_append(const _CharT* __s, size_type __n)
65*e4b17023SJohn Marino     {
66*e4b17023SJohn Marino       const size_type __len = __n + this->size();
67*e4b17023SJohn Marino 
68*e4b17023SJohn Marino       if (__len <= this->capacity() && !this->_M_is_shared())
69*e4b17023SJohn Marino 	{
70*e4b17023SJohn Marino 	  if (__n)
71*e4b17023SJohn Marino 	    this->_S_copy(this->_M_data() + this->size(), __s, __n);
72*e4b17023SJohn Marino 	}
73*e4b17023SJohn Marino       else
74*e4b17023SJohn Marino 	this->_M_mutate(this->size(), size_type(0), __s, __n);
75*e4b17023SJohn Marino 
76*e4b17023SJohn Marino       this->_M_set_length(__len);
77*e4b17023SJohn Marino       return *this;
78*e4b17023SJohn Marino     }
79*e4b17023SJohn Marino 
80*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
81*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
82*e4b17023SJohn Marino     template<typename _InputIterator>
83*e4b17023SJohn Marino       __versa_string<_CharT, _Traits, _Alloc, _Base>&
84*e4b17023SJohn Marino       __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_replace_dispatch(iterator __i1,iterator __i2,_InputIterator __k1,_InputIterator __k2,std::__false_type)85*e4b17023SJohn Marino       _M_replace_dispatch(iterator __i1, iterator __i2, _InputIterator __k1,
86*e4b17023SJohn Marino 			  _InputIterator __k2, std::__false_type)
87*e4b17023SJohn Marino       {
88*e4b17023SJohn Marino 	const __versa_string __s(__k1, __k2);
89*e4b17023SJohn Marino 	const size_type __n1 = __i2 - __i1;
90*e4b17023SJohn Marino 	return _M_replace(__i1 - _M_ibegin(), __n1, __s._M_data(),
91*e4b17023SJohn Marino 			  __s.size());
92*e4b17023SJohn Marino       }
93*e4b17023SJohn Marino 
94*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
95*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
96*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>&
97*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_replace_aux(size_type __pos1,size_type __n1,size_type __n2,_CharT __c)98*e4b17023SJohn Marino     _M_replace_aux(size_type __pos1, size_type __n1, size_type __n2,
99*e4b17023SJohn Marino 		   _CharT __c)
100*e4b17023SJohn Marino     {
101*e4b17023SJohn Marino       _M_check_length(__n1, __n2, "__versa_string::_M_replace_aux");
102*e4b17023SJohn Marino 
103*e4b17023SJohn Marino       const size_type __old_size = this->size();
104*e4b17023SJohn Marino       const size_type __new_size = __old_size + __n2 - __n1;
105*e4b17023SJohn Marino 
106*e4b17023SJohn Marino       if (__new_size <= this->capacity() && !this->_M_is_shared())
107*e4b17023SJohn Marino 	{
108*e4b17023SJohn Marino 	  _CharT* __p = this->_M_data() + __pos1;
109*e4b17023SJohn Marino 
110*e4b17023SJohn Marino 	  const size_type __how_much = __old_size - __pos1 - __n1;
111*e4b17023SJohn Marino 	  if (__how_much && __n1 != __n2)
112*e4b17023SJohn Marino 	    this->_S_move(__p + __n2, __p + __n1, __how_much);
113*e4b17023SJohn Marino 	}
114*e4b17023SJohn Marino       else
115*e4b17023SJohn Marino 	this->_M_mutate(__pos1, __n1, 0, __n2);
116*e4b17023SJohn Marino 
117*e4b17023SJohn Marino       if (__n2)
118*e4b17023SJohn Marino 	this->_S_assign(this->_M_data() + __pos1, __n2, __c);
119*e4b17023SJohn Marino 
120*e4b17023SJohn Marino       this->_M_set_length(__new_size);
121*e4b17023SJohn Marino       return *this;
122*e4b17023SJohn Marino     }
123*e4b17023SJohn Marino 
124*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
125*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
126*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>&
127*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
_M_replace(size_type __pos,size_type __len1,const _CharT * __s,const size_type __len2)128*e4b17023SJohn Marino     _M_replace(size_type __pos, size_type __len1, const _CharT* __s,
129*e4b17023SJohn Marino 	       const size_type __len2)
130*e4b17023SJohn Marino     {
131*e4b17023SJohn Marino       _M_check_length(__len1, __len2, "__versa_string::_M_replace");
132*e4b17023SJohn Marino 
133*e4b17023SJohn Marino       const size_type __old_size = this->size();
134*e4b17023SJohn Marino       const size_type __new_size = __old_size + __len2 - __len1;
135*e4b17023SJohn Marino 
136*e4b17023SJohn Marino       if (__new_size <= this->capacity() && !this->_M_is_shared())
137*e4b17023SJohn Marino 	{
138*e4b17023SJohn Marino 	  _CharT* __p = this->_M_data() + __pos;
139*e4b17023SJohn Marino 
140*e4b17023SJohn Marino 	  const size_type __how_much = __old_size - __pos - __len1;
141*e4b17023SJohn Marino 	  if (_M_disjunct(__s))
142*e4b17023SJohn Marino 	    {
143*e4b17023SJohn Marino 	      if (__how_much && __len1 != __len2)
144*e4b17023SJohn Marino 		this->_S_move(__p + __len2, __p + __len1, __how_much);
145*e4b17023SJohn Marino 	      if (__len2)
146*e4b17023SJohn Marino 		this->_S_copy(__p, __s, __len2);
147*e4b17023SJohn Marino 	    }
148*e4b17023SJohn Marino 	  else
149*e4b17023SJohn Marino 	    {
150*e4b17023SJohn Marino 	      // Work in-place.
151*e4b17023SJohn Marino 	      if (__len2 && __len2 <= __len1)
152*e4b17023SJohn Marino 		this->_S_move(__p, __s, __len2);
153*e4b17023SJohn Marino 	      if (__how_much && __len1 != __len2)
154*e4b17023SJohn Marino 		this->_S_move(__p + __len2, __p + __len1, __how_much);
155*e4b17023SJohn Marino 	      if (__len2 > __len1)
156*e4b17023SJohn Marino 		{
157*e4b17023SJohn Marino 		  if (__s + __len2 <= __p + __len1)
158*e4b17023SJohn Marino 		    this->_S_move(__p, __s, __len2);
159*e4b17023SJohn Marino 		  else if (__s >= __p + __len1)
160*e4b17023SJohn Marino 		    this->_S_copy(__p, __s + __len2 - __len1, __len2);
161*e4b17023SJohn Marino 		  else
162*e4b17023SJohn Marino 		    {
163*e4b17023SJohn Marino 		      const size_type __nleft = (__p + __len1) - __s;
164*e4b17023SJohn Marino 		      this->_S_move(__p, __s, __nleft);
165*e4b17023SJohn Marino 		      this->_S_copy(__p + __nleft, __p + __len2,
166*e4b17023SJohn Marino 				    __len2 - __nleft);
167*e4b17023SJohn Marino 		    }
168*e4b17023SJohn Marino 		}
169*e4b17023SJohn Marino 	    }
170*e4b17023SJohn Marino 	}
171*e4b17023SJohn Marino       else
172*e4b17023SJohn Marino 	this->_M_mutate(__pos, __len1, __s, __len2);
173*e4b17023SJohn Marino 
174*e4b17023SJohn Marino       this->_M_set_length(__new_size);
175*e4b17023SJohn Marino       return *this;
176*e4b17023SJohn Marino     }
177*e4b17023SJohn Marino 
178*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
179*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
180*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)181*e4b17023SJohn Marino     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
182*e4b17023SJohn Marino 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
183*e4b17023SJohn Marino     {
184*e4b17023SJohn Marino       __versa_string<_CharT, _Traits, _Alloc, _Base> __str;
185*e4b17023SJohn Marino       __str.reserve(__lhs.size() + __rhs.size());
186*e4b17023SJohn Marino       __str.append(__lhs);
187*e4b17023SJohn Marino       __str.append(__rhs);
188*e4b17023SJohn Marino       return __str;
189*e4b17023SJohn Marino     }
190*e4b17023SJohn Marino 
191*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
192*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
193*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const _CharT * __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)194*e4b17023SJohn Marino     operator+(const _CharT* __lhs,
195*e4b17023SJohn Marino 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
196*e4b17023SJohn Marino     {
197*e4b17023SJohn Marino       __glibcxx_requires_string(__lhs);
198*e4b17023SJohn Marino       typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type;
199*e4b17023SJohn Marino       typedef typename __string_type::size_type	  __size_type;
200*e4b17023SJohn Marino       const __size_type __len = _Traits::length(__lhs);
201*e4b17023SJohn Marino       __string_type __str;
202*e4b17023SJohn Marino       __str.reserve(__len + __rhs.size());
203*e4b17023SJohn Marino       __str.append(__lhs, __len);
204*e4b17023SJohn Marino       __str.append(__rhs);
205*e4b17023SJohn Marino       return __str;
206*e4b17023SJohn Marino     }
207*e4b17023SJohn Marino 
208*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
209*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
210*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(_CharT __lhs,const __versa_string<_CharT,_Traits,_Alloc,_Base> & __rhs)211*e4b17023SJohn Marino     operator+(_CharT __lhs,
212*e4b17023SJohn Marino 	      const __versa_string<_CharT, _Traits, _Alloc, _Base>& __rhs)
213*e4b17023SJohn Marino     {
214*e4b17023SJohn Marino       __versa_string<_CharT, _Traits, _Alloc, _Base> __str;
215*e4b17023SJohn Marino       __str.reserve(__rhs.size() + 1);
216*e4b17023SJohn Marino       __str.push_back(__lhs);
217*e4b17023SJohn Marino       __str.append(__rhs);
218*e4b17023SJohn Marino       return __str;
219*e4b17023SJohn Marino     }
220*e4b17023SJohn Marino 
221*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
222*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
223*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,const _CharT * __rhs)224*e4b17023SJohn Marino     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
225*e4b17023SJohn Marino 	      const _CharT* __rhs)
226*e4b17023SJohn Marino     {
227*e4b17023SJohn Marino       __glibcxx_requires_string(__rhs);
228*e4b17023SJohn Marino       typedef __versa_string<_CharT, _Traits, _Alloc, _Base> __string_type;
229*e4b17023SJohn Marino       typedef typename __string_type::size_type	  __size_type;
230*e4b17023SJohn Marino       const __size_type __len = _Traits::length(__rhs);
231*e4b17023SJohn Marino       __string_type __str;
232*e4b17023SJohn Marino       __str.reserve(__lhs.size() + __len);
233*e4b17023SJohn Marino       __str.append(__lhs);
234*e4b17023SJohn Marino       __str.append(__rhs, __len);
235*e4b17023SJohn Marino       return __str;
236*e4b17023SJohn Marino     }
237*e4b17023SJohn Marino 
238*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
239*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
240*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>
operator +(const __versa_string<_CharT,_Traits,_Alloc,_Base> & __lhs,_CharT __rhs)241*e4b17023SJohn Marino     operator+(const __versa_string<_CharT, _Traits, _Alloc, _Base>& __lhs,
242*e4b17023SJohn Marino 	      _CharT __rhs)
243*e4b17023SJohn Marino     {
244*e4b17023SJohn Marino       __versa_string<_CharT, _Traits, _Alloc, _Base> __str;
245*e4b17023SJohn Marino       __str.reserve(__lhs.size() + 1);
246*e4b17023SJohn Marino       __str.append(__lhs);
247*e4b17023SJohn Marino       __str.push_back(__rhs);
248*e4b17023SJohn Marino       return __str;
249*e4b17023SJohn Marino     }
250*e4b17023SJohn Marino 
251*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
252*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
253*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
254*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
copy(_CharT * __s,size_type __n,size_type __pos) const255*e4b17023SJohn Marino     copy(_CharT* __s, size_type __n, size_type __pos) const
256*e4b17023SJohn Marino     {
257*e4b17023SJohn Marino       _M_check(__pos, "__versa_string::copy");
258*e4b17023SJohn Marino       __n = _M_limit(__pos, __n);
259*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n);
260*e4b17023SJohn Marino       if (__n)
261*e4b17023SJohn Marino 	this->_S_copy(__s, this->_M_data() + __pos, __n);
262*e4b17023SJohn Marino       // 21.3.5.7 par 3: do not append null.  (good.)
263*e4b17023SJohn Marino       return __n;
264*e4b17023SJohn Marino     }
265*e4b17023SJohn Marino 
266*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
267*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
268*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
269*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find(const _CharT * __s,size_type __pos,size_type __n) const270*e4b17023SJohn Marino     find(const _CharT* __s, size_type __pos, size_type __n) const
271*e4b17023SJohn Marino     {
272*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n);
273*e4b17023SJohn Marino       const size_type __size = this->size();
274*e4b17023SJohn Marino       const _CharT* __data = this->_M_data();
275*e4b17023SJohn Marino 
276*e4b17023SJohn Marino       if (__n == 0)
277*e4b17023SJohn Marino 	return __pos <= __size ? __pos : npos;
278*e4b17023SJohn Marino 
279*e4b17023SJohn Marino       if (__n <= __size)
280*e4b17023SJohn Marino 	{
281*e4b17023SJohn Marino 	  for (; __pos <= __size - __n; ++__pos)
282*e4b17023SJohn Marino 	    if (traits_type::eq(__data[__pos], __s[0])
283*e4b17023SJohn Marino 		&& traits_type::compare(__data + __pos + 1,
284*e4b17023SJohn Marino 					__s + 1, __n - 1) == 0)
285*e4b17023SJohn Marino 	      return __pos;
286*e4b17023SJohn Marino 	}
287*e4b17023SJohn Marino       return npos;
288*e4b17023SJohn Marino     }
289*e4b17023SJohn Marino 
290*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
291*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
292*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
293*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find(_CharT __c,size_type __pos) const294*e4b17023SJohn Marino     find(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
295*e4b17023SJohn Marino     {
296*e4b17023SJohn Marino       size_type __ret = npos;
297*e4b17023SJohn Marino       const size_type __size = this->size();
298*e4b17023SJohn Marino       if (__pos < __size)
299*e4b17023SJohn Marino 	{
300*e4b17023SJohn Marino 	  const _CharT* __data = this->_M_data();
301*e4b17023SJohn Marino 	  const size_type __n = __size - __pos;
302*e4b17023SJohn Marino 	  const _CharT* __p = traits_type::find(__data + __pos, __n, __c);
303*e4b17023SJohn Marino 	  if (__p)
304*e4b17023SJohn Marino 	    __ret = __p - __data;
305*e4b17023SJohn Marino 	}
306*e4b17023SJohn Marino       return __ret;
307*e4b17023SJohn Marino     }
308*e4b17023SJohn Marino 
309*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
310*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
311*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
312*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
rfind(const _CharT * __s,size_type __pos,size_type __n) const313*e4b17023SJohn Marino     rfind(const _CharT* __s, size_type __pos, size_type __n) const
314*e4b17023SJohn Marino     {
315*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n);
316*e4b17023SJohn Marino       const size_type __size = this->size();
317*e4b17023SJohn Marino       if (__n <= __size)
318*e4b17023SJohn Marino 	{
319*e4b17023SJohn Marino 	  __pos = std::min(size_type(__size - __n), __pos);
320*e4b17023SJohn Marino 	  const _CharT* __data = this->_M_data();
321*e4b17023SJohn Marino 	  do
322*e4b17023SJohn Marino 	    {
323*e4b17023SJohn Marino 	      if (traits_type::compare(__data + __pos, __s, __n) == 0)
324*e4b17023SJohn Marino 		return __pos;
325*e4b17023SJohn Marino 	    }
326*e4b17023SJohn Marino 	  while (__pos-- > 0);
327*e4b17023SJohn Marino 	}
328*e4b17023SJohn Marino       return npos;
329*e4b17023SJohn Marino     }
330*e4b17023SJohn Marino 
331*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
332*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
333*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
334*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
rfind(_CharT __c,size_type __pos) const335*e4b17023SJohn Marino     rfind(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
336*e4b17023SJohn Marino     {
337*e4b17023SJohn Marino       size_type __size = this->size();
338*e4b17023SJohn Marino       if (__size)
339*e4b17023SJohn Marino 	{
340*e4b17023SJohn Marino 	  if (--__size > __pos)
341*e4b17023SJohn Marino 	    __size = __pos;
342*e4b17023SJohn Marino 	  for (++__size; __size-- > 0; )
343*e4b17023SJohn Marino 	    if (traits_type::eq(this->_M_data()[__size], __c))
344*e4b17023SJohn Marino 	      return __size;
345*e4b17023SJohn Marino 	}
346*e4b17023SJohn Marino       return npos;
347*e4b17023SJohn Marino     }
348*e4b17023SJohn Marino 
349*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
350*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
351*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
352*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_first_of(const _CharT * __s,size_type __pos,size_type __n) const353*e4b17023SJohn Marino     find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
354*e4b17023SJohn Marino     {
355*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n);
356*e4b17023SJohn Marino       for (; __n && __pos < this->size(); ++__pos)
357*e4b17023SJohn Marino 	{
358*e4b17023SJohn Marino 	  const _CharT* __p = traits_type::find(__s, __n,
359*e4b17023SJohn Marino 						this->_M_data()[__pos]);
360*e4b17023SJohn Marino 	  if (__p)
361*e4b17023SJohn Marino 	    return __pos;
362*e4b17023SJohn Marino 	}
363*e4b17023SJohn Marino       return npos;
364*e4b17023SJohn Marino     }
365*e4b17023SJohn Marino 
366*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
367*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
368*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
369*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_last_of(const _CharT * __s,size_type __pos,size_type __n) const370*e4b17023SJohn Marino     find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
371*e4b17023SJohn Marino     {
372*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n);
373*e4b17023SJohn Marino       size_type __size = this->size();
374*e4b17023SJohn Marino       if (__size && __n)
375*e4b17023SJohn Marino 	{
376*e4b17023SJohn Marino 	  if (--__size > __pos)
377*e4b17023SJohn Marino 	    __size = __pos;
378*e4b17023SJohn Marino 	  do
379*e4b17023SJohn Marino 	    {
380*e4b17023SJohn Marino 	      if (traits_type::find(__s, __n, this->_M_data()[__size]))
381*e4b17023SJohn Marino 		return __size;
382*e4b17023SJohn Marino 	    }
383*e4b17023SJohn Marino 	  while (__size-- != 0);
384*e4b17023SJohn Marino 	}
385*e4b17023SJohn Marino       return npos;
386*e4b17023SJohn Marino     }
387*e4b17023SJohn Marino 
388*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
389*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
390*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
391*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_first_not_of(const _CharT * __s,size_type __pos,size_type __n) const392*e4b17023SJohn Marino     find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
393*e4b17023SJohn Marino     {
394*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n);
395*e4b17023SJohn Marino       for (; __pos < this->size(); ++__pos)
396*e4b17023SJohn Marino 	if (!traits_type::find(__s, __n, this->_M_data()[__pos]))
397*e4b17023SJohn Marino 	  return __pos;
398*e4b17023SJohn Marino       return npos;
399*e4b17023SJohn Marino     }
400*e4b17023SJohn Marino 
401*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
402*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
403*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
404*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_first_not_of(_CharT __c,size_type __pos) const405*e4b17023SJohn Marino     find_first_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
406*e4b17023SJohn Marino     {
407*e4b17023SJohn Marino       for (; __pos < this->size(); ++__pos)
408*e4b17023SJohn Marino 	if (!traits_type::eq(this->_M_data()[__pos], __c))
409*e4b17023SJohn Marino 	  return __pos;
410*e4b17023SJohn Marino       return npos;
411*e4b17023SJohn Marino     }
412*e4b17023SJohn Marino 
413*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
414*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
415*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
416*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_last_not_of(const _CharT * __s,size_type __pos,size_type __n) const417*e4b17023SJohn Marino     find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
418*e4b17023SJohn Marino     {
419*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n);
420*e4b17023SJohn Marino       size_type __size = this->size();
421*e4b17023SJohn Marino       if (__size)
422*e4b17023SJohn Marino 	{
423*e4b17023SJohn Marino 	  if (--__size > __pos)
424*e4b17023SJohn Marino 	    __size = __pos;
425*e4b17023SJohn Marino 	  do
426*e4b17023SJohn Marino 	    {
427*e4b17023SJohn Marino 	      if (!traits_type::find(__s, __n, this->_M_data()[__size]))
428*e4b17023SJohn Marino 		return __size;
429*e4b17023SJohn Marino 	    }
430*e4b17023SJohn Marino 	  while (__size--);
431*e4b17023SJohn Marino 	}
432*e4b17023SJohn Marino       return npos;
433*e4b17023SJohn Marino     }
434*e4b17023SJohn Marino 
435*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
436*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
437*e4b17023SJohn Marino     typename __versa_string<_CharT, _Traits, _Alloc, _Base>::size_type
438*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
find_last_not_of(_CharT __c,size_type __pos) const439*e4b17023SJohn Marino     find_last_not_of(_CharT __c, size_type __pos) const _GLIBCXX_NOEXCEPT
440*e4b17023SJohn Marino     {
441*e4b17023SJohn Marino       size_type __size = this->size();
442*e4b17023SJohn Marino       if (__size)
443*e4b17023SJohn Marino 	{
444*e4b17023SJohn Marino 	  if (--__size > __pos)
445*e4b17023SJohn Marino 	    __size = __pos;
446*e4b17023SJohn Marino 	  do
447*e4b17023SJohn Marino 	    {
448*e4b17023SJohn Marino 	      if (!traits_type::eq(this->_M_data()[__size], __c))
449*e4b17023SJohn Marino 		return __size;
450*e4b17023SJohn Marino 	    }
451*e4b17023SJohn Marino 	  while (__size--);
452*e4b17023SJohn Marino 	}
453*e4b17023SJohn Marino       return npos;
454*e4b17023SJohn Marino     }
455*e4b17023SJohn Marino 
456*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
457*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
458*e4b17023SJohn Marino     int
459*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos,size_type __n,const __versa_string & __str) const460*e4b17023SJohn Marino     compare(size_type __pos, size_type __n, const __versa_string& __str) const
461*e4b17023SJohn Marino     {
462*e4b17023SJohn Marino       _M_check(__pos, "__versa_string::compare");
463*e4b17023SJohn Marino       __n = _M_limit(__pos, __n);
464*e4b17023SJohn Marino       const size_type __osize = __str.size();
465*e4b17023SJohn Marino       const size_type __len = std::min(__n, __osize);
466*e4b17023SJohn Marino       int __r = traits_type::compare(this->_M_data() + __pos,
467*e4b17023SJohn Marino 				     __str.data(), __len);
468*e4b17023SJohn Marino       if (!__r)
469*e4b17023SJohn Marino 	__r = this->_S_compare(__n, __osize);
470*e4b17023SJohn Marino       return __r;
471*e4b17023SJohn Marino     }
472*e4b17023SJohn Marino 
473*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
474*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
475*e4b17023SJohn Marino     int
476*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos1,size_type __n1,const __versa_string & __str,size_type __pos2,size_type __n2) const477*e4b17023SJohn Marino     compare(size_type __pos1, size_type __n1, const __versa_string& __str,
478*e4b17023SJohn Marino 	    size_type __pos2, size_type __n2) const
479*e4b17023SJohn Marino     {
480*e4b17023SJohn Marino       _M_check(__pos1, "__versa_string::compare");
481*e4b17023SJohn Marino       __str._M_check(__pos2, "__versa_string::compare");
482*e4b17023SJohn Marino       __n1 = _M_limit(__pos1, __n1);
483*e4b17023SJohn Marino       __n2 = __str._M_limit(__pos2, __n2);
484*e4b17023SJohn Marino       const size_type __len = std::min(__n1, __n2);
485*e4b17023SJohn Marino       int __r = traits_type::compare(this->_M_data() + __pos1,
486*e4b17023SJohn Marino 				     __str.data() + __pos2, __len);
487*e4b17023SJohn Marino       if (!__r)
488*e4b17023SJohn Marino 	__r = this->_S_compare(__n1, __n2);
489*e4b17023SJohn Marino       return __r;
490*e4b17023SJohn Marino     }
491*e4b17023SJohn Marino 
492*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
493*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
494*e4b17023SJohn Marino     int
495*e4b17023SJohn Marino     __versa_string<_CharT, _Traits, _Alloc, _Base>::
compare(const _CharT * __s) const496*e4b17023SJohn Marino     compare(const _CharT* __s) const
497*e4b17023SJohn Marino     {
498*e4b17023SJohn Marino       __glibcxx_requires_string(__s);
499*e4b17023SJohn Marino       const size_type __size = this->size();
500*e4b17023SJohn Marino       const size_type __osize = traits_type::length(__s);
501*e4b17023SJohn Marino       const size_type __len = std::min(__size, __osize);
502*e4b17023SJohn Marino       int __r = traits_type::compare(this->_M_data(), __s, __len);
503*e4b17023SJohn Marino       if (!__r)
504*e4b17023SJohn Marino 	__r = this->_S_compare(__size, __osize);
505*e4b17023SJohn Marino       return __r;
506*e4b17023SJohn Marino     }
507*e4b17023SJohn Marino 
508*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
509*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
510*e4b17023SJohn Marino     int
511*e4b17023SJohn Marino     __versa_string <_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos,size_type __n1,const _CharT * __s) const512*e4b17023SJohn Marino     compare(size_type __pos, size_type __n1, const _CharT* __s) const
513*e4b17023SJohn Marino     {
514*e4b17023SJohn Marino       __glibcxx_requires_string(__s);
515*e4b17023SJohn Marino       _M_check(__pos, "__versa_string::compare");
516*e4b17023SJohn Marino       __n1 = _M_limit(__pos, __n1);
517*e4b17023SJohn Marino       const size_type __osize = traits_type::length(__s);
518*e4b17023SJohn Marino       const size_type __len = std::min(__n1, __osize);
519*e4b17023SJohn Marino       int __r = traits_type::compare(this->_M_data() + __pos, __s, __len);
520*e4b17023SJohn Marino       if (!__r)
521*e4b17023SJohn Marino 	__r = this->_S_compare(__n1, __osize);
522*e4b17023SJohn Marino       return __r;
523*e4b17023SJohn Marino     }
524*e4b17023SJohn Marino 
525*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
526*e4b17023SJohn Marino 	   template <typename, typename, typename> class _Base>
527*e4b17023SJohn Marino     int
528*e4b17023SJohn Marino     __versa_string <_CharT, _Traits, _Alloc, _Base>::
compare(size_type __pos,size_type __n1,const _CharT * __s,size_type __n2) const529*e4b17023SJohn Marino     compare(size_type __pos, size_type __n1, const _CharT* __s,
530*e4b17023SJohn Marino 	    size_type __n2) const
531*e4b17023SJohn Marino     {
532*e4b17023SJohn Marino       __glibcxx_requires_string_len(__s, __n2);
533*e4b17023SJohn Marino       _M_check(__pos, "__versa_string::compare");
534*e4b17023SJohn Marino       __n1 = _M_limit(__pos, __n1);
535*e4b17023SJohn Marino       const size_type __len = std::min(__n1, __n2);
536*e4b17023SJohn Marino       int __r = traits_type::compare(this->_M_data() + __pos, __s, __len);
537*e4b17023SJohn Marino       if (!__r)
538*e4b17023SJohn Marino 	__r = this->_S_compare(__n1, __n2);
539*e4b17023SJohn Marino       return __r;
540*e4b17023SJohn Marino     }
541*e4b17023SJohn Marino 
542*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
543*e4b17023SJohn Marino } // namespace
544*e4b17023SJohn Marino 
545*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
546*e4b17023SJohn Marino {
547*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
548*e4b17023SJohn Marino 
549*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
550*e4b17023SJohn Marino            template <typename, typename, typename> class _Base>
551*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
operator >>(basic_istream<_CharT,_Traits> & __in,__gnu_cxx::__versa_string<_CharT,_Traits,_Alloc,_Base> & __str)552*e4b17023SJohn Marino     operator>>(basic_istream<_CharT, _Traits>& __in,
553*e4b17023SJohn Marino 	       __gnu_cxx::__versa_string<_CharT, _Traits,
554*e4b17023SJohn Marino 	                                 _Alloc, _Base>& __str)
555*e4b17023SJohn Marino     {
556*e4b17023SJohn Marino       typedef basic_istream<_CharT, _Traits>            __istream_type;
557*e4b17023SJohn Marino       typedef typename __istream_type::ios_base         __ios_base;
558*e4b17023SJohn Marino       typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>
559*e4b17023SJohn Marino 	                                                __string_type;
560*e4b17023SJohn Marino       typedef typename __istream_type::int_type		__int_type;
561*e4b17023SJohn Marino       typedef typename __string_type::size_type		__size_type;
562*e4b17023SJohn Marino       typedef ctype<_CharT>				__ctype_type;
563*e4b17023SJohn Marino       typedef typename __ctype_type::ctype_base         __ctype_base;
564*e4b17023SJohn Marino 
565*e4b17023SJohn Marino       __size_type __extracted = 0;
566*e4b17023SJohn Marino       typename __ios_base::iostate __err = __ios_base::goodbit;
567*e4b17023SJohn Marino       typename __istream_type::sentry __cerb(__in, false);
568*e4b17023SJohn Marino       if (__cerb)
569*e4b17023SJohn Marino 	{
570*e4b17023SJohn Marino 	  __try
571*e4b17023SJohn Marino 	    {
572*e4b17023SJohn Marino 	      // Avoid reallocation for common case.
573*e4b17023SJohn Marino 	      __str.erase();
574*e4b17023SJohn Marino 	      _CharT __buf[128];
575*e4b17023SJohn Marino 	      __size_type __len = 0;
576*e4b17023SJohn Marino 	      const streamsize __w = __in.width();
577*e4b17023SJohn Marino 	      const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
578*e4b17023SJohn Marino 		                              : __str.max_size();
579*e4b17023SJohn Marino 	      const __ctype_type& __ct = use_facet<__ctype_type>(__in.getloc());
580*e4b17023SJohn Marino 	      const __int_type __eof = _Traits::eof();
581*e4b17023SJohn Marino 	      __int_type __c = __in.rdbuf()->sgetc();
582*e4b17023SJohn Marino 
583*e4b17023SJohn Marino 	      while (__extracted < __n
584*e4b17023SJohn Marino 		     && !_Traits::eq_int_type(__c, __eof)
585*e4b17023SJohn Marino 		     && !__ct.is(__ctype_base::space,
586*e4b17023SJohn Marino 				 _Traits::to_char_type(__c)))
587*e4b17023SJohn Marino 		{
588*e4b17023SJohn Marino 		  if (__len == sizeof(__buf) / sizeof(_CharT))
589*e4b17023SJohn Marino 		    {
590*e4b17023SJohn Marino 		      __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
591*e4b17023SJohn Marino 		      __len = 0;
592*e4b17023SJohn Marino 		    }
593*e4b17023SJohn Marino 		  __buf[__len++] = _Traits::to_char_type(__c);
594*e4b17023SJohn Marino 		  ++__extracted;
595*e4b17023SJohn Marino 		  __c = __in.rdbuf()->snextc();
596*e4b17023SJohn Marino 		}
597*e4b17023SJohn Marino 	      __str.append(__buf, __len);
598*e4b17023SJohn Marino 
599*e4b17023SJohn Marino 	      if (_Traits::eq_int_type(__c, __eof))
600*e4b17023SJohn Marino 		__err |= __ios_base::eofbit;
601*e4b17023SJohn Marino 	      __in.width(0);
602*e4b17023SJohn Marino 	    }
603*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
604*e4b17023SJohn Marino 	    {
605*e4b17023SJohn Marino 	      __in._M_setstate(__ios_base::badbit);
606*e4b17023SJohn Marino 	      __throw_exception_again;
607*e4b17023SJohn Marino 	    }
608*e4b17023SJohn Marino 	  __catch(...)
609*e4b17023SJohn Marino 	    {
610*e4b17023SJohn Marino 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
611*e4b17023SJohn Marino 	      // 91. Description of operator>> and getline() for string<>
612*e4b17023SJohn Marino 	      // might cause endless loop
613*e4b17023SJohn Marino 	      __in._M_setstate(__ios_base::badbit);
614*e4b17023SJohn Marino 	    }
615*e4b17023SJohn Marino 	}
616*e4b17023SJohn Marino       // 211.  operator>>(istream&, string&) doesn't set failbit
617*e4b17023SJohn Marino       if (!__extracted)
618*e4b17023SJohn Marino 	__err |= __ios_base::failbit;
619*e4b17023SJohn Marino       if (__err)
620*e4b17023SJohn Marino 	__in.setstate(__err);
621*e4b17023SJohn Marino       return __in;
622*e4b17023SJohn Marino     }
623*e4b17023SJohn Marino 
624*e4b17023SJohn Marino   template<typename _CharT, typename _Traits, typename _Alloc,
625*e4b17023SJohn Marino            template <typename, typename, typename> class _Base>
626*e4b17023SJohn Marino     basic_istream<_CharT, _Traits>&
getline(basic_istream<_CharT,_Traits> & __in,__gnu_cxx::__versa_string<_CharT,_Traits,_Alloc,_Base> & __str,_CharT __delim)627*e4b17023SJohn Marino     getline(basic_istream<_CharT, _Traits>& __in,
628*e4b17023SJohn Marino 	    __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str,
629*e4b17023SJohn Marino 	    _CharT __delim)
630*e4b17023SJohn Marino     {
631*e4b17023SJohn Marino       typedef basic_istream<_CharT, _Traits>	        __istream_type;
632*e4b17023SJohn Marino       typedef typename __istream_type::ios_base         __ios_base;
633*e4b17023SJohn Marino       typedef __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>
634*e4b17023SJohn Marino 	                                                __string_type;
635*e4b17023SJohn Marino       typedef typename __istream_type::int_type		__int_type;
636*e4b17023SJohn Marino       typedef typename __string_type::size_type		__size_type;
637*e4b17023SJohn Marino 
638*e4b17023SJohn Marino       __size_type __extracted = 0;
639*e4b17023SJohn Marino       const __size_type __n = __str.max_size();
640*e4b17023SJohn Marino       typename __ios_base::iostate __err = __ios_base::goodbit;
641*e4b17023SJohn Marino       typename __istream_type::sentry __cerb(__in, true);
642*e4b17023SJohn Marino       if (__cerb)
643*e4b17023SJohn Marino 	{
644*e4b17023SJohn Marino 	  __try
645*e4b17023SJohn Marino 	    {
646*e4b17023SJohn Marino 	      // Avoid reallocation for common case.
647*e4b17023SJohn Marino 	      __str.erase();
648*e4b17023SJohn Marino 	      _CharT __buf[128];
649*e4b17023SJohn Marino 	      __size_type __len = 0;
650*e4b17023SJohn Marino 	      const __int_type __idelim = _Traits::to_int_type(__delim);
651*e4b17023SJohn Marino 	      const __int_type __eof = _Traits::eof();
652*e4b17023SJohn Marino 	      __int_type __c = __in.rdbuf()->sgetc();
653*e4b17023SJohn Marino 
654*e4b17023SJohn Marino 	      while (__extracted < __n
655*e4b17023SJohn Marino 		     && !_Traits::eq_int_type(__c, __eof)
656*e4b17023SJohn Marino 		     && !_Traits::eq_int_type(__c, __idelim))
657*e4b17023SJohn Marino 		{
658*e4b17023SJohn Marino 		  if (__len == sizeof(__buf) / sizeof(_CharT))
659*e4b17023SJohn Marino 		    {
660*e4b17023SJohn Marino 		      __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
661*e4b17023SJohn Marino 		      __len = 0;
662*e4b17023SJohn Marino 		    }
663*e4b17023SJohn Marino 		  __buf[__len++] = _Traits::to_char_type(__c);
664*e4b17023SJohn Marino 		  ++__extracted;
665*e4b17023SJohn Marino 		  __c = __in.rdbuf()->snextc();
666*e4b17023SJohn Marino 		}
667*e4b17023SJohn Marino 	      __str.append(__buf, __len);
668*e4b17023SJohn Marino 
669*e4b17023SJohn Marino 	      if (_Traits::eq_int_type(__c, __eof))
670*e4b17023SJohn Marino 		__err |= __ios_base::eofbit;
671*e4b17023SJohn Marino 	      else if (_Traits::eq_int_type(__c, __idelim))
672*e4b17023SJohn Marino 		{
673*e4b17023SJohn Marino 		  ++__extracted;
674*e4b17023SJohn Marino 		  __in.rdbuf()->sbumpc();
675*e4b17023SJohn Marino 		}
676*e4b17023SJohn Marino 	      else
677*e4b17023SJohn Marino 		__err |= __ios_base::failbit;
678*e4b17023SJohn Marino 	    }
679*e4b17023SJohn Marino 	  __catch(__cxxabiv1::__forced_unwind&)
680*e4b17023SJohn Marino 	    {
681*e4b17023SJohn Marino 	      __in._M_setstate(__ios_base::badbit);
682*e4b17023SJohn Marino 	      __throw_exception_again;
683*e4b17023SJohn Marino 	    }
684*e4b17023SJohn Marino 	  __catch(...)
685*e4b17023SJohn Marino 	    {
686*e4b17023SJohn Marino 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
687*e4b17023SJohn Marino 	      // 91. Description of operator>> and getline() for string<>
688*e4b17023SJohn Marino 	      // might cause endless loop
689*e4b17023SJohn Marino 	      __in._M_setstate(__ios_base::badbit);
690*e4b17023SJohn Marino 	    }
691*e4b17023SJohn Marino 	}
692*e4b17023SJohn Marino       if (!__extracted)
693*e4b17023SJohn Marino 	__err |= __ios_base::failbit;
694*e4b17023SJohn Marino       if (__err)
695*e4b17023SJohn Marino 	__in.setstate(__err);
696*e4b17023SJohn Marino       return __in;
697*e4b17023SJohn Marino     }
698*e4b17023SJohn Marino 
699*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
700*e4b17023SJohn Marino } // namespace
701*e4b17023SJohn Marino 
702*e4b17023SJohn Marino #endif // _VSTRING_TCC
703