williamr@2
|
1 |
/*
|
williamr@2
|
2 |
* Copyright (c) 1999
|
williamr@2
|
3 |
* Silicon Graphics Computer Systems, Inc.
|
williamr@2
|
4 |
*
|
williamr@4
|
5 |
* Copyright (c) 1999
|
williamr@2
|
6 |
* Boris Fomitchev
|
williamr@2
|
7 |
*
|
williamr@2
|
8 |
* This material is provided "as is", with absolutely no warranty expressed
|
williamr@2
|
9 |
* or implied. Any use is at your own risk.
|
williamr@2
|
10 |
*
|
williamr@4
|
11 |
* Permission to use or copy this software for any purpose is hereby granted
|
williamr@2
|
12 |
* without fee, provided the above notices are retained on all copies.
|
williamr@2
|
13 |
* Permission to modify the code and to distribute modified code is granted,
|
williamr@2
|
14 |
* provided the above notices are retained, and a notice that the code was
|
williamr@2
|
15 |
* modified is included with the above copyright notice.
|
williamr@2
|
16 |
*
|
williamr@4
|
17 |
*/
|
williamr@2
|
18 |
#ifndef _STLP_STREAMBUF_C
|
williamr@2
|
19 |
#define _STLP_STREAMBUF_C
|
williamr@2
|
20 |
|
williamr@2
|
21 |
#ifndef _STLP_INTERNAL_STREAMBUF
|
williamr@4
|
22 |
# include <stl/_streambuf.h>
|
williamr@2
|
23 |
#endif
|
williamr@2
|
24 |
|
williamr@2
|
25 |
_STLP_BEGIN_NAMESPACE
|
williamr@2
|
26 |
//----------------------------------------------------------------------
|
williamr@2
|
27 |
// Non-inline basic_streambuf<> member functions.
|
williamr@2
|
28 |
|
williamr@4
|
29 |
#if !defined (_STLP_MSVC) || (_STLP_MSVC >= 1300) || !defined (_STLP_USE_STATIC_LIB)
|
williamr@2
|
30 |
template <class _CharT, class _Traits>
|
williamr@4
|
31 |
basic_streambuf<_CharT, _Traits>::basic_streambuf()
|
williamr@2
|
32 |
: _M_gbegin(0), _M_gnext(0), _M_gend(0),
|
williamr@2
|
33 |
_M_pbegin(0), _M_pnext(0), _M_pend(0),
|
williamr@4
|
34 |
_M_locale() {
|
williamr@2
|
35 |
// _M_lock._M_initialize();
|
williamr@2
|
36 |
}
|
williamr@4
|
37 |
#endif
|
williamr@2
|
38 |
|
williamr@2
|
39 |
template <class _CharT, class _Traits>
|
williamr@4
|
40 |
basic_streambuf<_CharT, _Traits>::~basic_streambuf()
|
williamr@2
|
41 |
{}
|
williamr@2
|
42 |
|
williamr@2
|
43 |
template <class _CharT, class _Traits>
|
williamr@4
|
44 |
locale
|
williamr@2
|
45 |
basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc) {
|
williamr@2
|
46 |
this->imbue(__loc);
|
williamr@2
|
47 |
locale __tmp = _M_locale;
|
williamr@2
|
48 |
_M_locale = __loc;
|
williamr@2
|
49 |
return __tmp;
|
williamr@2
|
50 |
}
|
williamr@2
|
51 |
|
williamr@2
|
52 |
template <class _CharT, class _Traits>
|
williamr@4
|
53 |
streamsize
|
williamr@4
|
54 |
basic_streambuf<_CharT, _Traits>::xsgetn(_CharT* __s, streamsize __n) {
|
williamr@2
|
55 |
streamsize __result = 0;
|
williamr@2
|
56 |
const int_type __eof = _Traits::eof();
|
williamr@2
|
57 |
|
williamr@2
|
58 |
while (__result < __n) {
|
williamr@2
|
59 |
if (_M_gnext < _M_gend) {
|
williamr@2
|
60 |
size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext),
|
williamr@4
|
61 |
__STATIC_CAST(size_t,__n - __result));
|
williamr@2
|
62 |
_Traits::copy(__s, _M_gnext, __chunk);
|
williamr@2
|
63 |
__result += __chunk;
|
williamr@2
|
64 |
__s += __chunk;
|
williamr@2
|
65 |
_M_gnext += __chunk;
|
williamr@2
|
66 |
}
|
williamr@2
|
67 |
else {
|
williamr@2
|
68 |
int_type __c = this->sbumpc();
|
williamr@2
|
69 |
if (!_Traits::eq_int_type(__c, __eof)) {
|
williamr@4
|
70 |
*__s = _Traits::to_char_type(__c);
|
williamr@2
|
71 |
++__result;
|
williamr@4
|
72 |
++__s;
|
williamr@2
|
73 |
}
|
williamr@2
|
74 |
else
|
williamr@4
|
75 |
break;
|
williamr@2
|
76 |
}
|
williamr@2
|
77 |
}
|
williamr@4
|
78 |
|
williamr@2
|
79 |
return __result;
|
williamr@2
|
80 |
}
|
williamr@2
|
81 |
|
williamr@2
|
82 |
template <class _CharT, class _Traits>
|
williamr@4
|
83 |
streamsize
|
williamr@2
|
84 |
basic_streambuf<_CharT, _Traits>::xsputn(const _CharT* __s, streamsize __n)
|
williamr@2
|
85 |
{
|
williamr@2
|
86 |
streamsize __result = 0;
|
williamr@2
|
87 |
const int_type __eof = _Traits::eof();
|
williamr@2
|
88 |
|
williamr@2
|
89 |
while (__result < __n) {
|
williamr@2
|
90 |
if (_M_pnext < _M_pend) {
|
williamr@2
|
91 |
size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
|
williamr@2
|
92 |
__STATIC_CAST(size_t,__n - __result));
|
williamr@2
|
93 |
_Traits::copy(_M_pnext, __s, __chunk);
|
williamr@2
|
94 |
__result += __chunk;
|
williamr@2
|
95 |
__s += __chunk;
|
williamr@2
|
96 |
_M_pnext += __chunk;
|
williamr@2
|
97 |
}
|
williamr@2
|
98 |
|
williamr@2
|
99 |
else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)),
|
williamr@2
|
100 |
__eof)) {
|
williamr@2
|
101 |
++__result;
|
williamr@2
|
102 |
++__s;
|
williamr@2
|
103 |
}
|
williamr@2
|
104 |
else
|
williamr@2
|
105 |
break;
|
williamr@2
|
106 |
}
|
williamr@2
|
107 |
return __result;
|
williamr@2
|
108 |
}
|
williamr@2
|
109 |
|
williamr@2
|
110 |
template <class _CharT, class _Traits>
|
williamr@4
|
111 |
streamsize
|
williamr@2
|
112 |
basic_streambuf<_CharT, _Traits>::_M_xsputnc(_CharT __c, streamsize __n)
|
williamr@2
|
113 |
{
|
williamr@2
|
114 |
streamsize __result = 0;
|
williamr@2
|
115 |
const int_type __eof = _Traits::eof();
|
williamr@2
|
116 |
|
williamr@2
|
117 |
while (__result < __n) {
|
williamr@2
|
118 |
if (_M_pnext < _M_pend) {
|
williamr@2
|
119 |
size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
|
williamr@2
|
120 |
__STATIC_CAST(size_t,__n - __result));
|
williamr@2
|
121 |
_Traits::assign(_M_pnext, __chunk, __c);
|
williamr@2
|
122 |
__result += __chunk;
|
williamr@2
|
123 |
_M_pnext += __chunk;
|
williamr@2
|
124 |
}
|
williamr@2
|
125 |
|
williamr@2
|
126 |
else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)),
|
williamr@2
|
127 |
__eof))
|
williamr@2
|
128 |
++__result;
|
williamr@2
|
129 |
else
|
williamr@2
|
130 |
break;
|
williamr@2
|
131 |
}
|
williamr@2
|
132 |
return __result;
|
williamr@2
|
133 |
}
|
williamr@2
|
134 |
|
williamr@2
|
135 |
template <class _CharT, class _Traits>
|
williamr@4
|
136 |
_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
|
williamr@4
|
137 |
basic_streambuf<_CharT, _Traits>::_M_snextc_aux()
|
williamr@2
|
138 |
{
|
williamr@2
|
139 |
int_type __eof = _Traits::eof();
|
williamr@2
|
140 |
if (_M_gend == _M_gnext)
|
williamr@2
|
141 |
return _Traits::eq_int_type(this->uflow(), __eof) ? __eof : this->sgetc();
|
williamr@2
|
142 |
else {
|
williamr@2
|
143 |
_M_gnext = _M_gend;
|
williamr@2
|
144 |
return this->underflow();
|
williamr@2
|
145 |
}
|
williamr@2
|
146 |
}
|
williamr@2
|
147 |
|
williamr@2
|
148 |
template <class _CharT, class _Traits>
|
williamr@4
|
149 |
_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
|
williamr@4
|
150 |
basic_streambuf<_CharT, _Traits>::pbackfail(int_type) {
|
williamr@4
|
151 |
return _Traits::eof();
|
williamr@2
|
152 |
}
|
williamr@2
|
153 |
|
williamr@2
|
154 |
template <class _CharT, class _Traits>
|
williamr@4
|
155 |
_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
|
williamr@4
|
156 |
basic_streambuf<_CharT, _Traits>::overflow(int_type) {
|
williamr@4
|
157 |
return _Traits::eof();
|
williamr@2
|
158 |
}
|
williamr@2
|
159 |
|
williamr@2
|
160 |
template <class _CharT, class _Traits>
|
williamr@4
|
161 |
_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
|
williamr@2
|
162 |
basic_streambuf<_CharT, _Traits>::uflow() {
|
williamr@2
|
163 |
return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ?
|
williamr@2
|
164 |
_Traits::eof() :
|
williamr@2
|
165 |
_Traits::to_int_type(*_M_gnext++));
|
williamr@2
|
166 |
}
|
williamr@2
|
167 |
|
williamr@2
|
168 |
template <class _CharT, class _Traits>
|
williamr@4
|
169 |
_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type
|
williamr@2
|
170 |
basic_streambuf<_CharT, _Traits>::underflow()
|
williamr@2
|
171 |
{ return _Traits::eof(); }
|
williamr@2
|
172 |
|
williamr@2
|
173 |
template <class _CharT, class _Traits>
|
williamr@4
|
174 |
streamsize
|
williamr@2
|
175 |
basic_streambuf<_CharT, _Traits>::showmanyc()
|
williamr@2
|
176 |
{ return 0; }
|
williamr@2
|
177 |
|
williamr@2
|
178 |
template <class _CharT, class _Traits>
|
williamr@4
|
179 |
void
|
williamr@2
|
180 |
basic_streambuf<_CharT, _Traits>::imbue(const locale&) {}
|
williamr@2
|
181 |
|
williamr@2
|
182 |
template <class _CharT, class _Traits>
|
williamr@4
|
183 |
int
|
williamr@2
|
184 |
basic_streambuf<_CharT, _Traits>::sync() { return 0; }
|
williamr@2
|
185 |
|
williamr@2
|
186 |
template <class _CharT, class _Traits>
|
williamr@4
|
187 |
_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type
|
williamr@2
|
188 |
basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
|
williamr@2
|
189 |
{ return pos_type(-1); }
|
williamr@2
|
190 |
|
williamr@2
|
191 |
template <class _CharT, class _Traits>
|
williamr@4
|
192 |
_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type
|
williamr@2
|
193 |
basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
|
williamr@4
|
194 |
ios_base::openmode)
|
williamr@2
|
195 |
{ return pos_type(-1); }
|
williamr@2
|
196 |
|
williamr@2
|
197 |
template <class _CharT, class _Traits>
|
williamr@4
|
198 |
basic_streambuf<_CharT, _Traits>*
|
williamr@2
|
199 |
basic_streambuf<_CharT, _Traits>:: setbuf(char_type*, streamsize)
|
williamr@2
|
200 |
{ return this; }
|
williamr@2
|
201 |
|
williamr@2
|
202 |
_STLP_END_NAMESPACE
|
williamr@2
|
203 |
|
williamr@4
|
204 |
#endif
|
williamr@2
|
205 |
|
williamr@4
|
206 |
// Local Variables:
|
williamr@4
|
207 |
// mode:C++
|
williamr@4
|
208 |
// End:
|