_num_put.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. /*
  2. * Copyright (c) 1999
  3. * Silicon Graphics Computer Systems, Inc.
  4. *
  5. * Copyright (c) 1999
  6. * Boris Fomitchev
  7. *
  8. * This material is provided "as is", with absolutely no warranty expressed
  9. * or implied. Any use is at your own risk.
  10. *
  11. * Permission to use or copy this software for any purpose is hereby granted
  12. * without fee, provided the above notices are retained on all copies.
  13. * Permission to modify the code and to distribute modified code is granted,
  14. * provided the above notices are retained, and a notice that the code was
  15. * modified is included with the above copyright notice.
  16. *
  17. */
  18. #ifndef _STLP_NUM_PUT_C
  19. #define _STLP_NUM_PUT_C
  20. #ifndef _STLP_INTERNAL_NUM_PUT_H
  21. # include <stl/_num_put.h>
  22. #endif
  23. #ifndef _STLP_INTERNAL_LIMITS
  24. # include <stl/_limits.h>
  25. #endif
  26. _STLP_BEGIN_NAMESPACE
  27. _STLP_MOVE_TO_PRIV_NAMESPACE
  28. // __do_put_float and its helper functions. Strategy: write the output
  29. // to a buffer of char, transform the buffer to _CharT, and then copy
  30. // it to the output.
  31. //----------------------------------------------------------------------
  32. // num_put facet
  33. template <class _CharT, class _OutputIter>
  34. _OutputIter _STLP_CALL
  35. __copy_float_and_fill(const _CharT* __first, const _CharT* __last,
  36. _OutputIter __oi,
  37. ios_base::fmtflags __flags,
  38. streamsize __width, _CharT __fill,
  39. _CharT __xplus, _CharT __xminus) {
  40. if (__width <= __last - __first)
  41. return _STLP_STD::copy(__first, __last, __oi);
  42. else {
  43. streamsize __pad = __width - (__last - __first);
  44. ios_base::fmtflags __dir = __flags & ios_base::adjustfield;
  45. if (__dir == ios_base::left) {
  46. __oi = _STLP_STD::copy(__first, __last, __oi);
  47. return _STLP_PRIV __fill_n(__oi, __pad, __fill);
  48. }
  49. else if (__dir == ios_base::internal && __first != __last &&
  50. (*__first == __xplus || *__first == __xminus)) {
  51. *__oi++ = *__first++;
  52. __oi = _STLP_PRIV __fill_n(__oi, __pad, __fill);
  53. return _STLP_STD::copy(__first, __last, __oi);
  54. }
  55. else {
  56. __oi = _STLP_PRIV __fill_n(__oi, __pad, __fill);
  57. return _STLP_STD::copy(__first, __last, __oi);
  58. }
  59. }
  60. }
  61. #if !defined (_STLP_NO_WCHAR_T)
  62. // Helper routine for wchar_t
  63. template <class _OutputIter>
  64. _OutputIter _STLP_CALL
  65. __put_float(__iostring &__str, _OutputIter __oi,
  66. ios_base& __f, wchar_t __fill,
  67. wchar_t __decimal_point, wchar_t __sep,
  68. size_t __group_pos, const string& __grouping) {
  69. const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__f.getloc());
  70. __iowstring __wbuf;
  71. __convert_float_buffer(__str, __wbuf, __ct, __decimal_point);
  72. if (!__grouping.empty()) {
  73. __insert_grouping(__wbuf, __group_pos, __grouping,
  74. __sep, __ct.widen('+'), __ct.widen('-'), 0);
  75. }
  76. return __copy_float_and_fill(__wbuf.data(), __wbuf.data() + __wbuf.size(), __oi,
  77. __f.flags(), __f.width(0), __fill, __ct.widen('+'), __ct.widen('-'));
  78. }
  79. #endif /* WCHAR_T */
  80. // Helper routine for char
  81. template <class _OutputIter>
  82. _OutputIter _STLP_CALL
  83. __put_float(__iostring &__str, _OutputIter __oi,
  84. ios_base& __f, char __fill,
  85. char __decimal_point, char __sep,
  86. size_t __group_pos, const string& __grouping) {
  87. if ((__group_pos < __str.size()) && (__str[__group_pos] == '.')) {
  88. __str[__group_pos] = __decimal_point;
  89. }
  90. if (!__grouping.empty()) {
  91. __insert_grouping(__str, __group_pos,
  92. __grouping, __sep, '+', '-', 0);
  93. }
  94. return __copy_float_and_fill(__str.data(), __str.data() + __str.size(), __oi,
  95. __f.flags(), __f.width(0), __fill, '+', '-');
  96. }
  97. template <class _CharT, class _OutputIter, class _Float>
  98. _OutputIter _STLP_CALL
  99. __do_put_float(_OutputIter __s, ios_base& __f,
  100. _CharT __fill, _Float __x) {
  101. __iostring __buf;
  102. size_t __group_pos = __write_float(__buf, __f.flags(), (int)__f.precision(), __x);
  103. const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__f.getloc());
  104. return __put_float(__buf, __s, __f, __fill,
  105. __np.decimal_point(), __np.thousands_sep(),
  106. __group_pos, __np.grouping());
  107. }
  108. inline void __get_money_digits_aux (__iostring &__buf, ios_base &, _STLP_LONGEST_FLOAT_TYPE __x)
  109. { __get_floor_digits(__buf, __x); }
  110. #if !defined (_STLP_NO_WCHAR_T)
  111. inline void __get_money_digits_aux (__iowstring &__wbuf, ios_base &__f, _STLP_LONGEST_FLOAT_TYPE __x) {
  112. __iostring __buf;
  113. __get_floor_digits(__buf, __x);
  114. const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__f.getloc());
  115. __convert_float_buffer(__buf, __wbuf, __ct, wchar_t(0), false);
  116. }
  117. #endif
  118. template <class _CharT>
  119. void _STLP_CALL __get_money_digits(_STLP_BASIC_IOSTRING(_CharT) &__buf, ios_base& __f, _STLP_LONGEST_FLOAT_TYPE __x)
  120. { __get_money_digits_aux(__buf, __f, __x); }
  121. // _M_do_put_integer and its helper functions.
  122. template <class _CharT, class _OutputIter>
  123. _OutputIter _STLP_CALL
  124. __copy_integer_and_fill(const _CharT* __buf, ptrdiff_t __len,
  125. _OutputIter __oi,
  126. ios_base::fmtflags __flg, streamsize __wid, _CharT __fill,
  127. _CharT __xplus, _CharT __xminus) {
  128. if (__len >= __wid)
  129. return _STLP_STD::copy(__buf, __buf + __len, __oi);
  130. else {
  131. //casting numeric_limits<ptrdiff_t>::max to streamsize only works is ptrdiff_t is signed or streamsize representation
  132. //is larger than ptrdiff_t one.
  133. _STLP_STATIC_ASSERT((sizeof(streamsize) > sizeof(ptrdiff_t)) ||
  134. ((sizeof(streamsize) == sizeof(ptrdiff_t)) && numeric_limits<ptrdiff_t>::is_signed))
  135. ptrdiff_t __pad = __STATIC_CAST(ptrdiff_t, (min) (__STATIC_CAST(streamsize, (numeric_limits<ptrdiff_t>::max)()),
  136. __STATIC_CAST(streamsize, __wid - __len)));
  137. ios_base::fmtflags __dir = __flg & ios_base::adjustfield;
  138. if (__dir == ios_base::left) {
  139. __oi = _STLP_STD::copy(__buf, __buf + __len, __oi);
  140. return _STLP_PRIV __fill_n(__oi, __pad, __fill);
  141. }
  142. else if (__dir == ios_base::internal && __len != 0 &&
  143. (__buf[0] == __xplus || __buf[0] == __xminus)) {
  144. *__oi++ = __buf[0];
  145. __oi = __fill_n(__oi, __pad, __fill);
  146. return _STLP_STD::copy(__buf + 1, __buf + __len, __oi);
  147. }
  148. else if (__dir == ios_base::internal && __len >= 2 &&
  149. (__flg & ios_base::showbase) &&
  150. (__flg & ios_base::basefield) == ios_base::hex) {
  151. *__oi++ = __buf[0];
  152. *__oi++ = __buf[1];
  153. __oi = __fill_n(__oi, __pad, __fill);
  154. return _STLP_STD::copy(__buf + 2, __buf + __len, __oi);
  155. }
  156. else {
  157. __oi = __fill_n(__oi, __pad, __fill);
  158. return _STLP_STD::copy(__buf, __buf + __len, __oi);
  159. }
  160. }
  161. }
  162. #if !defined (_STLP_NO_WCHAR_T)
  163. // Helper function for wchar_t
  164. template <class _OutputIter>
  165. _OutputIter _STLP_CALL
  166. __put_integer(char* __buf, char* __iend, _OutputIter __s,
  167. ios_base& __f,
  168. ios_base::fmtflags __flags, wchar_t __fill) {
  169. locale __loc = __f.getloc();
  170. const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__loc);
  171. wchar_t __xplus = __ct.widen('+');
  172. wchar_t __xminus = __ct.widen('-');
  173. wchar_t __wbuf[64];
  174. __ct.widen(__buf, __iend, __wbuf);
  175. ptrdiff_t __len = __iend - __buf;
  176. wchar_t* __eend = __wbuf + __len;
  177. const numpunct<wchar_t>& __np = use_facet<numpunct<wchar_t> >(__loc);
  178. const string& __grouping = __np.grouping();
  179. if (!__grouping.empty()) {
  180. int __basechars;
  181. if (__flags & ios_base::showbase)
  182. switch (__flags & ios_base::basefield) {
  183. case ios_base::hex: __basechars = 2; break;
  184. case ios_base::oct: __basechars = 1; break;
  185. default: __basechars = 0;
  186. }
  187. else
  188. __basechars = 0;
  189. __len = __insert_grouping(__wbuf, __eend, __grouping, __np.thousands_sep(),
  190. __xplus, __xminus, __basechars);
  191. }
  192. return __copy_integer_and_fill((wchar_t*)__wbuf, __len, __s,
  193. __flags, __f.width(0), __fill, __xplus, __xminus);
  194. }
  195. #endif
  196. // Helper function for char
  197. template <class _OutputIter>
  198. _OutputIter _STLP_CALL
  199. __put_integer(char* __buf, char* __iend, _OutputIter __s,
  200. ios_base& __f, ios_base::fmtflags __flags, char __fill) {
  201. char __grpbuf[64];
  202. ptrdiff_t __len = __iend - __buf;
  203. const numpunct<char>& __np = use_facet<numpunct<char> >(__f.getloc());
  204. const string& __grouping = __np.grouping();
  205. if (!__grouping.empty()) {
  206. int __basechars;
  207. if (__flags & ios_base::showbase)
  208. switch (__flags & ios_base::basefield) {
  209. case ios_base::hex: __basechars = 2; break;
  210. case ios_base::oct: __basechars = 1; break;
  211. default: __basechars = 0;
  212. }
  213. else
  214. __basechars = 0;
  215. // make sure there is room at the end of the buffer
  216. // we pass to __insert_grouping
  217. _STLP_STD::copy(__buf, __iend, (char *) __grpbuf);
  218. __buf = __grpbuf;
  219. __iend = __grpbuf + __len;
  220. __len = __insert_grouping(__buf, __iend, __grouping, __np.thousands_sep(),
  221. '+', '-', __basechars);
  222. }
  223. return __copy_integer_and_fill(__buf, __len, __s, __flags, __f.width(0), __fill, '+', '-');
  224. }
  225. #if defined (_STLP_LONG_LONG)
  226. typedef _STLP_LONG_LONG __max_int_t;
  227. typedef unsigned _STLP_LONG_LONG __umax_int_t;
  228. #else
  229. typedef long __max_int_t;
  230. typedef unsigned long __umax_int_t;
  231. #endif
  232. _STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_lo();
  233. _STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_hi();
  234. template <class _Integer>
  235. inline char* _STLP_CALL
  236. __write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __true_type& /* is_signed */) {
  237. const bool __negative = __x < 0 ;
  238. __max_int_t __temp = __x;
  239. __umax_int_t __utemp = __negative?-__temp:__temp;
  240. for (; __utemp != 0; __utemp /= 10)
  241. *--__ptr = (char)((int)(__utemp % 10) + '0');
  242. // put sign if needed or requested
  243. if (__negative)
  244. *--__ptr = '-';
  245. else if (__flags & ios_base::showpos)
  246. *--__ptr = '+';
  247. return __ptr;
  248. }
  249. template <class _Integer>
  250. inline char* _STLP_CALL
  251. __write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __false_type& /* is_signed */) {
  252. for (; __x != 0; __x /= 10)
  253. *--__ptr = (char)((int)(__x % 10) + '0');
  254. // put sign if requested
  255. if (__flags & ios_base::showpos)
  256. *--__ptr = '+';
  257. return __ptr;
  258. }
  259. template <class _Integer>
  260. char* _STLP_CALL
  261. __write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x) {
  262. char* __ptr = __buf;
  263. if (__x == 0) {
  264. *--__ptr = '0';
  265. if ((__flags & ios_base::showpos) && ((__flags & (ios_base::oct | ios_base::hex)) == 0))
  266. *--__ptr = '+';
  267. // oct or hex base shall not be added to the 0 value (see '#' flag in C formating strings)
  268. }
  269. else {
  270. switch (__flags & ios_base::basefield) {
  271. case ios_base::oct:
  272. {
  273. __umax_int_t __temp = __x;
  274. // if the size of integer is less than 8, clear upper part
  275. if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 )
  276. __temp &= 0xFFFFFFFF;
  277. for (; __temp != 0; __temp >>=3)
  278. *--__ptr = (char)((((unsigned)__temp)& 0x7) + '0');
  279. // put leading '0' if showbase is set
  280. if (__flags & ios_base::showbase)
  281. *--__ptr = '0';
  282. }
  283. break;
  284. case ios_base::hex:
  285. {
  286. const char* __table_ptr = (__flags & ios_base::uppercase) ?
  287. __hex_char_table_hi() : __hex_char_table_lo();
  288. __umax_int_t __temp = __x;
  289. // if the size of integer is less than 8, clear upper part
  290. if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 )
  291. __temp &= 0xFFFFFFFF;
  292. for (; __temp != 0; __temp >>=4)
  293. *--__ptr = __table_ptr[((unsigned)__temp & 0xF)];
  294. if (__flags & ios_base::showbase) {
  295. *--__ptr = __table_ptr[16];
  296. *--__ptr = '0';
  297. }
  298. }
  299. break;
  300. //case ios_base::dec:
  301. default:
  302. {
  303. #if defined(__HP_aCC) && (__HP_aCC == 1)
  304. bool _IsSigned = !((_Integer)-1 > 0);
  305. if (_IsSigned)
  306. __ptr = __write_decimal_backward(__ptr, __x, __flags, __true_type() );
  307. else
  308. __ptr = __write_decimal_backward(__ptr, __x, __flags, __false_type() );
  309. #else
  310. typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned;
  311. __ptr = __write_decimal_backward(__ptr, __x, __flags, _IsSigned());
  312. #endif
  313. }
  314. break;
  315. }
  316. }
  317. // return pointer to beginning of the string
  318. return __ptr;
  319. }
  320. template <class _CharT, class _OutputIter, class _Integer>
  321. _OutputIter _STLP_CALL
  322. __do_put_integer(_OutputIter __s, ios_base& __f, _CharT __fill, _Integer __x) {
  323. // buffer size = number of bytes * number of digit necessary in the smallest Standard base (base 8, 3 digits/byte)
  324. // plus the longest base representation '0x'
  325. // Do not use __buf_size to define __buf static buffer, some compilers (HP aCC) do not accept const variable as
  326. // the specification of a static buffer size.
  327. char __buf[sizeof(_Integer) * 3 + 2];
  328. const ptrdiff_t __buf_size = sizeof(__buf) / sizeof(char);
  329. ios_base::fmtflags __flags = __f.flags();
  330. char* __ibeg = __write_integer_backward((char*)__buf + __buf_size, __flags, __x);
  331. return __put_integer(__ibeg, (char*)__buf + __buf_size, __s, __f, __flags, __fill);
  332. }
  333. template <class _CharT, class _OutputIter>
  334. _OutputIter _STLP_CALL
  335. __do_put_bool(_OutputIter __s, ios_base& __f, _CharT __fill, bool __x) {
  336. const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__f.getloc());
  337. basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __str = __x ? __np.truename() : __np.falsename();
  338. streamsize __wid = __f.width(0);
  339. if (__str.size() >= __STATIC_CAST(size_t, __wid))
  340. return _STLP_STD::copy(__str.begin(), __str.end(), __s);
  341. else {
  342. streamsize __pad = __wid - __str.size();
  343. ios_base::fmtflags __dir = __f.flags() & ios_base::adjustfield;
  344. if (__dir == ios_base::left) {
  345. __s = _STLP_STD::copy(__str.begin(), __str.end(), __s);
  346. return __fill_n(__s, __pad, __fill);
  347. }
  348. else /* covers right and internal padding */ {
  349. __s = __fill_n(__s, __pad, __fill);
  350. return _STLP_STD::copy(__str.begin(), __str.end(), __s);
  351. }
  352. }
  353. }
  354. _STLP_MOVE_TO_STD_NAMESPACE
  355. //
  356. // num_put<>
  357. //
  358. template <class _CharT, class _OutputIterator>
  359. locale::id num_put<_CharT, _OutputIterator>::id;
  360. #if !defined (_STLP_NO_BOOL)
  361. template <class _CharT, class _OutputIter>
  362. _OutputIter
  363. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
  364. bool __val) const {
  365. if (!(__f.flags() & ios_base::boolalpha))
  366. // 22.2.2.2.2.23: shall return do_put for int and not directly __do_put_integer.
  367. return do_put(__s, __f, __fill, __STATIC_CAST(long, __val));
  368. return _STLP_PRIV __do_put_bool(__s, __f, __fill, __val);
  369. }
  370. #endif
  371. template <class _CharT, class _OutputIter>
  372. _OutputIter
  373. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
  374. long __val) const
  375. { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }
  376. template <class _CharT, class _OutputIter>
  377. _OutputIter
  378. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
  379. unsigned long __val) const
  380. { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }
  381. template <class _CharT, class _OutputIter>
  382. _OutputIter
  383. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
  384. double __val) const
  385. { return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); }
  386. #if !defined (_STLP_NO_LONG_DOUBLE)
  387. template <class _CharT, class _OutputIter>
  388. _OutputIter
  389. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
  390. long double __val) const
  391. { return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); }
  392. #endif
  393. #if defined (_STLP_LONG_LONG)
  394. template <class _CharT, class _OutputIter>
  395. _OutputIter
  396. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
  397. _STLP_LONG_LONG __val) const
  398. { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }
  399. template <class _CharT, class _OutputIter>
  400. _OutputIter
  401. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
  402. unsigned _STLP_LONG_LONG __val) const
  403. { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); }
  404. #endif /* _STLP_LONG_LONG */
  405. // 22.2.2.2.2 Stage 1: "For conversion from void* the specifier is %p."
  406. // This is not clear and I'm really don't follow this (below).
  407. template <class _CharT, class _OutputIter>
  408. _OutputIter
  409. num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT /*__fill*/,
  410. const void* __val) const {
  411. const ctype<_CharT>& __c_type = use_facet<ctype<_CharT> >(__f.getloc());
  412. ios_base::fmtflags __save_flags = __f.flags();
  413. __f.setf(ios_base::hex, ios_base::basefield);
  414. __f.setf(ios_base::showbase);
  415. __f.setf(ios_base::internal, ios_base::adjustfield);
  416. __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix
  417. if ( __val == 0 ) {
  418. // base ('0x') not shown for null, but I really want to type it
  419. // for pointer. Print it first in this case.
  420. const char* __table_ptr = (__save_flags & ios_base::uppercase) ?
  421. _STLP_PRIV __hex_char_table_hi() : _STLP_PRIV __hex_char_table_lo();
  422. __s++ = __c_type.widen( '0' );
  423. __s++ = __c_type.widen( __table_ptr[16] );
  424. __f.width((sizeof(void*) * 2)); // digits in pointer type
  425. } else {
  426. __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix
  427. }
  428. #if defined (_STLP_MSVC)
  429. # pragma warning (push)
  430. # pragma warning (disable : 4311) //pointer truncation from 'const void*' to 'unsigned long'
  431. #endif
  432. _OutputIter result =
  433. #ifdef _STLP_LONG_LONG
  434. ( sizeof(void*) == sizeof(unsigned long) ) ?
  435. #endif
  436. _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned long,__val))
  437. #ifdef _STLP_LONG_LONG
  438. : /* ( sizeof(void*) == sizeof(unsigned _STLP_LONG_LONG) ) ? */
  439. _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val))
  440. #endif
  441. ;
  442. #if defined (_STLP_MSVC)
  443. # pragma warning (pop)
  444. #endif
  445. __f.flags(__save_flags);
  446. return result;
  447. }
  448. _STLP_END_NAMESPACE
  449. #endif /* _STLP_NUM_PUT_C */
  450. // Local Variables:
  451. // mode:C++
  452. // End: