summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0407
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0407')
-rw-r--r--data/vim/patches/8.1.04071253
1 files changed, 1253 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0407 b/data/vim/patches/8.1.0407
new file mode 100644
index 000000000..aef42ebe7
--- /dev/null
+++ b/data/vim/patches/8.1.0407
@@ -0,0 +1,1253 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0407
+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.0407
+Problem: Quickfix code mixes using the stack and a list pointer.
+Solution: Use a list pointer in more places. (Yegappan Lakshmanan,
+ closes #3443)
+Files: src/quickfix.c
+
+
+*** ../vim-8.1.0406/src/quickfix.c 2018-09-02 15:18:38.910627833 +0200
+--- src/quickfix.c 2018-09-18 22:47:16.706525861 +0200
+***************
+*** 136,153 ****
+
+ static void qf_new_list(qf_info_T *qi, char_u *qf_title);
+ static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid);
+! static void qf_free(qf_info_T *qi, int idx);
+ static char_u *qf_types(int, int);
+ static int qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *, char_u *);
+ static char_u *qf_push_dir(char_u *, struct dir_stack_T **, int is_file_stack);
+ static char_u *qf_pop_dir(struct dir_stack_T **);
+! static char_u *qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *);
+ static void qf_fmt_text(char_u *text, char_u *buf, int bufsize);
+ static int qf_win_pos_update(qf_info_T *qi, int old_qf_index);
+ static win_T *qf_find_win(qf_info_T *qi);
+ static buf_T *qf_find_buf(qf_info_T *qi);
+ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last);
+- static void qf_set_title_var(qf_info_T *qi);
+ static void qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last);
+ static char_u *get_mef_name(void);
+ static buf_T *load_dummy_buffer(char_u *fname, char_u *dirname_start, char_u *resulting_dir);
+--- 136,152 ----
+
+ static void qf_new_list(qf_info_T *qi, char_u *qf_title);
+ static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid);
+! static void qf_free(qf_list_T *qfl);
+ static char_u *qf_types(int, int);
+ static int qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *, char_u *);
+ static char_u *qf_push_dir(char_u *, struct dir_stack_T **, int is_file_stack);
+ static char_u *qf_pop_dir(struct dir_stack_T **);
+! static char_u *qf_guess_filepath(qf_list_T *qfl, char_u *);
+ static void qf_fmt_text(char_u *text, char_u *buf, int bufsize);
+ static int qf_win_pos_update(qf_info_T *qi, int old_qf_index);
+ static win_T *qf_find_win(qf_info_T *qi);
+ static buf_T *qf_find_buf(qf_info_T *qi);
+ static void qf_update_buffer(qf_info_T *qi, qfline_T *old_last);
+ static void qf_fill_buffer(qf_info_T *qi, buf_T *buf, qfline_T *old_last);
+ static char_u *get_mef_name(void);
+ static buf_T *load_dummy_buffer(char_u *fname, char_u *dirname_start, char_u *resulting_dir);
+***************
+*** 1757,1763 ****
+ if (!adding)
+ {
+ /* Error when creating a new list. Free the new list */
+! qf_free(qi, qi->qf_curlist);
+ qi->qf_listcount--;
+ if (qi->qf_curlist > 0)
+ --qi->qf_curlist;
+--- 1756,1762 ----
+ if (!adding)
+ {
+ /* Error when creating a new list. Free the new list */
+! qf_free(&qi->qf_lists[qi->qf_curlist]);
+ qi->qf_listcount--;
+ if (qi->qf_curlist > 0)
+ --qi->qf_curlist;
+***************
+*** 1802,1816 ****
+ * Prepends ':' to the title.
+ */
+ static void
+! qf_store_title(qf_info_T *qi, int qf_idx, char_u *title)
+ {
+! VIM_CLEAR(qi->qf_lists[qf_idx].qf_title);
+
+ if (title != NULL)
+ {
+ char_u *p = alloc((int)STRLEN(title) + 2);
+
+! qi->qf_lists[qf_idx].qf_title = p;
+ if (p != NULL)
+ STRCPY(p, title);
+ }
+--- 1801,1815 ----
+ * Prepends ':' to the title.
+ */
+ static void
+! qf_store_title(qf_list_T *qfl, char_u *title)
+ {
+! VIM_CLEAR(qfl->qf_title);
+
+ if (title != NULL)
+ {
+ char_u *p = alloc((int)STRLEN(title) + 2);
+
+! qfl->qf_title = p;
+ if (p != NULL)
+ STRCPY(p, title);
+ }
+***************
+*** 1847,1853 ****
+ * way with ":grep'.
+ */
+ while (qi->qf_listcount > qi->qf_curlist + 1)
+! qf_free(qi, --qi->qf_listcount);
+
+ /*
+ * When the stack is full, remove to oldest entry
+--- 1846,1852 ----
+ * way with ":grep'.
+ */
+ while (qi->qf_listcount > qi->qf_curlist + 1)
+! qf_free(&qi->qf_lists[--qi->qf_listcount]);
+
+ /*
+ * When the stack is full, remove to oldest entry
+***************
+*** 1855,1861 ****
+ */
+ if (qi->qf_listcount == LISTCOUNT)
+ {
+! qf_free(qi, 0);
+ for (i = 1; i < LISTCOUNT; ++i)
+ qi->qf_lists[i - 1] = qi->qf_lists[i];
+ qi->qf_curlist = LISTCOUNT - 1;
+--- 1854,1860 ----
+ */
+ if (qi->qf_listcount == LISTCOUNT)
+ {
+! qf_free(&qi->qf_lists[0]);
+ for (i = 1; i < LISTCOUNT; ++i)
+ qi->qf_lists[i - 1] = qi->qf_lists[i];
+ qi->qf_curlist = LISTCOUNT - 1;
+***************
+*** 1863,1874 ****
+ else
+ qi->qf_curlist = qi->qf_listcount++;
+ vim_memset(&qi->qf_lists[qi->qf_curlist], 0, (size_t)(sizeof(qf_list_T)));
+! qf_store_title(qi, qi->qf_curlist, qf_title);
+ qi->qf_lists[qi->qf_curlist].qf_id = ++last_qf_id;
+ }
+
+ /*
+! * Free a location list
+ */
+ static void
+ ll_free_all(qf_info_T **pqi)
+--- 1862,1873 ----
+ else
+ qi->qf_curlist = qi->qf_listcount++;
+ vim_memset(&qi->qf_lists[qi->qf_curlist], 0, (size_t)(sizeof(qf_list_T)));
+! qf_store_title(&qi->qf_lists[qi->qf_curlist], qf_title);
+ qi->qf_lists[qi->qf_curlist].qf_id = ++last_qf_id;
+ }
+
+ /*
+! * Free a location list stack
+ */
+ static void
+ ll_free_all(qf_info_T **pqi)
+***************
+*** 1886,1892 ****
+ {
+ /* No references to this location list */
+ for (i = 0; i < qi->qf_listcount; ++i)
+! qf_free(qi, i);
+ vim_free(qi);
+ }
+ }
+--- 1885,1891 ----
+ {
+ /* No references to this location list */
+ for (i = 0; i < qi->qf_listcount; ++i)
+! qf_free(&qi->qf_lists[i]);
+ vim_free(qi);
+ }
+ }
+***************
+*** 1909,1915 ****
+ else
+ /* quickfix list */
+ for (i = 0; i < qi->qf_listcount; ++i)
+! qf_free(qi, i);
+ }
+
+ /*
+--- 1908,1914 ----
+ else
+ /* quickfix list */
+ for (i = 0; i < qi->qf_listcount; ++i)
+! qf_free(&qi->qf_lists[i]);
+ }
+
+ /*
+***************
+*** 1933,1938 ****
+--- 1932,1938 ----
+ int type, /* type character */
+ int valid) /* valid entry */
+ {
++ qf_list_T *qfl = &qi->qf_lists[qf_idx];
+ qfline_T *qfp;
+ qfline_T **lastp; /* pointer to qf_last or NULL */
+
+***************
+*** 1980,1991 ****
+ qfp->qf_type = type;
+ qfp->qf_valid = valid;
+
+! lastp = &qi->qf_lists[qf_idx].qf_last;
+ if (qf_list_empty(qi, qf_idx)) /* first element in the list */
+ {
+! qi->qf_lists[qf_idx].qf_start = qfp;
+! qi->qf_lists[qf_idx].qf_ptr = qfp;
+! qi->qf_lists[qf_idx].qf_index = 0;
+ qfp->qf_prev = NULL;
+ }
+ else
+--- 1980,1991 ----
+ qfp->qf_type = type;
+ qfp->qf_valid = valid;
+
+! lastp = &qfl->qf_last;
+ if (qf_list_empty(qi, qf_idx)) /* first element in the list */
+ {
+! qfl->qf_start = qfp;
+! qfl->qf_ptr = qfp;
+! qfl->qf_index = 0;
+ qfp->qf_prev = NULL;
+ }
+ else
+***************
+*** 1996,2015 ****
+ qfp->qf_next = NULL;
+ qfp->qf_cleared = FALSE;
+ *lastp = qfp;
+! ++qi->qf_lists[qf_idx].qf_count;
+! if (qi->qf_lists[qf_idx].qf_index == 0 && qfp->qf_valid)
+ /* first valid entry */
+ {
+! qi->qf_lists[qf_idx].qf_index =
+! qi->qf_lists[qf_idx].qf_count;
+! qi->qf_lists[qf_idx].qf_ptr = qfp;
+ }
+
+ return OK;
+ }
+
+ /*
+! * Allocate a new location list
+ */
+ static qf_info_T *
+ ll_new_list(void)
+--- 1996,2014 ----
+ qfp->qf_next = NULL;
+ qfp->qf_cleared = FALSE;
+ *lastp = qfp;
+! ++qfl->qf_count;
+! if (qfl->qf_index == 0 && qfp->qf_valid)
+ /* first valid entry */
+ {
+! qfl->qf_index = qfl->qf_count;
+! qfl->qf_ptr = qfp;
+ }
+
+ return OK;
+ }
+
+ /*
+! * Allocate a new location list stack
+ */
+ static qf_info_T *
+ ll_new_list(void)
+***************
+*** 2023,2030 ****
+ }
+
+ /*
+! * Return the location list for window 'wp'.
+! * If not present, allocate a location list
+ */
+ static qf_info_T *
+ ll_get_or_alloc_list(win_T *wp)
+--- 2022,2029 ----
+ }
+
+ /*
+! * Return the location list stack for window 'wp'.
+! * If not present, allocate a location list stack
+ */
+ static qf_info_T *
+ ll_get_or_alloc_list(win_T *wp)
+***************
+*** 2197,2203 ****
+ if (mch_getperm(ptr) < 0)
+ {
+ vim_free(ptr);
+! directory = qf_guess_filepath(qi, qf_idx, fname);
+ if (directory)
+ ptr = concat_fnames(directory, fname, TRUE);
+ else
+--- 2196,2202 ----
+ if (mch_getperm(ptr) < 0)
+ {
+ vim_free(ptr);
+! directory = qf_guess_filepath(&qi->qf_lists[qf_idx], fname);
+ if (directory)
+ ptr = concat_fnames(directory, fname, TRUE);
+ else
+***************
+*** 2365,2376 ****
+ * qf_guess_filepath will return NULL.
+ */
+ static char_u *
+! qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *filename)
+ {
+ struct dir_stack_T *ds_ptr;
+ struct dir_stack_T *ds_tmp;
+ char_u *fullname;
+- qf_list_T *qfl = &qi->qf_lists[qf_idx];
+
+ /* no dirs on the stack - there's nothing we can do */
+ if (qfl->qf_dir_stack == NULL)
+--- 2364,2374 ----
+ * qf_guess_filepath will return NULL.
+ */
+ static char_u *
+! qf_guess_filepath(qf_list_T *qfl, char_u *filename)
+ {
+ struct dir_stack_T *ds_ptr;
+ struct dir_stack_T *ds_tmp;
+ char_u *fullname;
+
+ /* no dirs on the stack - there's nothing we can do */
+ if (qfl->qf_dir_stack == NULL)
+***************
+*** 2436,2449 ****
+ * Similar to location list.
+ */
+ static int
+! is_qf_entry_present(qf_info_T *qi, qfline_T *qf_ptr)
+ {
+- qf_list_T *qfl;
+ qfline_T *qfp;
+ int i;
+
+- qfl = &qi->qf_lists[qi->qf_curlist];
+-
+ /* Search for the entry in the current list */
+ for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count;
+ ++i, qfp = qfp->qf_next)
+--- 2434,2444 ----
+ * Similar to location list.
+ */
+ static int
+! is_qf_entry_present(qf_list_T *qfl, qfline_T *qf_ptr)
+ {
+ qfline_T *qfp;
+ int i;
+
+ /* Search for the entry in the current list */
+ for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count;
+ ++i, qfp = qfp->qf_next)
+***************
+*** 2462,2468 ****
+ */
+ static qfline_T *
+ get_next_valid_entry(
+! qf_info_T *qi,
+ qfline_T *qf_ptr,
+ int *qf_index,
+ int dir)
+--- 2457,2463 ----
+ */
+ static qfline_T *
+ get_next_valid_entry(
+! qf_list_T *qfl,
+ qfline_T *qf_ptr,
+ int *qf_index,
+ int dir)
+***************
+*** 2475,2487 ****
+
+ do
+ {
+! if (idx == qi->qf_lists[qi->qf_curlist].qf_count
+! || qf_ptr->qf_next == NULL)
+ return NULL;
+ ++idx;
+ qf_ptr = qf_ptr->qf_next;
+! } while ((!qi->qf_lists[qi->qf_curlist].qf_nonevalid
+! && !qf_ptr->qf_valid)
+ || (dir == FORWARD_FILE && qf_ptr->qf_fnum == old_qf_fnum));
+
+ *qf_index = idx;
+--- 2470,2480 ----
+
+ do
+ {
+! if (idx == qfl->qf_count || qf_ptr->qf_next == NULL)
+ return NULL;
+ ++idx;
+ qf_ptr = qf_ptr->qf_next;
+! } while ((!qfl->qf_nonevalid && !qf_ptr->qf_valid)
+ || (dir == FORWARD_FILE && qf_ptr->qf_fnum == old_qf_fnum));
+
+ *qf_index = idx;
+***************
+*** 2494,2500 ****
+ */
+ static qfline_T *
+ get_prev_valid_entry(
+! qf_info_T *qi,
+ qfline_T *qf_ptr,
+ int *qf_index,
+ int dir)
+--- 2487,2493 ----
+ */
+ static qfline_T *
+ get_prev_valid_entry(
+! qf_list_T *qfl,
+ qfline_T *qf_ptr,
+ int *qf_index,
+ int dir)
+***************
+*** 2511,2518 ****
+ return NULL;
+ --idx;
+ qf_ptr = qf_ptr->qf_prev;
+! } while ((!qi->qf_lists[qi->qf_curlist].qf_nonevalid
+! && !qf_ptr->qf_valid)
+ || (dir == BACKWARD_FILE && qf_ptr->qf_fnum == old_qf_fnum));
+
+ *qf_index = idx;
+--- 2504,2510 ----
+ return NULL;
+ --idx;
+ qf_ptr = qf_ptr->qf_prev;
+! } while ((!qfl->qf_nonevalid && !qf_ptr->qf_valid)
+ || (dir == BACKWARD_FILE && qf_ptr->qf_fnum == old_qf_fnum));
+
+ *qf_index = idx;
+***************
+*** 2527,2533 ****
+ */
+ static qfline_T *
+ get_nth_valid_entry(
+! qf_info_T *qi,
+ int errornr,
+ qfline_T *qf_ptr,
+ int *qf_index,
+--- 2519,2525 ----
+ */
+ static qfline_T *
+ get_nth_valid_entry(
+! qf_list_T *qfl,
+ int errornr,
+ qfline_T *qf_ptr,
+ int *qf_index,
+***************
+*** 2544,2552 ****
+ prev_index = *qf_index;
+
+ if (dir == FORWARD || dir == FORWARD_FILE)
+! qf_ptr = get_next_valid_entry(qi, qf_ptr, qf_index, dir);
+ else
+! qf_ptr = get_prev_valid_entry(qi, qf_ptr, qf_index, dir);
+ if (qf_ptr == NULL)
+ {
+ qf_ptr = prev_qf_ptr;
+--- 2536,2544 ----
+ prev_index = *qf_index;
+
+ if (dir == FORWARD || dir == FORWARD_FILE)
+! qf_ptr = get_next_valid_entry(qfl, qf_ptr, qf_index, dir);
+ else
+! qf_ptr = get_prev_valid_entry(qfl, qf_ptr, qf_index, dir);
+ if (qf_ptr == NULL)
+ {
+ qf_ptr = prev_qf_ptr;
+***************
+*** 2570,2576 ****
+ */
+ static qfline_T *
+ get_nth_entry(
+! qf_info_T *qi,
+ int errornr,
+ qfline_T *qf_ptr,
+ int *cur_qfidx)
+--- 2562,2568 ----
+ */
+ static qfline_T *
+ get_nth_entry(
+! qf_list_T *qfl,
+ int errornr,
+ qfline_T *qf_ptr,
+ int *cur_qfidx)
+***************
+*** 2584,2592 ****
+ qf_ptr = qf_ptr->qf_prev;
+ }
+ /* New error number is greater than the current error number */
+! while (errornr > qf_idx &&
+! qf_idx < qi->qf_lists[qi->qf_curlist].qf_count &&
+! qf_ptr->qf_next != NULL)
+ {
+ ++qf_idx;
+ qf_ptr = qf_ptr->qf_next;
+--- 2576,2583 ----
+ qf_ptr = qf_ptr->qf_prev;
+ }
+ /* New error number is greater than the current error number */
+! while (errornr > qf_idx && qf_idx < qfl->qf_count &&
+! qf_ptr->qf_next != NULL)
+ {
+ ++qf_idx;
+ qf_ptr = qf_ptr->qf_next;
+***************
+*** 2784,2792 ****
+ }
+
+ /*
+! * Go to a window that shows the specified file. If a window is not found, go
+! * to the window just above the quickfix window. This is used for opening a
+! * file from a quickfix window and not from a location window.
+ */
+ static void
+ qf_goto_win_with_qfl_file(int qf_fnum)
+--- 2775,2784 ----
+ }
+
+ /*
+! * Go to a window that contains the specified buffer 'qf_fnum'. If a window is
+! * not found, then go to the window just above the quickfix window. This is
+! * used for opening a file from a quickfix window and not from a location
+! * window.
+ */
+ static void
+ qf_goto_win_with_qfl_file(int qf_fnum)
+***************
+*** 2899,2904 ****
+--- 2891,2897 ----
+ int *opened_window,
+ int *abort)
+ {
++ qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist];
+ int retval = OK;
+
+ if (qf_ptr->qf_type == 1)
+***************
+*** 2918,2924 ****
+ else
+ {
+ int old_qf_curlist = qi->qf_curlist;
+! int save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+
+ retval = buflist_getfile(qf_ptr->qf_fnum,
+ (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
+--- 2911,2917 ----
+ else
+ {
+ int old_qf_curlist = qi->qf_curlist;
+! int save_qfid = qfl->qf_id;
+
+ retval = buflist_getfile(qf_ptr->qf_fnum,
+ (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit);
+***************
+*** 2942,2948 ****
+ }
+ }
+ else if (old_qf_curlist != qi->qf_curlist
+! || !is_qf_entry_present(qi, qf_ptr))
+ {
+ if (IS_QF_STACK(qi))
+ EMSG(_("E925: Current quickfix was changed"));
+--- 2935,2941 ----
+ }
+ }
+ else if (old_qf_curlist != qi->qf_curlist
+! || !is_qf_entry_present(qfl, qf_ptr))
+ {
+ if (IS_QF_STACK(qi))
+ EMSG(_("E925: Current quickfix was changed"));
+***************
+*** 3087,3092 ****
+--- 3080,3086 ----
+ int errornr,
+ int forceit)
+ {
++ qf_list_T *qfl;
+ qfline_T *qf_ptr;
+ qfline_T *old_qf_ptr;
+ int qf_index;
+***************
+*** 3113,3125 ****
+ return;
+ }
+
+! qf_ptr = qi->qf_lists[qi->qf_curlist].qf_ptr;
+ old_qf_ptr = qf_ptr;
+! qf_index = qi->qf_lists[qi->qf_curlist].qf_index;
+ old_qf_index = qf_index;
+ if (dir != 0) /* next/prev valid entry */
+ {
+! qf_ptr = get_nth_valid_entry(qi, errornr, qf_ptr, &qf_index, dir);
+ if (qf_ptr == NULL)
+ {
+ qf_ptr = old_qf_ptr;
+--- 3107,3121 ----
+ return;
+ }
+
+! qfl = &qi->qf_lists[qi->qf_curlist];
+!
+! qf_ptr = qfl->qf_ptr;
+ old_qf_ptr = qf_ptr;
+! qf_index = qfl->qf_index;
+ old_qf_index = qf_index;
+ if (dir != 0) /* next/prev valid entry */
+ {
+! qf_ptr = get_nth_valid_entry(qfl, errornr, qf_ptr, &qf_index, dir);
+ if (qf_ptr == NULL)
+ {
+ qf_ptr = old_qf_ptr;
+***************
+*** 3128,3136 ****
+ }
+ }
+ else if (errornr != 0) /* go to specified number */
+! qf_ptr = get_nth_entry(qi, errornr, qf_ptr, &qf_index);
+
+! qi->qf_lists[qi->qf_curlist].qf_index = qf_index;
+ if (qf_win_pos_update(qi, old_qf_index))
+ /* No need to print the error message if it's visible in the error
+ * window */
+--- 3124,3132 ----
+ }
+ }
+ else if (errornr != 0) /* go to specified number */
+! qf_ptr = get_nth_entry(qfl, errornr, qf_ptr, &qf_index);
+
+! qfl->qf_index = qf_index;
+ if (qf_win_pos_update(qi, old_qf_index))
+ /* No need to print the error message if it's visible in the error
+ * window */
+***************
+*** 3215,3222 ****
+ theend:
+ if (qi != NULL)
+ {
+! qi->qf_lists[qi->qf_curlist].qf_ptr = qf_ptr;
+! qi->qf_lists[qi->qf_curlist].qf_index = qf_index;
+ }
+ if (p_swb != old_swb && opened_window)
+ {
+--- 3211,3218 ----
+ theend:
+ if (qi != NULL)
+ {
+! qfl->qf_ptr = qf_ptr;
+! qfl->qf_index = qf_index;
+ }
+ if (p_swb != old_swb && opened_window)
+ {
+***************
+*** 3242,3250 ****
+ /*
+ * Display information about a single entry from the quickfix/location list.
+ * Used by ":clist/:llist" commands.
+ */
+ static void
+! qf_list_entry(qf_info_T *qi, qfline_T *qfp, int qf_idx)
+ {
+ char_u *fname;
+ buf_T *buf;
+--- 3238,3248 ----
+ /*
+ * Display information about a single entry from the quickfix/location list.
+ * Used by ":clist/:llist" commands.
++ * 'cursel' will be set to TRUE for the currently selected entry in the
++ * quickfix list.
+ */
+ static void
+! qf_list_entry(qfline_T *qfp, int qf_idx, int cursel)
+ {
+ char_u *fname;
+ buf_T *buf;
+***************
+*** 3285,3292 ****
+ return;
+
+ msg_putchar('\n');
+! msg_outtrans_attr(IObuff, qf_idx == qi->qf_lists[qi->qf_curlist].qf_index
+! ? HL_ATTR(HLF_QFL) : qfFileAttr);
+
+ if (qfp->qf_lnum != 0)
+ msg_puts_attr((char_u *)":", qfSepAttr);
+--- 3283,3289 ----
+ return;
+
+ msg_putchar('\n');
+! msg_outtrans_attr(IObuff, cursel ? HL_ATTR(HLF_QFL) : qfFileAttr);
+
+ if (qfp->qf_lnum != 0)
+ msg_puts_attr((char_u *)":", qfSepAttr);
+***************
+*** 3326,3331 ****
+--- 3323,3329 ----
+ void
+ qf_list(exarg_T *eap)
+ {
++ qf_list_T *qfl;
+ qfline_T *qfp;
+ int i;
+ int idx1 = 1;
+***************
+*** 3362,3376 ****
+ EMSG(_(e_trailing));
+ return;
+ }
+ if (plus)
+ {
+! i = qi->qf_lists[qi->qf_curlist].qf_index;
+ idx2 = i + idx1;
+ idx1 = i;
+ }
+ else
+ {
+! i = qi->qf_lists[qi->qf_curlist].qf_count;
+ if (idx1 < 0)
+ idx1 = (-idx1 > i) ? 0 : idx1 + i + 1;
+ if (idx2 < 0)
+--- 3360,3375 ----
+ EMSG(_(e_trailing));
+ return;
+ }
++ qfl = &qi->qf_lists[qi->qf_curlist];
+ if (plus)
+ {
+! i = qfl->qf_index;
+ idx2 = i + idx1;
+ idx1 = i;
+ }
+ else
+ {
+! i = qfl->qf_count;
+ if (idx1 < 0)
+ idx1 = (-idx1 > i) ? 0 : idx1 + i + 1;
+ if (idx2 < 0)
+***************
+*** 3394,3410 ****
+ if (qfLineAttr == 0)
+ qfLineAttr = HL_ATTR(HLF_N);
+
+! if (qi->qf_lists[qi->qf_curlist].qf_nonevalid)
+ all = TRUE;
+! qfp = qi->qf_lists[qi->qf_curlist].qf_start;
+! for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; )
+ {
+ if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2)
+ {
+ if (got_int)
+ break;
+
+! qf_list_entry(qi, qfp, i);
+ }
+
+ qfp = qfp->qf_next;
+--- 3393,3409 ----
+ if (qfLineAttr == 0)
+ qfLineAttr = HL_ATTR(HLF_N);
+
+! if (qfl->qf_nonevalid)
+ all = TRUE;
+! qfp = qfl->qf_start;
+! for (i = 1; !got_int && i <= qfl->qf_count; )
+ {
+ if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2)
+ {
+ if (got_int)
+ break;
+
+! qf_list_entry(qfp, i, i == qfl->qf_index);
+ }
+
+ qfp = qfp->qf_next;
+***************
+*** 3547,3558 ****
+ * associated with the list like context and title are not freed.
+ */
+ static void
+! qf_free_items(qf_info_T *qi, int idx)
+ {
+ qfline_T *qfp;
+ qfline_T *qfpnext;
+ int stop = FALSE;
+- qf_list_T *qfl = &qi->qf_lists[idx];
+
+ while (qfl->qf_count && qfl->qf_start != NULL)
+ {
+--- 3546,3556 ----
+ * associated with the list like context and title are not freed.
+ */
+ static void
+! qf_free_items(qf_list_T *qfl)
+ {
+ qfline_T *qfp;
+ qfline_T *qfpnext;
+ int stop = FALSE;
+
+ while (qfl->qf_count && qfl->qf_start != NULL)
+ {
+***************
+*** 3595,3605 ****
+ * associated context information and the title.
+ */
+ static void
+! qf_free(qf_info_T *qi, int idx)
+ {
+! qf_list_T *qfl = &qi->qf_lists[idx];
+!
+! qf_free_items(qi, idx);
+
+ VIM_CLEAR(qfl->qf_title);
+ free_tv(qfl->qf_ctx);
+--- 3593,3601 ----
+ * associated context information and the title.
+ */
+ static void
+! qf_free(qf_list_T *qfl)
+ {
+! qf_free_items(qfl);
+
+ VIM_CLEAR(qfl->qf_title);
+ free_tv(qfl->qf_ctx);
+***************
+*** 3801,3806 ****
+--- 3797,3812 ----
+ }
+
+ /*
++ * Set "w:quickfix_title" if "qi" has a title.
++ */
++ static void
++ qf_set_title_var(qf_list_T *qfl)
++ {
++ if (qfl->qf_title != NULL)
++ set_internal_string_var((char_u *)"w:quickfix_title", qfl->qf_title);
++ }
++
++ /*
+ * ":copen": open a window that shows the list of errors.
+ * ":lopen": open a window that shows the location list.
+ */
+***************
+*** 3919,3925 ****
+ prevwin = win;
+ }
+
+! qf_set_title_var(qi);
+
+ /*
+ * Fill the buffer with the quickfix list.
+--- 3925,3931 ----
+ prevwin = win;
+ }
+
+! qf_set_title_var(&qi->qf_lists[qi->qf_curlist]);
+
+ /*
+ * Fill the buffer with the quickfix list.
+***************
+*** 4033,4039 ****
+
+ /*
+ * Check whether the given window is displaying the specified quickfix/location
+! * list buffer
+ */
+ static int
+ is_qf_win(win_T *win, qf_info_T *qi)
+--- 4039,4045 ----
+
+ /*
+ * Check whether the given window is displaying the specified quickfix/location
+! * stack.
+ */
+ static int
+ is_qf_win(win_T *win, qf_info_T *qi)
+***************
+*** 4053,4059 ****
+ }
+
+ /*
+! * Find a window displaying the quickfix/location list 'qi'
+ * Only searches in the current tabpage.
+ */
+ static win_T *
+--- 4059,4065 ----
+ }
+
+ /*
+! * Find a window displaying the quickfix/location stack 'qi'
+ * Only searches in the current tabpage.
+ */
+ static win_T *
+***************
+*** 4097,4103 ****
+ {
+ curwin_save = curwin;
+ curwin = win;
+! qf_set_title_var(qi);
+ curwin = curwin_save;
+ }
+ }
+--- 4103,4109 ----
+ {
+ curwin_save = curwin;
+ curwin = win;
+! qf_set_title_var(&qi->qf_lists[qi->qf_curlist]);
+ curwin = curwin_save;
+ }
+ }
+***************
+*** 4143,4159 ****
+ }
+
+ /*
+- * Set "w:quickfix_title" if "qi" has a title.
+- */
+- static void
+- qf_set_title_var(qf_info_T *qi)
+- {
+- if (qi->qf_lists[qi->qf_curlist].qf_title != NULL)
+- set_internal_string_var((char_u *)"w:quickfix_title",
+- qi->qf_lists[qi->qf_curlist].qf_title);
+- }
+-
+- /*
+ * Add an error line to the quickfix buffer.
+ */
+ static int
+--- 4149,4154 ----
+***************
+*** 4679,4687 ****
+ * For :cfdo and :lfdo returns the 'n'th valid file entry.
+ */
+ static int
+! qf_get_nth_valid_entry(qf_info_T *qi, int n, int fdo)
+ {
+- qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist];
+ qfline_T *qfp = qfl->qf_start;
+ int i, eidx;
+ int prev_fnum = 0;
+--- 4674,4681 ----
+ * For :cfdo and :lfdo returns the 'n'th valid file entry.
+ */
+ static int
+! qf_get_nth_valid_entry(qf_list_T *qfl, int n, int fdo)
+ {
+ qfline_T *qfp = qfl->qf_start;
+ int i, eidx;
+ int prev_fnum = 0;
+***************
+*** 4762,4768 ****
+ */
+ if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
+ || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
+! errornr = qf_get_nth_valid_entry(qi,
+ eap->addr_count > 0 ? (int)eap->line1 : 1,
+ eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo);
+
+--- 4756,4762 ----
+ */
+ if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
+ || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
+! errornr = qf_get_nth_valid_entry(&qi->qf_lists[qi->qf_curlist],
+ eap->addr_count > 0 ? (int)eap->line1 : 1,
+ eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo);
+
+***************
+*** 5712,5718 ****
+ TRUE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
+ {
+ (void)get_errorlist(qi, NULL, 0, l);
+! qf_free(qi, 0);
+ }
+ free(qi);
+ }
+--- 5706,5712 ----
+ TRUE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
+ {
+ (void)get_errorlist(qi, NULL, 0, l);
+! qf_free(&qi->qf_lists[0]);
+ }
+ free(qi);
+ }
+***************
+*** 5983,5988 ****
+--- 5977,5983 ----
+ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
+ {
+ qf_info_T *qi = &ql_info;
++ qf_list_T *qfl;
+ int status = OK;
+ int qf_idx;
+ dictitem_T *di;
+***************
+*** 6003,6008 ****
+--- 5998,6005 ----
+ if (qi == NULL || qi->qf_listcount == 0 || qf_idx == INVALID_QFIDX)
+ return qf_getprop_defaults(qi, flags, retdict);
+
++ qfl = &qi->qf_lists[qf_idx];
++
+ if (flags & QF_GETLIST_TITLE)
+ status = qf_getprop_title(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_NR))
+***************
+*** 6014,6028 ****
+ if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
+ status = qf_getprop_ctx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_ID))
+! status = dict_add_number(retdict, "id", qi->qf_lists[qf_idx].qf_id);
+ if ((status == OK) && (flags & QF_GETLIST_IDX))
+ status = qf_getprop_idx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_SIZE))
+! status = dict_add_number(retdict, "size",
+! qi->qf_lists[qf_idx].qf_count);
+ if ((status == OK) && (flags & QF_GETLIST_TICK))
+! status = dict_add_number(retdict, "changedtick",
+! qi->qf_lists[qf_idx].qf_changedtick);
+ if ((status == OK) && (wp != NULL) && (flags & QF_GETLIST_FILEWINID))
+ status = qf_getprop_filewinid(wp, qi, retdict);
+
+--- 6011,6023 ----
+ if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
+ status = qf_getprop_ctx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_ID))
+! status = dict_add_number(retdict, "id", qfl->qf_id);
+ if ((status == OK) && (flags & QF_GETLIST_IDX))
+ status = qf_getprop_idx(qi, qf_idx, retdict);
+ if ((status == OK) && (flags & QF_GETLIST_SIZE))
+! status = dict_add_number(retdict, "size", qfl->qf_count);
+ if ((status == OK) && (flags & QF_GETLIST_TICK))
+! status = dict_add_number(retdict, "changedtick", qfl->qf_changedtick);
+ if ((status == OK) && (wp != NULL) && (flags & QF_GETLIST_FILEWINID))
+ status = qf_getprop_filewinid(wp, qi, retdict);
+
+***************
+*** 6118,6123 ****
+--- 6113,6119 ----
+ char_u *title,
+ int action)
+ {
++ qf_list_T *qfl = &qi->qf_lists[qf_idx];
+ listitem_T *li;
+ dict_T *d;
+ qfline_T *old_last = NULL;
+***************
+*** 6128,6141 ****
+ /* make place for a new list */
+ qf_new_list(qi, title);
+ qf_idx = qi->qf_curlist;
+ }
+ else if (action == 'a' && !qf_list_empty(qi, qf_idx))
+ /* Adding to existing list, use last entry. */
+! old_last = qi->qf_lists[qf_idx].qf_last;
+ else if (action == 'r')
+ {
+! qf_free_items(qi, qf_idx);
+! qf_store_title(qi, qf_idx, title);
+ }
+
+ for (li = list->lv_first; li != NULL; li = li->li_next)
+--- 6124,6138 ----
+ /* make place for a new list */
+ qf_new_list(qi, title);
+ qf_idx = qi->qf_curlist;
++ qfl = &qi->qf_lists[qf_idx];
+ }
+ else if (action == 'a' && !qf_list_empty(qi, qf_idx))
+ /* Adding to existing list, use last entry. */
+! old_last = qfl->qf_last;
+ else if (action == 'r')
+ {
+! qf_free_items(qfl);
+! qf_store_title(qfl, title);
+ }
+
+ for (li = list->lv_first; li != NULL; li = li->li_next)
+***************
+*** 6152,6168 ****
+ break;
+ }
+
+! if (qi->qf_lists[qf_idx].qf_index == 0)
+ /* no valid entry */
+! qi->qf_lists[qf_idx].qf_nonevalid = TRUE;
+ else
+! qi->qf_lists[qf_idx].qf_nonevalid = FALSE;
+ if (action != 'a')
+ {
+! qi->qf_lists[qf_idx].qf_ptr =
+! qi->qf_lists[qf_idx].qf_start;
+ if (!qf_list_empty(qi, qf_idx))
+! qi->qf_lists[qf_idx].qf_index = 1;
+ }
+
+ /* Don't update the cursor in quickfix window when appending entries */
+--- 6149,6164 ----
+ break;
+ }
+
+! if (qfl->qf_index == 0)
+ /* no valid entry */
+! qfl->qf_nonevalid = TRUE;
+ else
+! qfl->qf_nonevalid = FALSE;
+ if (action != 'a')
+ {
+! qfl->qf_ptr = qfl->qf_start;
+ if (!qf_list_empty(qi, qf_idx))
+! qfl->qf_index = 1;
+ }
+
+ /* Don't update the cursor in quickfix window when appending entries */
+***************
+*** 6302,6308 ****
+ return FAIL;
+
+ if (action == 'r')
+! qf_free_items(qi, qf_idx);
+ if (qf_init_ext(qi, qf_idx, NULL, NULL, &di->di_tv, errorformat,
+ FALSE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
+ retval = OK;
+--- 6298,6304 ----
+ return FAIL;
+
+ if (action == 'r')
+! qf_free_items(&qi->qf_lists[qf_idx]);
+ if (qf_init_ext(qi, qf_idx, NULL, NULL, &di->di_tv, errorformat,
+ FALSE, (linenr_T)0, (linenr_T)0, NULL, NULL) > 0)
+ retval = OK;
+***************
+*** 6314,6328 ****
+ * Set quickfix list context.
+ */
+ static int
+! qf_setprop_context(qf_info_T *qi, int qf_idx, dictitem_T *di)
+ {
+ typval_T *ctx;
+
+! free_tv(qi->qf_lists[qf_idx].qf_ctx);
+ ctx = alloc_tv();
+ if (ctx != NULL)
+ copy_tv(&di->di_tv, ctx);
+! qi->qf_lists[qf_idx].qf_ctx = ctx;
+
+ return OK;
+ }
+--- 6310,6324 ----
+ * Set quickfix list context.
+ */
+ static int
+! qf_setprop_context(qf_list_T *qfl, dictitem_T *di)
+ {
+ typval_T *ctx;
+
+! free_tv(qfl->qf_ctx);
+ ctx = alloc_tv();
+ if (ctx != NULL)
+ copy_tv(&di->di_tv, ctx);
+! qfl->qf_ctx = ctx;
+
+ return OK;
+ }
+***************
+*** 6361,6367 ****
+ if ((di = dict_find(what, (char_u *)"lines", -1)) != NULL)
+ retval = qf_setprop_items_from_lines(qi, qf_idx, what, di, action);
+ if ((di = dict_find(what, (char_u *)"context", -1)) != NULL)
+! retval = qf_setprop_context(qi, qf_idx, di);
+
+ if (retval == OK)
+ qf_list_changed(qi, qf_idx);
+--- 6357,6363 ----
+ if ((di = dict_find(what, (char_u *)"lines", -1)) != NULL)
+ retval = qf_setprop_items_from_lines(qi, qf_idx, what, di, action);
+ if ((di = dict_find(what, (char_u *)"context", -1)) != NULL)
+! retval = qf_setprop_context(&qi->qf_lists[qf_idx], di);
+
+ if (retval == OK)
+ qf_list_changed(qi, qf_idx);
+***************
+*** 6370,6376 ****
+ }
+
+ /*
+! * Find the non-location list window with the specified location list.
+ */
+ static win_T *
+ find_win_with_ll(qf_info_T *qi)
+--- 6366,6373 ----
+ }
+
+ /*
+! * Find the non-location list window with the specified location list in the
+! * current tabpage.
+ */
+ static win_T *
+ find_win_with_ll(qf_info_T *qi)
+***************
+*** 6399,6405 ****
+ {
+ /* If the quickfix/location list window is open, then clear it */
+ if (qi->qf_curlist < qi->qf_listcount)
+! qf_free(qi, qi->qf_curlist);
+ qf_update_buffer(qi, NULL);
+ }
+
+--- 6396,6402 ----
+ {
+ /* If the quickfix/location list window is open, then clear it */
+ if (qi->qf_curlist < qi->qf_listcount)
+! qf_free(&qi->qf_lists[qi->qf_curlist]);
+ qf_update_buffer(qi, NULL);
+ }
+
+*** ../vim-8.1.0406/src/version.c 2018-09-18 22:37:26.976072822 +0200
+--- src/version.c 2018-09-18 22:49:11.893423547 +0200
+***************
+*** 796,797 ****
+--- 796,799 ----
+ { /* Add new patch number below this line */
++ /**/
++ 407,
+ /**/
+
+--
+From "know your smileys":
+¯\_(ツ)_/¯ Shrug
+
+ /// 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 ///