#ifndef _STLP_STRING_IO_C #define _STLP_STRING_IO_C #ifndef _STLP_STRING_IO_H # include #endif #ifndef _STLP_INTERNAL_CTYPE_H # include #endif _STLP_BEGIN_NAMESPACE template 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 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 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 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: