31#if 3 == __GNUG__ && 3 > __GNUC_MINOR__ \
32 || 3 == __GNUC_MINOR__ && 1 >__GNUC_PATCHLEVEL__
36# ifndef _RWSTD_NO_EXTERN_TEMPLATE
37# define _RWSTD_NO_EXTERN_TEMPLATE
53strstreambuf::~strstreambuf ()
57 if ( _C_buffer && _C_state & _C_allocated
58 && !(_C_state & _C_frozen)) {
67 strstreambuf::int_type
68strstreambuf::overflow (int_type
c)
72 if (!_C_is_out () || !(_C_state & _C_dynamic))
73 return traits_type::eof ();
76 return traits_type::not_eof (
c);
79 if (!(pptr () < epptr ())) {
81 const streamsize new_size =
82 _C_bufsize ? _C_bufsize * 2 : _C_alsize ? _C_alsize : 128;
85 if (!strstreambuf::setbuf (0, new_size))
86 return traits_type::eof ();
89 return sputc (traits_type::to_char_type (
c));
93 strstreambuf::int_type
94strstreambuf::pbackfail (int_type
c)
98 typedef traits_type
Traits;
100 if (eback () < gptr ()) {
104 if (Traits::eq_int_type (
c, Traits::eof ())) {
109 return Traits::not_eof (
c);
112 if (Traits::eq_int_type (Traits::to_int_type (*(gptr () - 1)),
c)) {
120 if (!(_C_state & _C_constant)) {
125 Traits::assign (*gptr (), Traits::to_char_type (
c));
131 return Traits::eof ();
135 strstreambuf::int_type
136strstreambuf::underflow ()
140 if (gptr () < egptr ()) {
144 return traits_type::to_int_type (*gptr ());
147 if (pptr () > egptr ()) {
151 setg (eback (), gptr (), pptr ());
153 setg (pbase (), pbase (), pptr ());
155 return traits_type::to_int_type (*gptr ());
159 return traits_type::eof ();
163 strstreambuf::pos_type
164strstreambuf::seekoff (off_type
off, ios::seekdir
way, ios::openmode
which)
173 char*
const seeklo = eback ();
174 char*
const seekhi = epptr () ? epptr () : egptr ();
176 const char*
const xnext =
which & ios::in ? gptr () : pptr ();
177 const char*
const xbeg =
which & ios::in ? eback () : pbase ();
181 return pos_type (off_type (-1));
183 off_type saved_off =
off;
187 off += off_type (xnext - xbeg);
188 else if (ios::end ==
way)
189 off += off_type (seekhi - xbeg);
192 if (off < seeklo - xbeg || off > seekhi - xbeg)
194 else if (
which & ios::in) {
197 if (
which & ios::out
199 || pos_type (-1) == seekoff (saved_off,
way, ios::out)))
200 return pos_type (off_type (-1));
203 if (
off <= egptr () - eback ())
204 setg (eback (), eback () +
off, egptr ());
205 else if (
off <= pptr () - egptr ())
206 setg (eback (), eback () +
off, pptr ());
208 setg (eback (), eback () +
off, epptr ());
210 else if (
which & ios::out) {
211 if (seeklo +
off < pbase ()) {
213 setp (seeklo, epptr ());
218 setp (pbase (), epptr ());
219 pbump (
off - (pbase () - seeklo));
227 return pos_type (
off);
231 strstreambuf::pos_type
232strstreambuf::seekpos (pos_type sp, ios::openmode
which)
238 return strstreambuf::seekoff (sp - pos_type (), ios::beg,
which);
243strstreambuf::setbuf (char_type*
buf, streamsize bufsize)
247 if ( !(_C_state & _C_dynamic) || (_C_state & _C_frozen)
248 || !
buf && !bufsize) {
265 const char_type*
const xbeg =
266 eback () && eback () < pbase () ? eback () : pbase ();
268 const char_type*
const xend =
269 epptr () && epptr () < egptr () ? egptr () : epptr ();
271 const char_type *gap_beg = pptr () < eback ()
272 ? pptr () : egptr () < pbase () ? egptr () : pbase ();
274 const char_type *gap_end = pptr () < eback ()
275 ? eback () : egptr () < pbase () ? egptr () : pbase ();
278 if (gap_end <= gap_beg)
279 gap_beg = gap_end = xend;
282 const streamsize
slen = streamsize ((xend - xbeg) - (gap_end - gap_beg));
284 if (bufsize <
slen || !_C_is_out ())
287 const bool free_old_buf = _C_own_buf ();
294 :
new char [bufsize];
309 traits_type::copy (
buf, xbeg, gap_beg - xbeg);
310 traits_type::copy (
buf + (gap_beg - xbeg), gap_end, xend - gap_end);
314 _C_pfree (_C_buffer);
320 _C_bufsize = bufsize;
322 const _RWSTD_PTRDIFF_T seq_1_size = gap_beg - xbeg;
325 const streamsize pptr_off = streamsize (pptr () - pbase ());
327 if (pbase () < gap_beg)
328 setp (_C_buffer, _C_buffer + _C_bufsize);
330 setp (_C_buffer + seq_1_size, _C_buffer + _C_bufsize);
335 char_type*
const gbeg = _C_buffer + (eback () < gap_beg ? 0 : seq_1_size);
336 setg (gbeg, gbeg + (gptr () - eback ()), gbeg + (egptr () - eback ()));
343_C_init (streamsize alsize,
347 void* (*palloc)(_RWSTD_SIZE_T),
348 void (*pdealloc)(
void*),
364 else if (!
n && gnext)
365 n = streamsize (traits_type::length (gnext));
368 _C_state = state | ios_base::in | ios_base::out;
372 setg (gnext, gnext, pbeg);
373 setp (pbeg, pbeg +
n);
377 setg (gnext, gnext, gnext +
n);
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_CONST_CAST(T, x)