diff options
Diffstat (limited to 'data/vim/patches/8.1.1062')
-rw-r--r-- | data/vim/patches/8.1.1062 | 620 |
1 files changed, 620 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1062 b/data/vim/patches/8.1.1062 new file mode 100644 index 000000000..f3d34777e --- /dev/null +++ b/data/vim/patches/8.1.1062 @@ -0,0 +1,620 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1062 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1062 +Problem: Quickfix code is repeated. +Solution: Define FOR_ALL_QFL_ITEMS(). Move some code to separate functions. + (Yegappan Lakshmanan, closes #4166) +Files: src/quickfix.c + + +*** ../vim-8.1.1061/src/quickfix.c 2019-03-22 14:16:02.877160892 +0100 +--- src/quickfix.c 2019-03-28 20:29:41.737770187 +0100 +*************** +*** 195,200 **** +--- 195,205 ---- + */ + #define GET_LOC_LIST(wp) (IS_LL_WINDOW(wp) ? wp->w_llist_ref : wp->w_llist) + ++ #define FOR_ALL_QFL_ITEMS(qfl, qfp, i) \ ++ for (i = 0, qfp = qfl->qf_start; \ ++ !got_int && i < qfl->qf_count && qfp != NULL; \ ++ ++i, qfp = qfp->qf_next) ++ + /* + * Looking up a buffer can be slow if there are many. Remember the last one + * to make this a lot faster if there are multiple matches in the same file. +*************** +*** 2148,2156 **** + 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_qfl, + NULL, +--- 2153,2159 ---- + qfline_T *prevp; + + // copy all the location entries in this list +! FOR_ALL_QFL_ITEMS(from_qfl, from_qfp, i) + { + if (qf_add_entry(to_qfl, + NULL, +*************** +*** 2544,2552 **** + int i; + + // Search for the entry in the current list +! for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count; +! ++i, qfp = qfp->qf_next) +! if (qfp == NULL || qfp == qf_ptr) + break; + + if (i == qfl->qf_count) // Entry is not found +--- 2547,2554 ---- + int i; + + // Search for the entry in the current list +! FOR_ALL_QFL_ITEMS(qfl, qfp, i) +! if (qfp == qf_ptr) + break; + + if (i == qfl->qf_count) // Entry is not found +*************** +*** 3792,3800 **** + qf_list_T *qfl = qf_get_list(qi, idx); + + if (!qf_list_empty(qfl)) +! for (i = 0, qfp = qfl->qf_start; +! i < qfl->qf_count && qfp != NULL; +! ++i, qfp = qfp->qf_next) + if (qfp->qf_fnum == curbuf->b_fnum) + { + found_one = TRUE; +--- 3794,3800 ---- + qf_list_T *qfl = qf_get_list(qi, idx); + + if (!qf_list_empty(qfl)) +! FOR_ALL_QFL_ITEMS(qfl, qfp, i) + if (qfp->qf_fnum == curbuf->b_fnum) + { + found_one = TRUE; +*************** +*** 4819,4826 **** + } + + qfl = qf_get_curlist(qi); +! for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count && qfp != NULL; +! ++i, qfp = qfp->qf_next) + { + if (qfp->qf_valid) + { +--- 4819,4825 ---- + } + + qfl = qf_get_curlist(qi); +! FOR_ALL_QFL_ITEMS(qfl, qfp, i) + { + if (qfp->qf_valid) + { +*************** +*** 5056,5061 **** +--- 5055,5078 ---- + } + + /* ++ * Return the autocmd name for the :cfile Ex commands ++ */ ++ static char_u * ++ cfile_get_auname(cmdidx_T cmdidx) ++ { ++ switch (cmdidx) ++ { ++ case CMD_cfile: return (char_u *)"cfile"; ++ case CMD_cgetfile: return (char_u *)"cgetfile"; ++ case CMD_caddfile: return (char_u *)"caddfile"; ++ case CMD_lfile: return (char_u *)"lfile"; ++ case CMD_lgetfile: return (char_u *)"lgetfile"; ++ case CMD_laddfile: return (char_u *)"laddfile"; ++ default: return NULL; ++ } ++ } ++ ++ /* + * ":cfile"/":cgetfile"/":caddfile" commands. + * ":lfile"/":lgetfile"/":laddfile" commands. + */ +*************** +*** 5069,5086 **** + int_u save_qfid = 0; // init for gcc + int res; + +! switch (eap->cmdidx) +! { +! case CMD_cfile: au_name = (char_u *)"cfile"; break; +! case CMD_cgetfile: au_name = (char_u *)"cgetfile"; break; +! case CMD_caddfile: au_name = (char_u *)"caddfile"; break; +! case CMD_lfile: au_name = (char_u *)"lfile"; break; +! case CMD_lgetfile: au_name = (char_u *)"lgetfile"; break; +! case CMD_laddfile: au_name = (char_u *)"laddfile"; break; +! default: break; +! } + if (au_name != NULL) + apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, FALSE, curbuf); + enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc; + #ifdef FEAT_BROWSE + if (cmdmod.browse) +--- 5086,5095 ---- + int_u save_qfid = 0; // init for gcc + int res; + +! au_name = cfile_get_auname(eap->cmdidx); + if (au_name != NULL) + apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, FALSE, curbuf); ++ + enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc; + #ifdef FEAT_BROWSE + if (cmdmod.browse) +*************** +*** 5832,5837 **** +--- 5841,5884 ---- + + #if defined(FEAT_EVAL) || defined(PROTO) + /* ++ * Copy the specified quickfix entry items into a new dict and appened the dict ++ * to 'list'. Returns OK on success. ++ */ ++ static int ++ get_qfline_items(qfline_T *qfp, list_T *list) ++ { ++ int bufnum; ++ dict_T *dict; ++ char_u buf[2]; ++ ++ // Handle entries with a non-existing buffer number. ++ bufnum = qfp->qf_fnum; ++ if (bufnum != 0 && (buflist_findnr(bufnum) == NULL)) ++ bufnum = 0; ++ ++ if ((dict = dict_alloc()) == NULL) ++ return FAIL; ++ if (list_append_dict(list, dict) == FAIL) ++ return FAIL; ++ ++ buf[0] = qfp->qf_type; ++ buf[1] = NUL; ++ if (dict_add_number(dict, "bufnr", (long)bufnum) == FAIL ++ || dict_add_number(dict, "lnum", (long)qfp->qf_lnum) == FAIL ++ || dict_add_number(dict, "col", (long)qfp->qf_col) == FAIL ++ || dict_add_number(dict, "vcol", (long)qfp->qf_viscol) == FAIL ++ || dict_add_number(dict, "nr", (long)qfp->qf_nr) == FAIL ++ || dict_add_string(dict, "module", qfp->qf_module) == FAIL ++ || dict_add_string(dict, "pattern", qfp->qf_pattern) == FAIL ++ || dict_add_string(dict, "text", qfp->qf_text) == FAIL ++ || dict_add_string(dict, "type", buf) == FAIL ++ || dict_add_number(dict, "valid", (long)qfp->qf_valid) == FAIL) ++ return FAIL; ++ ++ return OK; ++ } ++ ++ /* + * Add each quickfix error to list "list" as a dictionary. + * If qf_idx is -1, use the current list. Otherwise, use the specified list. + */ +*************** +*** 5840,5850 **** + { + qf_info_T *qi = qi_arg; + qf_list_T *qfl; +- dict_T *dict; +- char_u buf[2]; + qfline_T *qfp; + int i; +- int bufnum; + + if (qi == NULL) + { +--- 5887,5894 ---- +*************** +*** 5867,5903 **** + if (qf_list_empty(qfl)) + return FAIL; + +! qfp = qfl->qf_start; +! for (i = 1; !got_int && i <= qfl->qf_count; ++i) + { +! // Handle entries with a non-existing buffer number. +! bufnum = qfp->qf_fnum; +! if (bufnum != 0 && (buflist_findnr(bufnum) == NULL)) +! bufnum = 0; +! +! if ((dict = dict_alloc()) == NULL) + return FAIL; +- if (list_append_dict(list, dict) == FAIL) +- return FAIL; +- +- buf[0] = qfp->qf_type; +- buf[1] = NUL; +- if ( dict_add_number(dict, "bufnr", (long)bufnum) == FAIL +- || dict_add_number(dict, "lnum", (long)qfp->qf_lnum) == FAIL +- || dict_add_number(dict, "col", (long)qfp->qf_col) == FAIL +- || dict_add_number(dict, "vcol", (long)qfp->qf_viscol) == FAIL +- || dict_add_number(dict, "nr", (long)qfp->qf_nr) == FAIL +- || dict_add_string(dict, "module", qfp->qf_module) == FAIL +- || dict_add_string(dict, "pattern", qfp->qf_pattern) == FAIL +- || dict_add_string(dict, "text", qfp->qf_text) == FAIL +- || dict_add_string(dict, "type", buf) == FAIL +- || dict_add_number(dict, "valid", (long)qfp->qf_valid) == FAIL) +- return FAIL; +- +- qfp = qfp->qf_next; +- if (qfp == NULL) +- break; + } + return OK; + } + +--- 5911,5922 ---- + if (qf_list_empty(qfl)) + return FAIL; + +! FOR_ALL_QFL_ITEMS(qfl, qfp, i) + { +! if (get_qfline_items(qfp, list) == FAIL) + return FAIL; + } ++ + return OK; + } + +*************** +*** 6842,6847 **** +--- 6861,6934 ---- + #endif + + /* ++ * Return the autocmd name for the :cbuffer Ex commands ++ */ ++ static char_u * ++ cbuffer_get_auname(cmdidx_T cmdidx) ++ { ++ switch (cmdidx) ++ { ++ case CMD_cbuffer: return (char_u *)"cbuffer"; ++ case CMD_cgetbuffer: return (char_u *)"cgetbuffer"; ++ case CMD_caddbuffer: return (char_u *)"caddbuffer"; ++ case CMD_lbuffer: return (char_u *)"lbuffer"; ++ case CMD_lgetbuffer: return (char_u *)"lgetbuffer"; ++ case CMD_laddbuffer: return (char_u *)"laddbuffer"; ++ default: return NULL; ++ } ++ } ++ ++ /* ++ * Process and validate the arguments passed to the :cbuffer, :caddbuffer, ++ * :cgetbuffer, :lbuffer, :laddbuffer, :lgetbuffer Ex commands. ++ */ ++ static int ++ cbuffer_process_args( ++ exarg_T *eap, ++ buf_T **bufp, ++ linenr_T *line1, ++ linenr_T *line2) ++ { ++ buf_T *buf = NULL; ++ ++ if (*eap->arg == NUL) ++ buf = curbuf; ++ else if (*skipwhite(skipdigits(eap->arg)) == NUL) ++ buf = buflist_findnr(atoi((char *)eap->arg)); ++ ++ if (buf == NULL) ++ { ++ emsg(_(e_invarg)); ++ return FAIL; ++ } ++ ++ if (buf->b_ml.ml_mfp == NULL) ++ { ++ emsg(_("E681: Buffer is not loaded")); ++ return FAIL; ++ } ++ ++ if (eap->addr_count == 0) ++ { ++ eap->line1 = 1; ++ eap->line2 = buf->b_ml.ml_line_count; ++ } ++ ++ if (eap->line1 < 1 || eap->line1 > buf->b_ml.ml_line_count ++ || eap->line2 < 1 || eap->line2 > buf->b_ml.ml_line_count) ++ { ++ emsg(_(e_invrange)); ++ return FAIL; ++ } ++ ++ *line1 = eap->line1; ++ *line2 = eap->line2; ++ *bufp = buf; ++ ++ return OK; ++ } ++ ++ /* + * ":[range]cbuffer [bufnr]" command. + * ":[range]caddbuffer [bufnr]" command. + * ":[range]cgetbuffer [bufnr]" command. +*************** +*** 6858,6876 **** + int res; + int_u save_qfid; + win_T *wp = NULL; + +! switch (eap->cmdidx) +! { +! case CMD_cbuffer: au_name = (char_u *)"cbuffer"; break; +! case CMD_cgetbuffer: au_name = (char_u *)"cgetbuffer"; break; +! case CMD_caddbuffer: au_name = (char_u *)"caddbuffer"; break; +! case CMD_lbuffer: au_name = (char_u *)"lbuffer"; break; +! case CMD_lgetbuffer: au_name = (char_u *)"lgetbuffer"; break; +! case CMD_laddbuffer: au_name = (char_u *)"laddbuffer"; break; +! default: break; +! } + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, +! curbuf->b_fname, TRUE, curbuf)) + { + #ifdef FEAT_EVAL + if (aborting()) +--- 6945,6957 ---- + int res; + int_u save_qfid; + win_T *wp = NULL; ++ char_u *qf_title; ++ linenr_T line1; ++ linenr_T line2; + +! au_name = cbuffer_get_auname(eap->cmdidx); + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, +! curbuf->b_fname, TRUE, curbuf)) + { + #ifdef FEAT_EVAL + if (aborting()) +*************** +*** 6887,6965 **** + wp = curwin; + } + +! if (*eap->arg == NUL) +! buf = curbuf; +! else if (*skipwhite(skipdigits(eap->arg)) == NUL) +! buf = buflist_findnr(atoi((char *)eap->arg)); +! if (buf == NULL) +! emsg(_(e_invarg)); +! else if (buf->b_ml.ml_mfp == NULL) +! emsg(_("E681: Buffer is not loaded")); +! else +! { +! if (eap->addr_count == 0) +! { +! eap->line1 = 1; +! eap->line2 = buf->b_ml.ml_line_count; +! } +! if (eap->line1 < 1 || eap->line1 > buf->b_ml.ml_line_count +! || eap->line2 < 1 || eap->line2 > buf->b_ml.ml_line_count) +! emsg(_(e_invrange)); +! else +! { +! char_u *qf_title = qf_cmdtitle(*eap->cmdlinep); + +! if (buf->b_sfname) +! { +! vim_snprintf((char *)IObuff, IOSIZE, "%s (%s)", +! (char *)qf_title, (char *)buf->b_sfname); +! qf_title = IObuff; +! } + +! incr_quickfix_busy(); + +! res = qf_init_ext(qi, qi->qf_curlist, NULL, buf, NULL, p_efm, +! (eap->cmdidx != CMD_caddbuffer +! && eap->cmdidx != CMD_laddbuffer), +! eap->line1, eap->line2, +! qf_title, NULL); +! if (qf_stack_empty(qi)) +! { +! decr_quickfix_busy(); +! return; +! } +! if (res >= 0) +! qf_list_changed(qf_get_curlist(qi)); + +! // Remember the current quickfix list identifier, so that we can +! // check for autocommands changing the current quickfix list. +! save_qfid = qf_get_curlist(qi)->qf_id; +! if (au_name != NULL) +! { +! buf_T *curbuf_old = curbuf; + +! apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, +! curbuf->b_fname, TRUE, curbuf); +! if (curbuf != curbuf_old) +! // Autocommands changed buffer, don't jump now, "qi" may +! // be invalid. +! res = 0; +! } +! // Jump to the first error for a new list and if autocmds didn't +! // free the list. +! if (res > 0 && (eap->cmdidx == CMD_cbuffer || +! eap->cmdidx == CMD_lbuffer) +! && qflist_valid(wp, save_qfid)) +! // display the first error +! qf_jump_first(qi, save_qfid, eap->forceit); + +! decr_quickfix_busy(); +! } + } + } + + #if defined(FEAT_EVAL) || defined(PROTO) + /* + * ":cexpr {expr}", ":cgetexpr {expr}", ":caddexpr {expr}" command. + * ":lexpr {expr}", ":lgetexpr {expr}", ":laddexpr {expr}" command. + */ +--- 6968,7045 ---- + wp = curwin; + } + +! if (cbuffer_process_args(eap, &buf, &line1, &line2) == FAIL) +! return; + +! qf_title = qf_cmdtitle(*eap->cmdlinep); + +! if (buf->b_sfname) +! { +! vim_snprintf((char *)IObuff, IOSIZE, "%s (%s)", +! (char *)qf_title, (char *)buf->b_sfname); +! qf_title = IObuff; +! } + +! incr_quickfix_busy(); + +! res = qf_init_ext(qi, qi->qf_curlist, NULL, buf, NULL, p_efm, +! (eap->cmdidx != CMD_caddbuffer +! && eap->cmdidx != CMD_laddbuffer), +! line1, line2, +! qf_title, NULL); +! if (qf_stack_empty(qi)) +! { +! decr_quickfix_busy(); +! return; +! } +! if (res >= 0) +! qf_list_changed(qf_get_curlist(qi)); + +! // Remember the current quickfix list identifier, so that we can +! // check for autocommands changing the current quickfix list. +! save_qfid = qf_get_curlist(qi)->qf_id; +! if (au_name != NULL) +! { +! buf_T *curbuf_old = curbuf; + +! apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, curbuf->b_fname, +! TRUE, curbuf); +! if (curbuf != curbuf_old) +! // Autocommands changed buffer, don't jump now, "qi" may +! // be invalid. +! res = 0; + } ++ // Jump to the first error for a new list and if autocmds didn't ++ // free the list. ++ if (res > 0 && (eap->cmdidx == CMD_cbuffer || ++ eap->cmdidx == CMD_lbuffer) ++ && qflist_valid(wp, save_qfid)) ++ // display the first error ++ qf_jump_first(qi, save_qfid, eap->forceit); ++ ++ decr_quickfix_busy(); + } + + #if defined(FEAT_EVAL) || defined(PROTO) + /* ++ * Return the autocmd name for the :cexpr Ex commands. ++ */ ++ static char_u * ++ cexpr_get_auname(cmdidx_T cmdidx) ++ { ++ switch (cmdidx) ++ { ++ case CMD_cexpr: return (char_u *)"cexpr"; ++ case CMD_cgetexpr: return (char_u *)"cgetexpr"; ++ case CMD_caddexpr: return (char_u *)"caddexpr"; ++ case CMD_lexpr: return (char_u *)"lexpr"; ++ case CMD_lgetexpr: return (char_u *)"lgetexpr"; ++ case CMD_laddexpr: return (char_u *)"laddexpr"; ++ default: return NULL; ++ } ++ } ++ ++ /* + * ":cexpr {expr}", ":cgetexpr {expr}", ":caddexpr {expr}" command. + * ":lexpr {expr}", ":lgetexpr {expr}", ":laddexpr {expr}" command. + */ +*************** +*** 6973,6988 **** + int_u save_qfid; + win_T *wp = NULL; + +! switch (eap->cmdidx) +! { +! case CMD_cexpr: au_name = (char_u *)"cexpr"; break; +! case CMD_cgetexpr: au_name = (char_u *)"cgetexpr"; break; +! case CMD_caddexpr: au_name = (char_u *)"caddexpr"; break; +! case CMD_lexpr: au_name = (char_u *)"lexpr"; break; +! case CMD_lgetexpr: au_name = (char_u *)"lgetexpr"; break; +! case CMD_laddexpr: au_name = (char_u *)"laddexpr"; break; +! default: break; +! } + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, + curbuf->b_fname, TRUE, curbuf)) + { +--- 7053,7059 ---- + int_u save_qfid; + win_T *wp = NULL; + +! au_name = cexpr_get_auname(eap->cmdidx); + if (au_name != NULL && apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, + curbuf->b_fname, TRUE, curbuf)) + { +*************** +*** 7257,7266 **** + #endif + } + +- // Make 'cpoptions' empty, the 'l' flag should not be used here. +- save_cpo = p_cpo; +- p_cpo = empty_option; +- + if (is_loclist_cmd(eap->cmdidx)) + { + qi = hgr_get_ll(&new_qi); +--- 7328,7333 ---- +*************** +*** 7268,7273 **** +--- 7335,7344 ---- + return; + } + ++ // Make 'cpoptions' empty, the 'l' flag should not be used here. ++ save_cpo = p_cpo; ++ p_cpo = empty_option; ++ + incr_quickfix_busy(); + + #ifdef FEAT_MULTI_LANG +*** ../vim-8.1.1061/src/version.c 2019-03-27 22:53:49.919226659 +0100 +--- src/version.c 2019-03-28 20:30:09.001593202 +0100 +*************** +*** 777,778 **** +--- 777,780 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1062, + /**/ + +-- +The coffee just wasn't strong enough to defend itself -- Tom Waits + + /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 /// |