mirror of git://gcc.gnu.org/git/gcc.git
locale_facets.tcc (money_put::do_put(long double)): Fix dimensioning of temporary buffers to avoid risk of overruns.
2002-03-18 Paolo Carlini <pcarlini@unitus.it> * include/bits/locale_facets.tcc (money_put::do_put(long double)): Fix dimensioning of temporary buffers to avoid risk of overruns. (money_put::do_put(string)): Same for the buffer used to add the grouping chars. * testsuite/22_locale/money_put_members_char.cc: Add test06. * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto. * include/bits/locale_facets.tcc (collate::do_transform): Simplify. From-SVN: r51012
This commit is contained in:
parent
1929c971b9
commit
3039874b15
|
|
@ -1,3 +1,16 @@
|
||||||
|
2002-03-18 Paolo Carlini <pcarlini@unitus.it>
|
||||||
|
|
||||||
|
* include/bits/locale_facets.tcc
|
||||||
|
(money_put::do_put(long double)): Fix dimensioning of
|
||||||
|
temporary buffers to avoid risk of overruns.
|
||||||
|
(money_put::do_put(string)): Same for the buffer used to
|
||||||
|
add the grouping chars.
|
||||||
|
* testsuite/22_locale/money_put_members_char.cc: Add test06.
|
||||||
|
* testsuite/22_locale/money_put_members_wchar_t.cc: Ditto.
|
||||||
|
|
||||||
|
* include/bits/locale_facets.tcc
|
||||||
|
(collate::do_transform): Simplify.
|
||||||
|
|
||||||
2002-03-18 Phil Edwards <pme@gcc.gnu.org>
|
2002-03-18 Phil Edwards <pme@gcc.gnu.org>
|
||||||
|
|
||||||
* acinclude.m4 (GLIBCPP_CONFIGURE): Make indentation/spacing uniform.
|
* acinclude.m4 (GLIBCPP_CONFIGURE): Make indentation/spacing uniform.
|
||||||
|
|
|
||||||
|
|
@ -1111,7 +1111,9 @@ namespace std
|
||||||
{
|
{
|
||||||
const locale __loc = __io.getloc();
|
const locale __loc = __io.getloc();
|
||||||
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
|
const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
|
||||||
const int __n = numeric_limits<long double>::digits10;
|
// max_exponent10 + 1 for the integer part, + 4 for sign, decimal point,
|
||||||
|
// decimal digit, '\0'.
|
||||||
|
const int __n = numeric_limits<long double>::max_exponent10 + 5;
|
||||||
char* __cs = static_cast<char*>(__builtin_alloca(sizeof(char) * __n));
|
char* __cs = static_cast<char*>(__builtin_alloca(sizeof(char) * __n));
|
||||||
_CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __n));
|
_CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __n));
|
||||||
int __len = __convert_from_v(__cs, "%.01Lf", __units, _S_c_locale);
|
int __len = __convert_from_v(__cs, "%.01Lf", __units, _S_c_locale);
|
||||||
|
|
@ -1206,8 +1208,9 @@ namespace std
|
||||||
: __mpf.thousands_sep();
|
: __mpf.thousands_sep();
|
||||||
const char* __gbeg = __grouping.c_str();
|
const char* __gbeg = __grouping.c_str();
|
||||||
const char* __gend = __gbeg + __grouping.size();
|
const char* __gend = __gbeg + __grouping.size();
|
||||||
const int __n = numeric_limits<long double>::digits10 * 2;
|
const int __n = (__end - __beg) * 2;
|
||||||
_CharT* __ws2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __n));
|
_CharT* __ws2 =
|
||||||
|
static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __n));
|
||||||
_CharT* __ws_end = __add_grouping(__ws2, __sep, __gbeg,
|
_CharT* __ws_end = __add_grouping(__ws2, __sep, __gbeg,
|
||||||
__gend, __beg, __end);
|
__gend, __beg, __end);
|
||||||
__value.insert(0, __ws2, __ws_end - __ws2);
|
__value.insert(0, __ws2, __ws_end - __ws2);
|
||||||
|
|
@ -1863,10 +1866,9 @@ namespace std
|
||||||
// If the buffer was not large enough, try again with the correct size.
|
// If the buffer was not large enough, try again with the correct size.
|
||||||
if (__res >= __len)
|
if (__res >= __len)
|
||||||
{
|
{
|
||||||
_CharT* __c2 =
|
__c =
|
||||||
static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * (__res + 1)));
|
static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * (__res + 1)));
|
||||||
_M_transform_helper(__c2, __lo, __res + 1);
|
_M_transform_helper(__c, __lo, __res + 1);
|
||||||
return string_type(__c2);
|
|
||||||
}
|
}
|
||||||
return string_type(__c);
|
return string_type(__c);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -226,7 +226,7 @@ void test02()
|
||||||
oss.setf(ios_base::showbase);
|
oss.setf(ios_base::showbase);
|
||||||
|
|
||||||
oss.str(empty);
|
oss.str(empty);
|
||||||
iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
|
iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
|
||||||
string result3 = oss.str();
|
string result3 = oss.str();
|
||||||
VERIFY( result3 == "7.200.000.000,00 DEM ");
|
VERIFY( result3 == "7.200.000.000,00 DEM ");
|
||||||
|
|
||||||
|
|
@ -341,6 +341,33 @@ void test05()
|
||||||
VERIFY( fmt.str() == "*(1,234.56)" );
|
VERIFY( fmt.str() == "*(1,234.56)" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct My_money_io_2 : public std::moneypunct<char,false>
|
||||||
|
{
|
||||||
|
char_type do_thousands_sep() const { return ','; }
|
||||||
|
std::string do_grouping() const { return "\001"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Make sure we can output a very big amount of money (with grouping too).
|
||||||
|
void test06()
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
typedef ostreambuf_iterator<char> OutIt;
|
||||||
|
|
||||||
|
locale loc(locale::classic(), new My_money_io_2);
|
||||||
|
|
||||||
|
bool intl = false;
|
||||||
|
|
||||||
|
long double val = 1e50L;
|
||||||
|
const money_put<char,OutIt>& mp =
|
||||||
|
use_facet<money_put<char, OutIt> >(loc);
|
||||||
|
|
||||||
|
ostringstream fmt;
|
||||||
|
fmt.imbue(loc);
|
||||||
|
OutIt out(fmt);
|
||||||
|
mp.put(out,intl,fmt,'*',val);
|
||||||
|
VERIFY( fmt );
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test01();
|
test01();
|
||||||
|
|
@ -348,5 +375,6 @@ int main()
|
||||||
test03();
|
test03();
|
||||||
test04();
|
test04();
|
||||||
test05();
|
test05();
|
||||||
|
test06();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -226,7 +226,7 @@ void test02()
|
||||||
oss.setf(ios_base::showbase);
|
oss.setf(ios_base::showbase);
|
||||||
|
|
||||||
oss.str(empty);
|
oss.str(empty);
|
||||||
iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
|
iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1);
|
||||||
wstring result3 = oss.str();
|
wstring result3 = oss.str();
|
||||||
VERIFY( result3 == L"7.200.000.000,00 DEM ");
|
VERIFY( result3 == L"7.200.000.000,00 DEM ");
|
||||||
|
|
||||||
|
|
@ -340,6 +340,33 @@ void test05()
|
||||||
mp.put(out,intl,fmt,L'*',val);
|
mp.put(out,intl,fmt,L'*',val);
|
||||||
VERIFY( fmt.str() == L"*(1,234.56)" );
|
VERIFY( fmt.str() == L"*(1,234.56)" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct My_money_io_2 : public std::moneypunct<wchar_t,false>
|
||||||
|
{
|
||||||
|
char_type do_thousands_sep() const { return L','; }
|
||||||
|
std::string do_grouping() const { return "\001"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Make sure we can output a very big amount of money (with grouping too).
|
||||||
|
void test06()
|
||||||
|
{
|
||||||
|
using namespace std;
|
||||||
|
typedef ostreambuf_iterator<wchar_t> OutIt;
|
||||||
|
|
||||||
|
locale loc(locale::classic(), new My_money_io_2);
|
||||||
|
|
||||||
|
bool intl = false;
|
||||||
|
|
||||||
|
long double val = 1e50L;
|
||||||
|
const money_put<wchar_t,OutIt>& mp =
|
||||||
|
use_facet<money_put<wchar_t, OutIt> >(loc);
|
||||||
|
|
||||||
|
wostringstream fmt;
|
||||||
|
fmt.imbue(loc);
|
||||||
|
OutIt out(fmt);
|
||||||
|
mp.put(out,intl,fmt,'*',val);
|
||||||
|
VERIFY( fmt );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
|
|
@ -350,6 +377,7 @@ int main()
|
||||||
test03();
|
test03();
|
||||||
test04();
|
test04();
|
||||||
test05();
|
test05();
|
||||||
|
test06();
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue