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 -- [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.

Raspunde prin e-mail lui