diff options
author | Paolo Carlini <pcarlini@suse.de> | 2006-10-09 18:04:18 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2006-10-09 18:04:18 +0000 |
commit | a484326f89cb7e5b71f67959d86a9de69309839a (patch) | |
tree | d42e04b5261647f911ed3c32db81cfe0582b7b02 | |
parent | a98d4769d5d5449e3ed3a524143b37e6c8a045ec (diff) | |
download | gcc-a484326f89cb7e5b71f67959d86a9de69309839a.zip gcc-a484326f89cb7e5b71f67959d86a9de69309839a.tar.gz gcc-a484326f89cb7e5b71f67959d86a9de69309839a.tar.bz2 |
PR libstdc++/28277 (partial: __add_grouping)
2006-10-09 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/28277 (partial: __add_grouping)
* include/bits/locale_facets.tcc (__add_grouping<>(_CharT*, _CharT,
const char*, size_t, const _CharT*, const _CharT*)): Rewrite in
non-recursive form.
From-SVN: r117581
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.tcc | 34 |
2 files changed, 31 insertions, 10 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index aceb26e..f9123f1 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2006-10-09 Paolo Carlini <pcarlini@suse.de> + PR libstdc++/28277 (partial: __add_grouping) + * include/bits/locale_facets.tcc (__add_grouping<>(_CharT*, _CharT, + const char*, size_t, const _CharT*, const _CharT*)): Rewrite in + non-recursive form. + +2006-10-09 Paolo Carlini <pcarlini@suse.de> + PR libstdc++/28277 (partial: money_put bits) * include/bits/locale_facets.tcc (money_put<>::_M_insert(iter_type, ios_base&, char_type, const string_type&)): Avoid __builtin_alloca diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 43051a1..49c64a1 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -2590,19 +2590,33 @@ _GLIBCXX_END_LDBL_NAMESPACE const char* __gbeg, size_t __gsize, const _CharT* __first, const _CharT* __last) { - if (__last - __first > *__gbeg - && static_cast<signed char>(*__gbeg) > 0) + size_t __idx = 0; + size_t __ctr = 0; + + while (__last - __first > __gbeg[__idx] + && static_cast<signed char>(__gbeg[__idx]) > 0) { - const bool __bump = __gsize != 1; - __s = std::__add_grouping(__s, __sep, __gbeg + __bump, - __gsize - __bump, __first, - __last - *__gbeg); - __first = __last - *__gbeg; - *__s++ = __sep; + __last -= __gbeg[__idx]; + __idx < __gsize - 1 ? ++__idx : ++__ctr; } - do + + while (__first != __last) *__s++ = *__first++; - while (__first != __last); + + while (__ctr--) + { + *__s++ = __sep; + for (char __i = __gbeg[__idx]; __i > 0; --__i) + *__s++ = *__first++; + } + + while (__idx--) + { + *__s++ = __sep; + for (char __i = __gbeg[__idx]; __i > 0; --__i) + *__s++ = *__first++; + } + return __s; } |