Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
streambuf.cc
Go to the documentation of this file.
1// -*- C++ -*-
2
32
33
34template <class _CharT, class _Traits>
35basic_streambuf<_CharT, _Traits>::
36basic_streambuf (ios_base::openmode __mode /* = ios_base::in | ios_base::out */)
37 : _C_buffer (0),
38 _C_bufsize (0),
39 _C_state (__mode),
40 _C_eback (0),
41 _C_gptr (0),
42 _C_egptr (0),
43 _C_pbase (0),
44 _C_pptr (0),
45 _C_epptr (0)
46{
47 // no op
48}
49
50
51template <class _CharT, class _Traits>
52typename basic_streambuf<_CharT, _Traits>::int_type
53basic_streambuf<_CharT, _Traits>::
54uflow ()
55{
56 _RWSTD_ASSERT (_C_is_valid ());
57
58 const int_type __c = underflow ();
59
60 if (traits_type::eq_int_type (__c, traits_type::eof ()))
61 return traits_type::eof ();
62
63 // handle unbuffered input mode
64 if (_C_gptr < _C_egptr)
65 return traits_type::to_int_type (*_C_gptr++);
66
67 return __c;
68}
69
70
71template <class _CharT, class _Traits>
72streamsize
73basic_streambuf<_CharT, _Traits>::
74xsgetn (char_type* __buf, streamsize __n)
75{
76 _RWSTD_ASSERT (_C_is_valid ());
77
78 // number of characters read
79 streamsize __nget = 0;
80
81 while (__n) {
82
83 // save the value returned from underflow() since the function
84 // can fill the buffer and still fail, say due to a code
85 // conversion error
86
87 const int_type __c = gptr () == egptr () ?
88 underflow () : traits_type::not_eof (traits_type::eof ());
89
90 // number of characters available in get area
91 streamsize __navail = egptr () - gptr ();
92
93 if (0 < __navail) {
94 if (__navail > __n)
95 __navail = __n;
96
97 // copy contents of get area to the destination buffer
98 traits_type::copy (__buf + __nget, gptr (), __navail);
99
100 // increment pointers and counts by the number of characters
101 // copied
102 gbump (__navail);
103 __n -= __navail;
104 __nget += __navail;
105 }
106 else if (traits_type::eq_int_type (__c, traits_type::eof ())) {
107 // break out on underflow() failure (e.g., reaching EOF)
108 break;
109 }
110 else {
111 // unbuffered mode: empty pending seuqence but non-EOF
112 // overflow() return value
113
114 // append character returned by underflow()
115 traits_type::assign (__buf [__nget],
116 traits_type::to_char_type (__c));
117
118 // avoid incrementing egptr() but adjust counters
119 --__n;
120 ++__nget;
121 }
122 }
123
124 return __nget;
125}
126
127
128template<class _CharT, class _Traits>
129streamsize
130basic_streambuf<_CharT, _Traits>::
131xsputn (const char_type* __buf, streamsize __n)
132{
133 _RWSTD_ASSERT (0 != __buf || 0 == __n);
134 _RWSTD_ASSERT (_C_is_valid ());
135
136 if (__n <= 0 || !_C_is_out ())
137 return 0;
138
139 streamsize __nput = 0;
140
141 for (; ; ++__buf, --__n, ++__nput) {
142 const streamsize __navail = epptr () - pptr ();
143 const streamsize __nwrite = __navail < __n ? __navail : __n;
144
145 traits_type::copy (pptr (), __buf, __nwrite);
146
147 pbump (__nwrite);
148
149 __nput += __nwrite;
150
151 if (__nwrite == __n)
152 break;
153
154 __buf += __nwrite;
155 __n -= __nwrite;
156
157 const int_type __c = overflow (traits_type::to_int_type (*__buf));
158
159 if (traits_type::eq_int_type (traits_type::eof (), __c))
160 break;
161 }
162
163 return __nput;
164}
165
166
167} // namespace std
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
#define _RWSTD_ASSERT(ignore)
Definition _defs.h:1108
Definition json.h:5363