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