aboutsummaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/builtin.c b/builtin.c
index 3fed1178..268656bc 100644
--- a/builtin.c
+++ b/builtin.c
@@ -240,17 +240,27 @@ strncasecmpmbs(const char *s1, const char *s2, size_t n)
memset(& mbs2, 0, sizeof(mbs2));
for (i1 = i2 = 0 ; i1 < n && i2 < n ;i1 += mbclen1, i2 += mbclen2) {
- mbclen1 = mbrtowc(& wc1, s1 + i1, n - i1, & mbs1);
- if (mbclen1 == (size_t) -1 || mbclen1 == (size_t) -2 || mbclen1 == 0) {
- /* We treat it as a singlebyte character. */
+ if (is_valid_character(s1[i1])) {
mbclen1 = 1;
- wc1 = s1[i1];
+ wc1 = btowc_cache[s1[i1]];
+ } else {
+ mbclen1 = mbrtowc(& wc1, s1 + i1, n - i1, & mbs1);
+ if (mbclen1 == (size_t) -1 || mbclen1 == (size_t) -2 || mbclen1 == 0) {
+ /* We treat it as a singlebyte character. */
+ mbclen1 = 1;
+ wc1 = btowc_cache[s1[i1]];
+ }
}
- mbclen2 = mbrtowc(& wc2, s2 + i2, n - i2, & mbs2);
- if (mbclen2 == (size_t) -1 || mbclen2 == (size_t) -2 || mbclen2 == 0) {
- /* We treat it as a singlebyte character. */
+ if (is_valid_character(s2[i2])) {
mbclen2 = 1;
- wc2 = s2[i2];
+ wc2 = btowc_cache[s2[i2]];
+ } else {
+ mbclen2 = mbrtowc(& wc2, s2 + i2, n - i2, & mbs2);
+ if (mbclen2 == (size_t) -1 || mbclen2 == (size_t) -2 || mbclen2 == 0) {
+ /* We treat it as a singlebyte character. */
+ mbclen2 = 1;
+ wc2 = btowc_cache[s2[i2]];
+ }
}
if ((gap = towlower(wc1) - towlower(wc2)) != 0)
/* s1 and s2 are not equivalent. */