diff -r 000000000000 -r e4d67989cc36 stdcpp/src/num_get.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stdcpp/src/num_get.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,177 @@ +/* + * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. + * + * Copyright (c) 1999 + * Silicon Graphics Computer Systems, Inc. + * + * Copyright (c) 1999 + * Boris Fomitchev + * + * This material is provided "as is", with absolutely no warranty expressed + * or implied. Any use is at your own risk. + * + * Permission to use or copy this software for any purpose is hereby granted + * without fee, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ +# include "stlport_prefix.h" +#include +#include +#include + +#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) +#include "libstdcppwsd.h" +# endif + +_STLP_BEGIN_NAMESPACE + +//---------------------------------------------------------------------- +// num_get + +#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) +//initialize the static array +void num_get_array_init() +{ + strcpy(get_num_get_narrow_digits(),"0123456789"); + strcpy(get_num_get_narrow_xdigits(),"aAbBcCdDeEfF"); +} +# else +static char narrow_digits[11] = "0123456789"; +static char narrow_xdigits[13] = "aAbBcCdDeEfF"; +# endif + +# ifndef _STLP_NO_WCHAR_T + +void _STLP_CALL +_Initialize_get_digit(wchar_t* digits, wchar_t* xdigits, + const ctype& ct) +{ +#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) + ct.widen(get_num_get_narrow_digits() + 0, get_num_get_narrow_digits() + 10, digits); + ct.widen(get_num_get_narrow_xdigits() + 0, get_num_get_narrow_xdigits() + 10, xdigits); +#else + ct.widen(narrow_digits + 0, narrow_digits + 10, digits); + ct.widen(narrow_xdigits + 0, narrow_xdigits + 10, xdigits); +# endif +} + +// Return either the digit corresponding to c, or a negative number if +// if c isn't a digit. We return -1 if c is the separator character, and +// -2 if it's some other non-digit. +int _STLP_CALL __get_digit(wchar_t c, + const wchar_t* digits, const wchar_t* xdigits, + wchar_t separator) +{ + // Test if it's the separator. + if (c == separator) + return -1; + + const wchar_t* p; + + // Test if it's a decimal digit. + p = find(digits, digits + 10, c); + if (p != digits + 10) + return (int)(p - digits); + + // Test if it's a hex digit. + p = find(xdigits, xdigits + 12, c); + if (p != xdigits + 12) + return (int)(10 + (xdigits - p) / 2); + else + return -2; // It's not a digit and not the separator. +} + +# endif /* _STLP_NO_WCHAR_T */ + +// __valid_grouping compares two strings, one representing the +// group sizes encountered when reading an integer, and the other +// representing the valid group sizes as returned by the numpunct +// grouping() member function. Both are interpreted right-to-left. +// The grouping string is treated as if it were extended indefinitely +// with its last value. For a grouping to be valid, each term in +// the first string must be equal to the corresponding term in the +// second, except for the last, which must be less than or equal. + +// boris : this takes reversed first string ! +_STLP_EXP_DECLSPEC bool _STLP_CALL +__valid_grouping(const char * first1, const char * last1, + const char * first2, const char * last2) +{ + if (first1 == last1 || first2 == last2) return true; + + --last1; --last2; + + while (first1 != last1) { + if (*last1 != *first2) + return false; + --last1; + if (first2 != last2) ++first2; + } + + return *last1 <= *first2; +} + +// this needed for some compilers to make sure sumbols are extern +extern const unsigned char __digit_val_table[]; +extern const char __narrow_atoms[]; + + +const unsigned char __digit_val_table[128] = +{ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,10,11,12,13,14,15,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,10,11,12,13,14,15,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF +}; + +const char __narrow_atoms[5] = {'+', '-', '0', 'x', 'X'}; + +_STLP_EXP_DECLSPEC unsigned char* _STLP_CALL __get_digit_val_table(void) +{ + return (unsigned char*)__digit_val_table; +} +_STLP_EXP_DECLSPEC char* _STLP_CALL __get_narrow_atoms(void) +{ + return (char*)__narrow_atoms; +} +// index is actually a char + +# ifndef _STLP_NO_WCHAR_T + + +//---------------------------------------------------------------------- +// Force instantiation of of num_get<> + +#if !defined(_STLP_NO_FORCE_INSTANTIATE) +template class _STLP_CLASS_DECLSPEC istreambuf_iterator >; +template class num_get > >; +// template class num_get; +#endif + +# endif /* _STLP_NO_WCHAR_T */ + +//---------------------------------------------------------------------- +// Force instantiation of of num_get<> + +#if !defined(_STLP_NO_FORCE_INSTANTIATE) +template class _STLP_CLASS_DECLSPEC istreambuf_iterator >; +// template class num_get; +template class num_get > >; +#endif + +// basic_streambuf >* _STLP_CALL _M_get_istreambuf(basic_istream >& ) ; + +_STLP_END_NAMESPACE + +// Local Variables: +// mode:C++ +// End: + +