epoc32/include/stdapis/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
/* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. */
williamr@4
     2
williamr@4
     3
williamr@4
     4
#ifndef _STLP_STRING_IO_C
williamr@4
     5
#define _STLP_STRING_IO_C
williamr@4
     6
williamr@4
     7
#ifndef _STLP_STRING_IO_H
williamr@4
     8
# include <stl/_string_io.h>
williamr@4
     9
#endif
williamr@4
    10
williamr@4
    11
#ifndef _STLP_INTERNAL_CTYPE_H
williamr@4
    12
# include <stl/_ctype.h>
williamr@4
    13
#endif
williamr@4
    14
williamr@4
    15
# ifdef _STLP_DEBUG
williamr@4
    16
#  define basic_string _Nondebug_string
williamr@4
    17
# endif
williamr@4
    18
williamr@4
    19
_STLP_BEGIN_NAMESPACE
williamr@4
    20
williamr@4
    21
# if defined (_STLP_OWN_IOSTREAMS)
williamr@4
    22
#  define _STLP_USING_IO
williamr@4
    23
# else
williamr@4
    24
#  define _STLP_USING_IO _STLP_USING_VENDOR_STD
williamr@4
    25
# endif
williamr@4
    26
williamr@4
    27
#if defined (_STLP_USE_NEW_IOSTREAMS)
williamr@4
    28
williamr@4
    29
template <class _CharT, class _Traits>
williamr@4
    30
bool _STLP_CALL
williamr@4
    31
__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
williamr@4
    32
                  basic_streambuf<_CharT, _Traits>* __buf,
williamr@4
    33
                  size_t __n)
williamr@4
    34
{
williamr@4
    35
  _CharT __f = __os.fill();
williamr@4
    36
  size_t __i;
williamr@4
    37
  bool __ok = true;
williamr@4
    38
williamr@4
    39
  for (__i = 0; __i < __n; ++__i)
williamr@4
    40
    __ok = __ok && !_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof());
williamr@4
    41
  return __ok;
williamr@4
    42
}
williamr@4
    43
williamr@4
    44
template <class _CharT, class _Traits, class _Alloc>
williamr@4
    45
basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
    46
operator<<(basic_ostream<_CharT, _Traits>& __os, 
williamr@4
    47
           const basic_string<_CharT,_Traits,_Alloc>& __s)
williamr@4
    48
{
williamr@4
    49
williamr@4
    50
  _STLP_USING_IO
williamr@4
    51
  typedef basic_ostream<_CharT, _Traits> __ostream;
williamr@4
    52
  typename __ostream::sentry __sentry(__os);
williamr@4
    53
  bool __ok = false;
williamr@4
    54
williamr@4
    55
  if (__sentry) {
williamr@4
    56
    __ok = true;
williamr@4
    57
    size_t __n = __s.size();
williamr@4
    58
    size_t __pad_len = 0;
williamr@4
    59
    const bool __left = (__os.flags() & __ostream::left) != 0;
williamr@4
    60
    const size_t __w = __os.width(0);
williamr@4
    61
    basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
williamr@4
    62
williamr@4
    63
    if (__n < __w) {
williamr@4
    64
      __pad_len = __w - __n;
williamr@4
    65
    }
williamr@4
    66
    
williamr@4
    67
    if (!__left)
williamr@4
    68
      __ok = __stlp_string_fill(__os, __buf, __pad_len);    
williamr@4
    69
williamr@4
    70
    __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
williamr@4
    71
williamr@4
    72
    if (__left)
williamr@4
    73
      __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
williamr@4
    74
  }
williamr@4
    75
williamr@4
    76
  if (!__ok)
williamr@4
    77
    __os.setstate(__ostream::failbit);
williamr@4
    78
williamr@4
    79
  return __os;
williamr@4
    80
}
williamr@4
    81
 
williamr@4
    82
template <class _CharT, class _Traits, class _Alloc>
williamr@4
    83
basic_istream<_CharT, _Traits>& _STLP_CALL 
williamr@4
    84
operator>>(basic_istream<_CharT, _Traits>& __is,
williamr@4
    85
           basic_string<_CharT,_Traits, _Alloc>& __s)
williamr@4
    86
{
williamr@4
    87
  _STLP_USING_IO
williamr@4
    88
  typedef basic_istream<_CharT, _Traits> __istream;
williamr@4
    89
  typename __istream::sentry __sentry(__is);
williamr@4
    90
williamr@4
    91
  if (__sentry) {
williamr@4
    92
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@4
    93
    typedef ctype<_CharT> _C_type;
williamr@4
    94
williamr@4
    95
#ifdef _STLP_OWN_IOSTREAMS
williamr@4
    96
    //    const _C_type& _Ctype = use_facet<_C_type>(__loc);
williamr@4
    97
    const _C_type& _Ctype = *(const _C_type*)__is._M_ctype_facet();
williamr@4
    98
#else
williamr@4
    99
# if defined (_STLP_MSVC) && (_STLP_MSVC <= 1200 ) || defined (__ICL)
williamr@4
   100
    const locale& __loc = __is.getloc();
williamr@4
   101
    const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0, true);
williamr@4
   102
# elif defined (__SUNPRO_CC)
williamr@4
   103
    const locale& __loc = __is.getloc();
williamr@4
   104
    const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0);
williamr@4
   105
# else
williamr@4
   106
    const locale& __loc = __is.getloc();
williamr@4
   107
    const _C_type& _Ctype = use_facet<_C_type>(__loc);
williamr@4
   108
# endif
williamr@4
   109
#endif
williamr@4
   110
    __s.clear();
williamr@4
   111
    size_t __n = __is.width(0);
williamr@4
   112
    if (__n == 0)
williamr@4
   113
      __n = __STATIC_CAST(size_t,-1);
williamr@4
   114
    else
williamr@4
   115
      __s.reserve(__n);
williamr@4
   116
    
williamr@4
   117
williamr@4
   118
    while (__n-- > 0) {
williamr@4
   119
      typename _Traits::int_type __c1 = __buf->sbumpc();
williamr@4
   120
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@4
   121
        __is.setstate(__istream::eofbit);
williamr@4
   122
        break;
williamr@4
   123
      }
williamr@4
   124
      else {
williamr@4
   125
        _CharT __c = _Traits::to_char_type(__c1);
williamr@4
   126
williamr@4
   127
        if (_Ctype.is(_C_type::space, __c)) {
williamr@4
   128
          if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
williamr@4
   129
            __is.setstate(__istream::failbit);
williamr@4
   130
          break;
williamr@4
   131
        }
williamr@4
   132
#ifdef __SYMBIAN32__
williamr@4
   133
        else if (__c == '\b') {
williamr@4
   134
          __s.pop_back();
williamr@4
   135
        }
williamr@4
   136
#endif
williamr@4
   137
        else
williamr@4
   138
          __s.push_back(__c);
williamr@4
   139
      }
williamr@4
   140
    }
williamr@4
   141
    
williamr@4
   142
    // If we have read no characters, then set failbit.
williamr@4
   143
    if (__s.size() == 0)
williamr@4
   144
      __is.setstate(__istream::failbit);
williamr@4
   145
  }
williamr@4
   146
  else
williamr@4
   147
    __is.setstate(__istream::failbit);
williamr@4
   148
williamr@4
   149
  return __is;
williamr@4
   150
}
williamr@4
   151
williamr@4
   152
template <class _CharT, class _Traits, class _Alloc>    
williamr@4
   153
basic_istream<_CharT, _Traits>& _STLP_CALL 
williamr@4
   154
getline(basic_istream<_CharT, _Traits>& __is,
williamr@4
   155
        basic_string<_CharT,_Traits,_Alloc>& __s,
williamr@4
   156
        _CharT __delim)
williamr@4
   157
{
williamr@4
   158
  _STLP_USING_IO
williamr@4
   159
  typedef basic_istream<_CharT, _Traits> __istream;
williamr@4
   160
  size_t __nread = 0;
williamr@4
   161
  typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
williamr@4
   162
  if (__sentry) {
williamr@4
   163
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@4
   164
    __s.clear();
williamr@4
   165
williamr@4
   166
    while (__nread < __s.max_size()) {
williamr@4
   167
      int __c1 = __buf->sbumpc();
williamr@4
   168
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@4
   169
        __is.setstate(__istream::eofbit);
williamr@4
   170
        break;
williamr@4
   171
      }
williamr@4
   172
      else {
williamr@4
   173
        ++__nread;
williamr@4
   174
        _CharT __c = _Traits::to_char_type(__c1);
williamr@4
   175
        if (!_Traits::eq(__c, __delim)) 
williamr@4
   176
          __s.push_back(__c);
williamr@4
   177
        else
williamr@4
   178
          break;              // Character is extracted but not appended.
williamr@4
   179
      }
williamr@4
   180
    }
williamr@4
   181
  }
williamr@4
   182
  if (__nread == 0 || __nread >= __s.max_size())
williamr@4
   183
    __is.setstate(__istream::failbit);
williamr@4
   184
williamr@4
   185
  return __is;
williamr@4
   186
}
williamr@4
   187
williamr@4
   188
#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
williamr@4
   189
williamr@4
   190
// (reg) For Watcom IO, _OSTREAM_DLL tells if ostream class is in .exe or in .dll
williamr@4
   191
williamr@4
   192
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   193
_OSTREAM_DLL&  _STLP_CALL operator<<(_OSTREAM_DLL& __os, 
williamr@4
   194
                    const basic_string<_CharT,_Traits,_Alloc>& __s)
williamr@4
   195
{
williamr@4
   196
  _STLP_USING_IO
williamr@4
   197
  streambuf* __buf = __os.rdbuf();
williamr@4
   198
  if (__buf) {
williamr@4
   199
    size_t __n = __s.size();
williamr@4
   200
    size_t __pad_len = 0;
williamr@4
   201
    const bool __left = (__os.flags() & ios::left) !=0;
williamr@4
   202
    const size_t __w = __os.width();
williamr@4
   203
williamr@4
   204
    if (__n < __w) { 
williamr@4
   205
      __pad_len = __w - __n; 
williamr@4
   206
    } 
williamr@4
   207
    
williamr@4
   208
    if (!__left)
williamr@4
   209
      __stlp_string_fill(__os, __buf, __pad_len);
williamr@4
   210
  
williamr@4
   211
    const size_t __nwritten = __buf->sputn(__s.data(), __n);
williamr@4
   212
williamr@4
   213
    if (__left)
williamr@4
   214
      __stlp_string_fill(__os, __buf, __pad_len);
williamr@4
   215
williamr@4
   216
    if (__nwritten != __n)
williamr@4
   217
      __os.clear(__os.rdstate() | ios::failbit);
williamr@4
   218
williamr@4
   219
    __os.width(0);
williamr@4
   220
  }
williamr@4
   221
  else
williamr@4
   222
    __os.clear(__os.rdstate() | ios::badbit);
williamr@4
   223
williamr@4
   224
  return __os;
williamr@4
   225
}
williamr@4
   226
williamr@4
   227
template <class _CharT, class _Traits, class _Alloc>
williamr@4
   228
