Home | History | Annotate | Download | only in src
      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:
    121