177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc. 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk. 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies. 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted, 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice. 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_NUM_PUT_C 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_NUM_PUT_C 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_NUM_PUT_H 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_num_put.h> 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_LIMITS 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_limits.h> 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// __do_put_float and its helper functions. Strategy: write the output 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// to a buffer of char, transform the buffer to _CharT, and then copy 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// it to the output. 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//---------------------------------------------------------------------- 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// num_put facet 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__copy_float_and_fill(const _CharT* __first, const _CharT* __last, 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _OutputIter __oi, 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __flags, 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner streamsize __width, _CharT __fill, 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT __xplus, _CharT __xminus) { 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__width <= __last - __first) 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__first, __last, __oi); 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner streamsize __pad = __width - (__last - __first); 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __dir = __flags & ios_base::adjustfield; 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__dir == ios_base::left) { 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __oi = _STLP_STD::copy(__first, __last, __oi); 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_PRIV __fill_n(__oi, __pad, __fill); 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else if (__dir == ios_base::internal && __first != __last && 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (*__first == __xplus || *__first == __xminus)) { 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *__oi++ = *__first++; 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __oi = _STLP_PRIV __fill_n(__oi, __pad, __fill); 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__first, __last, __oi); 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __oi = _STLP_PRIV __fill_n(__oi, __pad, __fill); 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__first, __last, __oi); 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T) 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Helper routine for wchar_t 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _OutputIter> 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__put_float(__iostring &__str, _OutputIter __oi, 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base& __f, wchar_t __fill, 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner wchar_t __decimal_point, wchar_t __sep, 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __group_pos, const string& __grouping) { 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__f.getloc()); 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __iowstring __wbuf; 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __convert_float_buffer(__str, __wbuf, __ct, __decimal_point); 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!__grouping.empty()) { 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __insert_grouping(__wbuf, __group_pos, __grouping, 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __sep, __ct.widen('+'), __ct.widen('-'), 0); 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __copy_float_and_fill(__wbuf.data(), __wbuf.data() + __wbuf.size(), __oi, 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.flags(), __f.width(0), __fill, __ct.widen('+'), __ct.widen('-')); 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* WCHAR_T */ 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Helper routine for char 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _OutputIter> 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__put_float(__iostring &__str, _OutputIter __oi, 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base& __f, char __fill, 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char __decimal_point, char __sep, 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __group_pos, const string& __grouping) { 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ((__group_pos < __str.size()) && (__str[__group_pos] == '.')) { 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __str[__group_pos] = __decimal_point; 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!__grouping.empty()) { 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __insert_grouping(__str, __group_pos, 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __grouping, __sep, '+', '-', 0); 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __copy_float_and_fill(__str.data(), __str.data() + __str.size(), __oi, 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.flags(), __f.width(0), __fill, '+', '-'); 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter, class _Float> 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__do_put_float(_OutputIter __s, ios_base& __f, 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT __fill, _Float __x) { 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __iostring __buf; 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner size_t __group_pos = __write_float(__buf, __f.flags(), (int)__f.precision(), __x); 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__f.getloc()); 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __put_float(__buf, __s, __f, __fill, 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __np.decimal_point(), __np.thousands_sep(), 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __group_pos, __np.grouping()); 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void __get_money_digits_aux (__iostring &__buf, ios_base &, _STLP_LONGEST_FLOAT_TYPE __x) 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ __get_floor_digits(__buf, __x); } 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T) 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void __get_money_digits_aux (__iowstring &__wbuf, ios_base &__f, _STLP_LONGEST_FLOAT_TYPE __x) { 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __iostring __buf; 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __get_floor_digits(__buf, __x); 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__f.getloc()); 13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __convert_float_buffer(__buf, __wbuf, __ct, wchar_t(0), false); 13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT> 14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid _STLP_CALL __get_money_digits(_STLP_BASIC_IOSTRING(_CharT) &__buf, ios_base& __f, _STLP_LONGEST_FLOAT_TYPE __x) 14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ __get_money_digits_aux(__buf, __f, __x); } 14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// _M_do_put_integer and its helper functions. 14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__copy_integer_and_fill(const _CharT* __buf, ptrdiff_t __len, 14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _OutputIter __oi, 15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __flg, streamsize __wid, _CharT __fill, 15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _CharT __xplus, _CharT __xminus) { 15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__len >= __wid) 15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__buf, __buf + __len, __oi); 15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //casting numeric_limits<ptrdiff_t>::max to streamsize only works is ptrdiff_t is signed or streamsize representation 15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //is larger than ptrdiff_t one. 15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STATIC_ASSERT((sizeof(streamsize) > sizeof(ptrdiff_t)) || 15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ((sizeof(streamsize) == sizeof(ptrdiff_t)) && numeric_limits<ptrdiff_t>::is_signed)) 15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t __pad = __STATIC_CAST(ptrdiff_t, (min) (__STATIC_CAST(streamsize, (numeric_limits<ptrdiff_t>::max)()), 16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __STATIC_CAST(streamsize, __wid - __len))); 16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __dir = __flg & ios_base::adjustfield; 16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__dir == ios_base::left) { 16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __oi = _STLP_STD::copy(__buf, __buf + __len, __oi); 16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_PRIV __fill_n(__oi, __pad, __fill); 16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else if (__dir == ios_base::internal && __len != 0 && 16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (__buf[0] == __xplus || __buf[0] == __xminus)) { 16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *__oi++ = __buf[0]; 17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __oi = __fill_n(__oi, __pad, __fill); 17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__buf + 1, __buf + __len, __oi); 17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else if (__dir == ios_base::internal && __len >= 2 && 17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (__flg & ios_base::showbase) && 17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner (__flg & ios_base::basefield) == ios_base::hex) { 17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *__oi++ = __buf[0]; 17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *__oi++ = __buf[1]; 17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __oi = __fill_n(__oi, __pad, __fill); 17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__buf + 2, __buf + __len, __oi); 18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __oi = __fill_n(__oi, __pad, __fill); 18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__buf, __buf + __len, __oi); 18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_WCHAR_T) 18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Helper function for wchar_t 19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _OutputIter> 19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__put_integer(char* __buf, char* __iend, _OutputIter __s, 19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base& __f, 19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __flags, wchar_t __fill) { 19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner locale __loc = __f.getloc(); 19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__loc); 19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner wchar_t __xplus = __ct.widen('+'); 19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner wchar_t __xminus = __ct.widen('-'); 20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner wchar_t __wbuf[64]; 20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __ct.widen(__buf, __iend, __wbuf); 20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t __len = __iend - __buf; 20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner wchar_t* __eend = __wbuf + __len; 20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const numpunct<wchar_t>& __np = use_facet<numpunct<wchar_t> >(__loc); 20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const string& __grouping = __np.grouping(); 20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!__grouping.empty()) { 21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int __basechars; 21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__flags & ios_base::showbase) 21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner switch (__flags & ios_base::basefield) { 21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case ios_base::hex: __basechars = 2; break; 21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case ios_base::oct: __basechars = 1; break; 21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner default: __basechars = 0; 21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else 21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __basechars = 0; 21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __len = __insert_grouping(__wbuf, __eend, __grouping, __np.thousands_sep(), 22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __xplus, __xminus, __basechars); 22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __copy_integer_and_fill((wchar_t*)__wbuf, __len, __s, 22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __flags, __f.width(0), __fill, __xplus, __xminus); 22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Helper function for char 23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _OutputIter> 23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__put_integer(char* __buf, char* __iend, _OutputIter __s, 23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base& __f, ios_base::fmtflags __flags, char __fill) { 23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char __grpbuf[64]; 23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t __len = __iend - __buf; 23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const numpunct<char>& __np = use_facet<numpunct<char> >(__f.getloc()); 23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const string& __grouping = __np.grouping(); 23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!__grouping.empty()) { 24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner int __basechars; 24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__flags & ios_base::showbase) 24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner switch (__flags & ios_base::basefield) { 24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case ios_base::hex: __basechars = 2; break; 24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case ios_base::oct: __basechars = 1; break; 24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner default: __basechars = 0; 24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else 24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __basechars = 0; 25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // make sure there is room at the end of the buffer 25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // we pass to __insert_grouping 25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::copy(__buf, __iend, (char *) __grpbuf); 25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __buf = __grpbuf; 25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __iend = __grpbuf + __len; 25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __len = __insert_grouping(__buf, __iend, __grouping, __np.thousands_sep(), 25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner '+', '-', __basechars); 25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __copy_integer_and_fill(__buf, __len, __s, __flags, __f.width(0), __fill, '+', '-'); 26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_LONG_LONG) 26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef _STLP_LONG_LONG __max_int_t; 26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef unsigned _STLP_LONG_LONG __umax_int_t; 26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef long __max_int_t; 26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef unsigned long __umax_int_t; 26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_lo(); 27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_hi(); 27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Integer> 27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline char* _STLP_CALL 27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __true_type& /* is_signed */) { 27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const bool __negative = __x < 0 ; 27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __max_int_t __temp = __x; 27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __umax_int_t __utemp = __negative?-__temp:__temp; 28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (; __utemp != 0; __utemp /= 10) 28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = (char)((int)(__utemp % 10) + '0'); 28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // put sign if needed or requested 28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__negative) 28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = '-'; 28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else if (__flags & ios_base::showpos) 28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = '+'; 28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __ptr; 28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Integer> 29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline char* _STLP_CALL 29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __false_type& /* is_signed */) { 29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (; __x != 0; __x /= 10) 29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = (char)((int)(__x % 10) + '0'); 29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // put sign if requested 29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__flags & ios_base::showpos) 29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = '+'; 29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __ptr; 30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Integer> 30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerchar* _STLP_CALL 30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x) { 30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char* __ptr = __buf; 30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__x == 0) { 30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = '0'; 30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ((__flags & ios_base::showpos) && ((__flags & (ios_base::oct | ios_base::hex)) == 0)) 31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = '+'; 31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // oct or hex base shall not be added to the 0 value (see '#' flag in C formating strings) 31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner switch (__flags & ios_base::basefield) { 31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case ios_base::oct: 31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __umax_int_t __temp = __x; 31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // if the size of integer is less than 8, clear upper part 31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 ) 32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __temp &= 0xFFFFFFFF; 32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (; __temp != 0; __temp >>=3) 32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = (char)((((unsigned)__temp)& 0x7) + '0'); 32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // put leading '0' if showbase is set 32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__flags & ios_base::showbase) 32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = '0'; 32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner break; 33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner case ios_base::hex: 33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const char* __table_ptr = (__flags & ios_base::uppercase) ? 33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __hex_char_table_hi() : __hex_char_table_lo(); 33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __umax_int_t __temp = __x; 33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // if the size of integer is less than 8, clear upper part 33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 ) 33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __temp &= 0xFFFFFFFF; 33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner for (; __temp != 0; __temp >>=4) 34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = __table_ptr[((unsigned)__temp & 0xF)]; 34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__flags & ios_base::showbase) { 34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = __table_ptr[16]; 34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *--__ptr = '0'; 34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner break; 34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner //case ios_base::dec: 34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner default: 35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner { 35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined(__HP_aCC) && (__HP_aCC == 1) 35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool _IsSigned = !((_Integer)-1 > 0); 35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_IsSigned) 35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __ptr = __write_decimal_backward(__ptr, __x, __flags, __true_type() ); 35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else 35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __ptr = __write_decimal_backward(__ptr, __x, __flags, __false_type() ); 35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else 35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned; 35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __ptr = __write_decimal_backward(__ptr, __x, __flags, _IsSigned()); 36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner break; 36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // return pointer to beginning of the string 36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __ptr; 36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter, class _Integer> 37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__do_put_integer(_OutputIter __s, ios_base& __f, _CharT __fill, _Integer __x) { 37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // buffer size = number of bytes * number of digit necessary in the smallest Standard base (base 8, 3 digits/byte) 37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // plus the longest base representation '0x' 37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Do not use __buf_size to define __buf static buffer, some compilers (HP aCC) do not accept const variable as 37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // the specification of a static buffer size. 37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char __buf[sizeof(_Integer) * 3 + 2]; 37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const ptrdiff_t __buf_size = sizeof(__buf) / sizeof(char); 37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __flags = __f.flags(); 38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner char* __ibeg = __write_integer_backward((char*)__buf + __buf_size, __flags, __x); 38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __put_integer(__ibeg, (char*)__buf + __buf_size, __s, __f, __flags, __fill); 38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter _STLP_CALL 38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__do_put_bool(_OutputIter __s, ios_base& __f, _CharT __fill, bool __x) { 38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__f.getloc()); 38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __str = __x ? __np.truename() : __np.falsename(); 39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner streamsize __wid = __f.width(0); 39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__str.size() >= __STATIC_CAST(size_t, __wid)) 39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__str.begin(), __str.end(), __s); 39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else { 39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner streamsize __pad = __wid - __str.size(); 39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __dir = __f.flags() & ios_base::adjustfield; 39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (__dir == ios_base::left) { 39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s = _STLP_STD::copy(__str.begin(), __str.end(), __s); 40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __fill_n(__s, __pad, __fill); 40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner else /* covers right and internal padding */ { 40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s = __fill_n(__s, __pad, __fill); 40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_STD::copy(__str.begin(), __str.end(), __s); 40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE 40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// num_put<> 41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIterator> 41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerlocale::id num_put<_CharT, _OutputIterator>::id; 41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_BOOL) 41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner bool __val) const { 42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (!(__f.flags() & ios_base::boolalpha)) 42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // 22.2.2.2.2.23: shall return do_put for int and not directly __do_put_integer. 42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return do_put(__s, __f, __fill, __STATIC_CAST(long, __val)); 42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return _STLP_PRIV __do_put_bool(__s, __f, __fill, __val); 42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner long __val) const 43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner unsigned long __val) const 44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner double __val) const 44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); } 44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_LONG_DOUBLE) 44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner long double __val) const 45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); } 45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_LONG_LONG) 45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_LONG_LONG __val) const 46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner unsigned _STLP_LONG_LONG __val) const 46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_LONG_LONG */ 46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// 22.2.2.2.2 Stage 1: "For conversion from void* the specifier is %p." 47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This is not clear and I'm really don't follow this (below). 47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _CharT, class _OutputIter> 47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_OutputIter 47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnernum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT /*__fill*/, 47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const void* __val) const { 47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const ctype<_CharT>& __c_type = use_facet<ctype<_CharT> >(__f.getloc()); 47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ios_base::fmtflags __save_flags = __f.flags(); 47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.setf(ios_base::hex, ios_base::basefield); 48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.setf(ios_base::showbase); 48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.setf(ios_base::internal, ios_base::adjustfield); 48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix 48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if ( __val == 0 ) { 48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // base ('0x') not shown for null, but I really want to type it 48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // for pointer. Print it first in this case. 48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner const char* __table_ptr = (__save_flags & ios_base::uppercase) ? 48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __hex_char_table_hi() : _STLP_PRIV __hex_char_table_lo(); 48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s++ = __c_type.widen( '0' ); 49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __s++ = __c_type.widen( __table_ptr[16] ); 49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.width((sizeof(void*) * 2)); // digits in pointer type 49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } else { 49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix 49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MSVC) 49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# pragma warning (push) 49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# pragma warning (disable : 4311) //pointer truncation from 'const void*' to 'unsigned long' 49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _OutputIter result = 50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_LONG_LONG 50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ( sizeof(void*) == sizeof(unsigned long) ) ? 50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned long,__val)) 50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_LONG_LONG 50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : /* ( sizeof(void*) == sizeof(unsigned _STLP_LONG_LONG) ) ? */ 50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val)) 50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ; 50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MSVC) 51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# pragma warning (pop) 51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner __f.flags(__save_flags); 51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return result; 51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE 51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_NUM_PUT_C */ 51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables: 52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++ 52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End: 523