_ISTREAM_DLL& _STLP_CALL operator>>(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s)
williamr@4
   229
{
williamr@4
   230
  _STLP_USING_IO
williamr@4
   231
  if (!__is)
williamr@4
   232
    return __is;
williamr@4
   233
williamr@4
   234
  streambuf* __buf = __is.rdbuf();
williamr@4
   235
  if (__buf) {
williamr@4
   236
williamr@4
   237
    if (__is.flags() & ios::skipws) {
williamr@4
   238
      //      _CharT __c;
williamr@4
   239
      int __c;
williamr@4
   240
      do {
williamr@4
   241
        __c = __buf->sbumpc();
williamr@4
   242
      }
williamr@4
   243
      while (__c != EOF && isspace((unsigned char)__c));
williamr@4
   244
williamr@4
   245
      if (__c == EOF) {
williamr@4
   246
        __is.clear(__is.rdstate() | ios::eofbit | ios::failbit);
williamr@4
   247
      }
williamr@4
   248
      else {
williamr@4
   249
	if (__buf->sputbackc(__c) == EOF)
williamr@4
   250
	  __is.clear(__is.rdstate() | ios::failbit);
williamr@4
   251
      }
williamr@4
   252
    }
williamr@4
   253
williamr@4
   254
    // If we arrive at end of file (or fail for some other reason) while
williamr@4
   255
    // still discarding whitespace, then we don't try to read the string.
williamr@4
   256
    if (__is) {
williamr@4
   257
      __s.clear();
williamr@4
   258
williamr@4
   259
      size_t __n = __is.width();
williamr@4
   260
      if (__n == 0)
williamr@4
   261
        __n = __STATIC_CAST(size_t,-1);
williamr@4
   262
      else
williamr@4
   263
        __s.reserve(__n);
williamr@4
   264
williamr@4
   265
      while (__n-- > 0) {
williamr@4
   266
        int __c1 = __buf->sbumpc();
williamr@4
   267
        if (__c1 == EOF) {
williamr@4
   268
          __is.clear(__is.rdstate() | ios::eofbit);
williamr@4
   269
          break;
williamr@4
   270
        }
williamr@4
   271
        else {
williamr@4
   272
          _CharT __c = _Traits::to_char_type(__c1);
williamr@4
   273
williamr@4
   274
          if (isspace((unsigned char) __c)) {
williamr@4
   275
            if (__buf->sputbackc(__c) == EOF)
williamr@4
   276
              __is.clear(__is.rdstate() | ios::failbit);
williamr@4
   277
            break;
williamr@4
   278
          }
williamr@4
   279
          else
williamr@4
   280
            __s.push_back(__c);
williamr@4
   281
        }
williamr@4
   282
      }
williamr@4
   283
    
williamr@4
   284
      // If we have read no characters, then set failbit.
williamr@4
   285
      if (__s.size() == 0)
williamr@4
   286
        __is.clear(__is.rdstate() | ios::failbit);
williamr@4
   287
    }
williamr@4
   288
williamr@4
   289
    __is.width(0);
williamr@4
   290
  }
williamr@4
   291
  else                          // We have no streambuf.
williamr@4
   292
    __is.clear(__is.rdstate() | ios::badbit);
williamr@4
   293
williamr@4
   294
  return __is;
williamr@4
   295
}
williamr@4
   296
williamr@4
   297
template <class _CharT, class _Traits, class _Alloc>    
williamr@4
   298
_ISTREAM_DLL& _STLP_CALL getline(_ISTREAM_DLL& __is,
williamr@4
   299
                 basic_string<_CharT,_Traits,_Alloc>& __s,
williamr@4
   300
                 _CharT __delim)
williamr@4
   301
{
williamr@4
   302
  _STLP_USING_IO
williamr@4
   303
  streambuf* __buf = __is.rdbuf();
williamr@4
   304
  if (__buf) {
williamr@4
   305
    size_t __nread = 0;
williamr@4
   306
    if (__is) {
williamr@4
   307
      __s.clear();
williamr@4
   308
williamr@4
   309
      while (__nread < __s.max_size()) {
williamr@4
   310
        int __c1 = __buf->sbumpc();
williamr@4
   311
        if (__c1 == EOF) {
williamr@4
   312
          __is.clear(__is.rdstate() | ios::eofbit);
williamr@4
   313
          break;
williamr@4
   314
        }
williamr@4
   315
        else {
williamr@4
   316
          ++__nread;
williamr@4
   317
          _CharT __c = _Traits::to_char_type(__c1);
williamr@4
   318
          if (!_Traits::eq(__c, __delim)) 
williamr@4
   319
            __s.push_back(__c);
williamr@4
   320
          else
williamr@4
   321
            break;              // Character is extracted but not appended.
williamr@4
   322
        }
williamr@4
   323
      }
williamr@4
   324
    }
williamr@4
   325
williamr@4
   326
    if (__nread == 0 || __nread >= __s.max_size())
williamr@4
   327
      __is.clear(__is.rdstate() | ios::failbit);
williamr@4
   328
  }
williamr@4
   329
  else
williamr@4
   330
    __is.clear(__is.rdstate() | ios::badbit);
williamr@4
   331
williamr@4
   332
  return __is;
williamr@4
   333
}
williamr@4
   334
williamr@4
   335
# endif /* _STLP_NEW_IOSTREAMS */
williamr@4
   336
williamr@4
   337
_STLP_END_NAMESPACE
williamr@4
   338
williamr@4
   339
// # undef _STLP_USING_IO
williamr@4
   340
# undef basic_string
williamr@4
   341
williamr@4
   342
#endif