epoc32/include/stdapis/stlportv5/stl/_num_get.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
/*
williamr@4
     2
 * Portions Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
williamr@4
     3
 *
williamr@2
     4
 * Copyright (c) 1999
williamr@2
     5
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     6
 *
williamr@2
     7
 * Copyright (c) 1999
williamr@2
     8
 * Boris Fomitchev
williamr@2
     9
 *
williamr@2
    10
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
    11
 * or implied. Any use is at your own risk.
williamr@2
    12
 *
williamr@2
    13
 * Permission to use or copy this software for any purpose is hereby granted
williamr@2
    14
 * without fee, provided the above notices are retained on all copies.
williamr@2
    15
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    16
 * provided the above notices are retained, and a notice that the code was
williamr@2
    17
 * modified is included with the above copyright notice.
williamr@2
    18
 *
williamr@2
    19
 */
williamr@2
    20
#ifndef _STLP_NUM_GET_C
williamr@2
    21
#define _STLP_NUM_GET_C
williamr@2
    22
williamr@2
    23
#ifndef _STLP_INTERNAL_NUM_GET_H
williamr@4
    24
#  include <stl/_num_get.h>
williamr@2
    25
#endif
williamr@2
    26
williamr@4
    27
#ifndef _STLP_INTERNAL_LIMITS
williamr@4
    28
#  include <stl/_limits.h>
williamr@2
    29
#endif
williamr@2
    30
williamr@2
    31
_STLP_BEGIN_NAMESPACE
williamr@2
    32
williamr@4
    33
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    34
williamr@4
    35
_STLP_DECLSPEC unsigned char _STLP_CALL __digit_val_table(unsigned);
williamr@4
    36
_STLP_DECLSPEC const char* _STLP_CALL __narrow_atoms();
williamr@2
    37
williamr@2
    38
template < class _InputIter, class _Integer, class _CharT>
williamr@2
    39
_InputIter _STLP_CALL
williamr@4
    40
__do_get_integer(_InputIter&, _InputIter&, ios_base&, ios_base::iostate&, _Integer&, _CharT*);
williamr@2
    41
williamr@4
    42
// __do_get_integer and its helper functions.
williamr@2
    43
williamr@4
    44
inline bool _STLP_CALL __get_fdigit(char __c, const char*)
williamr@4
    45
{ return __c >= '0' && __c <= '9'; }
williamr@2
    46
williamr@4
    47
inline bool _STLP_CALL __get_fdigit_or_sep(char& __c, char __sep, const char *__digits) {
williamr@2
    48
  if (__c == __sep) {
williamr@2
    49
    __c = ',' ;
williamr@2
    50
    return true ;
williamr@4
    51
  }
williamr@4
    52
  else
williamr@4
    53
    return  __get_fdigit(__c, __digits);
williamr@2
    54
}
williamr@2
    55
williamr@2
    56
inline int _STLP_CALL
williamr@2
    57
__get_digit_from_table(unsigned __index)
williamr@4
    58
{ return (__index > 127 ? 0xFF : __digit_val_table(__index)); }
williamr@2
    59
williamr@2
    60
template <class _InputIter, class _CharT>
williamr@2
    61
int
williamr@4
    62
__get_base_or_zero(_InputIter& __in_ite, _InputIter& __end, ios_base& __str, _CharT*) {
williamr@2
    63
  _CharT __atoms[5];
williamr@4
    64
  const ctype<_CharT>& __c_type = *__STATIC_CAST(const ctype<_CharT>*, __str._M_ctype_facet());
williamr@2
    65
williamr@4
    66
  __c_type.widen(__narrow_atoms(), __narrow_atoms() + 5, __atoms);
williamr@2
    67
williamr@2
    68
  bool __negative = false;
williamr@4
    69
  _CharT __c = *__in_ite;
williamr@2
    70
williamr@2
    71
  if (__c == __atoms[1] /* __xminus_char */ ) {
williamr@2
    72
    __negative = true;
williamr@4
    73
    ++__in_ite;
williamr@2
    74
  }
williamr@2
    75
  else if (__c == __atoms[0] /* __xplus_char */ )
williamr@4
    76
    ++__in_ite;
williamr@2
    77
williamr@2
    78
  int __base;
williamr@2
    79
  int __valid_zero = 0;
williamr@2
    80
williamr@2
    81
  ios_base::fmtflags __basefield = __str.flags() & ios_base::basefield;
williamr@2
    82
williamr@2
    83
  switch (__basefield) {
williamr@2
    84
  case ios_base::oct:
williamr@2
    85
    __base = 8;
williamr@2
    86
    break;
williamr@2
    87
  case ios_base::dec:
williamr@2
    88
    __base = 10;
williamr@2
    89
    break;
williamr@2
    90
  case ios_base::hex:
williamr@2
    91
    __base = 16;
williamr@4
    92
    if (__in_ite != __end && *__in_ite == __atoms[2] /* __zero_char */ ) {
williamr@4
    93
      ++__in_ite;
williamr@4
    94
      if (__in_ite != __end &&
williamr@4
    95
          (*__in_ite == __atoms[3] /* __x_char */ || *__in_ite == __atoms[4] /* __X_char */ ))
williamr@4
    96
        ++__in_ite;
williamr@2
    97
      else
williamr@2
    98
        __valid_zero = 1; // That zero is valid by itself.
williamr@2
    99
    }
williamr@2
   100
    break;
williamr@2
   101
  default:
williamr@4
   102
    if (__in_ite != __end && *__in_ite == __atoms[2] /* __zero_char */ ) {
williamr@4
   103
      ++__in_ite;
williamr@4
   104
      if (__in_ite != __end &&
williamr@4
   105
          (*__in_ite == __atoms[3] /* __x_char */ || *__in_ite == __atoms[4] /* __X_char */ )) {
williamr@4
   106
        ++__in_ite;
williamr@2
   107
        __base = 16;
williamr@2
   108
      }
williamr@2
   109
      else
williamr@2
   110
        {
williamr@2
   111
          __base = 8;
williamr@2
   112
          __valid_zero = 1; // That zero is still valid by itself.
williamr@2
   113
        }
williamr@2
   114
    }
williamr@2
   115
    else
williamr@2
   116
      __base = 10;
williamr@2
   117
    break;
williamr@2
   118
  }
williamr@2
   119
  return (__base << 2) | ((int)__negative << 1) | __valid_zero;
williamr@2
   120
}
williamr@2
   121
williamr@2
   122
williamr@4
   123
template <class _InputIter, class _Integer, class _CharT>
williamr@2
   124
bool _STLP_CALL
williamr@2
   125
__get_integer(_InputIter& __first, _InputIter& __last,
williamr@4
   126
              int __base, _Integer& __val,
williamr@4
   127
              int __got, bool __is_negative, _CharT __separator, const string& __grouping, const __true_type& /*_IsSigned*/) {
williamr@2
   128
  bool __ovflow = false;
williamr@2
   129
  _Integer __result = 0;
williamr@2
   130
  bool __is_group = !__grouping.empty();
williamr@4
   131
  char __group_sizes[64];
williamr@4
   132
  char __current_group_size = 0;
williamr@2
   133
  char* __group_sizes_end = __group_sizes;
williamr@4
   134
williamr@2
   135
  _Integer __over_base = (numeric_limits<_Integer>::min)() / __STATIC_CAST(_Integer, __base);
williamr@2
   136
williamr@2
   137
   for ( ; __first != __last ; ++__first) {
williamr@2
   138
williamr@4
   139
     const _CharT __c = *__first;
williamr@2
   140
williamr@2
   141
     if (__is_group && __c == __separator) {
williamr@4
   142
       *__group_sizes_end++ = __current_group_size;
williamr@2
   143
       __current_group_size = 0;
williamr@2
   144
       continue;
williamr@2
   145
     }
williamr@2
   146
williamr@2
   147
     int __n = __get_digit_from_table(__c);
williamr@2
   148
williamr@2
   149
     if (__n >= __base)
williamr@4
   150
       break;
williamr@2
   151
williamr@2
   152
     ++__got;
williamr@2
   153
     ++__current_group_size;
williamr@2
   154
williamr@2
   155
     if (__result < __over_base)
williamr@2
   156
       __ovflow = true;  // don't need to keep accumulating
williamr@2
   157
     else {
williamr@2
   158
       _Integer __next = __STATIC_CAST(_Integer, __base * __result - __n);
williamr@2
   159
       if (__result != 0)
williamr@4
   160
         __ovflow = __ovflow || __next >= __result;
williamr@2
   161
       __result = __next;
williamr@2
   162
     }
williamr@2
   163
   }
williamr@2
   164
williamr@2
   165
   if (__is_group && __group_sizes_end != __group_sizes) {
williamr@2
   166
     *__group_sizes_end++ = __current_group_size;
williamr@2
   167
   }
williamr@2
   168
williamr@2
   169
   // fbp : added to not modify value if nothing was read
williamr@2
   170
   if (__got > 0) {
williamr@4
   171
       __val = __ovflow ? __is_negative ? (numeric_limits<_Integer>::min)()
williamr@4
   172
                                        : (numeric_limits<_Integer>::max)()
williamr@4
   173
                        : __is_negative ? __result
williamr@4
   174
                                        : __STATIC_CAST(_Integer, -__result);
williamr@2
   175
   }
williamr@2
   176
  // overflow is being treated as failure
williamr@4
   177
  return ((__got > 0) && !__ovflow) &&
williamr@4
   178
          (__is_group == 0 ||
williamr@4
   179
           __valid_grouping(__group_sizes, __group_sizes_end,
williamr@4
   180
                            __grouping.data(), __grouping.data()+ __grouping.size()));
williamr@2
   181
}
williamr@2
   182
