1
0
forked from aniani/vim

patch 8.1.0434: copy_loclist() is too long

Problem:    copy_loclist() is too long.
Solution:   Split in multiple functions. (Yegappan Lakshmanan)
This commit is contained in:
Bram Moolenaar
2018-09-25 22:08:14 +02:00
parent 31cbadf74b
commit 09037503ea
4 changed files with 108 additions and 92 deletions

View File

@@ -1,7 +1,7 @@
/* quickfix.c */ /* quickfix.c */
int qf_init(win_T *wp, char_u *efile, char_u *errorformat, int newlist, char_u *qf_title, char_u *enc); 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 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_jump(qf_info_T *qi, int dir, int errornr, int forceit);
void qf_list(exarg_T *eap); void qf_list(exarg_T *eap);
void qf_age(exarg_T *eap); void qf_age(exarg_T *eap);

View File

@@ -2044,46 +2044,56 @@ 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'.
*/ */
void static int
copy_loclist(win_T *from, win_T *to) copy_loclist_entries(qf_list_T *from_qfl, qf_list_T *to_qfl, qf_info_T *to_qi)
{ {
qf_info_T *qi;
int idx;
int i; int i;
qfline_T *from_qfp;
qfline_T *prevp;
/* // copy all the location entries in this list
* When copying from a location list window, copy the referenced for (i = 0, from_qfp = from_qfl->qf_start;
* location list. For other windows, copy the location list for i < from_qfl->qf_count && from_qfp != NULL;
* that window. ++i, from_qfp = from_qfp->qf_next)
*/
if (IS_LL_WINDOW(from))
qi = from->w_llist_ref;
else
qi = from->w_llist;
if (qi == NULL) /* no location list to copy */
return;
/* 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 */
for (idx = 0; idx < qi->qf_listcount; ++idx)
{ {
qf_list_T *from_qfl; if (qf_add_entry(to_qi,
qf_list_T *to_qfl; 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;
to->w_llist->qf_curlist = idx; // 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
}
from_qfl = &qi->qf_lists[idx]; return OK;
to_qfl = &to->w_llist->qf_lists[idx]; }
/* Some of the fields are populated by qf_add_entry() */ /*
* 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_nonevalid = from_qfl->qf_nonevalid;
to_qfl->qf_count = 0; to_qfl->qf_count = 0;
to_qfl->qf_index = 0; to_qfl->qf_index = 0;
@@ -2104,62 +2114,66 @@ copy_loclist(win_T *from, win_T *to)
to_qfl->qf_ctx = NULL; to_qfl->qf_ctx = NULL;
if (from_qfl->qf_count) if (from_qfl->qf_count)
{ if (copy_loclist_entries(from_qfl, to_qfl, to_qi) == FAIL)
qfline_T *from_qfp; return FAIL;
qfline_T *prevp;
/* copy all the location entries in this list */ to_qfl->qf_index = from_qfl->qf_index; // current index in the 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
/* Assign a new ID for the location list */
to_qfl->qf_id = ++last_qf_id; to_qfl->qf_id = ++last_qf_id;
to_qfl->qf_changedtick = 0L; to_qfl->qf_changedtick = 0L;
/* When no valid entries are present in the list, qf_ptr points to // When no valid entries are present in the list, qf_ptr points to
* the first item in the list */ // the first item in the list
if (to_qfl->qf_nonevalid) if (to_qfl->qf_nonevalid)
{ {
to_qfl->qf_ptr = to_qfl->qf_start; to_qfl->qf_ptr = to_qfl->qf_start;
to_qfl->qf_index = 1; 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)
{
qf_info_T *qi;
int idx;
// 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
return;
// 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
for (idx = 0; idx < qi->qf_listcount; ++idx)
{
to->w_llist->qf_curlist = idx;
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
} }
/* /*

View File

@@ -794,6 +794,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
434,
/**/ /**/
433, 433,
/**/ /**/

View File

@@ -1308,7 +1308,7 @@ win_init(win_T *newp, win_T *oldp, int flags UNUSED)
newp->w_llist_ref = NULL; newp->w_llist_ref = NULL;
} }
else else
copy_loclist(oldp, newp); copy_loclist_stack(oldp, newp);
#endif #endif
newp->w_localdir = (oldp->w_localdir == NULL) newp->w_localdir = (oldp->w_localdir == NULL)
? NULL : vim_strsave(oldp->w_localdir); ? NULL : vim_strsave(oldp->w_localdir);