From: Bram Moolenaar Date: Mon, 20 Jun 2016 19:26:08 +0000 (+0200) Subject: patch 7.4.1948 X-Git-Tag: v7.4.1948 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ad5ca9bc1e7145474adb082775a805f1731e9e37;p=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) --- diff --git a/src/ops.c b/src/ops.c index d97107e22..8d62ed0b9 100644 --- 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, 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) diff --git a/src/version.c b/src/version.c index e51402039..72f4c0120 100644 --- a/src/version.c +++ b/src/version.c @@ -753,6 +753,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1948, /**/ 1947, /**/