Patch 8.1.0014
Problem: qf_init_ext() is too long.
Solution: Split it into multiple functions. (Yegappan Lakshmanan,
closes #2939)
Files: src/quickfix.c
*** ../vim-8.1.0013/src/quickfix.c 2018-05-20 15:41:12.884693893 +0200
--- src/quickfix.c 2018-05-21 16:53:13.288566927 +0200
***************
*** 134,143 ****
static efm_T *fmt_start = NULL; /* cached across qf_parse_line() calls */
- static int qf_init_ext(qf_info_T *qi, int qf_idx, char_u *efile, buf_T
*buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst,
linenr_T lnumlast, char_u *qf_title, char_u *enc);
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 qf_info_T *ll_new_list(void);
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 *);
--- 134,141 ----
***************
*** 178,209 ****
N_("E926: Current location list was changed");
/*
- * Read the errorfile "efile" into memory, line by line, building the error
- * list. Set the error list's title to qf_title.
- * Return -1 for error, number of errors for success.
- */
- int
- qf_init(win_T *wp,
- char_u *efile,
- char_u *errorformat,
- int newlist, /* TRUE: start a new error list */
- char_u *qf_title,
- char_u *enc)
- {
- qf_info_T *qi = &ql_info;
-
- if (wp != NULL)
- {
- qi = ll_get_or_alloc_list(wp);
- if (qi == NULL)
- return FAIL;
- }
-
- return qf_init_ext(qi, qi->qf_curlist, efile, curbuf, NULL, errorformat,
- newlist, (linenr_T)0, (linenr_T)0, qf_title, enc);
- }
-
- /*
* Maximum number of bytes allowed per line while reading a errorfile.
*/
#define LINE_MAXLEN 4096
--- 176,181 ----
***************
*** 1336,1341 ****
--- 1308,1401 ----
}
/*
+ * Allocate the fields used for parsing lines and populating a quickfix list.
+ */
+ static int
+ qf_alloc_fields(qffields_T *pfields)
+ {
+ pfields->namebuf = alloc_id(CMDBUFFSIZE + 1, aid_qf_namebuf);
+ pfields->module = alloc_id(CMDBUFFSIZE + 1, aid_qf_module);
+ pfields->errmsglen = CMDBUFFSIZE + 1;
+ pfields->errmsg = alloc_id(pfields->errmsglen, aid_qf_errmsg);
+ pfields->pattern = alloc_id(CMDBUFFSIZE + 1, aid_qf_pattern);
+ if (pfields->namebuf == NULL || pfields->errmsg == NULL
+ || pfields->pattern == NULL || pfields->module == NULL)
+ return FAIL;
+
+ return OK;
+ }
+
+ /*
+ * Free the fields used for parsing lines and populating a quickfix list.
+ */
+ static void
+ qf_free_fields(qffields_T *pfields)
+ {
+ vim_free(pfields->namebuf);
+ vim_free(pfields->module);
+ vim_free(pfields->errmsg);
+ vim_free(pfields->pattern);
+ }
+
+ /*
+ * Setup the state information used for parsing lines and populating a
+ * quickfix list.
+ */
+ static int
+ qf_setup_state(
+ qfstate_T *pstate,
+ char_u *enc,
+ char_u *efile,
+ typval_T *tv,
+ buf_T *buf,
+ linenr_T lnumfirst,
+ linenr_T lnumlast)
+ {
+ #ifdef FEAT_MBYTE
+ pstate->vc.vc_type = CONV_NONE;
+ if (enc != NULL && *enc != NUL)
+ convert_setup(&pstate->vc, enc, p_enc);
+ #endif
+
+ if (efile != NULL && (pstate->fd = mch_fopen((char *)efile, "r")) == NULL)
+ {
+ EMSG2(_(e_openerrf), efile);
+ return FAIL;
+ }
+
+ if (tv != NULL)
+ {
+ if (tv->v_type == VAR_STRING)
+ pstate->p_str = tv->vval.v_string;
+ else if (tv->v_type == VAR_LIST)
+ pstate->p_li = tv->vval.v_list->lv_first;
+ pstate->tv = tv;
+ }
+ pstate->buf = buf;
+ pstate->buflnum = lnumfirst;
+ pstate->lnumlast = lnumlast;
+
+ return OK;
+ }
+
+ /*
+ * Cleanup the state information used for parsing lines and populating a
+ * quickfix list.
+ */
+ static void
+ qf_cleanup_state(qfstate_T *pstate)
+ {
+ if (pstate->fd != NULL)
+ fclose(pstate->fd);
+
+ vim_free(pstate->growbuf);
+ #ifdef FEAT_MBYTE
+ if (pstate->vc.vc_type != CONV_NONE)
+ convert_setup(&pstate->vc, NULL, NULL);
+ #endif
+ }
+
+ /*
* Read the errorfile "efile" into memory, line by line, building the error
* list.
* Alternative: when "efile" is NULL read errors from buffer "buf".
***************
*** 1375,1400 ****
vim_memset(&state, 0, sizeof(state));
vim_memset(&fields, 0, sizeof(fields));
! #ifdef FEAT_MBYTE
! state.vc.vc_type = CONV_NONE;
! if (enc != NULL && *enc != NUL)
! convert_setup(&state.vc, enc, p_enc);
! #endif
! fields.namebuf = alloc_id(CMDBUFFSIZE + 1, aid_qf_namebuf);
! fields.module = alloc_id(CMDBUFFSIZE + 1, aid_qf_module);
! fields.errmsglen = CMDBUFFSIZE + 1;
! fields.errmsg = alloc_id(fields.errmsglen, aid_qf_errmsg);
! fields.pattern = alloc_id(CMDBUFFSIZE + 1, aid_qf_pattern);
! if (fields.namebuf == NULL || fields.errmsg == NULL
! || fields.pattern == NULL || fields.module == NULL)
goto qf_init_end;
- if (efile != NULL && (state.fd = mch_fopen((char *)efile, "r")) == NULL)
- {
- EMSG2(_(e_openerrf), efile);
- goto qf_init_end;
- }
-
if (newlist || qf_idx == qi->qf_listcount)
{
/* make place for a new list */
--- 1435,1445 ----
vim_memset(&state, 0, sizeof(state));
vim_memset(&fields, 0, sizeof(fields));
! if ((qf_alloc_fields(&fields) == FAIL) ||
! (qf_setup_state(&state, enc, efile, tv, buf,
! lnumfirst, lnumlast) == FAIL))
goto qf_init_end;
if (newlist || qf_idx == qi->qf_listcount)
{
/* make place for a new list */
***************
*** 1442,1459 ****
*/
got_int = FALSE;
- if (tv != NULL)
- {
- if (tv->v_type == VAR_STRING)
- state.p_str = tv->vval.v_string;
- else if (tv->v_type == VAR_LIST)
- state.p_li = tv->vval.v_list->lv_first;
- state.tv = tv;
- }
- state.buf = buf;
- state.buflnum = lnumfirst;
- state.lnumlast = lnumlast;
-
/*
* Read the lines in the error file one by one.
* Try to recognize one of the error formats in each line.
--- 1487,1492 ----
***************
*** 1526,1550 ****
--qi->qf_curlist;
}
qf_init_end:
- if (state.fd != NULL)
- fclose(state.fd);
- vim_free(fields.namebuf);
- vim_free(fields.module);
- vim_free(fields.errmsg);
- vim_free(fields.pattern);
- vim_free(state.growbuf);
-
if (qf_idx == qi->qf_curlist)
qf_update_buffer(qi, old_last);
! #ifdef FEAT_MBYTE
! if (state.vc.vc_type != CONV_NONE)
! convert_setup(&state.vc, NULL, NULL);
! #endif
return retval;
}
/*
* Set the title of the specified quickfix list. Frees the previous title.
* Prepends ':' to the title.
*/
--- 1559,1599 ----
--qi->qf_curlist;
}
qf_init_end:
if (qf_idx == qi->qf_curlist)
qf_update_buffer(qi, old_last);
! qf_cleanup_state(&state);
! qf_free_fields(&fields);
return retval;
}
/*
+ * Read the errorfile "efile" into memory, line by line, building the error
+ * list. Set the error list's title to qf_title.
+ * Return -1 for error, number of errors for success.
+ */
+ int
+ qf_init(win_T *wp,
+ char_u *efile,
+ char_u *errorformat,
+ int newlist, /* TRUE: start a new error list */
+ char_u *qf_title,
+ char_u *enc)
+ {
+ qf_info_T *qi = &ql_info;
+
+ if (wp != NULL)
+ {
+ qi = ll_get_or_alloc_list(wp);
+ if (qi == NULL)
+ return FAIL;
+ }
+
+ return qf_init_ext(qi, qi->qf_curlist, efile, curbuf, NULL, errorformat,
+ newlist, (linenr_T)0, (linenr_T)0, qf_title, enc);
+ }
+
+ /*
* Set the title of the specified quickfix list. Frees the previous title.
* Prepends ':' to the title.
*/
***************
*** 3835,3840 ****
--- 3884,3963 ----
}
/*
+ * Add an error line to the quickfix buffer.
+ */
+ static int
+ qf_buf_add_line(buf_T *buf, linenr_T lnum, qfline_T *qfp, char_u *dirname)
+ {
+ int len;
+ buf_T *errbuf;
+
+ if (qfp->qf_module != NULL)
+ {
+ STRCPY(IObuff, qfp->qf_module);
+ len = (int)STRLEN(IObuff);
+ }
+ else if (qfp->qf_fnum != 0
+ && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
+ && errbuf->b_fname != NULL)
+ {
+ if (qfp->qf_type == 1) /* :helpgrep */
+ STRCPY(IObuff, gettail(errbuf->b_fname));
+ else
+ {
+ /* shorten the file name if not done already */
+ if (errbuf->b_sfname == NULL
+ || mch_isFullName(errbuf->b_sfname))
+ {
+ if (*dirname == NUL)
+ mch_dirname(dirname, MAXPATHL);
+ shorten_buf_fname(errbuf, dirname, FALSE);
+ }
+ STRCPY(IObuff, errbuf->b_fname);
+ }
+ len = (int)STRLEN(IObuff);
+ }
+ else
+ len = 0;
+ IObuff[len++] = '|';
+
+ if (qfp->qf_lnum > 0)
+ {
+ sprintf((char *)IObuff + len, "%ld", qfp->qf_lnum);
+ len += (int)STRLEN(IObuff + len);
+
+ if (qfp->qf_col > 0)
+ {
+ sprintf((char *)IObuff + len, " col %d", qfp->qf_col);
+ len += (int)STRLEN(IObuff + len);
+ }
+
+ sprintf((char *)IObuff + len, "%s",
+ (char *)qf_types(qfp->qf_type, qfp->qf_nr));
+ len += (int)STRLEN(IObuff + len);
+ }
+ else if (qfp->qf_pattern != NULL)
+ {
+ qf_fmt_text(qfp->qf_pattern, IObuff + len, IOSIZE - len);
+ len += (int)STRLEN(IObuff + len);
+ }
+ IObuff[len++] = '|';
+ IObuff[len++] = ' ';
+
+ /* Remove newlines and leading whitespace from the text.
+ * For an unrecognized line keep the indent, the compiler may
+ * mark a word with ^^^^. */
+ qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
+ IObuff + len, IOSIZE - len);
+
+ if (ml_append_buf(buf, lnum, IObuff,
+ (colnr_T)STRLEN(IObuff) + 1, FALSE) == FAIL)
+ return FAIL;
+
+ return OK;
+ }
+
+ /*
* Fill current buffer with quickfix errors, replacing any previous contents.
* curbuf must be the quickfix buffer!
* If "old_last" is not NULL append the items after this one.
***************
*** 3846,3853 ****
{
linenr_T lnum;
qfline_T *qfp;
- buf_T *errbuf;
- int len;
int old_KeyTyped = KeyTyped;
if (old_last == NULL)
--- 3969,3974 ----
***************
*** 3883,3949 ****
}
while (lnum < qi->qf_lists[qi->qf_curlist].qf_count)
{
! if (qfp->qf_module != NULL)
! {
! STRCPY(IObuff, qfp->qf_module);
! len = (int)STRLEN(IObuff);
! }
! else if (qfp->qf_fnum != 0
! && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
! && errbuf->b_fname != NULL)
! {
! if (qfp->qf_type == 1) /* :helpgrep */
! STRCPY(IObuff, gettail(errbuf->b_fname));
! else
! {
! /* shorten the file name if not done already */
! if (errbuf->b_sfname == NULL
! || mch_isFullName(errbuf->b_sfname))
! {
! if (*dirname == NUL)
! mch_dirname(dirname, MAXPATHL);
! shorten_buf_fname(errbuf, dirname, FALSE);
! }
! STRCPY(IObuff, errbuf->b_fname);
! }
! len = (int)STRLEN(IObuff);
! }
! else
! len = 0;
! IObuff[len++] = '|';
!
! if (qfp->qf_lnum > 0)
! {
! sprintf((char *)IObuff + len, "%ld", qfp->qf_lnum);
! len += (int)STRLEN(IObuff + len);
!
! if (qfp->qf_col > 0)
! {
! sprintf((char *)IObuff + len, " col %d", qfp->qf_col);
! len += (int)STRLEN(IObuff + len);
! }
!
! sprintf((char *)IObuff + len, "%s",
! (char *)qf_types(qfp->qf_type, qfp->qf_nr));
! len += (int)STRLEN(IObuff + len);
! }
! else if (qfp->qf_pattern != NULL)
! {
! qf_fmt_text(qfp->qf_pattern, IObuff + len, IOSIZE - len);
! len += (int)STRLEN(IObuff + len);
! }
! IObuff[len++] = '|';
! IObuff[len++] = ' ';
!
! /* Remove newlines and leading whitespace from the text.
! * For an unrecognized line keep the indent, the compiler may
! * mark a word with ^^^^. */
! qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
! IObuff + len, IOSIZE - len);
!
! if (ml_append_buf(buf, lnum, IObuff,
! (colnr_T)STRLEN(IObuff) + 1, FALSE) == FAIL)
break;
++lnum;
qfp = qfp->qf_next;
if (qfp == NULL)
--- 4004,4012 ----
}
while (lnum < qi->qf_lists[qi->qf_curlist].qf_count)
{
! if (qf_buf_add_line(buf, lnum, qfp, dirname) == FAIL)
break;
+
++lnum;
qfp = qfp->qf_next;
if (qfp == NULL)
*** ../vim-8.1.0013/src/version.c 2018-05-21 14:55:22.555983588 +0200
--- src/version.c 2018-05-21 16:55:00.327845962 +0200
***************
*** 763,764 ****
--- 763,766 ----
{ /* Add new patch number below this line */
+ /**/
+ 14,
/**/
--
ARTHUR: ... and I am your king ....
OLD WOMAN: Ooooh! I didn't know we had a king. I thought we were an
autonomous collective ...
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.