aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/diff.c
diff options
context:
space:
mode:
authorJan Edmund Lazo <janedmundlazo@hotmail.com>2018-08-10 16:39:21 -0400
committerJan Edmund Lazo <janedmundlazo@hotmail.com>2018-08-11 14:54:39 -0400
commit4f93d05d3985d90701fa9dace22daee82b4e48f9 (patch)
treeeefafbc6f4035e287734a11d688308df7d188471 /src/nvim/diff.c
parent22311457ab60be9335f8e630c8b794340d39e466 (diff)
downloadrneovim-4f93d05d3985d90701fa9dace22daee82b4e48f9.tar.gz
rneovim-4f93d05d3985d90701fa9dace22daee82b4e48f9.tar.bz2
rneovim-4f93d05d3985d90701fa9dace22daee82b4e48f9.zip
vim-patch:8.0.1037: "icase" of 'diffopt' is not used for highlighting
Problem: "icase" of 'diffopt' is not used for highlighting differences. Solution: Also use "icase". (Rick Howe) https://github.com/vim/vim/commit/da22b8cc8b1b96fabd5a4c35c57b04a351340fb1
Diffstat (limited to 'src/nvim/diff.c')
-rw-r--r--src/nvim/diff.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/nvim/diff.c b/src/nvim/diff.c
index 8699c16351..7b06609fc3 100644
--- a/src/nvim/diff.c
+++ b/src/nvim/diff.c
@@ -1870,6 +1870,35 @@ bool diffopt_horizontal(void)
return (diff_flags & DIFF_HORIZONTAL) != 0;
}
+// Compare the characters at "p1" and "p2". If they are equal (possibly
+// ignoring case) return true and set "len" to the number of bytes.
+static bool diff_equal_char(const char_u *const p1, const char_u *const p2,
+ int *const len)
+{
+ const int l = utfc_ptr2len(p1);
+
+ if (l != utfc_ptr2len(p2)) {
+ return false;
+ }
+ if (l > 1) {
+ if (STRNCMP(p1, p2, l) != 0
+ && (!enc_utf8
+ || !(diff_flags & DIFF_ICASE)
+ || utf_fold(utf_ptr2char(p1)) != utf_fold(utf_ptr2char(p2)))) {
+ return false;
+ }
+ *len = l;
+ } else {
+ if ((*p1 != *p2)
+ && (!(diff_flags & DIFF_ICASE)
+ || TOLOWER_LOC(*p1) != TOLOWER_LOC(*p2))) {
+ return false;
+ }
+ *len = 1;
+ }
+ return true;
+}
+
/// Find the difference within a changed line.
///
/// @param wp window whose current buffer to check
@@ -1887,6 +1916,7 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
int ei_org;
int ei_new;
bool added = true;
+ int l;
// Make a copy of the line, the next ml_get() will invalidate it.
char_u *line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE));
@@ -1933,11 +1963,11 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
si_org = (int)(skipwhite(line_org + si_org) - line_org);
si_new = (int)(skipwhite(line_new + si_new) - line_new);
} else {
- if (line_org[si_org] != line_new[si_new]) {
+ if (!diff_equal_char(line_org + si_org, line_new + si_new, &l)) {
break;
}
- ++si_org;
- ++si_new;
+ si_org += l;
+ si_new += l;
}
}
@@ -1972,11 +2002,17 @@ bool diff_find_change(win_T *wp, linenr_T lnum, int *startp, int *endp)
ei_new--;
}
} else {
- if (line_org[ei_org] != line_new[ei_new]) {
+ const char_u *p1 = line_org + ei_org;
+ const char_u *p2 = line_new + ei_new;
+
+ p1 -= utf_head_off(line_org, p1);
+ p2 -= utf_head_off(line_new, p2);
+
+ if (!diff_equal_char(p1, p2, &l)) {
break;
}
- ei_org--;
- ei_new--;
+ ei_org -= l;
+ ei_new -= l;
}
}