]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.0115: byte2line() does not work correctly with text properties v8.2.0115
authorBram Moolenaar <Bram@vim.org>
Mon, 13 Jan 2020 19:40:51 +0000 (20:40 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 13 Jan 2020 19:40:51 +0000 (20:40 +0100)
Problem:    Byte2line() does not work correctly with text properties. (Billie
            Cleek)
Solution:   Take the bytes of the text properties into account.
            (closes #5334)

src/memline.c
src/testdir/test_textprop.vim
src/version.c

index 860438cfcd32b50f2331e6b968a97b7d4a47a8e4..2ac47af117b0341023877823251c418b949fb12b 100644 (file)
@@ -5738,7 +5738,7 @@ ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
        count = (long)(buf->b_ml.ml_locked_high) -
                (long)(buf->b_ml.ml_locked_low) + 1;
        start_idx = idx = curline - buf->b_ml.ml_locked_low;
-       if (idx == 0)// first line in block, text at the end
+       if (idx == 0)  // first line in block, text at the end
            text_end = dp->db_txt_end;
        else
            text_end = ((dp->db_index[idx - 1]) & DB_INDEX_MASK);
@@ -5752,13 +5752,38 @@ ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
        }
        else
        {
+#ifdef FEAT_PROP_POPUP
+           long textprop_total = 0;
+           long textprop_size = 0;
+           char_u *l1, *l2;
+#endif
+
            extra = 0;
-           while (offset >= size
-                      + text_end - (int)((dp->db_index[idx]) & DB_INDEX_MASK)
-                                                                     + ffdos)
+           for (;;)
            {
+#ifdef FEAT_PROP_POPUP
+               if (buf->b_has_textprop)
+               {
+                   // compensate for the extra bytes taken by textprops
+                   l1 = (char_u *)dp + ((dp->db_index[idx]) & DB_INDEX_MASK);
+                   l2 = (char_u *)dp + (idx == 0 ? dp->db_txt_end
+                                 : ((dp->db_index[idx - 1]) & DB_INDEX_MASK));
+                   textprop_size = (l2 - l1) - (STRLEN(l1) + 1);
+               }
+#endif
+               if (!(offset >= size
+                       + text_end - (int)((dp->db_index[idx]) & DB_INDEX_MASK)
+#ifdef FEAT_PROP_POPUP
+                       - textprop_total - textprop_size
+#endif
+                       + ffdos))
+                   break;
+
                if (ffdos)
                    size++;
+#ifdef FEAT_PROP_POPUP
+               textprop_total += textprop_size;
+#endif
                if (idx == count - 1)
                {
                    extra = 1;
@@ -5776,7 +5801,8 @@ ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
            // lengths.
            len = 0;
            for (i = start_idx; i <= idx; ++i)
-               len += (int)STRLEN((char_u *)dp + ((dp->db_index[i]) & DB_INDEX_MASK)) + 1;
+               len += (int)STRLEN((char_u *)dp
+                                   + ((dp->db_index[i]) & DB_INDEX_MASK)) + 1;
        }
        else
 #endif
index ca6fd746e6da5893b3a538df8960b7894820bcb2..32001b3622b576ff5a30a606c1721a369a1e2c8b 100644 (file)
@@ -664,7 +664,7 @@ func Test_prop_multiline()
   call prop_type_delete('comment')
 endfunc
 
-func Test_prop_byteoff()
+func Test_prop_line2byte()
   call prop_type_add('comment', {'highlight': 'Directory'})
   new
   call setline(1, ['line1', 'second line', ''])
@@ -677,6 +677,22 @@ func Test_prop_byteoff()
   call prop_type_delete('comment')
 endfunc
 
+func Test_prop_byte2line()
+  new
+  set ff=unix
+  call setline(1, ['one one', 'two two', 'three three', 'four four', 'five'])
+  call assert_equal(4, byte2line(line2byte(4)))
+  call assert_equal(5, byte2line(line2byte(5)))
+
+  call prop_type_add('prop', {'highlight': 'Directory'})
+  call prop_add(3, 1, {'length': 5, 'type': 'prop'})
+  call assert_equal(4, byte2line(line2byte(4)))
+  call assert_equal(5, byte2line(line2byte(5)))
+
+  bwipe!
+  call prop_type_delete('prop')
+endfunc
+
 func Test_prop_undo()
   new
   call prop_type_add('comment', {'highlight': 'Directory'})
index 0dac41e7cf8db4cac1873a47204672e13944a583..2d502beac6e3ef5e6227a1c71d2c9ba0874b5278 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    115,
 /**/
     114,
 /**/