[PATCH] Fix _M_compare_helper

Paolo Carlini pcarlini@unitus.it
Sat Mar 9 15:32:00 GMT 2002


Hi all, hi Benjamin,

this is the patch discussed with Ulrich, which fixes part of the issue with
collate_members_wchar_t.cc: with it only one VERIFY fails, that at line 107.
Right now this is the best we can do, I think, barring further debugging of the
glibc side of the problem.

Ok?

Ciao, Paolo.

/////////////////

2002-03-09  Ulrich Drepper  <drepper@redhat.com>
            Paolo Carlini  <pcarlini@unitus.it>

        * config/locale/generic/collate_members.cc
        (collate<char,wchar_t>::_M_compare_helper): normalize
        values returned by strcoll and wcscoll.
        * config/locale/gnu/collate_members.cc
        (collate<char,wchar_t>::_M_compare_helper): ditto
        for __strcoll_l and __wcscoll_l.

diff -urN libstdc++-v3-orig/config/locale/generic/collate_members.cc
libstdc++-v3/config/locale/generic/collate_members.cc
--- libstdc++-v3-orig/config/locale/generic/collate_members.cc Sat Mar  9
03:16:32 2002
+++ libstdc++-v3/config/locale/generic/collate_members.cc Sat Mar  9 21:58:53
2002
@@ -43,7 +43,10 @@
     int
     collate<char>::_M_compare_helper(const char* __one,
          const char* __two) const
-    { return strcoll(__one, __two); }
+    {
+      int __cmp = strcoll(__one, __two);
+      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+    }

   template<>
     size_t
@@ -56,7 +59,10 @@
     int
     collate<wchar_t>::_M_compare_helper(const wchar_t* __one,
      const wchar_t* __two) const
-    { return wcscoll(__one, __two); }
+    {
+      int __cmp = wcscoll(__one, __two);
+      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+    }

   template<>
     size_t
diff -urN libstdc++-v3-orig/config/locale/gnu/collate_members.cc
libstdc++-v3/config/locale/gnu/collate_members.cc
--- libstdc++-v3-orig/config/locale/gnu/collate_members.cc Sat Mar  9 03:16:33
2002
+++ libstdc++-v3/config/locale/gnu/collate_members.cc Sat Mar  9 22:00:01 2002
@@ -43,7 +43,10 @@
     int
     collate<char>::_M_compare_helper(const char* __one,
          const char* __two) const
-    { return __strcoll_l(__one, __two, _M_c_locale_collate); }
+    {
+      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate);
+      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+    }

   template<>
     size_t
@@ -56,7 +59,10 @@
     int
     collate<wchar_t>::_M_compare_helper(const wchar_t* __one,
      const wchar_t* __two) const
-    { return __wcscoll_l(__one, __two, _M_c_locale_collate); }
+    {
+      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate);
+      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
+    }

   template<>
     size_t







More information about the Libstdc++ mailing list