williamr@4
   183
template <class _InputIter, class _Integer, class _CharT>
williamr@2
   184
bool _STLP_CALL
williamr@2
   185
__get_integer(_InputIter& __first, _InputIter& __last,
williamr@4
   186
              int __base, _Integer& __val,
williamr@4
   187
              int __got, bool __is_negative, _CharT __separator, const string& __grouping, const __false_type& /*_IsSigned*/) {
williamr@2
   188
  bool __ovflow = false;
williamr@2
   189
  _Integer __result = 0;
williamr@2
   190
  bool __is_group = !__grouping.empty();
williamr@4
   191
  char __group_sizes[64];
williamr@4
   192
  char __current_group_size = 0;
williamr@2
   193
  char* __group_sizes_end = __group_sizes;
williamr@2
   194
williamr@2
   195
  _Integer  __over_base = (numeric_limits<_Integer>::max)() / __STATIC_CAST(_Integer, __base);
williamr@2
   196
williamr@2
   197
  for ( ; __first != __last ; ++__first) {
williamr@2
   198
williamr@4
   199
    const _CharT __c = *__first;
williamr@4
   200
williamr@4
   201
    if (__is_group && __c == __separator) {
williamr@4
   202
      *__group_sizes_end++ = __current_group_size;
williamr@2
   203
      __current_group_size = 0;
williamr@2
   204
      continue;
williamr@2
   205
    }
williamr@4
   206
williamr@2
   207
    int __n = __get_digit_from_table(__c);
williamr@2
   208
williamr@2
   209
    if (__n >= __base)
williamr@4
   210
      break;
williamr@2
   211
williamr@2
   212
    ++__got;
williamr@2
   213
    ++__current_group_size;
williamr@2
   214
williamr@2
   215
    if (__result > __over_base)
williamr@2
   216
      __ovflow = true;  //don't need to keep accumulating
williamr@2
   217
    else {
williamr@2
   218
      _Integer __next = __STATIC_CAST(_Integer, __base * __result + __n);
williamr@4
   219
      if (__result != 0)
williamr@4
   220
        __ovflow = __ovflow || __next <= __result;
williamr@4
   221
        __result = __next;
williamr@2
   222
      }
williamr@2
   223
  }
williamr@2
   224
williamr@2
   225
  if (__is_group && __group_sizes_end != __group_sizes) {
williamr@4
   226
      *__group_sizes_end++ = __current_group_size;
williamr@2
   227
  }
williamr@2
   228
williamr@2
   229
  // fbp : added to not modify value if nothing was read
williamr@2
   230
  if (__got > 0) {
williamr@4
   231
      __val = __ovflow ? (numeric_limits<_Integer>::max)()
williamr@4
   232
                       : (__is_negative ? __STATIC_CAST(_Integer, -__result)
williamr@4
   233
                                        : __result);
williamr@2
   234
  }
williamr@2
   235
williamr@2
   236
  // overflow is being treated as failure
williamr@2
   237
  return ((__got > 0) && !__ovflow) &&
williamr@4
   238
          (__is_group == 0 ||
williamr@4
   239
           __valid_grouping(__group_sizes, __group_sizes_end,
williamr@4
   240
                            __grouping.data(), __grouping.data()+ __grouping.size()));
williamr@2
   241
}
williamr@2
   242
williamr@2
   243
williamr@4
   244
template <class _InputIter, class _Integer, class _CharT>
williamr@2
   245
bool _STLP_CALL
williamr@4
   246
__get_decimal_integer(_InputIter& __first, _InputIter& __last, _Integer& __val, _CharT* /*dummy*/) {
williamr@2
   247
  string __grp;
williamr@4
   248
  //Here there is no grouping so separator is not important, we just pass the default charater.
williamr@4
   249
  return __get_integer(__first, __last, 10, __val, 0, false, _CharT() /*separator*/, __grp, __false_type());
williamr@2
   250
}
williamr@2
   251
williamr@2
   252
template <class _InputIter, class _Integer, class _CharT>
williamr@2
   253
_InputIter _STLP_CALL
williamr@4
   254
__do_get_integer(_InputIter& __in_ite, _InputIter& __end, ios_base& __str,
williamr@4
   255
                 ios_base::iostate& __err, _Integer& __val, _CharT* __pc) {
williamr@4
   256
#if defined (__HP_aCC) && (__HP_aCC == 1)
williamr@2
   257
  bool _IsSigned = !((_Integer)(-1) > 0);
williamr@2
   258
#else
williamr@2
   259
  typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned;
williamr@2
   260
#endif
williamr@2
   261
williamr@4
   262
  const numpunct<_CharT>& __numpunct = *__STATIC_CAST(const numpunct<_CharT>*, __str._M_numpunct_facet());
williamr@4
   263
  const string& __grouping = __str._M_grouping(); // cached copy
williamr@2
   264
williamr@4
   265
  const int __base_or_zero = __get_base_or_zero(__in_ite, __end, __str, __pc);
williamr@2
   266
  int  __got = __base_or_zero & 1;
williamr@2
   267
williamr@2
   268
  bool __result;
williamr@2
   269
williamr@4
   270
  if (__in_ite == __end) {      // We may have already read a 0.  If so,
williamr@2
   271
williamr@2
   272
    if (__got > 0) {       // the result is 0 even if we're at eof.
williamr@2
   273
      __val = 0;
williamr@2
   274
      __result = true;
williamr@2
   275
    }
williamr@2
   276
    else
williamr@2
   277
      __result = false;
williamr@4
   278
  }
williamr@4
   279
  else {
williamr@4
   280
    const bool __negative = (__base_or_zero & 2) != 0;
williamr@2
   281
    const int __base = __base_or_zero >> 2;
williamr@2
   282
williamr@4
   283
#if defined (__HP_aCC) && (__HP_aCC == 1)
williamr@4
   284
    if (_IsSigned)
williamr@4
   285
      __result = __get_integer(__in_ite, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __true_type() );
williamr@4
   286
    else
williamr@4
   287
      __result = __get_integer(__in_ite, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __false_type() );
williamr@2
   288
#else
williamr@4
   289
    __result = __get_integer(__in_ite, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, _IsSigned());
williamr@2
   290
# endif
williamr@2
   291
  }
williamr@2
   292
williamr@2
   293
  __err = __STATIC_CAST(ios_base::iostate, __result ? ios_base::goodbit : ios_base::failbit);
williamr@2
   294
williamr@4
   295
  if (__in_ite == __end)
williamr@2
   296
    __err |= ios_base::eofbit;
williamr@4
   297
  return __in_ite;
williamr@2
   298
}
williamr@2
   299
williamr@4
   300
// __read_float and its helper functions.
williamr@2
   301
template <class _InputIter, class _CharT>
williamr@2
   302
_InputIter  _STLP_CALL
williamr@4
   303
__copy_sign(_InputIter __first, _InputIter __last, __iostring& __v,
williamr@2
   304
            _CharT __xplus, _CharT __xminus) {
williamr@4
   305
  if (__first != __last) {
williamr@2
   306
    _CharT __c = *__first;
williamr@2
   307
    if (__c == __xplus)
williamr@2
   308
      ++__first;
williamr@2
   309
    else if (__c == __xminus) {
williamr@2
   310
      __v.push_back('-');
williamr@2
   311
      ++__first;
williamr@2
   312
    }
williamr@2
   313
  }
williamr@2
   314
  return __first;
williamr@2
   315
}
williamr@2
   316
williamr@2
   317
williamr@2
   318
template <class _InputIter, class _CharT>
williamr@2
   319
bool _STLP_CALL
williamr@4
   320
__copy_digits(_InputIter& __first, _InputIter __last,
williamr@4
   321
              __iostring& __v, const _CharT* __digits) {
williamr@2
   322
  bool __ok = false;
williamr@2
   323
williamr@2
   324
  for ( ; __first != __last; ++__first) {
williamr@2
   325
    _CharT __c = *__first;
williamr@2
   326
    if (__get_fdigit(__c, __digits)) {
williamr@2
   327
      __v.push_back((char)__c);
williamr@2
   328
      __ok = true;
williamr@2
   329
    }
williamr@2
   330
    else
williamr@2
   331
      break;
williamr@2
   332
  }
williamr@2
   333
  return __ok;
williamr@2
   334
}
williamr@2
   335
williamr@2
   336
template <class _InputIter, class _CharT>
williamr@2
   337
bool _STLP_CALL
williamr@4
   338
__copy_grouped_digits(_InputIter& __first, _InputIter __last,
williamr@4
   339
                      __iostring& __v, const _CharT * __digits,
williamr@4
   340
                      _CharT __sep, const string& __grouping,
williamr@4
   341
                      bool& __grouping_ok) {
williamr@2
   342
  bool __ok = false;
williamr@4
   343
  char __group_sizes[64];
williamr@2
   344
  char*__group_sizes_end = __group_sizes;
williamr@2
   345
  char __current_group_size = 0;
williamr@2
   346
williamr@2
   347
  for ( ; __first != __last; ++__first) {
williamr@2
   348
    _CharT __c = *__first;
williamr@2
   349
    bool __tmp = __get_fdigit_or_sep(__c, __sep, __digits);
williamr@2
   350
    if (__tmp) {
williamr@4
   351
      if (__c == ',') {
williamr@4
   352
        *__group_sizes_end++ = __current_group_size;
williamr@2
   353
        __current_group_size = 0;
williamr@2
   354
      }
williamr@2
   355
      else {
williamr@2
   356
        __ok = true;
williamr@2
   357
        __v.push_back((char)__c);
williamr@2
   358
        ++__current_group_size;
williamr@2
   359
      }
williamr@2
   360
    }
williamr@2
   361
    else
williamr@2
   362
      break;
williamr@2
   363
  }
williamr@2
   364
williamr@2
   365
  if (__group_sizes_end != __group_sizes)
williamr@4
   366
    *__group_sizes_end++ = __current_group_size;
williamr@2
   367
  __grouping_ok = __valid_grouping(__group_sizes, __group_sizes_end, __grouping.data(), __grouping.data() + __grouping.size());
williamr@2
   368
  return __ok;
williamr@2
   369
}
williamr@2
   370
