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