epoc32/include/stdapis/stlportv5/stl/_string_io.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 epoc32/include/stdapis/stlport/stl/_string_io.c@2fe1408b6811
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
/*
williamr@2
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
williamr@2
     3
williamr@2
     4
* Redistribution and use in source and binary forms, with or without 
williamr@2
     5
* modification, are permitted provided that the following conditions are met:
williamr@2
     6
williamr@2
     7
* Redistributions of source code must retain the above copyright notice, this 
williamr@2
     8
* list of conditions and the following disclaimer.
williamr@2
     9
* Redistributions in binary form must reproduce the above copyright notice, 
williamr@2
    10
* this list of conditions and the following disclaimer in the documentation 
williamr@2
    11
* and/or other materials provided with the distribution.
williamr@2
    12
* Neither the name of Nokia Corporation nor the names of its contributors 
williamr@2
    13
* may be used to endorse or promote products derived from this software 
williamr@2
    14
* without specific prior written permission.
williamr@2
    15
williamr@2
    16
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
williamr@2
    17
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
williamr@2
    18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
williamr@2
    19
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 
williamr@2
    20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
williamr@2
    21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
williamr@2
    22
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
williamr@2
    23
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
williamr@2
    24
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
williamr@2
    25
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
williamr@2
    26
*
williamr@2
    27
* Description:
williamr@2
    28
*
williamr@2
    29
*/
williamr@2
    30
williamr@2
    31
#ifndef _STLP_STRING_IO_C
williamr@2
    32
#define _STLP_STRING_IO_C
williamr@2
    33
williamr@2
    34
#ifndef _STLP_STRING_IO_H
williamr@2
    35
# include <stl/_string_io.h>
williamr@2
    36
#endif
williamr@2
    37
williamr@2
    38
#ifndef _STLP_INTERNAL_CTYPE_H
williamr@2
    39
# include <stl/_ctype.h>
williamr@2
    40
#endif
williamr@2
    41
williamr@2
    42
# ifdef _STLP_DEBUG
williamr@2
    43
#  define basic_string _Nondebug_string
williamr@2
    44
# endif
williamr@2
    45
williamr@2
    46
_STLP_BEGIN_NAMESPACE
williamr@2
    47
williamr@2
    48
# if defined (_STLP_OWN_IOSTREAMS)
williamr@2
    49
#  define _STLP_USING_IO
williamr@2
    50
# else
williamr@2
    51
#  define _STLP_USING_IO _STLP_USING_VENDOR_STD
williamr@2
    52
# endif
williamr@2
    53
williamr@2
    54
#if defined (_STLP_USE_NEW_IOSTREAMS)
williamr@2
    55
williamr@2
    56
template <class _CharT, class _Traits>
williamr@2
    57
bool _STLP_CALL
williamr@2
    58
__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
williamr@2
    59
                  basic_streambuf<_CharT, _Traits>* __buf,
williamr@2
    60
                  size_t __n)
williamr@2
    61
{
williamr@2
    62
  _CharT __f = __os.fill();
williamr@2
    63
  size_t __i;
williamr@2
    64
  bool __ok = true;
williamr@2
    65
williamr@2
    66
  for (__i = 0; __i < __n; ++__i)
williamr@2
    67
    __ok = __ok && !_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof());
williamr@2
    68
  return __ok;
williamr@2
    69
}
williamr@2
    70
williamr@2
    71
template <class _CharT, class _Traits, class _Alloc>
williamr@2
    72
basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
    73
operator<<(basic_ostream<_CharT, _Traits>& __os, 
williamr@2
    74
           const basic_string<_CharT,_Traits,_Alloc>& __s)
williamr@2
    75
{
williamr@2
    76
williamr@2
    77
  _STLP_USING_IO
williamr@2
    78
  typedef basic_ostream<_CharT, _Traits> __ostream;
williamr@2
    79
  typename __ostream::sentry __sentry(__os);
williamr@2
    80
  bool __ok = false;
williamr@2
    81
williamr@2
    82
  if (__sentry) {
williamr@2
    83
    __ok = true;
williamr@2
    84
    size_t __n = __s.size();
williamr@2
    85
    size_t __pad_len = 0;
williamr@2
    86
    const bool __left = (__os.flags() & __ostream::left) != 0;
williamr@2
    87
    const size_t __w = __os.width(0);
williamr@2
    88
    basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
williamr@2
    89
williamr@2
    90
    if (__n < __w) {
williamr@2
    91
      __pad_len = __w - __n;
williamr@2
    92
    }
williamr@2
    93
    
williamr@2
    94
    if (!__left)
williamr@2
    95
      __ok = __stlp_string_fill(__os, __buf, __pad_len);    
williamr@2
    96
williamr@2
    97
    __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
williamr@2
    98
williamr@2
    99
    if (__left)
williamr@2
   100
      __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
williamr@2
   101
  }
williamr@2
   102
williamr@2
   103
  if (!__ok)
williamr@2
   104
    __os.setstate(__ostream::failbit);
williamr@2
   105
williamr@2
   106
  return __os;
williamr@2
   107
}
williamr@2
   108
 
williamr@2
   109
template <class _CharT, class _Traits, class _Alloc>
williamr@2
   110
basic_istream<_CharT, _Traits>& _STLP_CALL 
williamr@2
   111
operator>>(basic_istream<_CharT, _Traits>& __is,
williamr@2
   112
           basic_string<_CharT,_Traits, _Alloc>& __s)
williamr@2
   113
{
williamr@2
   114
  _STLP_USING_IO
williamr@2
   115
  typedef basic_istream<_CharT, _Traits> __istream;
williamr@2
   116
  typename __istream::sentry __sentry(__is);
williamr@2
   117
williamr@2
   118
  if (__sentry) {
williamr@2
   119
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@2
   120
    typedef ctype<_CharT> _C_type;
williamr@2
   121
williamr@2
   122
#ifdef _STLP_OWN_IOSTREAMS
williamr@2
   123
    //    const _C_type& _Ctype = use_facet<_C_type>(__loc);
williamr@2
   124
    const _C_type& _Ctype = *(const _C_type*)__is._M_ctype_facet();
williamr@2
   125
#else
williamr@2
   126
# if defined (_STLP_MSVC) && (_STLP_MSVC <= 1200 ) || defined (__ICL)
williamr@2
   127
    const locale& __loc = __is.getloc();
williamr@2
   128
    const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0, true);
williamr@2
   129
# elif defined (__SUNPRO_CC)
williamr@2
   130
    const locale& __loc = __is.getloc();
williamr@2
   131
    const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0);
williamr@2
   132
# else
williamr@2
   133
    const locale& __loc = __is.getloc();
williamr@2
   134
    const _C_type& _Ctype = use_facet<_C_type>(__loc);
williamr@2
   135
# endif
williamr@2
   136
#endif
williamr@2
   137
    __s.clear();
williamr@2
   138
    size_t __n = __is.width(0);
williamr@2
   139
    if (__n == 0)
williamr@2
   140
      __n = __STATIC_CAST(size_t,-1);
williamr@2
   141
    else
williamr@2
   142
      __s.reserve(__n);
williamr@2
   143
    
williamr@2
   144
williamr@2
   145
    while (__n-- > 0) {
williamr@2
   146
      typename _Traits::int_type __c1 = __buf->sbumpc();
williamr@2
   147
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@2
   148
        __is.setstate(__istream::eofbit);
williamr@2
   149
        break;
williamr@2
   150
      }
williamr@2
   151
      else {
williamr@2
   152
        _CharT __c = _Traits::to_char_type(__c1);
williamr@2
   153
williamr@2
   154
        if (_Ctype.is(_C_type::space, __c)) {
williamr@2
   155
          if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
williamr@2
   156
            __is.setstate(__istream::failbit);
williamr@2
   157
          break;
williamr@2
   158
        }
williamr@2
   159
#ifdef __SYMBIAN32__
williamr@2
   160
        else if (__c == '\b') {
williamr@2
   161
          __s.pop_back();
williamr@2
   162
        }
williamr@2
   163
#endif
williamr@2
   164
        else
williamr@2
   165
          __s.push_back(__c);
williamr@2
   166
      }
williamr@2
   167
    }
williamr@2
   168
    
williamr@2
   169
    // If we have read no characters, then set failbit.
williamr@2
   170
    if (__s.size() == 0)
williamr@2
   171
      __is.setstate(__istream::failbit);
williamr@2
   172
  }
williamr@2
   173
  else
williamr@2
   174
    __is.setstate(__istream::failbit);
williamr@2
   175
williamr@2
   176
  return __is;
williamr@2
   177
}
williamr@2
   178
williamr@2
   179
template <class _CharT, class _Traits, class _Alloc>    
williamr@2
   180
basic_istream<_CharT, _Traits>& _STLP_CALL 
williamr@2
   181
getline(basic_istream<_CharT, _Traits>& __is,
williamr@2
   182
        basic_string<_CharT,_Traits,_Alloc>& __s,
williamr@2
   183
        _CharT __delim)
