]> granicus.if.org Git - mutt/commitdiff
#2673: Make mutt_which_case() multi-byte aware.
authorThomas Roessler <roessler@does-not-exist.org>
Tue, 9 Jan 2007 10:31:09 +0000 (10:31 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Tue, 9 Jan 2007 10:31:09 +0000 (10:31 +0000)
pattern.c

index c10f92d00f3e729dbae4cc1316dd167246e1f6dd..fcc03569eb88eab2937e0a0b74c402bd4d472c34 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -134,12 +134,22 @@ int mutt_getvaluebychar (char ch, struct mapping_t *table)
 /* if no uppercase letters are given, do a case-insensitive search */
 int mutt_which_case (const char *s)
 {
-  while (*s)
+  wchar_t w;
+  mbstate_t mb;
+  size_t l;
+  
+  memset (&mb, 0, sizeof (mb));
+  
+  for (; (l = mbrtowc (&w, s, MB_CUR_MAX, &mb)) != 0; s += l)
   {
-    if (isalpha ((unsigned char) *s) && isupper ((unsigned char) *s))
+    if (l == (size_t) -2)
+      continue; /* shift sequences */
+    if (l == (size_t) -1)
+      return 0; /* error; assume case-sensitive */
+    if (iswalpha ((wint_t) w) && iswupper ((wint_t) w))
       return 0; /* case-sensitive */
-    s++;
   }
+
   return REG_ICASE; /* case-insensitive */
 }