changeset 9332:a9b8f5613601 v7.4.1948

commit https://github.com/vim/vim/commit/ad5ca9bc1e7145474adb082775a805f1731e9e37 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jun 20 21:26:08 2016 +0200 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)
author Christian Brabandt <cb@256bit.org>
date Mon, 20 Jun 2016 21:30:07 +0200
parents 67d56b233da7
children df1a801dff77
files src/ops.c src/version.c
diffstat 2 files changed, 62 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/ops.c
+++ b/src/ops.c
@@ -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
 			 && (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)
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1948,
+/**/
     1947,
 /**/
     1946,