williamr@2
   184
{
williamr@2
   185
  _STLP_USING_IO
williamr@2
   186
  typedef basic_istream<_CharT, _Traits> __istream;
williamr@2
   187
  size_t __nread = 0;
williamr@2
   188
  typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
williamr@2
   189
  if (__sentry) {
williamr@2
   190
    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
williamr@2
   191
    __s.clear();
williamr@2
   192
williamr@2
   193
    while (__nread < __s.max_size()) {
williamr@2
   194
      int __c1 = __buf->sbumpc();
williamr@2
   195
      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
williamr@2
   196
        __is.setstate(__istream::eofbit);
williamr@2
   197
        break;
williamr@2
   198
      }
williamr@2
   199
      else {
williamr@2
   200
        ++__nread;
williamr@2
   201
        _CharT __c = _Traits::to_char_type(__c1);
williamr@2
   202
        if (!_Traits::eq(__c, __delim)) 
williamr@2
   203
          __s.push_back(__c);
williamr@2
   204
        else
williamr@2
   205
          break;              // Character is extracted but not appended.
williamr@2
   206
      }
williamr@2
   207
    }
williamr@2
   208
  }
williamr@2
   209
  if (__nread == 0 || __nread >= __s.max_size())
williamr@2
   210
    __is.setstate(__istream::failbit);
williamr@2
   211
williamr@2
   212
  return __is;
williamr@2
   213
}
williamr@2
   214
williamr@2
   215
#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
williamr@2
   216
williamr@2
   217
// (reg) For Watcom IO, _OSTREAM_DLL tells if ostream class is in .exe or in .dll
williamr@2
   218
williamr@2
   219
template <class _CharT, class _Traits, class _Alloc>
williamr@2
   220
_OSTREAM_DLL&  _STLP_CALL operator<<(_OSTREAM_DLL& __os, 
williamr@2
   221
                    const basic_string<_CharT,_Traits,_Alloc>& __s)
williamr@2
   222
{
williamr@2
   223
  _STLP_USING_IO
williamr@2
   224
  streambuf* __buf = __os.rdbuf();
williamr@2
   225
  if (__buf) {
williamr@2
   226
    size_t __n = __s.size();
williamr@2
   227
    size_t __pad_len = 0;
williamr@2
   228
    const bool __left = (__os.flags() & ios::left) !=0;
williamr@2
   229
    const size_t __w = __os.width();
williamr@2
   230
williamr@2
   231
    if (__n < __w) { 
williamr@2
   232
      __pad_len = __w - __n; 
williamr@2
   233
    } 
williamr@2
   234
    
williamr@2
   235
    if (!__left)
williamr@2
   236
      __stlp_string_fill(__os, __buf, __pad_len);
williamr@2
   237
  
williamr@2
   238
    const size_t __nwritten = __buf->sputn(__s.data(), __n);
williamr@2
   239
williamr@2
   240
    if (__left)
williamr@2
   241
      __stlp_string_fill(__os, __buf, __pad_len);
williamr@2
   242
williamr@2
   243
    if (__nwritten != __n)
williamr@2
   244
      __os.clear(__os.rdstate() | ios::failbit);
williamr@2
   245
williamr@2
   246
    __os.width(0);
williamr@2
   247
  }
williamr@2
   248
  else
williamr@2
   249
    __os.clear(__os.rdstate() | ios::badbit);
williamr@2
   250
williamr@2
   251
  return __os;
williamr@2
   252
}
williamr@2
   253
williamr@2
   254
template <class _CharT, class _Traits, class _Alloc>
williamr@2
   255
_ISTREAM_DLL& _STLP_CALL operator>>(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s)
williamr@2
   256
{
williamr@2
   257
  _STLP_USING_IO
williamr@2
   258
  if (!__is)
williamr@2
   259
    return __is;
williamr@2
   260
williamr@2
   261
  streambuf* __buf = __is.rdbuf();
williamr@2
   262
  if (__buf) {
williamr@2
   263
williamr@2
   264
    if (__is.flags() & ios::skipws) {
williamr@2
   265
      //      _CharT __c;
williamr@2
   266
      int __c;
williamr@2
   267
      do {
williamr@2
   268
        __c = __buf->sbumpc();
williamr@2
   269
      }
williamr@2
   270
      while (__c != EOF && isspace((unsigned char)__c));
williamr@2
   271
williamr@2
   272
      if (__c == EOF) {
williamr@2
   273
        __is.clear(__is.rdstate() | ios::eofbit | ios::failbit);
williamr@2
   274
      }
williamr@2
   275
      else {
williamr@2
   276
	if (__buf->sputbackc(__c) == EOF)
williamr@2
   277
	  __is.clear(__is.rdstate() | ios::failbit);
williamr@2
   278
      }
williamr@2
   279
    }
williamr@2
   280
williamr@2
   281
    // If we arrive at end of file (or fail for some other reason) while
williamr@2
   282
    // still discarding whitespace, then we don't try to read the string.
williamr@2
   283
    if (__is) {
williamr@2
   284
      __s.clear();
williamr@2
   285
williamr@2
   286
      size_t __n = __is.width();
williamr@2
   287
      if (__n == 0)
williamr@2
   288
        __n = __STATIC_CAST(size_t,-1);
williamr@2
   289
      else
williamr@2
   290
        __s.reserve(__n);
williamr@2
   291
williamr@2
   292
      while (__n-- > 0) {
williamr@2
   293
        int __c1 = __buf->sbumpc();
williamr@2
   294
        if (__c1 == EOF) {
williamr@2
   295
          __is.clear(__is.rdstate() | ios::eofbit);
williamr@2
   296
          break;
williamr@2
   297
        }
williamr@2
   298
        else {
williamr@2
   299
          _CharT __c = _Traits::to_char_type(__c1);
williamr@2
   300
williamr@2
   301
          if (isspace((unsigned char) __c)) {
williamr@2
   302
            if (__buf->sputbackc(__c) == EOF)
williamr@2
   303
              __is.clear(__is.rdstate() | ios::failbit);
williamr@2
   304
            break;
williamr@2
   305
          }
williamr@2
   306
          else
williamr@2
   307
            __s.push_back(__c);
williamr@2
   308
        }
williamr@2
   309
      }
williamr@2
   310
    
williamr@2
   311
      // If we have read no characters, then set failbit.
williamr@2
   312
      if (__s.size() == 0)
williamr@2
   313
        __is.clear(__is.rdstate() | ios::failbit);
williamr@2
   314
    }
williamr@2
   315
williamr@2
   316
    __is.width(0);
williamr@2
   317
  }
williamr@2
   318
  else                          // We have no streambuf.
williamr@2
   319
    __is.clear(__is.rdstate() | ios::badbit);
williamr@2
   320
williamr@2
   321
  return __is;
williamr@2
   322
}
williamr@2
   323
williamr@2
   324
template <class _CharT, class _Traits, class _Alloc>    
williamr@2
   325
_ISTREAM_DLL& _STLP_CALL getline(_ISTREAM_DLL& __is,
williamr@2
   326
                 basic_string<_CharT,_Traits,_Alloc>& __s,
williamr@2
   327
                 _CharT __delim)
williamr@2
   328
{
williamr@2
   329
  _STLP_USING_IO
williamr@2
   330
  streambuf* __buf = __is.rdbuf();
williamr@2
   331
  if (__buf) {
williamr@2
   332
    size_t __nread = 0;
williamr@2
   333
    if (__is) {
williamr@2
   334
      __s.clear();
williamr@2
   335
williamr@2
   336
      while (__nread < __s.max_size()) {
williamr@2
   337
        int __c1 = __buf->sbumpc();
williamr@2
   338
        if (__c1 == EOF) {
williamr@2
   339
          __is.clear(__is.rdstate() | ios::eofbit);
williamr@2
   340
          break;
williamr@2
   341
        }
williamr@2
   342
        else {
williamr@2
   343
          ++__nread;
williamr@2
   344
          _CharT __c = _Traits::to_char_type(__c1);
williamr@2
   345
          if (!_Traits::eq(__c, __delim)) 
williamr@2
   346
            __s.push_back(__c);
williamr@2
   347
          else
williamr@2
   348
            break;              // Character is extracted but not appended.
williamr@2
   349
        }
williamr@2
   350
      }
williamr@2
   351
    }
williamr@2
   352
williamr@2
   353
    if (__nread == 0 || __nread >= __s.max_size())
williamr@2
   354
      __is.clear(__is.rdstate() | ios::failbit);
williamr@2
   355
  }
williamr@2
   356
  else
williamr@2
   357
    __is.clear(__is.rdstate() | ios::badbit);
williamr@2
   358
williamr@2
   359
  return __is;
williamr@2
   360
}
williamr@2
   361
williamr@2
   362
# endif /* _STLP_NEW_IOSTREAMS */
williamr@2
   363
williamr@2
   364
_STLP_END_NAMESPACE
williamr@2
   365
williamr@2
   366
// # undef _STLP_USING_IO
williamr@2
   367
# undef basic_string
williamr@2
   368
williamr@2
   369
#endif