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