aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-10-14 10:00:14 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-10-23 01:33:16 -0400
commit279ff233799f23dc8a11882fe78df79f9dafdfa3 (patch)
tree6cf7efeaaa26da934fe3c57d6f36654bc6c0eb46 /src
parent8257d49ff6bd825e8f4ffca189cd6c23bd0c66be (diff)
downloadrneovim-279ff233799f23dc8a11882fe78df79f9dafdfa3.tar.gz
rneovim-279ff233799f23dc8a11882fe78df79f9dafdfa3.tar.bz2
rneovim-279ff233799f23dc8a11882fe78df79f9dafdfa3.zip
vim-patch:8.1.0434: copy_loclist() is too long
Problem: copy_loclist() is too long. Solution: Split in multiple functions. (Yegappan Lakshmanan) https://github.com/vim/vim/commit/09037503ea5f957ad23121bc61e15e4bb1765edf
Diffstat (limited to 'src')
-rw-r--r--src/nvim/quickfix.c204
-rw-r--r--src/nvim/window.c5
2 files changed, 114 insertions, 95 deletions
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c
index 3f2688809d..9483670864 100644
--- a/src/nvim/quickfix.c
+++ b/src/nvim/quickfix.c
@@ -1622,116 +1622,134 @@ static qf_info_T *ll_get_or_alloc_list(win_T *wp)
return wp->w_llist;
}
-/*
- * Copy the location list from window "from" to window "to".
- */
-void copy_loclist(win_T *from, win_T *to)
+// Copy location list entries from 'from_qfl' to 'to_qfl'.
+static int copy_loclist_entries(const qf_list_T *from_qfl,
+ qf_list_T *to_qfl,
+ qf_info_T *to_qi)
+ FUNC_ATTR_NONNULL_ALL
{
- qf_info_T *qi;
- int idx;
int i;
+ const qfline_T *from_qfp;
+
+ // copy all the location entries in this list
+ for (i = 0, from_qfp = from_qfl->qf_start;
+ i < from_qfl->qf_count && from_qfp != NULL;
+ i++, from_qfp = from_qfp->qf_next) {
+ if (qf_add_entry(to_qi,
+ to_qi->qf_curlist,
+ NULL,
+ NULL,
+ from_qfp->qf_module,
+ 0,
+ from_qfp->qf_text,
+ from_qfp->qf_lnum,
+ from_qfp->qf_col,
+ from_qfp->qf_viscol,
+ from_qfp->qf_pattern,
+ from_qfp->qf_nr,
+ 0,
+ from_qfp->qf_valid) == FAIL) {
+ return FAIL;
+ }
- /*
- * When copying from a location list window, copy the referenced
- * location list. For other windows, copy the location list for
- * that window.
- */
- if (IS_LL_WINDOW(from))
+ // qf_add_entry() will not set the qf_num field, as the
+ // directory and file names are not supplied. So the qf_fnum
+ // field is copied here.
+ qfline_T *const prevp = to_qfl->qf_last;
+ prevp->qf_fnum = from_qfp->qf_fnum; // file number
+ prevp->qf_type = from_qfp->qf_type; // error type
+ if (from_qfl->qf_ptr == from_qfp) {
+ to_qfl->qf_ptr = prevp; // current location
+ }
+ }
+
+ return OK;
+}
+
+// Copy the specified location list 'from_qfl' to 'to_qfl'.
+static int copy_loclist(const qf_list_T *from_qfl,
+ qf_list_T *to_qfl,
+ qf_info_T *to_qi)
+ FUNC_ATTR_NONNULL_ALL
+{
+ // Some of the fields are populated by qf_add_entry()
+ to_qfl->qf_nonevalid = from_qfl->qf_nonevalid;
+ to_qfl->qf_count = 0;
+ to_qfl->qf_index = 0;
+ to_qfl->qf_start = NULL;
+ to_qfl->qf_last = NULL;
+ to_qfl->qf_ptr = NULL;
+ if (from_qfl->qf_title != NULL) {
+ to_qfl->qf_title = vim_strsave(from_qfl->qf_title);
+ } else {
+ to_qfl->qf_title = NULL;
+ }
+ if (from_qfl->qf_ctx != NULL) {
+ to_qfl->qf_ctx = xcalloc(1, sizeof(*to_qfl->qf_ctx));
+ if (to_qfl->qf_ctx != NULL) {
+ tv_copy(from_qfl->qf_ctx, to_qfl->qf_ctx);
+ }
+ } else {
+ to_qfl->qf_ctx = NULL;
+ }
+ if (from_qfl->qf_count) {
+ if (copy_loclist_entries(from_qfl, to_qfl, to_qi) == FAIL) {
+ return FAIL;
+ }
+ }
+
+ to_qfl->qf_index = from_qfl->qf_index; // current index in the list
+
+ // Assign a new ID for the location list
+ to_qfl->qf_id = ++last_qf_id;
+ to_qfl->qf_changedtick = 0L;
+
+ // When no valid entries are present in the list, qf_ptr points to
+ // the first item in the list
+ if (to_qfl->qf_nonevalid) {
+ to_qfl->qf_ptr = to_qfl->qf_start;
+ to_qfl->qf_index = 1;
+ }
+
+ return OK;
+}
+
+// Copy the location list stack 'from' window to 'to' window.
+void copy_loclist_stack(win_T *from, win_T *to)
+ FUNC_ATTR_NONNULL_ALL
+{
+ qf_info_T *qi;
+
+ // When copying from a location list window, copy the referenced
+ // location list. For other windows, copy the location list for
+ // that window.
+ if (IS_LL_WINDOW(from)) {
qi = from->w_llist_ref;
- else
+ } else {
qi = from->w_llist;
+ }
- if (qi == NULL) /* no location list to copy */
+ if (qi == NULL) { // no location list to copy
return;
+ }
- /* allocate a new location list */
+ // allocate a new location list
to->w_llist = ll_new_list();
to->w_llist->qf_listcount = qi->qf_listcount;
- /* Copy the location lists one at a time */
- for (idx = 0; idx < qi->qf_listcount; idx++) {
- qf_list_T *from_qfl;
- qf_list_T *to_qfl;
-
+ // Copy the location lists one at a time
+ for (int idx = 0; idx < qi->qf_listcount; idx++) {
to->w_llist->qf_curlist = idx;
- from_qfl = &qi->qf_lists[idx];
- to_qfl = &to->w_llist->qf_lists[idx];
-
- /* Some of the fields are populated by qf_add_entry() */
- to_qfl->qf_nonevalid = from_qfl->qf_nonevalid;
- to_qfl->qf_count = 0;
- to_qfl->qf_index = 0;
- to_qfl->qf_start = NULL;
- to_qfl->qf_last = NULL;
- to_qfl->qf_ptr = NULL;
- if (from_qfl->qf_title != NULL)
- to_qfl->qf_title = vim_strsave(from_qfl->qf_title);
- else
- to_qfl->qf_title = NULL;
-
- if (from_qfl->qf_ctx != NULL) {
- to_qfl->qf_ctx = xcalloc(1, sizeof(typval_T));
- tv_copy(from_qfl->qf_ctx, to_qfl->qf_ctx);
- } else {
- to_qfl->qf_ctx = NULL;
- }
-
- if (from_qfl->qf_count) {
- qfline_T *from_qfp;
- qfline_T *prevp;
-
- // copy all the location entries in this list
- for (i = 0, from_qfp = from_qfl->qf_start;
- i < from_qfl->qf_count && from_qfp != NULL;
- i++, from_qfp = from_qfp->qf_next) {
- if (qf_add_entry(to->w_llist,
- to->w_llist->qf_curlist,
- NULL,
- NULL,
- from_qfp->qf_module,
- 0,
- from_qfp->qf_text,
- from_qfp->qf_lnum,
- from_qfp->qf_col,
- from_qfp->qf_viscol,
- from_qfp->qf_pattern,
- from_qfp->qf_nr,
- 0,
- from_qfp->qf_valid) == FAIL) {
- qf_free_all(to);
- return;
- }
- /*
- * qf_add_entry() will not set the qf_num field, as the
- * directory and file names are not supplied. So the qf_fnum
- * field is copied here.
- */
- prevp = to->w_llist->qf_lists[to->w_llist->qf_curlist].qf_last;
- prevp->qf_fnum = from_qfp->qf_fnum; // file number
- prevp->qf_type = from_qfp->qf_type; // error type
- if (from_qfl->qf_ptr == from_qfp) {
- to_qfl->qf_ptr = prevp; // current location
- }
- }
- }
-
- to_qfl->qf_index = from_qfl->qf_index; /* current index in the list */
-
- // Assign a new ID for the location list
- to_qfl->qf_id = ++last_qf_id;
- to_qfl->qf_changedtick = 0L;
-
- /* When no valid entries are present in the list, qf_ptr points to
- * the first item in the list */
- if (to_qfl->qf_nonevalid) {
- to_qfl->qf_ptr = to_qfl->qf_start;
- to_qfl->qf_index = 1;
+ if (copy_loclist(&qi->qf_lists[idx], &to->w_llist->qf_lists[idx],
+ to->w_llist) == FAIL) {
+ qf_free_all(to);
+ return;
}
}
- to->w_llist->qf_curlist = qi->qf_curlist; /* current list */
+ to->w_llist->qf_curlist = qi->qf_curlist; // current list
}
// Get buffer number for file "directory/fname".
diff --git a/src/nvim/window.c b/src/nvim/window.c
index d4a0db9c89..0531ad1938 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -1530,8 +1530,9 @@ static void win_init(win_T *newp, win_T *oldp, int flags)
/* Don't copy the location list. */
newp->w_llist = NULL;
newp->w_llist_ref = NULL;
- } else
- copy_loclist(oldp, newp);
+ } else {
+ copy_loclist_stack(oldp, newp);
+ }
newp->w_localdir = (oldp->w_localdir == NULL)
? NULL : vim_strsave(oldp->w_localdir);