]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1083: setreg() doesn't correctly handle mbyte chars in blockwise mode v9.1.1083
authorYee Cheng Chin <ychin.git@gmail.com>
Sat, 8 Feb 2025 17:19:15 +0000 (18:19 +0100)
committerChristian Brabandt <cb@256bit.org>
Sat, 8 Feb 2025 17:19:15 +0000 (18:19 +0100)
Problem:  setreg() doesn't correctly handle mbyte chars in blockwise
          mode
Solution: use mb_ptr2len_len function pointer (Yee Cheng Chin)

setreg() will automatically calculate the width when a blockwise mode is
specified, but it does not properly calculate the line widths of mbyte
characters when value is passed as newline-terminated string. It does
work when value is passed as a list of lines though.

Fix this by properly using the mbyte function pointer to increment the
loop counter.

closes: #16596

Signed-off-by: Yee Cheng Chin <ychin.git@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/register.c
src/testdir/test_registers.vim
src/version.c

index 3ca425b4502bfd9be2570fe1b22397bffb7da00c..0df05054ca7229139da2292c46cdbda978603328 100644 (file)
@@ -3019,12 +3019,17 @@ str_to_reg(
        {
            int charlen = 0;
 
-           for (i = start; i < len; ++i)       // find the end of the line
+           for (i = start; i < len;)   // find the end of the line
            {
                if (str[i] == '\n')
                    break;
                if (type == MBLOCK)
                    charlen += mb_ptr2cells_len(str + i, len - i);
+
+               if (str[i] == NUL)
+                   i++; // registers can have NUL chars
+               else
+                   i += mb_ptr2len_len(str + i, len - i);
            }
            i -= start;                 // i is now length of line
            if (charlen > maxlen)
index 36fc3046c25287a790243ec219d7c168baaa2904..1177c2395d3f09ffd43c2a223cb3f477dace3f71 100644 (file)
@@ -431,6 +431,23 @@ func Test_set_register()
   enew!
 endfunc
 
+" Test for blockwise register width calculations
+func Test_set_register_blockwise_width()
+  " Test for regular calculations and overriding the width
+  call setreg('a', "12\n1234\n123", 'b')
+  call assert_equal("\<c-v>4", getreginfo('a').regtype)
+  call setreg('a', "12\n1234\n123", 'b1')
+  call assert_equal("\<c-v>1", getreginfo('a').regtype)
+  call setreg('a', "12\n1234\n123", 'b6')
+  call assert_equal("\<c-v>6", getreginfo('a').regtype)
+
+  " Test for Unicode parsing
+  call setreg('a', "z😅😅z\n12345", 'b')
+  call assert_equal("\<c-v>6", getreginfo('a').regtype)
+  call setreg('a', ["z😅😅z", "12345"], 'b')
+  call assert_equal("\<c-v>6", getreginfo('a').regtype)
+endfunc
+
 " Test for clipboard registers (* and +)
 func Test_clipboard_regs()
   CheckNotGui
index 35deca8635211457b7014692a77ce177ad670d67..4651be27eefe067743031b29163754c1ad824fe3 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1083,
 /**/
     1082,
 /**/