Skip to content

Commit

Permalink
patch 8.0.1037: "icase" of 'diffopt' is not used for highlighting
Browse files Browse the repository at this point in the history
Problem:    "icase" of 'diffopt' is not used for highlighting differences.
Solution:   Also use "icase". (Rick Howe)
  • Loading branch information
brammool committed Sep 2, 2017
1 parent dada6d2 commit da22b8c
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 8 deletions.
57 changes: 51 additions & 6 deletions src/diff.c
Expand Up @@ -1949,6 +1949,40 @@ 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 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.
Expand All @@ -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));
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 6 additions & 2 deletions src/testdir/test_diffmode.vim
Expand Up @@ -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
Expand All @@ -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&
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -769,6 +769,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1037,
/**/
1036,
/**/
Expand Down

0 comments on commit da22b8c

Please sign in to comment.