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.

Raspunde prin e-mail lui