aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2006-10-09 18:04:18 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2006-10-09 18:04:18 +0000
commita484326f89cb7e5b71f67959d86a9de69309839a (patch)
treed42e04b5261647f911ed3c32db81cfe0582b7b02
parenta98d4769d5d5449e3ed3a524143b37e6c8a045ec (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc34
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;
}