From: Thomas Roessler Date: Tue, 9 Jan 2007 10:31:09 +0000 (+0000) Subject: #2673: Make mutt_which_case() multi-byte aware. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e1068f04f0678ca60ec0bed9e7c3fd1f66d44954;p=neomutt #2673: Make mutt_which_case() multi-byte aware. --- diff --git a/pattern.c b/pattern.c index c10f92d00..fcc03569e 100644 --- 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 */ }