summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0655
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0655')
-rw-r--r--data/vim/patches/8.1.0655407
1 files changed, 407 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0655 b/data/vim/patches/8.1.0655
new file mode 100644
index 000000000..661d93b5c
--- /dev/null
+++ b/data/vim/patches/8.1.0655
@@ -0,0 +1,407 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0655
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0655
+Problem: When appending a line text property flags are not added.
+Solution: Add text properties to a newly added line.
+Files: src/memline.c, src/testdir/test_textprop.vim, src/textprop.c
+
+
+*** ../vim-8.1.0654/src/memline.c 2018-12-28 21:59:24.508993022 +0100
+--- src/memline.c 2018-12-28 22:55:57.259280353 +0100
+***************
+*** 2568,2573 ****
+--- 2568,2633 ----
+ return (curbuf->b_ml.ml_flags & ML_LINE_DIRTY);
+ }
+
++ #ifdef FEAT_TEXT_PROP
++ static void
++ add_text_props_for_append(
++ buf_T *buf,
++ linenr_T lnum,
++ char_u **line,
++ int *len,
++ char_u **tofree)
++ {
++ int round;
++ int new_prop_count = 0;
++ int count;
++ int n;
++ char_u *props;
++ int new_len;
++ char_u *new_line;
++ textprop_T prop;
++
++ // Make two rounds:
++ // 1. calculate the extra space needed
++ // 2. allocate the space and fill it
++ for (round = 1; round <= 2; ++round)
++ {
++ if (round == 2)
++ {
++ if (new_prop_count == 0)
++ return; // nothing to do
++ new_len = *len + new_prop_count * sizeof(textprop_T);
++ new_line = alloc((unsigned)new_len);
++ if (new_line == NULL)
++ return;
++ mch_memmove(new_line, *line, *len);
++ new_prop_count = 0;
++ }
++
++ // Get the line above to find any props that continue in the next
++ // line.
++ count = get_text_props(buf, lnum, &props, FALSE);
++ for (n = 0; n < count; ++n)
++ {
++ mch_memmove(&prop, props + n * sizeof(textprop_T), sizeof(textprop_T));
++ if (prop.tp_flags & TP_FLAG_CONT_NEXT)
++ {
++ if (round == 2)
++ {
++ prop.tp_flags |= TP_FLAG_CONT_PREV;
++ prop.tp_col = 1;
++ prop.tp_len = *len;
++ mch_memmove(new_line + *len + new_prop_count * sizeof(textprop_T), &prop, sizeof(textprop_T));
++ }
++ ++new_prop_count;
++ }
++ }
++ }
++ *line = new_line;
++ *tofree = new_line;
++ *len = new_len;
++ }
++ #endif
++
+ /*
+ * Append a line after lnum (may be 0 to insert a line in front of the file).
+ * "line" does not need to be allocated, but can't be another line in a
+***************
+*** 2622,2633 ****
+ ml_append_int(
+ buf_T *buf,
+ linenr_T lnum, // append after this line (can be 0)
+! char_u *line, // text of the new line
+ colnr_T len_arg, // length of line, including NUL, or 0
+ int newfile, // flag, see above
+ int mark) // mark the new line
+ {
+! colnr_T len = len_arg; // length of line, including NUL, or 0
+ int i;
+ int line_count; // number of indexes in current block
+ int offset;
+--- 2682,2694 ----
+ ml_append_int(
+ buf_T *buf,
+ linenr_T lnum, // append after this line (can be 0)
+! char_u *line_arg, // text of the new line
+ colnr_T len_arg, // length of line, including NUL, or 0
+ int newfile, // flag, see above
+ int mark) // mark the new line
+ {
+! char_u *line = line_arg;
+! colnr_T len = len_arg;
+ int i;
+ int line_count; // number of indexes in current block
+ int offset;
+***************
+*** 2641,2656 ****
+ DATA_BL *dp;
+ PTR_BL *pp;
+ infoptr_T *ip;
+
+- /* lnum out of range */
+ if (lnum > buf->b_ml.ml_line_count || buf->b_ml.ml_mfp == NULL)
+! return FAIL;
+
+ if (lowest_marked && lowest_marked > lnum)
+ lowest_marked = lnum + 1;
+
+ if (len == 0)
+ len = (colnr_T)STRLEN(line) + 1; // space needed for the text
+ space_needed = len + INDEX_SIZE; // space needed for text + index
+
+ mfp = buf->b_ml.ml_mfp;
+--- 2702,2727 ----
+ DATA_BL *dp;
+ PTR_BL *pp;
+ infoptr_T *ip;
++ #ifdef FEAT_TEXT_PROP
++ char_u *tofree = NULL;
++ #endif
++ int ret = FAIL;
+
+ if (lnum > buf->b_ml.ml_line_count || buf->b_ml.ml_mfp == NULL)
+! return FAIL; // lnum out of range
+
+ if (lowest_marked && lowest_marked > lnum)
+ lowest_marked = lnum + 1;
+
+ if (len == 0)
+ len = (colnr_T)STRLEN(line) + 1; // space needed for the text
++
++ #ifdef FEAT_TEXT_PROP
++ if (curbuf->b_has_textprop && lnum > 0)
++ // Add text properties that continue from the previous line.
++ add_text_props_for_append(buf, lnum, &line, &len, &tofree);
++ #endif
++
+ space_needed = len + INDEX_SIZE; // space needed for text + index
+
+ mfp = buf->b_ml.ml_mfp;
+***************
+*** 2663,2669 ****
+ */
+ if ((hp = ml_find_line(buf, lnum == 0 ? (linenr_T)1 : lnum,
+ ML_INSERT)) == NULL)
+! return FAIL;
+
+ buf->b_ml.ml_flags &= ~ML_EMPTY;
+
+--- 2734,2740 ----
+ */
+ if ((hp = ml_find_line(buf, lnum == 0 ? (linenr_T)1 : lnum,
+ ML_INSERT)) == NULL)
+! goto theend;
+
+ buf->b_ml.ml_flags &= ~ML_EMPTY;
+
+***************
+*** 2694,2700 ****
+ --(buf->b_ml.ml_locked_lineadd);
+ --(buf->b_ml.ml_locked_high);
+ if ((hp = ml_find_line(buf, lnum + 1, ML_INSERT)) == NULL)
+! return FAIL;
+
+ db_idx = -1; /* careful, it is negative! */
+ /* get line count before the insertion */
+--- 2765,2771 ----
+ --(buf->b_ml.ml_locked_lineadd);
+ --(buf->b_ml.ml_locked_high);
+ if ((hp = ml_find_line(buf, lnum + 1, ML_INSERT)) == NULL)
+! goto theend;
+
+ db_idx = -1; /* careful, it is negative! */
+ /* get line count before the insertion */
+***************
+*** 2708,2716 ****
+
+ if ((int)dp->db_free >= space_needed) /* enough room in data block */
+ {
+! /*
+! * Insert new line in existing data block, or in data block allocated above.
+! */
+ dp->db_txt_start -= len;
+ dp->db_free -= space_needed;
+ ++(dp->db_line_count);
+--- 2779,2788 ----
+
+ if ((int)dp->db_free >= space_needed) /* enough room in data block */
+ {
+! /*
+! * Insert the new line in an existing data block, or in the data block
+! * allocated above.
+! */
+ dp->db_txt_start -= len;
+ dp->db_free -= space_needed;
+ ++(dp->db_line_count);
+***************
+*** 2756,2770 ****
+ }
+ else /* not enough space in data block */
+ {
+- /*
+- * If there is not enough room we have to create a new data block and copy some
+- * lines into it.
+- * Then we have to insert an entry in the pointer block.
+- * If this pointer block also is full, we go up another block, and so on, up
+- * to the root if necessary.
+- * The line counts in the pointer blocks have already been adjusted by
+- * ml_find_line().
+- */
+ long line_count_left, line_count_right;
+ int page_count_left, page_count_right;
+ bhdr_T *hp_left;
+--- 2828,2833 ----
+***************
+*** 2783,2788 ****
+--- 2846,2859 ----
+ PTR_BL *pp_new;
+
+ /*
++ * There is not enough room, we have to create a new data block and
++ * copy some lines into it.
++ * Then we have to insert an entry in the pointer block.
++ * If this pointer block also is full, we go up another block, and so
++ * on, up to the root if necessary.
++ * The line counts in the pointer blocks have already been adjusted by
++ * ml_find_line().
++ *
+ * We are going to allocate a new data block. Depending on the
+ * situation it will be put to the left or right of the existing
+ * block. If possible we put the new line in the left block and move
+***************
+*** 2826,2832 ****
+ /* correct line counts in pointer blocks */
+ --(buf->b_ml.ml_locked_lineadd);
+ --(buf->b_ml.ml_locked_high);
+! return FAIL;
+ }
+ if (db_idx < 0) /* left block is new */
+ {
+--- 2897,2903 ----
+ /* correct line counts in pointer blocks */
+ --(buf->b_ml.ml_locked_lineadd);
+ --(buf->b_ml.ml_locked_high);
+! goto theend;
+ }
+ if (db_idx < 0) /* left block is new */
+ {
+***************
+*** 2951,2963 ****
+ ip = &(buf->b_ml.ml_stack[stack_idx]);
+ pb_idx = ip->ip_index;
+ if ((hp = mf_get(mfp, ip->ip_bnum, 1)) == NULL)
+! return FAIL;
+ pp = (PTR_BL *)(hp->bh_data); /* must be pointer block */
+ if (pp->pb_id != PTR_ID)
+ {
+ IEMSG(_("E317: pointer block id wrong 3"));
+ mf_put(mfp, hp, FALSE, FALSE);
+! return FAIL;
+ }
+ /*
+ * TODO: If the pointer block is full and we are adding at the end
+--- 3022,3034 ----
+ ip = &(buf->b_ml.ml_stack[stack_idx]);
+ pb_idx = ip->ip_index;
+ if ((hp = mf_get(mfp, ip->ip_bnum, 1)) == NULL)
+! goto theend;
+ pp = (PTR_BL *)(hp->bh_data); /* must be pointer block */
+ if (pp->pb_id != PTR_ID)
+ {
+ IEMSG(_("E317: pointer block id wrong 3"));
+ mf_put(mfp, hp, FALSE, FALSE);
+! goto theend;
+ }
+ /*
+ * TODO: If the pointer block is full and we are adding at the end
+***************
+*** 3014,3020 ****
+ {
+ hp_new = ml_new_ptr(mfp);
+ if (hp_new == NULL) /* TODO: try to fix tree */
+! return FAIL;
+ pp_new = (PTR_BL *)(hp_new->bh_data);
+
+ if (hp->bh_bnum != 1)
+--- 3085,3091 ----
+ {
+ hp_new = ml_new_ptr(mfp);
+ if (hp_new == NULL) /* TODO: try to fix tree */
+! goto theend;
+ pp_new = (PTR_BL *)(hp_new->bh_data);
+
+ if (hp->bh_bnum != 1)
+***************
+*** 3119,3126 ****
+ if (buf->b_write_to_channel)
+ channel_write_new_lines(buf);
+ #endif
+
+! return OK;
+ }
+
+ /*
+--- 3190,3202 ----
+ if (buf->b_write_to_channel)
+ channel_write_new_lines(buf);
+ #endif
++ ret = OK;
+
+! theend:
+! #ifdef FEAT_TEXT_PROP
+! vim_free(tofree);
+! #endif
+! return ret;
+ }
+
+ /*
+*** ../vim-8.1.0654/src/testdir/test_textprop.vim 2018-12-28 21:59:24.512992993 +0100
+--- src/testdir/test_textprop.vim 2018-12-28 23:18:00.504921000 +0100
+***************
+*** 257,262 ****
+--- 257,272 ----
+ call assert_equal([expect_short], prop_list(4))
+ bwipe!
+
++ " Test appending a line below the text prop start.
++ call Setup_three_line_prop()
++ let expect2 = {'col': 4, 'length': 4, 'type': 'comment', 'start': 1, 'end': 0, 'id': 0}
++ call assert_equal([expect2], prop_list(2))
++ call append(2, "new line")
++ call assert_equal([expect2], prop_list(2))
++ let expect3 = {'col': 1, 'length': 9, 'type': 'comment', 'start': 0, 'end': 0, 'id': 0}
++ call assert_equal([expect3], prop_list(3))
++ bwipe!
++
+ call prop_type_delete('comment')
+ endfunc
+
+*** ../vim-8.1.0654/src/textprop.c 2018-12-25 23:15:41.795966567 +0100
+--- src/textprop.c 2018-12-28 23:19:17.068318767 +0100
+***************
+*** 17,30 ****
+ * Text properties have a type, which can be used to specify highlighting.
+ *
+ * TODO:
+! * - mismatch in column 1 being the first column
+! * - Let props overrule syntax HL.
+! * - When deleting a line where a prop ended, adjust flag of previous line.
+! * - When deleting a line where a prop started, adjust flag of next line.
+! * - When inserting a line add props that continue from previous line.
+! * - Adjust property column and length when text is inserted/deleted
+! * - Add an arrray for global_proptypes, to quickly lookup a proptype by ID
+! * - Add an arrray for b_proptypes, to quickly lookup a proptype by ID
+ * - Also test line2byte() with many lines, so that ml_updatechunk() is taken
+ * into account.
+ * - add mechanism to keep track of changed lines.
+--- 17,28 ----
+ * Text properties have a type, which can be used to specify highlighting.
+ *
+ * TODO:
+! * - Perhaps we only need TP_FLAG_CONT_NEXT ?
+! * - Adjust text property column and length when text is inserted/deleted
+! * - Add an arrray for global_proptypes, to quickly lookup a prop type by ID
+! * - Add an arrray for b_proptypes, to quickly lookup a prop type by ID
+! * - Checking the text length to detect text properties is slow. Use a flag in
+! * the index, like DB_MARKED?
+ * - Also test line2byte() with many lines, so that ml_updatechunk() is taken
+ * into account.
+ * - add mechanism to keep track of changed lines.
+*** ../vim-8.1.0654/src/version.c 2018-12-28 21:59:24.512992993 +0100
+--- src/version.c 2018-12-28 22:58:21.238154315 +0100
+***************
+*** 801,802 ****
+--- 801,804 ----
+ { /* Add new patch number below this line */
++ /**/
++ 655,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+71. You wonder how people walk
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///