locale_facets.tcc (money_put<>::_M_insert): Deal properly with empty __digits and negative frac_digits, clean-up a bit.

2004-03-03  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/locale_facets.tcc (money_put<>::_M_insert):
	Deal properly with empty __digits and negative frac_digits,
	clean-up a bit.

From-SVN: r78844
This commit is contained in:
Paolo Carlini 2004-03-03 18:07:23 +00:00 committed by Paolo Carlini
parent f9957958fe
commit 039e3c5c45
2 changed files with 19 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2004-03-03 Paolo Carlini <pcarlini@suse.de>
* include/bits/locale_facets.tcc (money_put<>::_M_insert):
Deal properly with empty __digits and negative frac_digits,
clean-up a bit.
2004-03-03 Jonathan Wakely <redi@gcc.gnu.org> 2004-03-03 Jonathan Wakely <redi@gcc.gnu.org>
* docs/html/documentation.html: Regenerate. * docs/html/documentation.html: Regenerate.

View File

@ -1441,7 +1441,6 @@ namespace std
// Determine if negative or positive formats are to be used, and // Determine if negative or positive formats are to be used, and
// discard leading negative_sign if it is present. // discard leading negative_sign if it is present.
const char_type* __beg = __digits.data(); const char_type* __beg = __digits.data();
const char_type* __end = __beg + __digits.size();
money_base::pattern __p; money_base::pattern __p;
const char_type* __sign; const char_type* __sign;
@ -1452,7 +1451,7 @@ namespace std
__sign = __lc->_M_positive_sign; __sign = __lc->_M_positive_sign;
__sign_size = __lc->_M_positive_sign_size; __sign_size = __lc->_M_positive_sign_size;
} }
else else if (__digits.size())
{ {
__p = __lc->_M_neg_format; __p = __lc->_M_neg_format;
__sign = __lc->_M_negative_sign; __sign = __lc->_M_negative_sign;
@ -1461,21 +1460,23 @@ namespace std
} }
// Look for valid numbers in the ctype facet within input digits. // Look for valid numbers in the ctype facet within input digits.
__end = __ctype.scan_not(ctype_base::digit, __beg, __end); size_type __len = __ctype.scan_not(ctype_base::digit, __beg,
if (__beg != __end) __beg + __digits.size()) - __beg;
if (__len)
{ {
// Assume valid input, and attempt to format. // Assume valid input, and attempt to format.
// Break down input numbers into base components, as follows: // Break down input numbers into base components, as follows:
// final_value = grouped units + (decimal point) + (digits) // final_value = grouped units + (decimal point) + (digits)
string_type __value; string_type __value;
size_type __len = __end - __beg;
__value.reserve(2 * __len); __value.reserve(2 * __len);
// Add thousands separators to non-decimal digits, per // Add thousands separators to non-decimal digits, per
// grouping rules. // grouping rules.
const int __paddec = __lc->_M_frac_digits - __len; int __paddec = __len - __lc->_M_frac_digits;
if (__paddec < 0) if (__paddec > 0)
{ {
if (__lc->_M_frac_digits < 0)
__paddec = __len;
if (__lc->_M_grouping_size) if (__lc->_M_grouping_size)
{ {
_CharT* __ws = _CharT* __ws =
@ -1485,24 +1486,23 @@ namespace std
std::__add_grouping(__ws, __lc->_M_thousands_sep, std::__add_grouping(__ws, __lc->_M_thousands_sep,
__lc->_M_grouping, __lc->_M_grouping,
__lc->_M_grouping_size, __lc->_M_grouping_size,
__beg, __end - __lc->_M_frac_digits); __beg, __beg + __paddec);
__value.assign(__ws, __ws_end - __ws); __value.assign(__ws, __ws_end - __ws);
} }
else else
__value.assign(__beg, -__paddec); __value.assign(__beg, __paddec);
} }
// Deal with decimal point, decimal digits. // Deal with decimal point, decimal digits.
if (__lc->_M_frac_digits > 0) if (__lc->_M_frac_digits > 0)
{ {
__value += __lc->_M_decimal_point; __value += __lc->_M_decimal_point;
if (__paddec <= 0) if (__paddec >= 0)
__value.append(__end - __lc->_M_frac_digits, __value.append(__beg + __paddec, __lc->_M_frac_digits);
__lc->_M_frac_digits);
else else
{ {
// Have to pad zeros in the decimal position. // Have to pad zeros in the decimal position.
__value.append(__paddec, __lit[_S_zero]); __value.append(-__paddec, __lit[_S_zero]);
__value.append(__beg, __len); __value.append(__beg, __len);
} }
} }