changeset 14844:a74786d0370c v8.1.0434

patch 8.1.0434: copy_loclist() is too long commit https://github.com/vim/vim/commit/09037503ea5f957ad23121bc61e15e4bb1765edf Author: Bram Moolenaar <Bram@vim.org> Date: Tue Sep 25 22:08:14 2018 +0200 patch 8.1.0434: copy_loclist() is too long Problem: copy_loclist() is too long. Solution: Split in multiple functions. (Yegappan Lakshmanan)
author Christian Brabandt <cb@256bit.org>
date Tue, 25 Sep 2018 22:15:06 +0200
parents 049e5d1f1eb0
children 1a576464722d
files src/proto/quickfix.pro src/quickfix.c src/version.c src/window.c
diffstat 4 files changed, 111 insertions(+), 95 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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 */
-	    }
+	    qf_free_all(to);
+	    return;
 	}
-
-	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;
-	}
-    }
-
-    to->w_llist->qf_curlist = qi->qf_curlist;	/* current list */
+    }
+
+    to->w_llist->qf_curlist = qi->qf_curlist;	// current list
 }
 
 /*
--- 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,
--- a/src/window.c
+++ b/src/window.c
@@ -1308,7 +1308,7 @@ win_init(win_T *newp, win_T *oldp, int f
 	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);