_num_put.c
来自「stl的源码」· C语言 代码 · 共 523 行 · 第 1/2 页
C
523 行
#if defined (_STLP_LONG_LONG)typedef _STLP_LONG_LONG __max_int_t;typedef unsigned _STLP_LONG_LONG __umax_int_t;#elsetypedef long __max_int_t;typedef unsigned long __umax_int_t;#endif_STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_lo();_STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_hi();template <class _Integer>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 = (char)((int)(__utemp % 10) + '0'); // put sign if needed or requested if (__negative) *--__ptr = '-'; else if (__flags & ios_base::showpos) *--__ptr = '+'; return __ptr;}template <class _Integer>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 = (char)((int)(__x % 10) + '0'); // put sign if requested if (__flags & ios_base::showpos) *--__ptr = '+'; return __ptr;}template <class _Integer>char* _STLP_CALL__write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x) { char* __ptr = __buf; if (__x == 0) { *--__ptr = '0'; if ((__flags & ios_base::showpos) && ((__flags & (ios_base::oct | ios_base::hex)) == 0)) *--__ptr = '+'; // oct or hex base shall not be added to the 0 value (see '#' flag in C formating strings) } else { switch (__flags & ios_base::basefield) { case ios_base::oct: { __umax_int_t __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 = (char)((((unsigned)__temp)& 0x7) + '0'); // put leading '0' if showbase is set if (__flags & ios_base::showbase) *--__ptr = '0'; } break; case ios_base::hex: { const char* __table_ptr = (__flags & ios_base::uppercase) ? __hex_char_table_hi() : __hex_char_table_lo(); __umax_int_t __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; //case ios_base::dec: 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<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned; __ptr = __write_decimal_backward(__ptr, __x, __flags, _IsSigned());#endif } break; } } // return pointer to beginning of the string return __ptr;}template <class _CharT, class _OutputIter, class _Integer>_OutputIter _STLP_CALL__do_put_integer(_OutputIter __s, ios_base& __f, _CharT __fill, _Integer __x) { // buffer size = number of bytes * number of digit necessary in the smallest Standard base (base 8, 3 digits/byte) // plus the longest base representation '0x' // Do not use __buf_size to define __buf static buffer, some compilers (HP aCC) do not accept const variable as // the specification of a static buffer size. char __buf[sizeof(_Integer) * 3 + 2]; const ptrdiff_t __buf_size = sizeof(__buf) / sizeof(char); ios_base::fmtflags __flags = __f.flags(); char* __ibeg = __write_integer_backward((char*)__buf + __buf_size, __flags, __x); return __put_integer(__ibeg, (char*)__buf + __buf_size, __s, __f, __flags, __fill);}template <class _CharT, class _OutputIter>_OutputIter _STLP_CALL__do_put_bool(_OutputIter __s, ios_base& __f, _CharT __fill, bool __x) { const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__f.getloc()); basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __str = __x ? __np.truename() : __np.falsename(); streamsize __wid = __f.width(0); if (__str.size() >= __STATIC_CAST(size_t, __wid)) return _STLP_STD::copy(__str.begin(), __str.end(), __s); else { streamsize __pad = __wid - __str.size(); ios_base::fmtflags __dir = __f.flags() & ios_base::adjustfield; if (__dir == ios_base::left) { __s = _STLP_STD::copy(__str.begin(), __str.end(), __s); return __fill_n(__s, __pad, __fill); } else /* covers right and internal padding */ { __s = __fill_n(__s, __pad, __fill); return _STLP_STD::copy(__str.begin(), __str.end(), __s); } }}_STLP_MOVE_TO_STD_NAMESPACE//// num_put<>//template <class _CharT, class _OutputIterator>locale::id num_put<_CharT, _OutputIterator>::id;#if !defined (_STLP_NO_BOOL)template <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, bool __val) const { if (!(__f.flags() & ios_base::boolalpha)) // 22.2.2.2.2.23: shall return do_put for int and not directly __do_put_integer. return do_put(__s, __f, __fill, __STATIC_CAST(long, __val)); return _STLP_PRIV __do_put_bool(__s, __f, __fill, __val);}#endiftemplate <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, long __val) const{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }template <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, unsigned long __val) const{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }template <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, double __val) const{ return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); }#if !defined (_STLP_NO_LONG_DOUBLE)template <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, long double __val) const{ return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); }#endif#if defined (_STLP_LONG_LONG)template <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, _STLP_LONG_LONG __val) const{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }template <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, unsigned _STLP_LONG_LONG __val) const{ return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }#endif /* _STLP_LONG_LONG */// 22.2.2.2.2 Stage 1: "For conversion from void* the specifier is %p."// This is not clear and I'm really don't follow this (below).template <class _CharT, class _OutputIter>_OutputIternum_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT /*__fill*/, const void* __val) const { 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 if ( __val == 0 ) { // base ('0x') not shown for null, but I really want to type it // for pointer. Print it first in this case. const char* __table_ptr = (__save_flags & ios_base::uppercase) ? _STLP_PRIV __hex_char_table_hi() : _STLP_PRIV __hex_char_table_lo(); __s++ = __c_type.widen( '0' ); __s++ = __c_type.widen( __table_ptr[16] ); __f.width((sizeof(void*) * 2)); // digits in pointer type } else { __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix }#if defined (_STLP_MSVC)# pragma warning (push)# pragma warning (disable : 4311) //pointer truncation from 'const void*' to 'unsigned long'#endif _OutputIter result =#ifdef _STLP_LONG_LONG ( sizeof(void*) == sizeof(unsigned long) ) ?#endif _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned long,__val))#ifdef _STLP_LONG_LONG : /* ( sizeof(void*) == sizeof(unsigned _STLP_LONG_LONG) ) ? */ _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val))#endif ;#if defined (_STLP_MSVC)# pragma warning (pop)#endif __f.flags(__save_flags); return result;}_STLP_END_NAMESPACE#endif /* _STLP_NUM_PUT_C */// Local Variables:// mode:C++// End:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?