19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_STRING_IO_C 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_STRING_IO_C 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_STRING_IO_H 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_string_io.h> 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CTYPE_H 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_ctype.h> 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits> 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbool _STLP_CALL 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os, 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_streambuf<_CharT, _Traits>* __buf, 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streamsize __n) { 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __f = __os.fill(); 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for (streamsize __i = 0; __i < __n; ++__i) { 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof())) 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return false; 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return true; 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc> 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_ostream<_CharT, _Traits>& _STLP_CALL 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator << (basic_ostream<_CharT, _Traits>& __os, 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const basic_string<_CharT,_Traits,_Alloc>& __s) { 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef basic_ostream<_CharT, _Traits> __ostream; 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type; 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The hypothesis of this implementation is that size_type is unsigned: 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0) 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename __ostream::sentry __sentry(__os); 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool __ok = false; 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__sentry) { 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __ok = true; 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __n = __s.size(); 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const bool __left = (__os.flags() & __ostream::left) != 0; 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const streamsize __w = __os.width(0); 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf(); 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const bool __need_pad = (((sizeof(streamsize) > sizeof(size_t)) && (__STATIC_CAST(streamsize, __n) < __w)) || 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ((sizeof(streamsize) <= sizeof(size_t)) && (__n < __STATIC_CAST(size_t, __w)))); 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streamsize __pad_len = __need_pad ? __w - __n : 0; 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (!__left) 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __ok = __stlp_string_fill(__os, __buf, __pad_len); 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n)); 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__left) 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len); 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (!__ok) 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __os.setstate(__ostream::failbit); 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __os; 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc> 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& _STLP_CALL 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockoperator >> (basic_istream<_CharT, _Traits>& __is, 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string<_CharT,_Traits, _Alloc>& __s) { 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef basic_istream<_CharT, _Traits> __istream; 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type; 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // The hypothesis of this implementation is that size_type is unsigned: 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0) 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename __istream::sentry __sentry(__is); 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__sentry) { 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ctype<_CharT> _C_type; 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const locale& __loc = __is.getloc(); 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const _C_type& _Ctype = use_facet<_C_type>(__loc); 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s.clear(); 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block streamsize __width = __is.width(0); 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __n; 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__width <= 0) 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __n = __s.max_size(); 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* __width can only overflow size_type if sizeof(streamsize) > sizeof(size_type) 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * because here we know that __width is positive and the stattic assertion check 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * that size_type is unsigned. 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else if (sizeof(streamsize) > sizeof(size_type) && 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block (__width > __STATIC_CAST(streamsize, __s.max_size()))) 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __n = 0; 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __n = __STATIC_CAST(size_type, __width); 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s.reserve(__n); 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block while (__n-- > 0) { 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename _Traits::int_type __c1 = __buf->sbumpc(); 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq_int_type(__c1, _Traits::eof())) { 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(__istream::eofbit); 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __c = _Traits::to_char_type(__c1); 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Ctype.is(_C_type::space, __c)) { 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof())) 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(__istream::failbit); 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s.push_back(__c); 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // If we have read no characters, then set failbit. 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__s.empty()) 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(__istream::failbit); 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(__istream::failbit); 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __is; 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _CharT, class _Traits, class _Alloc> 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockbasic_istream<_CharT, _Traits>& _STLP_CALL 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockgetline(basic_istream<_CharT, _Traits>& __is, 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_string<_CharT,_Traits,_Alloc>& __s, 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __delim) { 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef basic_istream<_CharT, _Traits> __istream; 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type; 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __nread = 0; 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true); 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__sentry) { 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s.clear(); 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block while (__nread < __s.max_size()) { 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block int __c1 = __buf->sbumpc(); 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (_Traits::eq_int_type(__c1, _Traits::eof())) { 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(__istream::eofbit); 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else { 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ++__nread; 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _CharT __c = _Traits::to_char_type(__c1); 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (!_Traits::eq(__c, __delim)) 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __s.push_back(__c); 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block break; // Character is extracted but not appended. 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__nread == 0 || __nread >= __s.max_size()) 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __is.setstate(__istream::failbit); 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __is; 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 173