summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-09-25 22:08:14 +0200
committerBram Moolenaar <Bram@vim.org>2018-09-25 22:08:14 +0200
commit09037503ea5f957ad23121bc61e15e4bb1765edf (patch)
tree03d1fd78b07d2174d792c235822bdb3fe7c78f91 /src
parent31cbadf74bccc2a5cd8233bc31bbcfe466b00021 (diff)
patch 8.1.0434: copy_loclist() is too longv8.1.0434
Problem: copy_loclist() is too long. Solution: Split in multiple functions. (Yegappan Lakshmanan)
Diffstat (limited to 'src')
-rw-r--r--src/proto/quickfix.pro2
-rw-r--r--src/quickfix.c194
-rw-r--r--src/version.c2
-rw-r--r--src/window.c2
4 files changed, 108 insertions, 92 deletions
diff --git a/src/proto/quickfix.pro b/src/proto/quickfix.pro
index 26a5de0bf6..c9c3a8c962 100644
--- a/src/proto/quickfix.pro
+++ b/src/proto/quickfix.pro
@@ -1,7 +1,7 @@
/* quickfix.c */
int qf_init(win_T *wp, char_u *efile, char_u *errorformat, int newlist, char_u *qf_title, char_u *enc);
void qf_free_all(win_T *wp);
-void copy_loclist(win_T *from, win_T *to);
+void copy_loclist_stack(win_T *from, win_T *to);
void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit);
void qf_list(exarg_T *eap);
void qf_age(exarg_T *eap);
diff --git a/src/quickfix.c b/src/quickfix.c
index 59b3a227c8..1c3343f344 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2044,122 +2044,136 @@ ll_get_or_alloc_list(win_T *wp)
}
/*
- * Copy the location list from window "from" to window "to".
+ * Copy location list entries from 'from_qfl' to 'to_qfl'.
+ */
+ static int
+copy_loclist_entries(qf_list_T *from_qfl, qf_list_T *to_qfl, qf_info_T *to_qi)
+{
+ int i;
+ 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_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;
+
+ // 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_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(qf_list_T *from_qfl, qf_list_T *to_qfl, qf_info_T *to_qi)
+{
+ // 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 = alloc_tv();
+ if (to_qfl->qf_ctx != NULL)
+ copy_tv(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(win_T *from, win_T *to)
+copy_loclist_stack(win_T *from, win_T *to)
{
qf_info_T *qi;
int idx;
- int i;
- /*
- * When copying from a location list window, copy the referenced
- * location list. For other windows, copy the location list for
- * that window.
- */
+ // 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
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
if ((to->w_llist = ll_new_list()) == NULL)
return;
to->w_llist->qf_listcount = qi->qf_listcount;
- /* Copy the location lists one at a time */
+ // 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;
-
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 = alloc_tv();
- if (to_qfl->qf_ctx != NULL)
- copy_tv(from_qfl->qf_ctx, to_qfl->qf_ctx);
- }
- else
- to_qfl->qf_ctx = NULL;
-
- if (from_qfl->qf_count)
+ if (copy_loclist(&qi->qf_lists[idx],
+ &to->w_llist->qf_lists[idx], to->w_llist) == FAIL)
{
- 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;
+ 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
}
/*
diff --git a/src/version.c b/src/version.c
index 6c69b17d69..73eff7d6b5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 434,
+/**/
433,
/**/
432,
diff --git a/src/window.c b/src/window.c
index a481af8b95..b50d835e46 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1308,7 +1308,7 @@ win_init(win_T *newp, win_T *oldp, int flags UNUSED)
newp->w_llist_ref = NULL;
}
else
- copy_loclist(oldp, newp);
+ copy_loclist_stack(oldp, newp);
#endif
newp->w_localdir = (oldp->w_localdir == NULL)
? NULL : vim_strsave(oldp->w_localdir);