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