mirror of git://gcc.gnu.org/git/gcc.git
locale_facets.tcc (collate::do_transform): Rewrite to fix problems with long transformed strings.
2002-03-09 Paolo Carlini <pcarlini@unitus.it>
* include/bits/locale_facets.tcc (collate::do_transform):
Rewrite to fix problems with long transformed strings.
From-SVN: r50500
This commit is contained in:
parent
edcc88c132
commit
32c1620024
|
|
@ -1,3 +1,8 @@
|
||||||
|
2002-03-09 Paolo Carlini <pcarlini@unitus.it>
|
||||||
|
|
||||||
|
* include/bits/locale_facets.tcc (collate::do_transform):
|
||||||
|
Rewrite to fix problems with long transformed strings.
|
||||||
|
|
||||||
2002-03-08 Benjamin Kosnik <bkoz@redhat.com>
|
2002-03-08 Benjamin Kosnik <bkoz@redhat.com>
|
||||||
|
|
||||||
* c_locale_generic.cc: Move to...
|
* c_locale_generic.cc: Move to...
|
||||||
|
|
|
||||||
|
|
@ -1854,16 +1854,17 @@ namespace std
|
||||||
collate<_CharT>::
|
collate<_CharT>::
|
||||||
do_transform(const _CharT* __lo, const _CharT* __hi) const
|
do_transform(const _CharT* __lo, const _CharT* __hi) const
|
||||||
{
|
{
|
||||||
size_t __len = __hi - __lo;
|
size_t __len = (__hi - __lo) * 2;
|
||||||
|
// First try a buffer perhaps big enough.
|
||||||
_CharT* __c = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __len));
|
_CharT* __c = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __len));
|
||||||
size_t __res = _M_transform_helper(__c, __lo, __len);
|
size_t __res = _M_transform_helper(__c, __lo, __len);
|
||||||
|
// If the buffer was not large enough, try again with the correct size.
|
||||||
if (__res >= __len)
|
if (__res >= __len)
|
||||||
{
|
{
|
||||||
// Try to increment size of translated string.
|
_CharT* __c2 =
|
||||||
size_t __len2 = __len * 2;
|
static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * (__res + 1)));
|
||||||
_CharT* __c2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __len2));
|
size_t __res2 = _M_transform_helper(__c2, __lo, __res + 1);
|
||||||
__res = _M_transform_helper(__c2, __lo, __len);
|
return string_type(__c2);
|
||||||
// XXX Throw exception if still indeterminate?
|
|
||||||
}
|
}
|
||||||
return string_type(__c);
|
return string_type(__c);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue