blob: 84b18736b573d0a1fadcda8596794142d7be4bb8 [file] [log] [blame]
#ifndef _STLP_STRING_IO_C
#define _STLP_STRING_IO_C
#ifndef _STLP_STRING_IO_H
# include <stl/_string_io.h>
#endif
#ifndef _STLP_INTERNAL_CTYPE_H
# include <stl/_ctype.h>
#endif
_STLP_BEGIN_NAMESPACE
template <class _CharT, class _Traits>
bool _STLP_CALL
__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
basic_streambuf<_CharT, _Traits>* __buf,
streamsize __n) {
_CharT __f = __os.fill();
for (streamsize __i = 0; __i < __n; ++__i) {
if (_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof()))
return false;
}
return true;
}
template <class _CharT, class _Traits, class _Alloc>
basic_ostream<_CharT, _Traits>& _STLP_CALL
operator << (basic_ostream<_CharT, _Traits>& __os,
const basic_string<_CharT,_Traits,_Alloc>& __s) {
typedef basic_ostream<_CharT, _Traits> __ostream;
typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
// The hypothesis of this implementation is that size_type is unsigned:
_STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0)
typename __ostream::sentry __sentry(__os);
bool __ok = false;
if (__sentry) {
__ok = true;
size_type __n = __s.size();
const bool __left = (__os.flags() & __ostream::left) != 0;
const streamsize __w = __os.width(0);
basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
const bool __need_pad = (((sizeof(streamsize) > sizeof(size_t)) && (__STATIC_CAST(streamsize, __n) < __w)) ||
((sizeof(streamsize) <= sizeof(size_t)) && (__n < __STATIC_CAST(size_t, __w))));
streamsize __pad_len = __need_pad ? __w - __n : 0;
if (!__left)
__ok = __stlp_string_fill(__os, __buf, __pad_len);
__ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
if (__left)
__ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
}
if (!__ok)
__os.setstate(__ostream::failbit);
return __os;
}
template <class _CharT, class _Traits, class _Alloc>
basic_istream<_CharT, _Traits>& _STLP_CALL
operator >> (basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT,_Traits, _Alloc>& __s) {
typedef basic_istream<_CharT, _Traits> __istream;
typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
// The hypothesis of this implementation is that size_type is unsigned:
_STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0)
typename __istream::sentry __sentry(__is);
if (__sentry) {
basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
typedef ctype<_CharT> _C_type;
const locale& __loc = __is.getloc();
const _C_type& _Ctype = use_facet<_C_type>(__loc);
__s.clear();
streamsize __width = __is.width(0);
size_type __n;
if (__width <= 0)
__n = __s.max_size();
/* __width can only overflow size_type if sizeof(streamsize) > sizeof(size_type)
* because here we know that __width is positive and the stattic assertion check
* that size_type is unsigned.
*/
else if (sizeof(streamsize) > sizeof(size_type) &&
(__width > __STATIC_CAST(streamsize, __s.max_size())))
__n = 0;
else {
__n = __STATIC_CAST(size_type, __width);
__s.reserve(__n);
}
while (__n-- > 0) {
typename _Traits::int_type __c1 = __buf->sbumpc();
if (_Traits::eq_int_type(__c1, _Traits::eof())) {
__is.setstate(__istream::eofbit);
break;
}
else {
_CharT __c = _Traits::to_char_type(__c1);
if (_Ctype.is(_C_type::space, __c)) {
if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
__is.setstate(__istream::failbit);
break;
}
else
__s.push_back(__c);
}
}
// If we have read no characters, then set failbit.
if (__s.empty())
__is.setstate(__istream::failbit);
}
else
__is.setstate(__istream::failbit);
return __is;
}
template <class _CharT, class _Traits, class _Alloc>
basic_istream<_CharT, _Traits>& _STLP_CALL
getline(basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT,_Traits,_Alloc>& __s,
_CharT __delim) {
typedef basic_istream<_CharT, _Traits> __istream;
typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
size_type __nread = 0;
typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
if (__sentry) {
basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
__s.clear();
while (__nread < __s.max_size()) {
int __c1 = __buf->sbumpc();
if (_Traits::eq_int_type(__c1, _Traits::eof())) {
__is.setstate(__istream::eofbit);
break;
}
else {
++__nread;
_CharT __c = _Traits::to_char_type(__c1);
if (!_Traits::eq(__c, __delim))
__s.push_back(__c);
else
break; // Character is extracted but not appended.
}
}
}
if (__nread == 0 || __nread >= __s.max_size())
__is.setstate(__istream::failbit);
return __is;
}
_STLP_END_NAMESPACE
#endif
// Local Variables:
// mode:C++
// End: