williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: #ifndef _STLP_NUM_PUT_C williamr@2: #define _STLP_NUM_PUT_C williamr@2: williamr@2: #ifndef _STLP_INTERNAL_NUM_PUT_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: # if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) williamr@2: williamr@2: #ifndef _STLP_LIMITS_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: // _M_do_put_float and its helper functions. Strategy: write the output williamr@2: // to a buffer of char, transform the buffer to _CharT, and then copy williamr@2: // it to the output. williamr@2: williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: _M_do_put_float(_OutputIter __s, ios_base& __f, _CharT __fill,_Float __x); williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // num_put facet williamr@2: williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __copy_float_and_fill(const _CharT* __first, const _CharT* __last, williamr@2: _OutputIter __stl_out, williamr@2: ios_base::fmtflags __flags, williamr@2: streamsize __width, _CharT __fill, williamr@2: _CharT __xplus, _CharT __xminus) { williamr@2: if (__width <= __last - __first) williamr@2: return copy(__first, __last, __stl_out); williamr@2: else { williamr@2: streamsize __pad = __width - (__last - __first); williamr@2: ios_base::fmtflags __dir = __flags & ios_base::adjustfield; williamr@2: williamr@2: if (__dir == ios_base::left) { williamr@2: __stl_out = copy(__first, __last, __stl_out); williamr@2: return fill_n(__stl_out, __pad, __fill); williamr@2: } williamr@2: else if (__dir == ios_base::internal && __first != __last && williamr@2: (*__first == __xplus || *__first == __xminus)) { williamr@2: *__stl_out++ = *__first++; williamr@2: __stl_out = fill_n(__stl_out, __pad, __fill); williamr@2: return copy(__first, __last, __stl_out); williamr@2: } williamr@2: else { williamr@2: __stl_out = fill_n(__stl_out, __pad, __fill); williamr@2: return copy(__first, __last, __stl_out); williamr@2: } williamr@2: } williamr@2: } williamr@2: williamr@2: #ifndef _STLP_NO_WCHAR_T williamr@2: // Helper routine for wchar_t williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __put_float(char* __ibuf, char* __iend, _OutputIter __stl_out, williamr@2: ios_base& __f, wchar_t __fill, williamr@2: wchar_t __decimal_point, williamr@2: wchar_t __sep, const string& __grouping) williamr@2: { williamr@2: //const ctype& __ct = *(ctype*)__f._M_ctype_facet() ; williamr@2: const ctype& __ct = use_facet< ctype >(__f.getloc()); williamr@2: williamr@2: // wchar_t __wbuf[128]; //stdcxx fix williamr@2: wchar_t __wbuf[256+10]; williamr@2: wchar_t* __eend = __convert_float_buffer(__ibuf, __iend, __wbuf, williamr@2: __ct, __decimal_point); williamr@2: if (!__grouping.empty()) { williamr@2: // In order to do separator-insertion only to the left of the williamr@2: // decimal point, we adjust the size of the first (right-most) williamr@2: // group. We need to be careful if there is only one entry in williamr@2: // grouping: in this case we need to duplicate the first entry. williamr@2: williamr@2: string __new_grouping = __grouping; williamr@2: wchar_t* __decimal_pos = find(__wbuf, __eend, __decimal_point); williamr@2: if (__grouping.size() == 1) williamr@2: __new_grouping.push_back(__grouping[0]); williamr@2: williamr@2: // dwa 1/24/00 - try as I might, there doesn't seem to be a way williamr@2: // to suppress the warning williamr@2: __new_grouping[0] += __STATIC_CAST(char, __eend - __decimal_pos); williamr@2: ptrdiff_t __len = __insert_grouping(__wbuf, __eend, __new_grouping, williamr@2: __sep, williamr@2: __ct.widen('+'), __ct.widen('-'), williamr@2: 0); williamr@2: __eend = __wbuf + __len; williamr@2: } williamr@2: williamr@2: return __copy_float_and_fill(__wbuf, __eend, __stl_out, williamr@2: __f.flags(), __f.width(0), __fill, williamr@2: __ct.widen('+'), __ct.widen('-')); williamr@2: } williamr@2: # endif /* WCHAR_T */ williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: template williamr@2: ptrdiff_t _STLP_CALL williamr@2: __insert_grouping(_CharT * first, _CharT * last, const string& grouping, williamr@2: _CharT separator, _CharT Plus, _CharT Minus, int basechars) williamr@2: { williamr@2: int length = last-first; williamr@2: ptrdiff_t res; williamr@2: char* str = new char(length+64); //morespace for seperators williamr@2: memset(str,'\0',length+64); williamr@2: memcpy(str,first, length); williamr@2: char _separator = (char)separator; williamr@2: char _Plus = (char)Plus; williamr@2: char _Minus = (char)Minus; williamr@2: williamr@2: res = __insert_grouping(str, str+length, grouping, williamr@2: _separator, _Plus, _Minus, basechars); williamr@2: memcpy(first,str,res); williamr@2: delete str; williamr@2: return res; williamr@2: williamr@2: } williamr@2: williamr@2: #endif williamr@2: // Helper routine for char williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __put_float(char* __ibuf, char* __iend, _OutputIter __stl_out, williamr@2: ios_base& __f, char __fill, williamr@2: char __decimal_point, williamr@2: char __sep, const string& __grouping) williamr@2: { williamr@2: __adjust_float_buffer(__ibuf, __iend, __decimal_point); williamr@2: if (!__grouping.empty()) { williamr@2: string __new_grouping = __grouping; williamr@2: const char * __decimal_pos = find(__ibuf, __iend, __decimal_point); williamr@2: if (__grouping.size() == 1) williamr@2: __new_grouping.push_back(__grouping[0]); williamr@2: __new_grouping[0] += __STATIC_CAST(char, (__iend - __decimal_pos)); williamr@2: ptrdiff_t __len = __insert_grouping(__ibuf, __iend, __new_grouping, williamr@2: __sep, '+', '-', 0); williamr@2: __iend = __ibuf + __len; williamr@2: } williamr@2: williamr@2: return __copy_float_and_fill(__ibuf, __iend, __stl_out, williamr@2: __f.flags(), __f.width(0), __fill, '+', '-'); williamr@2: } williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __put_float(char* __ibuf, char* __iend, _OutputIter __stl_out, williamr@2: ios_base& __f, _CharT __fill, williamr@2: _CharT __decimal_point, williamr@2: _CharT __sep, const string& __grouping) williamr@2: { williamr@2: __adjust_float_buffer(__ibuf, __iend, __decimal_point); williamr@2: if (!__grouping.empty()) { williamr@2: string __new_grouping = __grouping; williamr@2: const char * __decimal_pos = find(__ibuf, __iend, __decimal_point); williamr@2: if (__grouping.size() == 1) williamr@2: __new_grouping.push_back(__grouping[0]); williamr@2: __new_grouping[0] += __STATIC_CAST(char, (__iend - __decimal_pos)); williamr@2: ptrdiff_t __len = __insert_grouping(__ibuf, __iend, __new_grouping, williamr@2: __sep, '+', '-', 0); williamr@2: __iend = __ibuf + __len; williamr@2: } williamr@2: williamr@2: _CharT __wbuf[64]; williamr@2: locale __loc = __f.getloc(); williamr@2: const ctype<_CharT>& __ct = use_facet >(__loc); williamr@2: __ct.widen(__ibuf, __iend, __wbuf); williamr@2: williamr@2: ptrdiff_t __len = __iend - __ibuf; williamr@2: return __copy_float_and_fill(__wbuf, __wbuf+__len, __stl_out, williamr@2: __f.flags(), __f.width(0), __fill, (_CharT)'+', (_CharT)'-'); williamr@2: } williamr@2: williamr@2: williamr@2: #endif williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: _M_do_put_float(_OutputIter __s, ios_base& __f, williamr@2: _CharT __fill, _Float __x) williamr@2: { williamr@2: string __buf; williamr@2: __buf.reserve(256+10); //+2 - 10/1/07 williamr@2: __write_float(__buf, __f.flags(), (int)__f.precision(), __x); williamr@2: williamr@2: //const numpunct<_CharT>& __np = *(const numpunct<_CharT>*)__f._M_numpunct_facet(); williamr@2: const numpunct<_CharT>& __np = use_facet< numpunct<_CharT> >(__f.getloc()); williamr@2: williamr@2: return __put_float(__CONST_CAST(char*, __buf.c_str()), williamr@2: __CONST_CAST(char*, __buf.c_str()) + __buf.size(), williamr@2: __s, __f, __fill, williamr@2: __np.decimal_point(), williamr@2: // __np.thousands_sep(), __f._M_grouping()); //stdcxx fix - 17/1/07 williamr@2: __np.thousands_sep(), __np.grouping()); williamr@2: } williamr@2: williamr@2: // _M_do_put_integer and its helper functions. williamr@2: williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __copy_integer_and_fill(const _CharT* __buf, ptrdiff_t __len, williamr@2: _OutputIter __stl_out, williamr@2: ios_base::fmtflags __flg, streamsize __wid, _CharT __fill, williamr@2: _CharT __xplus, _CharT __xminus) williamr@2: { williamr@2: if (__len >= __wid) williamr@2: return copy(__buf, __buf + __len, __stl_out); williamr@2: else { williamr@2: ptrdiff_t __pad = __wid - __len; williamr@2: ios_base::fmtflags __dir = __flg & ios_base::adjustfield; williamr@2: williamr@2: if (__dir == ios_base::left) { williamr@2: __stl_out = copy(__buf, __buf + __len, __stl_out); williamr@2: return fill_n(__stl_out, __pad, __fill); williamr@2: } williamr@2: else if (__dir == ios_base::internal && __len != 0 && williamr@2: (__buf[0] == __xplus || __buf[0] == __xminus)) { williamr@2: *__stl_out++ = __buf[0]; williamr@2: __stl_out = fill_n(__stl_out, __pad, __fill); williamr@2: return copy(__buf + 1, __buf + __len, __stl_out); williamr@2: } williamr@2: else if (__dir == ios_base::internal && __len >= 2 && williamr@2: (__flg & ios_base::showbase) && williamr@2: (__flg & ios_base::basefield) == ios_base::hex) { williamr@2: *__stl_out++ = __buf[0]; williamr@2: *__stl_out++ = __buf[1]; williamr@2: __stl_out = fill_n(__stl_out, __pad, __fill); williamr@2: return copy(__buf + 2, __buf + __len, __stl_out); williamr@2: } williamr@2: else { williamr@2: __stl_out = fill_n(__stl_out, __pad, __fill); williamr@2: return copy(__buf, __buf + __len, __stl_out); williamr@2: } williamr@2: } williamr@2: } williamr@2: williamr@2: #ifndef _STLP_NO_WCHAR_T williamr@2: // Helper function for wchar_t williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __put_integer(char* __buf, char* __iend, _OutputIter __s, williamr@2: ios_base& __f, williamr@2: ios_base::fmtflags __flags, wchar_t __fill) williamr@2: { williamr@2: locale __loc = __f.getloc(); williamr@2: const ctype& __ct = use_facet >(__loc); williamr@2: //const ctype& __ct = *(const ctype*)__f._M_ctype_facet(); williamr@2: williamr@2: wchar_t __xplus = __ct.widen('+'); williamr@2: wchar_t __xminus = __ct.widen('-'); williamr@2: williamr@2: wchar_t __wbuf[64]; williamr@2: __ct.widen(__buf, __iend, __wbuf); williamr@2: ptrdiff_t __len = __iend - __buf; williamr@2: wchar_t* __eend = __wbuf + __len; williamr@2: williamr@2: const numpunct& __np = use_facet >(__loc); williamr@2: const string& __grouping = __np.grouping(); williamr@2: williamr@2: //const numpunct& __np = *(const numpunct*)__f._M_numpunct_facet(); williamr@2: // const string& __grouping = __f._M_grouping(); williamr@2: williamr@2: if (!__grouping.empty()) { williamr@2: int __basechars; williamr@2: if (__flags & ios_base::showbase) williamr@2: switch (__flags & ios_base::basefield) { williamr@2: case ios_base::hex: __basechars = 2; break; williamr@2: case ios_base::oct: __basechars = 1; break; williamr@2: default: __basechars = 0; williamr@2: } williamr@2: else williamr@2: __basechars = 0; williamr@2: williamr@2: __len = __insert_grouping(__wbuf, __eend, __grouping, __np.thousands_sep(), williamr@2: __xplus, __xminus, __basechars); williamr@2: } williamr@2: williamr@2: return __copy_integer_and_fill((wchar_t*)__wbuf, __len, __s, williamr@2: __flags, __f.width(0), __fill, __xplus, __xminus); williamr@2: } williamr@2: #endif williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __put_integer(char* __buf, char* __iend, _OutputIter __s, williamr@2: ios_base& __f, williamr@2: ios_base::fmtflags __flags, _CharT __fill) williamr@2: { williamr@2: locale __loc = __f.getloc(); williamr@2: const ctype<_CharT>& __ct = use_facet >(__loc); williamr@2: //const ctype& __ct = *(const ctype*)__f._M_ctype_facet(); williamr@2: williamr@2: _CharT __xplus = '+'; williamr@2: _CharT __xminus = '-'; williamr@2: williamr@2: _CharT __wbuf[64]; williamr@2: williamr@2: ptrdiff_t __len = __iend - __buf; williamr@2: _CharT* __eend = __wbuf + __len; williamr@2: williamr@2: williamr@2: const numpunct& __np = use_facet >(__loc); williamr@2: const string& __grouping = __np.grouping(); williamr@2: williamr@2: //const numpunct& __np = *(const numpunct*)__f._M_numpunct_facet(); williamr@2: // const string& __grouping = __f._M_grouping(); williamr@2: williamr@2: if (!__grouping.empty()) { williamr@2: int __basechars; williamr@2: if (__flags & ios_base::showbase) williamr@2: switch (__flags & ios_base::basefield) { williamr@2: case ios_base::hex: __basechars = 2; break; williamr@2: case ios_base::oct: __basechars = 1; break; williamr@2: default: __basechars = 0; williamr@2: } williamr@2: else williamr@2: __basechars = 0; williamr@2: williamr@2: __len = __insert_grouping(__buf, __iend, __grouping, __np.thousands_sep(), williamr@2: __ct.narrow( __xplus, '+'), __ct.narrow(__xminus, '-'), __basechars); williamr@2: __ct.widen(__buf, __iend, __wbuf); williamr@2: williamr@2: } williamr@2: williamr@2: return __copy_integer_and_fill(__wbuf, __len, __s, williamr@2: __flags, __f.width(0), __fill, __xplus, __xminus); williamr@2: } williamr@2: williamr@2: williamr@2: #endif williamr@2: // Helper function for char williamr@2: template williamr@2: _OutputIter _STLP_CALL williamr@2: __put_integer(char* __buf, char* __iend, _OutputIter __s, williamr@2: ios_base& __f, ios_base::fmtflags __flags, char __fill) williamr@2: { williamr@2: ptrdiff_t __len = __iend - __buf; williamr@2: char __grpbuf[64]; williamr@2: williamr@2: // const numpunct& __np = use_facet >(__f.getloc()); williamr@2: // const string& __grouping = __np.grouping(); williamr@2: williamr@2: const numpunct& __np = *(const numpunct*)__f._M_numpunct_facet(); williamr@2: // const string& __grouping = __f._M_grouping(); //stdcxx fix, 17/1/07 williamr@2: const string& __grouping = __np.grouping(); williamr@2: williamr@2: if (!__grouping.empty()) { williamr@2: int __basechars; williamr@2: if (__flags & ios_base::showbase) williamr@2: switch (__flags & ios_base::basefield) { williamr@2: case ios_base::hex: __basechars = 2; break; williamr@2: case ios_base::oct: __basechars = 1; break; williamr@2: default: __basechars = 0; williamr@2: } williamr@2: else williamr@2: __basechars = 0; williamr@2: williamr@2: // make sure there is room at the end of the buffer williamr@2: // we pass to __insert_grouping williamr@2: williamr@2: copy(__buf, __iend, (char *) __grpbuf); williamr@2: __buf = __grpbuf; williamr@2: __iend = __grpbuf + __len; williamr@2: __len = __insert_grouping(__buf, __iend, __grouping, __np.thousands_sep(), williamr@2: '+', '-', __basechars); williamr@2: } williamr@2: williamr@2: return __copy_integer_and_fill(__buf, __len, __s, __flags, __f.width(0), __fill, '+', '-'); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_LONG_LONG williamr@2: typedef _STLP_LONG_LONG __max_int_t; williamr@2: typedef unsigned _STLP_LONG_LONG __umax_int_t; williamr@2: #else williamr@2: typedef long __max_int_t; williamr@2: typedef unsigned long __umax_int_t; williamr@2: #endif williamr@2: williamr@2: extern _STLP_DECLSPEC const char* get_hex_char_table_lo(); williamr@2: extern _STLP_DECLSPEC const char* get_hex_char_table_hi(); williamr@2: williamr@2: template williamr@2: inline char* _STLP_CALL williamr@2: __write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __true_type& /* is_signed */) williamr@2: { williamr@2: const bool __negative = __x < 0 ; williamr@2: __max_int_t __temp = __x; williamr@2: __umax_int_t __utemp = __negative?-__temp:__temp; williamr@2: williamr@2: for (; __utemp != 0; __utemp /= 10) williamr@2: *--__ptr = (int)(__utemp % 10) + '0'; williamr@2: // put sign if needed or requested williamr@2: if (__negative) williamr@2: *--__ptr = '-'; williamr@2: else if (__flags & ios_base::showpos) williamr@2: *--__ptr = '+'; williamr@2: return __ptr; williamr@2: } williamr@2: williamr@2: template williamr@2: inline char* _STLP_CALL williamr@2: __write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __false_type& /* is_signed */) williamr@2: { williamr@2: for (; __x != 0; __x /= 10) williamr@2: *--__ptr = (int)(__x % 10) + '0'; williamr@2: // put sign if requested williamr@2: if (__flags & ios_base::showpos) williamr@2: *--__ptr = '+'; williamr@2: return __ptr; williamr@2: } williamr@2: williamr@2: template williamr@2: char* _STLP_CALL williamr@2: __write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x) williamr@2: { williamr@2: char* __ptr = __buf; williamr@2: __umax_int_t __temp; williamr@2: williamr@2: if (__x == 0) { williamr@2: *--__ptr = '0'; williamr@2: if ((__flags & ios_base::showpos) && ( (__flags & (ios_base::hex | ios_base::oct)) == 0 )) williamr@2: *--__ptr = '+'; williamr@2: } williamr@2: else { williamr@2: williamr@2: switch (__flags & ios_base::basefield) { williamr@2: case ios_base::oct: williamr@2: __temp = __x; williamr@2: // if the size of integer is less than 8, clear upper part williamr@2: if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 ) williamr@2: __temp &= 0xFFFFFFFF; williamr@2: williamr@2: for (; __temp != 0; __temp >>=3) williamr@2: *--__ptr = (((unsigned)__temp)& 0x7) + '0'; williamr@2: williamr@2: // put leading '0' is showbase is set williamr@2: if (__flags & ios_base::showbase) williamr@2: *--__ptr = '0'; williamr@2: break; williamr@2: case ios_base::hex: williamr@2: { williamr@2: const char* __table_ptr = (__flags & ios_base::uppercase) ? williamr@2: get_hex_char_table_hi() : get_hex_char_table_lo(); williamr@2: __temp = __x; williamr@2: // if the size of integer is less than 8, clear upper part williamr@2: if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 ) williamr@2: __temp &= 0xFFFFFFFF; williamr@2: williamr@2: for (; __temp != 0; __temp >>=4) williamr@2: *--__ptr = __table_ptr[((unsigned)__temp & 0xF)]; williamr@2: williamr@2: if (__flags & ios_base::showbase) { williamr@2: *--__ptr = __table_ptr[16]; williamr@2: *--__ptr = '0'; williamr@2: } williamr@2: } williamr@2: break; williamr@2: default: williamr@2: { williamr@2: #if defined(__HP_aCC) && (__HP_aCC == 1) williamr@2: bool _IsSigned = !((_Integer)-1 > 0); williamr@2: if (_IsSigned) williamr@2: __ptr = __write_decimal_backward(__ptr, __x, __flags, __true_type() ); williamr@2: else williamr@2: __ptr = __write_decimal_backward(__ptr, __x, __flags, __false_type() ); williamr@2: #else williamr@2: typedef typename __bool2type::is_signed>::_Ret _IsSigned; williamr@2: __ptr = __write_decimal_backward(__ptr, __x, __flags, _IsSigned()); williamr@2: # endif williamr@2: } williamr@2: break; williamr@2: } williamr@2: } williamr@2: // return pointer to beginning of the string williamr@2: return __ptr; williamr@2: } williamr@2: williamr@2: // williamr@2: // num_put<> williamr@2: // williamr@2: williamr@2: # if ( _STLP_STATIC_TEMPLATE_DATA > 0 ) williamr@2: # if !defined(__LIBSTD_CPP_SYMBIAN32_WSD__) && !defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) williamr@2: template williamr@2: locale::id num_put<_CharT, _OutputIterator>::id; williamr@2: #endif williamr@2: # else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */ williamr@2: williamr@2: typedef num_put num_put_char; williamr@2: typedef num_put num_put_char_2; williamr@2: typedef num_put > > num_put_char_3; williamr@2: typedef num_put > num_put_char_4; williamr@2: williamr@2: #ifndef __SYMBIAN32__ williamr@2: __DECLARE_INSTANCE(locale::id, num_put_char::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, num_put_char_2::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, num_put_char_3::id, ); williamr@2: #endif williamr@2: williamr@2: # ifndef _STLP_NO_WCHAR_T williamr@2: williamr@2: typedef num_put num_put_wchar_t; williamr@2: typedef num_put num_put_wchar_t_2; williamr@2: typedef num_put > > num_put_wchar_t_3; williamr@2: williamr@2: #ifndef __SYMBIAN32__ williamr@2: __DECLARE_INSTANCE(locale::id, num_put_wchar_t::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, num_put_wchar_t_2::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, num_put_wchar_t_3::id, ); williamr@2: #endif williamr@2: williamr@2: # endif williamr@2: williamr@2: # endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */ williamr@2: williamr@2: // issue 118 williamr@2: williamr@2: # ifndef _STLP_NO_BOOL williamr@2: williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, williamr@2: char_type __fill, bool __val) const { williamr@2: if (!(__f.flags() & ios_base::boolalpha)) williamr@2: return this->do_put(__s, __f, __fill, __STATIC_CAST(long,__val)); williamr@2: williamr@2: locale __loc = __f.getloc(); williamr@2: typedef numpunct<_CharT> _Punct; williamr@2: const _Punct& __np = use_facet<_Punct>(__loc); williamr@2: williamr@2: //const numpunct<_CharT>& __np = *(const numpunct<_CharT>*)__f._M_numpunct_facet(); williamr@2: williamr@2: basic_string<_CharT> __str = __val ? __np.truename() : __np.falsename(); williamr@2: williamr@2: // Reuse __copy_integer_and_fill. Since internal padding makes no williamr@2: // sense for bool, though, make sure we use something else instead. williamr@2: // The last two argument to __copy_integer_and_fill are dummies. williamr@2: ios_base::fmtflags __flags = __f.flags(); williamr@2: if ((__flags & ios_base::adjustfield) == ios_base::internal) williamr@2: __flags = (__flags & ~ios_base::adjustfield) | ios_base::right; williamr@2: williamr@2: return __copy_integer_and_fill(__str.c_str(), __str.size(), __s, williamr@2: __flags, __f.width(0), __fill, williamr@2: (_CharT) 0, (_CharT) 0); williamr@2: } williamr@2: williamr@2: # endif williamr@2: williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, williamr@2: long __val) const { williamr@2: williamr@2: char __buf[64]; // Large enough for a base 8 64-bit integer, williamr@2: // plus any necessary grouping. williamr@2: ios_base::fmtflags __flags = __f.flags(); williamr@2: char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val); williamr@2: return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill); williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, williamr@2: unsigned long __val) const { williamr@2: char __buf[64]; // Large enough for a base 8 64-bit integer, williamr@2: // plus any necessary grouping. williamr@2: williamr@2: ios_base::fmtflags __flags = __f.flags(); williamr@2: char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val); williamr@2: return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill); williamr@2: } williamr@2: williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, williamr@2: double __val) const { williamr@2: return _M_do_put_float(__s, __f, __fill, __val); williamr@2: } williamr@2: williamr@2: #ifndef _STLP_NO_LONG_DOUBLE williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, williamr@2: long double __val) const { williamr@2: return _M_do_put_float(__s, __f, __fill, __val); williamr@2: } williamr@2: #endif williamr@2: williamr@2: #ifdef _STLP_LONG_LONG williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, williamr@2: _STLP_LONG_LONG __val) const { williamr@2: char __buf[64]; // Large enough for a base 8 64-bit integer, williamr@2: // plus any necessary grouping. williamr@2: williamr@2: ios_base::fmtflags __flags = __f.flags(); williamr@2: char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val); williamr@2: return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill); williamr@2: } williamr@2: williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, williamr@2: unsigned _STLP_LONG_LONG __val) const { williamr@2: char __buf[64]; // Large enough for a base 8 64-bit integer, williamr@2: // plus any necessary grouping. williamr@2: williamr@2: ios_base::fmtflags __flags = __f.flags(); williamr@2: char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val); williamr@2: return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill); williamr@2: } williamr@2: williamr@2: #endif /* _STLP_LONG_LONG */ williamr@2: williamr@2: williamr@2: // lib.facet.num.put.virtuals "12 For conversion from void* the specifier is %p." williamr@2: template williamr@2: _OutputIter williamr@2: num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT /*__fill*/, williamr@2: const void* __val) const { williamr@2: //const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__f._M_ctype_facet(); williamr@2: const ctype<_CharT>& __c_type = use_facet< ctype<_CharT> >(__f.getloc()); williamr@2: ios_base::fmtflags __save_flags = __f.flags(); williamr@2: williamr@2: __f.setf(ios_base::hex, ios_base::basefield); williamr@2: __f.setf(ios_base::showbase); williamr@2: __f.setf(ios_base::internal, ios_base::adjustfield); williamr@2: //__f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix //making output equal to linux. williamr@2: # if defined(_STLP_LONG_LONG) && !defined(__MRC__) //*ty 11/24/2001 - MrCpp can not cast from void* to long long williamr@2: _OutputIter result = this->do_put(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val)); williamr@2: # else williamr@2: _OutputIter result = this->do_put(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned long,__val)); williamr@2: # endif williamr@2: __f.flags(__save_flags); williamr@2: return result; williamr@2: } williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # endif /* _STLP_EXPOSE_STREAM_IMPLEMENTATION */ williamr@2: williamr@2: #endif /* _STLP_NUM_PUT_C */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: