williamr@2
|
1 |
#ifndef _STLP_STRING_IO_C
|
williamr@2
|
2 |
#define _STLP_STRING_IO_C
|
williamr@2
|
3 |
|
williamr@2
|
4 |
#ifndef _STLP_STRING_IO_H
|
williamr@4
|
5 |
# include <stl/_string_io.h>
|
williamr@2
|
6 |
#endif
|
williamr@2
|
7 |
|
williamr@2
|
8 |
#ifndef _STLP_INTERNAL_CTYPE_H
|
williamr@4
|
9 |
# include <stl/_ctype.h>
|
williamr@2
|
10 |
#endif
|
williamr@2
|
11 |
|
williamr@2
|
12 |
_STLP_BEGIN_NAMESPACE
|
williamr@2
|
13 |
|
williamr@2
|
14 |
template <class _CharT, class _Traits>
|
williamr@2
|
15 |
bool _STLP_CALL
|
williamr@2
|
16 |
__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
|
williamr@4
|
17 |
basic_streambuf<_CharT, _Traits>* __buf,
|
williamr@4
|
18 |
streamsize __n) {
|
williamr@2
|
19 |
_CharT __f = __os.fill();
|
williamr@4
|
20 |
for (streamsize __i = 0; __i < __n; ++__i) {
|
williamr@4
|
21 |
if (_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof()))
|
williamr@4
|
22 |
return false;
|
williamr@4
|
23 |
}
|
williamr@4
|
24 |
return true;
|
williamr@4
|
25 |
}
|
williamr@2
|
26 |
|
williamr@2
|
27 |
|
williamr@2
|
28 |
template <class _CharT, class _Traits, class _Alloc>
|
williamr@2
|
29 |
basic_ostream<_CharT, _Traits>& _STLP_CALL
|
williamr@4
|
30 |
operator << (basic_ostream<_CharT, _Traits>& __os,
|
williamr@4
|
31 |
const basic_string<_CharT,_Traits,_Alloc>& __s) {
|
williamr@4
|
32 |
typedef basic_ostream<_CharT, _Traits> __ostream;
|
williamr@4
|
33 |
typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
|
williamr@2
|
34 |
|
williamr@4
|
35 |
// The hypothesis of this implementation is that size_type is unsigned:
|
williamr@4
|
36 |
_STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0)
|
williamr@4
|
37 |
|
williamr@2
|
38 |
typename __ostream::sentry __sentry(__os);
|
williamr@2
|
39 |
bool __ok = false;
|
williamr@2
|
40 |
|
williamr@2
|
41 |
if (__sentry) {
|
williamr@2
|
42 |
__ok = true;
|
williamr@4
|
43 |
size_type __n = __s.size();
|
williamr@2
|
44 |
const bool __left = (__os.flags() & __ostream::left) != 0;
|
williamr@4
|
45 |
const streamsize __w = __os.width(0);
|
williamr@2
|
46 |
basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
|
williamr@2
|
47 |
|
williamr@4
|
48 |
const bool __need_pad = (((sizeof(streamsize) > sizeof(size_t)) && (__STATIC_CAST(streamsize, __n) < __w)) ||
|
williamr@4
|
49 |
((sizeof(streamsize) <= sizeof(size_t)) && (__n < __STATIC_CAST(size_t, __w))));
|
williamr@4
|
50 |
streamsize __pad_len = __need_pad ? __w - __n : 0;
|
williamr@4
|
51 |
|
williamr@2
|
52 |
if (!__left)
|
williamr@4
|
53 |
__ok = __stlp_string_fill(__os, __buf, __pad_len);
|
williamr@2
|
54 |
|
williamr@2
|
55 |
__ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
|
williamr@2
|
56 |
|
williamr@2
|
57 |
if (__left)
|
williamr@2
|
58 |
__ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
|
williamr@2
|
59 |
}
|
williamr@2
|
60 |
|
williamr@2
|
61 |
if (!__ok)
|
williamr@2
|
62 |
__os.setstate(__ostream::failbit);
|
williamr@2
|
63 |
|
williamr@2
|
64 |
return __os;
|
williamr@2
|
65 |
}
|
williamr@4
|
66 |
|
williamr@2
|
67 |
template <class _CharT, class _Traits, class _Alloc>
|
williamr@4
|
68 |
basic_istream<_CharT, _Traits>& _STLP_CALL
|
williamr@4
|
69 |
operator >> (basic_istream<_CharT, _Traits>& __is,
|
williamr@4
|
70 |
basic_string<_CharT,_Traits, _Alloc>& __s) {
|
williamr@2
|
71 |
typedef basic_istream<_CharT, _Traits> __istream;
|
williamr@4
|
72 |
typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
|
williamr@4
|
73 |
|
williamr@4
|
74 |
// The hypothesis of this implementation is that size_type is unsigned:
|
williamr@4
|
75 |
_STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0)
|
williamr@4
|
76 |
|
williamr@2
|
77 |
typename __istream::sentry __sentry(__is);
|
williamr@2
|
78 |
|
williamr@2
|
79 |
if (__sentry) {
|
williamr@2
|
80 |
basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
|
williamr@2
|
81 |
typedef ctype<_CharT> _C_type;
|
williamr@2
|
82 |
|
williamr@2
|
83 |
const locale& __loc = __is.getloc();
|
williamr@2
|
84 |
const _C_type& _Ctype = use_facet<_C_type>(__loc);
|
williamr@2
|
85 |
__s.clear();
|
williamr@4
|
86 |
streamsize __width = __is.width(0);
|
williamr@4
|
87 |
size_type __n;
|
williamr@4
|
88 |
if (__width <= 0)
|
williamr@4
|
89 |
__n = __s.max_size();
|
williamr@4
|
90 |
/* __width can only overflow size_type if sizeof(streamsize) > sizeof(size_type)
|
williamr@4
|
91 |
* because here we know that __width is positive and the stattic assertion check
|
williamr@4
|
92 |
* that size_type is unsigned.
|
williamr@4
|
93 |
*/
|
williamr@4
|
94 |
else if (sizeof(streamsize) > sizeof(size_type) &&
|
williamr@4
|
95 |
(__width > __STATIC_CAST(streamsize, __s.max_size())))
|
williamr@4
|
96 |
__n = 0;
|
williamr@4
|
97 |
else {
|
williamr@4
|
98 |
__n = __STATIC_CAST(size_type, __width);
|
williamr@2
|
99 |
__s.reserve(__n);
|
williamr@4
|
100 |
}
|
williamr@2
|
101 |
|
williamr@2
|
102 |
while (__n-- > 0) {
|
williamr@2
|
103 |
typename _Traits::int_type __c1 = __buf->sbumpc();
|
williamr@2
|
104 |
if (_Traits::eq_int_type(__c1, _Traits::eof())) {
|
williamr@2
|
105 |
__is.setstate(__istream::eofbit);
|
williamr@2
|
106 |
break;
|
williamr@2
|
107 |
}
|
williamr@2
|
108 |
else {
|
williamr@2
|
109 |
_CharT __c = _Traits::to_char_type(__c1);
|
williamr@2
|
110 |
|
williamr@2
|
111 |
if (_Ctype.is(_C_type::space, __c)) {
|
williamr@2
|
112 |
if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
|
williamr@2
|
113 |
__is.setstate(__istream::failbit);
|
williamr@2
|
114 |
break;
|
williamr@2
|
115 |
}
|
williamr@2
|
116 |
else
|
williamr@2
|
117 |
__s.push_back(__c);
|
williamr@2
|
118 |
}
|
williamr@2
|
119 |
}
|
williamr@4
|
120 |
|
williamr@2
|
121 |
// If we have read no characters, then set failbit.
|
williamr@4
|
122 |
if (__s.empty())
|
williamr@2
|
123 |
__is.setstate(__istream::failbit);
|
williamr@2
|
124 |
}
|
williamr@2
|
125 |
else
|
williamr@2
|
126 |
__is.setstate(__istream::failbit);
|
williamr@2
|
127 |
|
williamr@2
|
128 |
return __is;
|
williamr@2
|
129 |
}
|
williamr@2
|
130 |
|
williamr@4
|
131 |
template <class _CharT, class _Traits, class _Alloc>
|
williamr@4
|
132 |
basic_istream<_CharT, _Traits>& _STLP_CALL
|
williamr@2
|
133 |
getline(basic_istream<_CharT, _Traits>& __is,
|
williamr@2
|
134 |
basic_string<_CharT,_Traits,_Alloc>& __s,
|
williamr@4
|
135 |
_CharT __delim) {
|
williamr@2
|
136 |
typedef basic_istream<_CharT, _Traits> __istream;
|
williamr@4
|
137 |
typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
|
williamr@4
|
138 |
size_type __nread = 0;
|
williamr@2
|
139 |
typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
|
williamr@2
|
140 |
if (__sentry) {
|
williamr@2
|
141 |
basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
|
williamr@2
|
142 |
__s.clear();
|
williamr@2
|
143 |
|
williamr@2
|
144 |
while (__nread < __s.max_size()) {
|
williamr@2
|
145 |
int __c1 = __buf->sbumpc();
|
williamr@2
|
146 |
if (_Traits::eq_int_type(__c1, _Traits::eof())) {
|
williamr@2
|
147 |
__is.setstate(__istream::eofbit);
|
williamr@2
|
148 |
break;
|
williamr@2
|
149 |
}
|
williamr@2
|
150 |
else {
|
williamr@2
|
151 |
++__nread;
|
williamr@2
|
152 |
_CharT __c = _Traits::to_char_type(__c1);
|
williamr@4
|
153 |
if (!_Traits::eq(__c, __delim))
|
williamr@2
|
154 |
__s.push_back(__c);
|
williamr@2
|
155 |
else
|
williamr@2
|
156 |
break; // Character is extracted but not appended.
|
williamr@2
|
157 |
}
|
williamr@2
|
158 |
}
|
williamr@2
|
159 |
}
|
williamr@2
|
160 |
if (__nread == 0 || __nread >= __s.max_size())
|
williamr@2
|
161 |
__is.setstate(__istream::failbit);
|
williamr@2
|
162 |
|
williamr@2
|
163 |
return __is;
|
williamr@2
|
164 |
}
|
williamr@2
|
165 |
|
williamr@2
|
166 |
_STLP_END_NAMESPACE
|
williamr@2
|
167 |
|
williamr@4
|
168 |
#endif
|
williamr@2
|
169 |
|
williamr@4
|
170 |
// Local Variables:
|
williamr@4
|
171 |
// mode:C++
|
williamr@4
|
172 |
// End:
|