summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/diff.c57
-rw-r--r--src/testdir/test_diffmode.vim8
-rw-r--r--src/version.c2
3 files changed, 59 insertions, 8 deletions
diff --git a/src/diff.c b/src/diff.c
index dac39c21e..cd3ffa48f 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1950,6 +1950,40 @@ diffopt_horizontal(void)
}
/*
+ * 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 int
+diff_equal_char(char_u *p1, char_u *p2, int *len)
+{
+#ifdef FEAT_MBYTE
+ int l = (*mb_ptr2len)(p1);
+
+ if (l != (*mb_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
+#endif
+ {
+ 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.
* Returns TRUE if the line was added, no other buffer has it.
*/
@@ -1969,6 +2003,10 @@ diff_find_change(
int idx;
int off;
int added = TRUE;
+#ifdef FEAT_MBYTE
+ char_u *p1, *p2;
+ int l;
+#endif
/* Make a copy of the line, the next ml_get() will invalidate it. */
line_org = vim_strsave(ml_get_buf(wp->w_buffer, lnum, FALSE));
@@ -2017,10 +2055,11 @@ diff_find_change(
}
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;
}
}
#ifdef FEAT_MBYTE
@@ -2056,10 +2095,16 @@ diff_find_change(
}
else
{
- if (line_org[ei_org] != line_new[ei_new])
+ p1 = line_org + ei_org;
+ p2 = line_new + ei_new;
+#ifdef FEAT_MBYTE
+ p1 -= (*mb_head_off)(line_org, p1);
+ p2 -= (*mb_head_off)(line_new, p2);
+#endif
+ if (!diff_equal_char(p1, p2, &l))
break;
- --ei_org;
- --ei_new;
+ ei_org -= l;
+ ei_new -= l;
}
}
if (*endp < ei_org)
diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim
index 088ec5ccf..3625a68e5 100644
--- a/src/testdir/test_diffmode.vim
+++ b/src/testdir/test_diffmode.vim
@@ -280,13 +280,13 @@ func Test_diffopt_icase()
set diffopt=icase,foldcolumn:0
e one
- call setline(1, ['One', 'Two', 'Three', 'Four'])
+ call setline(1, ['One', 'Two', 'Three', 'Four', 'Fi#ve'])
redraw
let normattr = screenattr(1, 1)
diffthis
botright vert new two
- call setline(1, ['one', 'TWO', 'Three ', 'Four'])
+ call setline(1, ['one', 'TWO', 'Three ', 'Four', 'fI=VE'])
diffthis
redraw
@@ -295,6 +295,10 @@ func Test_diffopt_icase()
call assert_notequal(normattr, screenattr(3, 1))
call assert_equal(normattr, screenattr(4, 1))
+ let dtextattr = screenattr(5, 3)
+ call assert_notequal(dtextattr, screenattr(5, 1))
+ call assert_notequal(dtextattr, screenattr(5, 5))
+
diffoff!
%bwipe!
set diffopt&
diff --git a/src/version.c b/src/version.c
index 579f0a2b6..8af46882e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1037,
+/**/
1036,
/**/
1035,