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