1
0
forked from aniani/vim

patch 7.4.1948

Problem:    Using Ctrl-A with double-byte encoding may result in garbled text.
Solution:   Skip to the start of a character. (Hirohito Higashi)
This commit is contained in:
Bram Moolenaar 2016-06-20 21:26:08 +02:00
parent ecefe71704
commit ad5ca9bc1e
2 changed files with 62 additions and 7 deletions

View File

@ -5488,11 +5488,23 @@ do_addsub(
{
if (dobin)
while (col > 0 && vim_isbdigit(ptr[col]))
{
--col;
#ifdef FEAT_MBYTE
if (has_mbyte)
col -= (*mb_head_off)(ptr, ptr + col);
#endif
}
if (dohex)
while (col > 0 && vim_isxdigit(ptr[col]))
{
--col;
#ifdef FEAT_MBYTE
if (has_mbyte)
col -= (*mb_head_off)(ptr, ptr + col);
#endif
}
if ( dobin
&& dohex
@ -5500,6 +5512,10 @@ do_addsub(
&& (ptr[col] == 'X'
|| ptr[col] == 'x')
&& ptr[col - 1] == '0'
#ifdef FEAT_MBYTE
&& (!has_mbyte ||
!(*mb_head_off)(ptr, ptr + col - 1))
#endif
&& vim_isxdigit(ptr[col + 1]))))
{
@ -5508,7 +5524,13 @@ do_addsub(
col = pos->col;
while (col > 0 && vim_isdigit(ptr[col]))
{
col--;
#ifdef FEAT_MBYTE
if (has_mbyte)
col -= (*mb_head_off)(ptr, ptr + col);
#endif
}
}
if (( dohex
@ -5516,16 +5538,28 @@ do_addsub(
&& (ptr[col] == 'X'
|| ptr[col] == 'x')
&& ptr[col - 1] == '0'
#ifdef FEAT_MBYTE
&& (!has_mbyte ||
!(*mb_head_off)(ptr, ptr + col - 1))
#endif
&& vim_isxdigit(ptr[col + 1])) ||
( dobin
&& col > 0
&& (ptr[col] == 'B'
|| ptr[col] == 'b')
&& ptr[col - 1] == '0'
#ifdef FEAT_MBYTE
&& (!has_mbyte ||
!(*mb_head_off)(ptr, ptr + col - 1))
#endif
&& vim_isbdigit(ptr[col + 1])))
{
/* Found hexadecimal or binary number, move to its start. */
--col;
#ifdef FEAT_MBYTE
if (has_mbyte)
col -= (*mb_head_off)(ptr, ptr + col);
#endif
}
else
{
@ -5537,12 +5571,18 @@ do_addsub(
while (ptr[col] != NUL
&& !vim_isdigit(ptr[col])
&& !(doalp && ASCII_ISALPHA(ptr[col])))
++col;
col += MB_PTR2LEN(ptr + col);
while (col > 0
&& vim_isdigit(ptr[col - 1])
&& !(doalp && ASCII_ISALPHA(ptr[col])))
{
--col;
#ifdef FEAT_MBYTE
if (has_mbyte)
col -= (*mb_head_off)(ptr, ptr + col);
#endif
}
}
}
@ -5552,14 +5592,21 @@ do_addsub(
&& !vim_isdigit(ptr[col])
&& !(doalp && ASCII_ISALPHA(ptr[col])))
{
++col;
--length;
int mb_len = MB_PTR2LEN(ptr + col);
col += mb_len;
length -= mb_len;
}
if (length == 0)
goto theend;
if (col > pos->col && ptr[col - 1] == '-')
if (col > pos->col && ptr[col - 1] == '-'
#ifdef FEAT_MBYTE
&& (!has_mbyte ||
!(*mb_head_off)(ptr, ptr + col - 1))
#endif
)
{
negative = TRUE;
was_positive = FALSE;
@ -5622,7 +5669,12 @@ do_addsub(
}
else
{
if (col > 0 && ptr[col - 1] == '-' && !visual)
if (col > 0 && ptr[col - 1] == '-'
#ifdef FEAT_MBYTE
&& (!has_mbyte ||
!(*mb_head_off)(ptr, ptr + col - 1))
#endif
&& !visual)
{
/* negative number */
--col;
@ -6036,8 +6088,9 @@ handle_viminfo_register(garray_T *values, int force)
&& (timestamp == 0 || y_ptr->y_time_set > timestamp))
return;
for (i = 0; i < y_ptr->y_size; i++)
vim_free(y_ptr->y_array[i]);
if (y_ptr->y_array != NULL)
for (i = 0; i < y_ptr->y_size; i++)
vim_free(y_ptr->y_array[i]);
vim_free(y_ptr->y_array);
if (y_read_regs == NULL)

View File

@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1948,
/**/
1947,
/**/