1
/*
2
 * Copyright (c) 1999
3
 * Silicon Graphics Computer Systems, Inc.
4
 *
5
 * Copyright (c) 1999
6
 * Boris Fomitchev
7
 *
8
 * This material is provided "as is", with absolutely no warranty expressed
9
 * or implied. Any use is at your own risk.
10
 *
11
 * Permission to use or copy this software for any purpose is hereby granted
12
 * without fee, provided the above notices are retained on all copies.
13
 * Permission to modify the code and to distribute modified code is granted,
14
 * provided the above notices are retained, and a notice that the code was
15
 * modified is included with the above copyright notice.
16
 *
17
 */
18
#include "stlport_prefix.h"
19
20
#include <locale>
21
#include <istream>
22
#include <algorithm>
23
24
_STLP_BEGIN_NAMESPACE
25
_STLP_MOVE_TO_PRIV_NAMESPACE
26
27
// __valid_grouping compares two strings, one representing the
28
// group sizes encountered when reading an integer, and the other
29
// representing the valid group sizes as returned by the numpunct
30
// grouping() member function.  Both are interpreted right-to-left.
31
// The grouping string is treated as if it were extended indefinitely
32
// with its last value.  For a grouping to be valid, each term in
33
// the first string must be equal to the corresponding term in the
34
// second, except for the last, which must be less than or equal.
35
36
// boris : this takes reversed first string !
37
bool  _STLP_CALL
38
__valid_grouping(const char * first1, const char * last1,
39
                 const char * first2, const char * last2) {
40
  if (first1 == last1 || first2 == last2) return true;
41
42
  --last1; --last2;
43
44
  while (first1 != last1) {
45
    if (*last1 != *first2)
46
      return false;
47
    --last1;
48
    if (first2 != last2) ++first2;
49
  }
50
51
  return *last1 <= *first2;
52
}
53
54
_STLP_DECLSPEC unsigned char _STLP_CALL __digit_val_table(unsigned __index) {
55
  static const unsigned char __val_table[128] = {
56
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
57
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
58
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
59
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
60
    0xFF,10,11,12,13,14,15,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
61
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
62
    0xFF,10,11,12,13,14,15,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
63
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
64
  };
65
66
  return __val_table[__index];
67
}
68
69
_STLP_DECLSPEC const char* _STLP_CALL __narrow_atoms()
70
{ return "+-0xX"; }
71
72
// index is actually a char
73
74
#if !defined (_STLP_NO_WCHAR_T)
75
76
// Similar, except return the character itself instead of the numeric
77
// value.  Used for floating-point input.
78
bool _STLP_CALL __get_fdigit(wchar_t& c, const wchar_t* digits) {
79
  const wchar_t* p = find(digits, digits + 10, c);
80
  if (p != digits + 10) {
81
    c = (char)('0' + (p - digits));
82
    return true;
83
  }
84
  else
85
    return false;
86
}
87
88
bool _STLP_CALL __get_fdigit_or_sep(wchar_t& c, wchar_t sep,
89
                                    const wchar_t * digits) {
90
  if (c == sep) {
91
    c = (char)',';
92
    return true;
93
  }
94
  else
95
    return __get_fdigit(c, digits);
96
}
97
98
#endif
99
100
_STLP_MOVE_TO_STD_NAMESPACE
101
102
#if !defined(_STLP_NO_FORCE_INSTANTIATE)
103
//----------------------------------------------------------------------
104
// Force instantiation of num_get<>
105
template class _STLP_CLASS_DECLSPEC istreambuf_iterator<char, char_traits<char> >;
106
// template class num_get<char, const char*>;
107
template class num_get<char, istreambuf_iterator<char, char_traits<char> > >;
108
109
#  if !defined (_STLP_NO_WCHAR_T)
110
template class _STLP_CLASS_DECLSPEC  istreambuf_iterator<wchar_t, char_traits<wchar_t> >;
111
template class num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
112
// template class num_get<wchar_t, const wchar_t*>;
113
#  endif
114
#endif
115
116
_STLP_END_NAMESPACE
117
118
// Local Variables:
119
// mode:C++
120
// End: