Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4680 right-hear 1
// String based streams -*- C++ -*-
2
 
3
// Copyright (C) 1997-1999, 2001 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 2, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// You should have received a copy of the GNU General Public License along
17
// with this library; see the file COPYING.  If not, write to the Free
18
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19
// USA.
20
 
21
// As a special exception, you may use this file as part of a free software
22
// library without restriction.  Specifically, if other files instantiate
23
// templates or use macros or inline functions from this file, or you compile
24
// this file and link it with other files to produce an executable, this
25
// file does not by itself cause the resulting executable to be covered by
26
// the GNU General Public License.  This exception does not however
27
// invalidate any other reasons why the executable file might be covered by
28
// the GNU General Public License.
29
 
30
//
31
// ISO C++ 14882: 27.7  String-based streams
32
//
33
 
34
#ifndef _CPP_BITS_SSTREAM_TCC
35
#define _CPP_BITS_SSTREAM_TCC	1
36
 
37
#include 
38
 
39
namespace std
40
{
41
 
42
  template 
43
    basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
44
    basic_stringbuf<_CharT, _Traits, _Alloc>::
45
    pbackfail(int_type __c)
46
    {
47
      int_type __ret = traits_type::eof();
48
      bool __testeof = traits_type::eq_int_type(__c, traits_type::eof());
49
      bool __testpos = _M_in_cur && _M_in_beg < _M_in_cur;
50
 
51
      // Try to put back __c into input sequence in one of three ways.
52
      // Order these tests done in is unspecified by the standard.
53
      if (__testpos)
54
	{
55
	  if (traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])
56
	      && !__testeof)
57
	    {
58
	      --_M_in_cur;
59
	      __ret = __c;
60
	    }
61
	  else if (!__testeof)
62
	    {
63
	      --_M_in_cur;
64
	      *_M_in_cur = traits_type::to_char_type(__c);
65
	      __ret = __c;
66
	    }
67
	  else if (__testeof)
68
	    {
69
	      --_M_in_cur;
70
	      __ret = traits_type::not_eof(__c);
71
	    }
72
	}
73
      return __ret;
74
    }
75
 
76
  template 
77
    basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
78
    basic_stringbuf<_CharT, _Traits, _Alloc>::
79
    overflow(int_type __c)
80
    {
81
      int_type __ret = traits_type::eof();
82
      bool __testeof = traits_type::eq_int_type(__c, __ret);
83
      bool __testwrite = _M_out_cur < _M_buf + _M_buf_size;
84
      bool __testout = _M_mode & ios_base::out;
85
 
86
      // Try to append __c into output sequence in one of two ways.
87
      // Order these tests done in is unspecified by the standard.
88
      if (__testout)
89
	{
90
	  if (!__testeof)
91
	    {
92
	      __size_type __len = max(_M_buf_size, _M_buf_size_opt);
93
	      __len *= 2;
94
 
95
	      if (__testwrite)
96
		__ret = this->sputc(__c);
97
	      else if (__len <= _M_string.max_size())
98
		{
99
		  // Force-allocate, re-sync.
100
		  _M_string = this->str();
101
		  _M_string.reserve(__len);
102
		  _M_buf_size = static_cast(__len);
103
		  _M_really_sync(_M_in_cur - _M_in_beg,
104
				 _M_out_cur - _M_out_beg);
105
		  *_M_out_cur = traits_type::to_char_type(__c);
106
		  _M_out_cur_move(1);
107
		  __ret = __c;
108
		}
109
	    }
110
	  else
111
	    __ret = traits_type::not_eof(__c);
112
	}
113
      return __ret;
114
    }
115
 
116
  template 
117
    basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
118
    basic_stringbuf<_CharT, _Traits, _Alloc>::
119
    seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
120
    {
121
      pos_type __ret =  pos_type(off_type(-1));
122
      bool __testin = __mode & ios_base::in && _M_mode & ios_base::in;
123
      bool __testout = __mode & ios_base::out && _M_mode & ios_base::out;
124
      bool __testboth = __testin && __testout && __way != ios_base::cur;
125
 
126
      if (_M_buf_size && ((__testin != __testout) || __testboth))
127
	{
128
	  char_type* __beg = _M_buf;
129
	  char_type* __curi = NULL;
130
	  char_type* __curo = NULL;
131
	  char_type* __endi = NULL;
132
	  char_type* __endo = NULL;
133
 
134
	  if (__testin)
135
	    {
136
	      __curi = this->gptr();
137
	      __endi = this->egptr();
138
	    }
139
	  if (__testout)
140
	    {
141
	      __curo = this->pptr();
142
	      __endo = this->epptr();
143
	    }
144
 
145
	  off_type __newoffi = 0;
146
	  off_type __newoffo = 0;
147
	  if (__way == ios_base::cur)
148
	    {
149
	      __newoffi = __curi - __beg;
150
	      __newoffo = __curo - __beg;
151
	    }
152
	  else if (__way == ios_base::end)
153
	    {
154
	      __newoffi = __endi - __beg;
155
	      __newoffo = __endo - __beg;
156
	    }
157
 
158
	  if (__testin
159
	      && __newoffi + __off >= 0 && __endi - __beg >= __newoffi + __off)
160
	    {
161
	      _M_in_cur = __beg + __newoffi + __off;
162
	      __ret = pos_type(__newoffi);
163
	    }
164
	  if (__testout
165
	      && __newoffo + __off >= 0 && __endo - __beg >= __newoffo + __off)
166
	    {
167
	      _M_out_cur_move(__newoffo + __off - (_M_out_cur - __beg));
168
	      __ret = pos_type(__newoffo);
169
	    }
170
	}
171
      return __ret;
172
    }
173
 
174
  template 
175
    basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
176
    basic_stringbuf<_CharT, _Traits, _Alloc>::
177
    seekpos(pos_type __sp, ios_base::openmode __mode)
178
    {
179
      pos_type __ret =  pos_type(off_type(-1));
180
      off_type __pos = __sp._M_position();
181
      char_type* __beg = NULL;
182
      char_type* __end = NULL;
183
      bool __testin = __mode & ios_base::in && _M_mode & ios_base::in;
184
      bool __testout = __mode & ios_base::out && _M_mode & ios_base::out;
185
 
186
      if (__testin)
187
	{
188
	  __beg = this->eback();
189
	  __end = this->egptr();
190
	}
191
      if (__testout)
192
	{
193
	  __beg = this->pbase();
194
	  __end = _M_buf + _M_buf_size;
195
	}
196
 
197
      if (0 <= __pos && __pos <= __end - __beg)
198
	{
199
	  // Need to set both of these if applicable
200
	  if (__testin)
201
	    _M_in_cur = _M_in_beg + __pos;
202
	  if (__testout)
203
	    _M_out_cur_move((__pos) - (_M_out_cur - __beg));
204
	  __ret = pos_type(off_type(__pos));
205
	}
206
 
207
      return __ret;
208
    }
209
 
210
} // namespace std
211
 
212
#endif	/* _CPP_BITS_SSTREAM_TCC */
213