Mercurial > vim
changeset 4246:4d0b39bcec20 v7.3.874
updated for version 7.3.874
Problem: Comparing file names does not handle multi-byte characters
properly.
Solution: Implement multi-byte handling.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 19 Mar 2013 18:31:49 +0100 |
parents | 89a3d151688c |
children | d2571e334983 |
files | src/misc1.c src/misc2.c src/version.c |
diffstat | 3 files changed, 30 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/src/misc1.c +++ b/src/misc1.c @@ -5049,20 +5049,28 @@ vim_fnamencmp(x, y, len) size_t len; { #ifdef BACKSLASH_IN_FILENAME + char_u *px = x; + char_u *py = y; + int cx = NUL; + int cy = NUL; + /* TODO: multi-byte characters. */ - while (len > 0 && *x && *y) - { - if ((p_fic ? TOLOWER_LOC(*x) != TOLOWER_LOC(*y) : *x != *y) - && !(*x == '/' && *y == '\\') - && !(*x == '\\' && *y == '/')) + while (len > 0) + { + cx = PTR2CHAR(px); + cy = PTR2CHAR(py); + if (cx == NUL || cy == NUL + || ((p_fic ? MB_TOLOWER(cx) != MB_TOLOWER(cy) : cx != cy) + && !(cx == '/' && cy == '\\') + && !(cx == '\\' && cy == '/'))) break; - ++x; - ++y; - --len; + len -= MB_PTR2LEN(px); + px += MB_PTR2LEN(px); + py += MB_PTR2LEN(py); } if (len == 0) return 0; - return (*x - *y); + return (cx - cy); #else if (p_fic) return MB_STRNICMP(x, y, len);
--- a/src/misc2.c +++ b/src/misc2.c @@ -5352,6 +5352,8 @@ ff_wc_equal(s1, s2) char_u *s2; { int i; + int prev1 = NUL; + int prev2 = NUL; if (s1 == s2) return TRUE; @@ -5362,20 +5364,16 @@ ff_wc_equal(s1, s2) if (STRLEN(s1) != STRLEN(s2)) return FAIL; - /* TODO: handle multi-byte characters. */ - for (i = 0; s1[i] != NUL && s2[i] != NUL; i++) + for (i = 0; s1[i] != NUL && s2[i] != NUL; i += MB_PTR2LEN(s1 + i)) { - if (s1[i] != s2[i] - && (!p_fic || TOUPPER_LOC(s1[i]) != TOUPPER_LOC(s2[i]))) - { - if (i >= 2) - if (s1[i-1] == '*' && s1[i-2] == '*') - continue; - else - return FAIL; - else - return FAIL; - } + int c1 = PTR2CHAR(s1 + i); + int c2 = PTR2CHAR(s2 + i); + + if ((p_fic ? MB_TOLOWER(c1) != MB_TOLOWER(c2) : c1 != c2) + && (prev1 != '*' || prev2 != '*')) + return FAIL; + prev2 = prev1; + prev1 = c1; } return TRUE; }