epoc32/include/stdapis/stlportv5/stl/_string_io.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
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@2
     1
#ifndef _STLP_STRING_IO_C
williamr@2
     2
#define _STLP_STRING_IO_C
williamr@2
     3
williamr@2
     4
#ifndef _STLP_STRING_IO_H
williamr@4
     5
#  include <stl/_string_io.h>
williamr@2
     6
#endif
williamr@2
     7
williamr@2
     8
#ifndef _STLP_INTERNAL_CTYPE_H
williamr@4
     9
#  include <stl/_ctype.h>
williamr@2
    10
#endif
williamr@2
    11
williamr@2
    12
_STLP_BEGIN_NAMESPACE
williamr@2
    13
williamr@2
    14
template <class _CharT, class _Traits>
williamr@2
    15
bool _STLP_CALL
williamr@2
    16
__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
williamr@4
    17
                   basic_streambuf<_CharT, _Traits>* __buf,
williamr@4
    18
                   streamsize __n) {
williamr@2
    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@2
    26
williamr@2
    27
williamr@2
    28
template <class _CharT, class _Traits, class _Alloc>
williamr@2
    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@2
    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@2
    38
  typename __ostream::sentry __sentry(__os);
williamr@2
    39
  bool __ok = false;
williamr@2
    40
williamr@2
    41
  if (__sentry) {
williamr@2
    42
    __ok = true;
williamr@4
    43
    size_type __n = __s.size();
williamr@2
    44
    const bool __left = (__os.flags() & __ostream::left) != 0;
williamr@4
    45
    const streamsize __w = __os.width(0);
williamr@2
    46
    basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
williamr@2
    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@2
    52
    if (!__left)
williamr@4
    53
      __ok = __stlp_string_fill(__os, __buf, __pad_len);
williamr@2
    54
williamr@2
    55
    __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
williamr@2
    56
williamr@2
    57
    if (__left)
williamr@2
    58
      __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
williamr@2
    59
  }
williamr@2
    60
williamr@2
    61
  if (!__ok)
williamr@2
    62
    __os.setstate(__ostream::failbit);
williamr@2
    63
williamr@2
    64
  return __os;
williamr@2
    65
}
williamr@4
    66
williamr@2
    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@2
    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@2
    77
  typename __istream::sentry __sentry(__is);
williamr@2
    78
williamr@2
    79
  if (__sentry) {
williamr@2
    80
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@2
    81
    typedef ctype<_CharT> _C_type;
williamr@2
    82
williamr@2
    83
    const locale& __loc = __is.getloc();
williamr@2
    84
    const _C_type& _Ctype = use_facet<_C_type>(__loc);
williamr@2
    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@2
    99
      __s.reserve(__n);
williamr@4
   100
    }
williamr@2
   101
williamr@2
   102
    while (__n-- > 0) {
williamr@2
   103
      typename _Traits::int_type __c1 = __buf->sbumpc();
williamr@2
   104
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@2
   105
        __is.setstate(__istream::eofbit);
williamr@2
   106
        break;
williamr@2
   107
      }
williamr@2
   108
      else {
williamr@2
   109
        _CharT __c = _Traits::to_char_type(__c1);
williamr@2
   110
williamr@2
   111
        if (_Ctype.is(_C_type::space, __c)) {
williamr@2
   112
          if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
williamr@2
   113
            __is.setstate(__istream::failbit);
williamr@2
   114
          break;
williamr@2
   115
        }
williamr@2
   116
        else
williamr@2
   117
          __s.push_back(__c);
williamr@2
   118
      }
williamr@2
   119
    }
williamr@4
   120
williamr@2
   121
    // If we have read no characters, then set failbit.
williamr@4
   122
    if (__s.empty())
williamr@2
   123
      __is.setstate(__istream::failbit);
williamr@2
   124
  }
williamr@2
   125
  else
williamr@2
   126
    __is.setstate(__istream::failbit);
williamr@2
   127
williamr@2
   128
  return __is;
williamr@2
   129
}
williamr@2
   130
williamr@4
   131
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   132
basic_istream<_CharT, _Traits>& _STLP_CALL
williamr@2
   133
getline(basic_istream<_CharT, _Traits>& __is,
williamr@2
   134
        basic_string<_CharT,_Traits,_Alloc>& __s,
williamr@4
   135
        _CharT __delim) {
williamr@2
   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@2
   139
  typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
williamr@2
   140
  if (__sentry) {
williamr@2
   141
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@2
   142
    __s.clear();
williamr@2
   143
williamr@2
   144
    while (__nread < __s.max_size()) {
williamr@2
   145
      int __c1 = __buf->sbumpc();
williamr@2
   146
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@2
   147
        __is.setstate(__istream::eofbit);
williamr@2
   148
        break;
williamr@2
   149
      }
williamr@2
   150
      else {
williamr@2
   151
        ++__nread;
williamr@2
   152
        _CharT __c = _Traits::to_char_type(__c1);
williamr@4
   153
        if (!_Traits::eq(__c, __delim))
williamr@2
   154
          __s.push_back(__c);
williamr@2
   155
        else
williamr@2
   156
          break;              // Character is extracted but not appended.
williamr@2
   157
      }
williamr@2
   158
    }
williamr@2
   159
  }
williamr@2
   160
  if (__nread == 0 || __nread >= __s.max_size())
williamr@2
   161
    __is.setstate(__istream::failbit);
williamr@2
   162
williamr@2
   163
  return __is;
williamr@2
   164
}
williamr@2
   165
williamr@2
   166
_STLP_END_NAMESPACE
williamr@2
   167
williamr@4
   168
#endif
williamr@2
   169
williamr@4
   170
// Local Variables:
williamr@4
   171
// mode:C++
williamr@4
   172
// End: