1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc. 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk. 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies. 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted, 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice. 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stlport_prefix.h" 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <locale> 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <ostream> 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Note that grouping[0] is the number of digits in the *rightmost* group. 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// We assume, without checking, that *last is null and that there is enough 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// space in the buffer to extend the number past [first, last). 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class Char> 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic ptrdiff_t 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__insert_grouping_aux(Char* first, Char* last, const string& grouping, 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Char separator, Char Plus, Char Minus, 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int basechars) { 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef string::size_type str_size; 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (first == last) 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return 0; 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int sign = 0; 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (*first == Plus || *first == Minus) { 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott sign = 1; 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++first; 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott first += basechars; 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Char* cur_group = last; // Points immediately beyond the rightmost 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // digit of the current group. 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int groupsize = 0; // Size of the current group (if grouping.size() == 0, size 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // of group unlimited: we force condition (groupsize <= 0)) 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for ( str_size n = 0; ; ) { // Index of the current group 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ( n < grouping.size() ) { 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott groupsize = __STATIC_CAST(int, grouping[n++] ); 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ((groupsize <= 0) || (groupsize >= cur_group - first) || (groupsize == CHAR_MAX)) { 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Insert a separator character just before position cur_group - groupsize 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cur_group -= groupsize; 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++last; 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott copy_backward(cur_group, last, last + 1); 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *cur_group = separator; 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return (last - first) + sign + basechars; 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//Dynamic output buffer version. 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class Char, class Str> 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__insert_grouping_aux( /* __basic_iostring<Char> */ Str& iostr, size_t __group_pos, 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const string& grouping, 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Char separator, Char Plus, Char Minus, 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int basechars) { 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef string::size_type str_size; 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (iostr.size() < __group_pos) 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return; 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int __first_pos = 0; 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Char __first = *iostr.begin(); 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__first == Plus || __first == Minus) { 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++__first_pos; 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __first_pos += basechars; 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typename Str::iterator cur_group(iostr.begin() + __group_pos); // Points immediately beyond the rightmost 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // digit of the current group. 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int groupsize = 0; // Size of the current group (if grouping.size() == 0, size 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // of group unlimited: we force condition (groupsize <= 0)) 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for ( str_size n = 0; ; ) { // Index of the current group 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ( n < grouping.size() ) { 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott groupsize = __STATIC_CAST( int, grouping[n++] ); 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if ( (groupsize <= 0) || (groupsize >= ((cur_group - iostr.begin()) - __first_pos)) || 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (groupsize == CHAR_MAX)) { 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott break; 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Insert a separator character just before position cur_group - groupsize 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cur_group -= groupsize; 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott cur_group = iostr.insert(cur_group, separator); 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//---------------------------------------------------------------------- 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// num_put 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_lo() 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return "0123456789abcdefx"; } 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_hi() 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return "0123456789ABCDEFX"; } 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottchar* _STLP_CALL 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__write_integer(char* buf, ios_base::fmtflags flags, long x) { 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char tmp[64]; 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char* bufend = tmp+64; 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char* beg = __write_integer_backward(bufend, flags, x); 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return copy(beg, bufend, buf); 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott///------------------------------------- 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottptrdiff_t _STLP_CALL 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__insert_grouping(char * first, char * last, const string& grouping, 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char separator, char Plus, char Minus, int basechars) { 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return __insert_grouping_aux(first, last, grouping, 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott separator, Plus, Minus, basechars); 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__insert_grouping(__iostring &str, size_t group_pos, const string& grouping, 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char separator, char Plus, char Minus, int basechars) { 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __insert_grouping_aux(str, group_pos, grouping, separator, Plus, Minus, basechars); 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T) 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottptrdiff_t _STLP_CALL 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__insert_grouping(wchar_t* first, wchar_t* last, const string& grouping, 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wchar_t separator, wchar_t Plus, wchar_t Minus, 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int basechars) { 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return __insert_grouping_aux(first, last, grouping, separator, 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Plus, Minus, basechars); 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__insert_grouping(__iowstring &str, size_t group_pos, const string& grouping, 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wchar_t separator, wchar_t Plus, wchar_t Minus, 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int basechars) { 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __insert_grouping_aux(str, group_pos, grouping, separator, Plus, Minus, basechars); 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//---------------------------------------------------------------------- 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Force instantiation of num_put<> 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined(_STLP_NO_FORCE_INSTANTIATE) 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class _STLP_CLASS_DECLSPEC ostreambuf_iterator<char, char_traits<char> >; 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// template class num_put<char, char*>; 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class num_put<char, ostreambuf_iterator<char, char_traits<char> > >; 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# ifndef _STLP_NO_WCHAR_T 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class ostreambuf_iterator<wchar_t, char_traits<wchar_t> >; 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate class num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >; 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// template class num_put<wchar_t, wchar_t*>; 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif /* INSTANTIATE_WIDE_STREAMS */ 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Local Variables: 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// mode:C++ 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// End: 184