williamr@2
   371
williamr@2
   372
template <class _InputIter, class _CharT>
williamr@2
   373
bool _STLP_CALL
williamr@4
   374
__read_float(__iostring& __buf, _InputIter& __in_ite, _InputIter& __end, ios_base& __s, _CharT*) {
williamr@2
   375
  // Create a string, copying characters of the form
williamr@2
   376
  // [+-]? [0-9]* .? [0-9]* ([eE] [+-]? [0-9]+)?
williamr@2
   377
williamr@2
   378
  bool __digits_before_dot /* = false */;
williamr@2
   379
  bool __digits_after_dot = false;
williamr@2
   380
  bool __ok;
williamr@2
   381
williamr@2
   382
  bool   __grouping_ok = true;
williamr@2
   383
williamr@4
   384
  const ctype<_CharT>& __ct = *__STATIC_CAST(const ctype<_CharT>*, __s._M_ctype_facet());
williamr@4
   385
  const numpunct<_CharT>& __numpunct = *__STATIC_CAST(const numpunct<_CharT>*, __s._M_numpunct_facet());
williamr@4
   386
  const string& __grouping = __s._M_grouping(); // cached copy
williamr@2
   387
williamr@2
   388
  _CharT __dot = __numpunct.decimal_point();
williamr@2
   389
  _CharT __sep = __numpunct.thousands_sep();
williamr@2
   390
williamr@2
   391
  _CharT __digits[10];
williamr@2
   392
  _CharT __xplus;
williamr@2
   393
  _CharT __xminus;
williamr@2
   394
williamr@2
   395
  _CharT __pow_e;
williamr@2
   396
  _CharT __pow_E;
williamr@2
   397
williamr@2
   398
  _Initialize_get_float(__ct, __xplus, __xminus, __pow_e, __pow_E, __digits);
williamr@2
   399
williamr@2
   400
  // Get an optional sign
williamr@4
   401
  __in_ite = __copy_sign(__in_ite, __end, __buf, __xplus, __xminus);
williamr@2
   402
williamr@2
   403
  // Get an optional string of digits.
williamr@4
   404
  if (!__grouping.empty())
williamr@4
   405
    __digits_before_dot = __copy_grouped_digits(__in_ite, __end, __buf, __digits,
williamr@4
   406
                                                __sep, __grouping, __grouping_ok);
williamr@2
   407
  else
williamr@4
   408
    __digits_before_dot = __copy_digits(__in_ite, __end, __buf, __digits);
williamr@2
   409
williamr@2
   410
  // Get an optional decimal point, and an optional string of digits.
williamr@4
   411
  if (__in_ite != __end && *__in_ite == __dot) {
williamr@2
   412
    __buf.push_back('.');
williamr@4
   413
    ++__in_ite;
williamr@4
   414
    __digits_after_dot = __copy_digits(__in_ite, __end, __buf, __digits);
williamr@2
   415
  }
williamr@2
   416
williamr@2
   417
  // There have to be some digits, somewhere.
williamr@2
   418
  __ok = __digits_before_dot || __digits_after_dot;
williamr@2
   419
williamr@2
   420
  // Get an optional exponent.
williamr@4
   421
  if (__ok && __in_ite != __end && (*__in_ite == __pow_e || *__in_ite == __pow_E)) {
williamr@2
   422
    __buf.push_back('e');
williamr@4
   423
    ++__in_ite;
williamr@4
   424
    __in_ite = __copy_sign(__in_ite, __end, __buf, __xplus, __xminus);
williamr@4
   425
    __ok = __copy_digits(__in_ite, __end, __buf, __digits);
williamr@2
   426
    // If we have an exponent then the sign
williamr@2
   427
    // is optional but the digits aren't.
williamr@2
   428
  }
williamr@2
   429
williamr@2
   430
  return __ok;
williamr@2
   431
}
williamr@2
   432
williamr@4
   433
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   434
williamr@2
   435
//
williamr@2
   436
// num_get<>, num_put<>
williamr@2
   437
//
williamr@2
   438
williamr@4
   439
#if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
williamr@4
   440
# if !defined(__SYMBIAN32__WSD__) 
williamr@4
   441
#  if !defined (__BORLANDC__) &&  (defined (__SYMBIAN32__) && defined(_STLP_DESIGNATED_DLL))
williamr@2
   442
template <class _CharT, class _InputIterator>
williamr@2
   443
locale::id num_get<_CharT, _InputIterator>::id;
williamr@4
   444
#  endif
williamr@2
   445
williamr@4
   446
#  if ((defined (__CYGWIN__) || defined (__MINGW32__)) && \
williamr@4
   447
       defined (_STLP_USE_DYNAMIC_LIB) && !defined (__BUILDING_STLPORT)) || (defined (__SYMBIAN32__) && defined(_STLP_DESIGNATED_DLL))
williamr@4
   448
/*
williamr@4
   449
 * Under cygwin, when STLport is used as a shared library, the id needs
williamr@4
   450
 * to be specified as imported otherwise they will be duplicated in the
williamr@4
   451
 * calling executable.
williamr@4
   452
 */
williamr@4
   453
#    if defined(__SYMBIAN32__)
williamr@4
   454
template <>
williamr@4
   455
locale::id num_get<char, istreambuf_iterator<char, char_traits<char> > >::id; //data should not exported in symbian
williamr@4
   456
/*
williamr@4
   457
template <>
williamr@4
   458
_STLP_DECLSPEC locale::id num_get<char, const char*>::id;
williamr@4
   459
*/
williamr@4
   460
williamr@4
   461
#    if !defined (STLP_NO_WCHAR_T)
williamr@4
   462
template <>
williamr@4
   463
locale::id num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id;
williamr@4
   464
/*
williamr@4
   465
template <>
williamr@4
   466
_STLP_DECLSPEC locale::id num_get<wchar_t, const wchar_t*>::id;
williamr@4
   467
*/
williamr@4
   468
#      endif//STLP_NO_WCHAR_T
williamr@4
   469
#    else
williamr@4
   470
template <>
williamr@4
   471
_STLP_DECLSPEC locale::id num_get<char, istreambuf_iterator<char, char_traits<char> > >::id;
williamr@4
   472
/*
williamr@4
   473
template <>
williamr@4
   474
_STLP_DECLSPEC locale::id num_get<char, const char*>::id;
williamr@4
   475
*/
williamr@4
   476
williamr@4
   477
#    if !defined (STLP_NO_WCHAR_T)
williamr@4
   478
template <>
williamr@4
   479
_STLP_DECLSPEC locale::id num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id;
williamr@4
   480
/*
williamr@4
   481
template <>
williamr@4
   482
_STLP_DECLSPEC locale::id num_get<wchar_t, const wchar_t*>::id;
williamr@4
   483
*/
williamr@4
   484
#      endif
williamr@4
   485
#    endif//__SYMBIAN32__
williamr@4
   486
williamr@4
   487
#  endif /* __CYGWIN__ && _STLP_USE_DYNAMIC_LIB */
williamr@4
   488
#endif //__SYMBIAN32__WSD__
williamr@4
   489
williamr@4
   490
#else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
williamr@4
   491
williamr@4
   492
//typedef num_get<char, const char*> num_get_char;
williamr@2
   493
typedef num_get<char, istreambuf_iterator<char, char_traits<char> > > num_get_char_2;
williamr@2
   494
williamr@4
   495
//__DECLARE_INSTANCE(locale::id, num_get_char::id, );
williamr@2
   496
__DECLARE_INSTANCE(locale::id, num_get_char_2::id, );
williamr@2
   497
williamr@4
   498
#  if !defined (_STLP_NO_WCHAR_T)
williamr@2
   499
williamr@4
   500
//typedef num_get<wchar_t, const wchar_t*> num_get_wchar_t;
williamr@2
   501
typedef num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > num_get_wchar_t_2;
williamr@2
   502
williamr@4
   503
//__DECLARE_INSTANCE(locale::id, num_get_wchar_t::id, );
williamr@2
   504
__DECLARE_INSTANCE(locale::id, num_get_wchar_t_2::id, );
williamr@2
   505
williamr@4
   506
#  endif
williamr@2
   507
williamr@4
   508
#endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
williamr@2
   509
williamr@4
   510
#if !defined (_STLP_NO_BOOL)
williamr@2
   511
template <class _CharT, class _InputIter>
williamr@2
   512
_InputIter
williamr@4
   513
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end,
williamr@2
   514
                                    ios_base& __s,
williamr@4
   515
                                    ios_base::iostate& __err, bool& __x) const {
williamr@2
   516
  if (__s.flags() & ios_base::boolalpha) {
williamr@2
   517
    locale __loc = __s.getloc();
williamr@4
   518
    const _Numpunct& __np = *__STATIC_CAST(const _Numpunct*, __s._M_numpunct_facet());
williamr@4
   519
    //    const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc) ;
williamr@2
   520
//    const ctype<_CharT>& __ct =    use_facet<ctype<_CharT> >(__loc) ;
williamr@2
   521
williamr@2
   522
    const basic_string<_CharT> __truename  = __np.truename();
williamr@2
   523
    const basic_string<_CharT> __falsename = __np.falsename();
williamr@2
   524
    bool __true_ok  = true;
williamr@2
   525
    bool __false_ok = true;
williamr@2
   526
williamr@2
   527
    size_t __n = 0;
williamr@4
   528
    for ( ; __in_ite != __end; ++__in_ite) {
williamr@4
   529
      _CharT __c = *__in_ite;
williamr@2
   530
      __true_ok  = __true_ok  && (__c == __truename[__n]);
williamr@2
   531
      __false_ok = __false_ok && (__c == __falsename[__n]);
williamr@2
   532
      ++__n;
williamr@2
   533
williamr@2
   534
      if ((!__true_ok && !__false_ok) ||
williamr@2
   535
          (__true_ok  && __n >= __truename.size()) ||
williamr@2
   536
          (__false_ok && __n >= __falsename.size())) {
williamr@4
   537
        ++__in_ite;
williamr@2
   538
        break;
williamr@2
   539
      }
williamr@2
   540
    }
williamr@4
   541
    if (__true_ok  && __n < __truename.size())  __true_ok  = false;
williamr@4
   542
    if (__false_ok && __n < __falsename.size()) __false_ok = false;
williamr@2
   543
williamr@2
   544
    if (__true_ok || __false_ok) {
williamr@2
   545
      __err = ios_base::goodbit;
williamr@2
   546
      __x = __true_ok;
williamr@2
   547
    }
williamr@2
   548
    else
williamr@2
   549
      __err = ios_base::failbit;
williamr@2
   550
williamr@4
   551
    if (__in_ite == __end)
williamr@2
   552
      __err |= ios_base::eofbit;
williamr@2
   553
williamr@4
   554
    return __in_ite;
williamr@2
   555
  }
williamr@2
   556
williamr@2
   557
  else {
williamr@2
   558
    long __lx;
williamr@4
   559
    _InputIter __tmp = this->do_get(__in_ite, __end, __s, __err, __lx);
williamr@2
   560
    if (!(__err & ios_base::failbit)) {
williamr@2
   561
      if (__lx == 0)
williamr@2
   562
        __x = false;
williamr@2
   563
      else if (__lx == 1)
williamr@2
   564
        __x = true;
williamr@2
   565
      else
williamr@2
   566
        __err |= ios_base::failbit;
williamr@2
   567
    }
williamr@2
   568
    return __tmp;
williamr@2
   569
  }
williamr@2
   570
}
williamr@2
   571
williamr@4
   572
#endif /* _STLP_NO_BOOL */
williamr@2
   573
williamr@4
   574
#if defined (_STLP_FIX_LIBRARY_ISSUES)
williamr@2
   575
template <class _CharT, class _InputIter>
williamr@2
   576
_InputIter
williamr@4
   577
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   578
                                    ios_base::iostate& __err, short& __val) const
williamr@4
   579
{ return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); }
williamr@4
   580
williamr@4
   581
template <class _CharT, class _InputIter>
williamr@4
   582
_InputIter
williamr@4
   583
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   584
                                    ios_base::iostate& __err, int& __val) const
williamr@4
   585
{ return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); }
williamr@4
   586
williamr@4
   587
#endif
williamr@4
   588
williamr@4
   589
template <class _CharT, class _InputIter>
williamr@4
   590
_InputIter
williamr@4
   591
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   592
                                    ios_base::iostate& __err, long& __val) const
williamr@4
   593
{ return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); }
williamr@4
   594
williamr@4
   595
template <class _CharT, class _InputIter>
williamr@4
   596
_InputIter
williamr@4
   597
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   598
                                    ios_base::iostate& __err,
williamr@4
   599
                                    unsigned short& __val) const
williamr@4
   600
{ return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); }
williamr@4
   601
williamr@4
   602
template <class _CharT, class _InputIter>
williamr@4
   603
_InputIter
williamr@4
   604
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   605
                                    ios_base::iostate& __err,
williamr@4
   606
                                    unsigned int& __val) const
williamr@4
   607
{ return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); }
williamr@4
   608
williamr@4
   609
template <class _CharT, class _InputIter>
williamr@4
   610
_InputIter
williamr@4
   611
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   612
                                    ios_base::iostate& __err,
williamr@4
   613
                                    unsigned long& __val) const
williamr@4
   614
{ return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 ); }
williamr@4
   615
williamr@4
   616
williamr@4
   617
template <class _CharT, class _InputIter>
williamr@4
   618
_InputIter
williamr@4
   619
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   620
                                    ios_base::iostate& __err,
williamr@4
   621
                                    float& __val) const {
williamr@4
   622
  _STLP_PRIV __iostring __buf ;
williamr@4
   623
  bool __ok = _STLP_PRIV __read_float(__buf, __in_ite, __end, __str, (_CharT*)0 );
williamr@4
   624
  _STLP_PRIV __string_to_float(__buf, __val);
williamr@4
   625
  __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
williamr@4
   626
  if (__in_ite == __end)
williamr@4
   627
    __err |= ios_base::eofbit;
williamr@4
   628
  return __in_ite;
williamr@2
   629
}
williamr@2
   630
williamr@2
   631
template <class _CharT, class _InputIter>
williamr@2
   632
_InputIter
williamr@4
   633
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@4
   634
                                    ios_base::iostate& __err,
williamr@4
   635
                                    double& __val) const {
williamr@4
   636
  _STLP_PRIV __iostring __buf ;
williamr@4
   637
  bool __ok = _STLP_PRIV __read_float(__buf, __in_ite, __end, __str, (_CharT*)0 );
williamr@4
   638
#ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT
williamr@4
   639
  if(__ok)
williamr@4
   640
  {
williamr@4
   641
#endif
williamr@4
   642
  _STLP_PRIV __string_to_float(__buf, __val);
williamr@4
   643
#ifdef SYMBIAN_OE_ENHANCED_LOCALE_SUPPORT
williamr@4
   644
  }
williamr@4
   645
#endif
williamr@4
   646
  __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
williamr@4
   647
  if (__in_ite == __end)
williamr@4
   648
    __err |= ios_base::eofbit;
williamr@4
   649
  return __in_ite;
williamr@2
   650
}
williamr@2
   651
williamr@4
   652
#if !defined (_STLP_NO_LONG_DOUBLE)
williamr@2
   653
template <class _CharT, class _InputIter>
williamr@2
   654
_InputIter
williamr@4
   655
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@2
   656
                                    ios_base::iostate& __err,
williamr@4
   657
                                    long double& __val) const {
williamr@4
   658
  _STLP_PRIV __iostring __buf ;
williamr@4
   659
  bool __ok = _STLP_PRIV __read_float(__buf, __in_ite, __end, __str, (_CharT*)0 );
williamr@4
   660
  _STLP_PRIV __string_to_float(__buf, __val);
williamr@2
   661
  __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
williamr@4
   662
  if (__in_ite == __end)
williamr@2
   663
    __err |= ios_base::eofbit;
williamr@4
   664
  return __in_ite;
williamr@2
   665
}
williamr@2
   666
#endif /* _STLP_NO_LONG_DOUBLE */
williamr@2
   667
williamr@2
   668
template <class _CharT, class _InputIter>
williamr@2
   669
_InputIter
williamr@4
   670
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@2
   671
                           ios_base::iostate& __err,
williamr@2
   672
                           void*& __p) const {
williamr@4
   673
#if defined (_STLP_LONG_LONG) && !defined (__MRC__)    //*ty 12/07/2001 - MrCpp can not cast from long long to void*
williamr@4
   674
  unsigned _STLP_LONG_LONG __val;
williamr@2
   675
#else
williamr@2
   676
  unsigned long __val;
williamr@4
   677
#endif
williamr@4
   678
    iter_type __tmp = _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 );
williamr@2
   679
    if (!(__err & ios_base::failbit))
williamr@4
   680
      __p = __REINTERPRET_CAST(void*,__val);
williamr@2
   681
    return __tmp;
williamr@2
   682
  }
williamr@2
   683
williamr@4
   684
#if defined (_STLP_LONG_LONG)
williamr@2
   685
template <class _CharT, class _InputIter>
williamr@2
   686
_InputIter
williamr@4
   687
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@2
   688
                                    ios_base::iostate& __err,
williamr@2
   689
                                    _STLP_LONG_LONG& __val) const {
williamr@4
   690
  return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 );
williamr@2
   691
}
williamr@2
   692
williamr@2
   693
template <class _CharT, class _InputIter>
williamr@2
   694
_InputIter
williamr@4
   695
num_get<_CharT, _InputIter>::do_get(_InputIter __in_ite, _InputIter __end, ios_base& __str,
williamr@2
   696
                                    ios_base::iostate& __err,
williamr@2
   697
                                    unsigned _STLP_LONG_LONG& __val) const {
williamr@4
   698
  return _STLP_PRIV __do_get_integer(__in_ite, __end, __str, __err, __val, (_CharT*)0 );
williamr@2
   699
}
williamr@2
   700
#endif /* _STLP_LONG_LONG */
williamr@2
   701
williamr@2
   702
_STLP_END_NAMESPACE
williamr@2
   703
williamr@2
   704
#endif /* _STLP_NUMERIC_FACETS_C */
williamr@2
   705
williamr@2
   706
// Local Variables:
williamr@2
   707
// mode:C++
williamr@2
   708
// End: