epoc32/include/tools/stlport/stl/_string_io.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
#ifndef _STLP_STRING_IO_C
williamr@4
     2
#define _STLP_STRING_IO_C
williamr@4
     3
williamr@4
     4
#ifndef _STLP_STRING_IO_H
williamr@4
     5
#  include <stl/_string_io.h>
williamr@4
     6
#endif
williamr@4
     7
williamr@4
     8
#ifndef _STLP_INTERNAL_CTYPE_H
williamr@4
     9
#  include <stl/_ctype.h>
williamr@4
    10
#endif
williamr@4
    11
williamr@4
    12
_STLP_BEGIN_NAMESPACE
williamr@4
    13
williamr@4
    14
template <class _CharT, class _Traits>
williamr@4
    15
bool _STLP_CALL
williamr@4
    16
__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
williamr@4
    17
                   basic_streambuf<_CharT, _Traits>* __buf,
williamr@4
    18
                   streamsize __n) {
williamr@4
    19
  _CharT __f = __os.fill();
williamr@4
    20
  for (streamsize __i = 0; __i < __n; ++__i) {
williamr@4
    21
    if (_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof()))
williamr@4
    22
      return false;
williamr@4
    23
  }
williamr@4
    24
  return true;
williamr@4
    25
}
williamr@4
    26
williamr@4
    27
williamr@4
    28
template <class _CharT, class _Traits, class _Alloc>
williamr@4
    29
basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
    30
operator << (basic_ostream<_CharT, _Traits>& __os,
williamr@4
    31
             const basic_string<_CharT,_Traits,_Alloc>& __s) {
williamr@4
    32
  typedef basic_ostream<_CharT, _Traits> __ostream;
williamr@4
    33
  typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
williamr@4
    34
williamr@4
    35
  // The hypothesis of this implementation is that size_type is unsigned:
williamr@4
    36
  _STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0)
williamr@4
    37
williamr@4
    38
  typename __ostream::sentry __sentry(__os);
williamr@4
    39
  bool __ok = false;
williamr@4
    40
williamr@4
    41
  if (__sentry) {
williamr@4
    42
    __ok = true;
williamr@4
    43
    size_type __n = __s.size();
williamr@4
    44
    const bool __left = (__os.flags() & __ostream::left) != 0;
williamr@4
    45
    const streamsize __w = __os.width(0);
williamr@4
    46
    basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
williamr@4
    47
williamr@4
    48
    const bool __need_pad = (((sizeof(streamsize) > sizeof(size_t)) && (__STATIC_CAST(streamsize, __n) < __w)) ||
williamr@4
    49
                             ((sizeof(streamsize) <= sizeof(size_t)) && (__n < __STATIC_CAST(size_t, __w))));
williamr@4
    50
    streamsize __pad_len = __need_pad ? __w - __n : 0;
williamr@4
    51
williamr@4
    52
    if (!__left)
williamr@4
    53
      __ok = __stlp_string_fill(__os, __buf, __pad_len);
williamr@4
    54
williamr@4
    55
    __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
williamr@4
    56
williamr@4
    57
    if (__left)
williamr@4
    58
      __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
williamr@4
    59
  }
williamr@4
    60
williamr@4
    61
  if (!__ok)
williamr@4
    62
    __os.setstate(__ostream::failbit);
williamr@4
    63
williamr@4
    64
  return __os;
williamr@4
    65
}
williamr@4
    66
williamr@4
    67
template <class _CharT, class _Traits, class _Alloc>
williamr@4
    68
basic_istream<_CharT, _Traits>& _STLP_CALL
williamr@4
    69
operator >> (basic_istream<_CharT, _Traits>& __is,
williamr@4
    70
             basic_string<_CharT,_Traits, _Alloc>& __s) {
williamr@4
    71
  typedef basic_istream<_CharT, _Traits> __istream;
williamr@4
    72
  typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
williamr@4
    73
williamr@4
    74
  // The hypothesis of this implementation is that size_type is unsigned:
williamr@4
    75
  _STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0)
williamr@4
    76
williamr@4
    77
  typename __istream::sentry __sentry(__is);
williamr@4
    78
williamr@4
    79
  if (__sentry) {
williamr@4
    80
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@4
    81
    typedef ctype<_CharT> _C_type;
williamr@4
    82
williamr@4
    83
    const locale& __loc = __is.getloc();
williamr@4
    84
    const _C_type& _Ctype = use_facet<_C_type>(__loc);
williamr@4
    85
    __s.clear();
williamr@4
    86
    streamsize __width = __is.width(0);
williamr@4
    87
    size_type __n;
williamr@4
    88
    if (__width <= 0)
williamr@4
    89
      __n = __s.max_size();
williamr@4
    90
    /* __width can only overflow size_type if sizeof(streamsize) > sizeof(size_type)
williamr@4
    91
     * because here we know that __width is positive and the stattic assertion check
williamr@4
    92
     * that size_type is unsigned.
williamr@4
    93
     */
williamr@4
    94
    else if (sizeof(streamsize) > sizeof(size_type) &&
williamr@4
    95
             (__width > __STATIC_CAST(streamsize, __s.max_size())))
williamr@4
    96
      __n = 0;
williamr@4
    97
    else {
williamr@4
    98
      __n = __STATIC_CAST(size_type, __width);
williamr@4
    99
      __s.reserve(__n);
williamr@4
   100
    }
williamr@4
   101
williamr@4
   102
    while (__n-- > 0) {
williamr@4
   103
      typename _Traits::int_type __c1 = __buf->sbumpc();
williamr@4
   104
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@4
   105
        __is.setstate(__istream::eofbit);
williamr@4
   106
        break;
williamr@4
   107
      }
williamr@4
   108
      else {
williamr@4
   109
        _CharT __c = _Traits::to_char_type(__c1);
williamr@4
   110
williamr@4
   111
        if (_Ctype.is(_C_type::space, __c)) {
williamr@4
   112
          if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
williamr@4
   113
            __is.setstate(__istream::failbit);
williamr@4
   114
          break;
williamr@4
   115
        }
williamr@4
   116
        else
williamr@4
   117
          __s.push_back(__c);
williamr@4
   118
      }
williamr@4
   119
    }
williamr@4
   120
williamr@4
   121
    // If we have read no characters, then set failbit.
williamr@4
   122
    if (__s.empty())
williamr@4
   123
      __is.setstate(__istream::failbit);
williamr@4
   124
  }
williamr@4
   125
  else
williamr@4
   126
    __is.setstate(__istream::failbit);
williamr@4
   127
williamr@4
   128
  return __is;
williamr@4
   129
}
williamr@4
   130
williamr@4
   131
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   132
basic_istream<_CharT, _Traits>& _STLP_CALL
williamr@4
   133
getline(basic_istream<_CharT, _Traits>& __is,
williamr@4
   134
        basic_string<_CharT,_Traits,_Alloc>& __s,
williamr@4
   135
        _CharT __delim) {
williamr@4
   136
  typedef basic_istream<_CharT, _Traits> __istream;
williamr@4
   137
  typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type;
williamr@4
   138
  size_type __nread = 0;
williamr@4
   139
  typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
williamr@4
   140
  if (__sentry) {
williamr@4
   141
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@4
   142
    __s.clear();
williamr@4
   143
williamr@4
   144
    while (__nread < __s.max_size()) {
williamr@4
   145
      int __c1 = __buf->sbumpc();
williamr@4
   146
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@4
   147
        __is.setstate(__istream::eofbit);
williamr@4
   148
        break;
williamr@4
   149
      }
williamr@4
   150
      else {
williamr@4
   151
        ++__nread;
williamr@4
   152
        _CharT __c = _Traits::to_char_type(__c1);
williamr@4
   153
        if (!_Traits::eq(__c, __delim))
williamr@4
   154
          __s.push_back(__c);
williamr@4
   155
        else
williamr@4
   156
          break;              // Character is extracted but not appended.
williamr@4
   157
      }
williamr@4
   158
    }
williamr@4
   159
  }
williamr@4
   160
  if (__nread == 0 || __nread >= __s.max_size())
williamr@4
   161
    __is.setstate(__istream::failbit);
williamr@4
   162
williamr@4
   163
  return __is;
williamr@4
   164
}
williamr@4
   165
williamr@4
   166
_STLP_END_NAMESPACE
williamr@4
   167
williamr@4
   168
#endif
williamr@4
   169
williamr@4
   170
// Local Variables:
williamr@4
   171
// mode:C++
williamr@4
   172
// End: