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