diff options
author | Paolo Carlini <pcarlini@unitus.it> | 2002-03-09 17:44:34 +0100 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2002-03-09 16:44:34 +0000 |
commit | 32c1620024756f8695f6e1d909b05e3b9873b55f (patch) | |
tree | 3e730b8a2766624cc967e8487b7764915665a5e5 /libstdc++-v3 | |
parent | edcc88c1323ae8df5d282c17834cb6c84e27b417 (diff) | |
download | gcc-32c1620024756f8695f6e1d909b05e3b9873b55f.zip gcc-32c1620024756f8695f6e1d909b05e3b9873b55f.tar.gz gcc-32c1620024756f8695f6e1d909b05e3b9873b55f.tar.bz2 |
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.tcc | 13 |
2 files changed, 12 insertions, 6 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7da2632..7355167 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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> * c_locale_generic.cc: Move to... diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 3c8fea1..90bb221 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1854,16 +1854,17 @@ namespace std collate<_CharT>:: 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)); 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) { - // Try to increment size of translated string. - size_t __len2 = __len * 2; - _CharT* __c2 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __len2)); - __res = _M_transform_helper(__c2, __lo, __len); - // XXX Throw exception if still indeterminate? + _CharT* __c2 = + static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * (__res + 1))); + size_t __res2 = _M_transform_helper(__c2, __lo, __res + 1); + return string_type(__c2); } return string_type(__c); } |