Patch 8.1.0010
Problem:    efm_to_regpat() is too long.
Solution:   Split off three functions. (Yegappan Lakshmanan, closes #2924)
Files:      src/quickfix.c


*** ../vim-8.1.0009/src/quickfix.c      2018-05-15 21:53:11.000000000 +0200
--- src/quickfix.c      2018-05-20 15:40:22.857179812 +0200
***************
*** 228,246 ****
      };
  
  /*
   * Converts a 'errorformat' string to regular expression pattern
   */
      static int
  efm_to_regpat(
        char_u  *efm,
!       int             len,
        efm_T   *fmt_ptr,
        char_u  *regpat,
        char_u  *errmsg)
  {
      char_u    *ptr;
      char_u    *efmp;
-     char_u    *srcptr;
      int               round;
      int               idx = 0;
  
--- 228,399 ----
      };
  
  /*
+  * Convert an errorformat pattern to a regular expression pattern.
+  * See fmt_pat definition above for the list of supported patterns.
+  */
+     static char_u *
+ fmtpat_to_regpat(
+       char_u  *efmp,
+       efm_T   *fmt_ptr,
+       int     idx,
+       int     round,
+       char_u  *ptr,
+       char_u  *errmsg)
+ {
+     char_u    *srcptr;
+ 
+     if (fmt_ptr->addr[idx])
+     {
+       /* Each errorformat pattern can occur only once */
+       sprintf((char *)errmsg,
+               _("E372: Too many %%%c in format string"), *efmp);
+       EMSG(errmsg);
+       return NULL;
+     }
+     if ((idx && idx < 6
+               && vim_strchr((char_u *)"DXOPQ", fmt_ptr->prefix) != NULL)
+           || (idx == 6
+               && vim_strchr((char_u *)"OPQ", fmt_ptr->prefix) == NULL))
+     {
+       sprintf((char *)errmsg,
+               _("E373: Unexpected %%%c in format string"), *efmp);
+       EMSG(errmsg);
+       return NULL;
+     }
+     fmt_ptr->addr[idx] = (char_u)++round;
+     *ptr++ = '\\';
+     *ptr++ = '(';
+ #ifdef BACKSLASH_IN_FILENAME
+     if (*efmp == 'f')
+     {
+       /* Also match "c:" in the file name, even when
+        * checking for a colon next: "%f:".
+        * "\%(\a:\)\=" */
+       STRCPY(ptr, "\\%(\\a:\\)\\=");
+       ptr += 10;
+     }
+ #endif
+     if (*efmp == 'f' && efmp[1] != NUL)
+     {
+       if (efmp[1] != '\\' && efmp[1] != '%')
+       {
+           /* A file name may contain spaces, but this isn't
+            * in "\f".  For "%f:%l:%m" there may be a ":" in
+            * the file name.  Use ".\{-1,}x" instead (x is
+            * the next character), the requirement that :999:
+            * follows should work. */
+           STRCPY(ptr, ".\\{-1,}");
+           ptr += 7;
+       }
+       else
+       {
+           /* File name followed by '\\' or '%': include as
+            * many file name chars as possible. */
+           STRCPY(ptr, "\\f\\+");
+           ptr += 4;
+       }
+     }
+     else
+     {
+       srcptr = (char_u *)fmt_pat[idx].pattern;
+       while ((*ptr = *srcptr++) != NUL)
+           ++ptr;
+     }
+     *ptr++ = '\\';
+     *ptr++ = ')';
+ 
+     return ptr;
+ }
+ 
+ /*
+  * Convert a scanf like format in 'errorformat' to a regular expression.
+  */
+     static char_u *
+ scanf_fmt_to_regpat(
+       char_u  *efm,
+       int     len,
+       char_u  **pefmp,
+       char_u  *ptr,
+       char_u  *errmsg)
+ {
+     char_u    *efmp = *pefmp;
+ 
+     if (*++efmp == '[' || *efmp == '\\')
+     {
+       if ((*ptr++ = *efmp) == '[')    /* %*[^a-z0-9] etc. */
+       {
+           if (efmp[1] == '^')
+               *ptr++ = *++efmp;
+           if (efmp < efm + len)
+           {
+               *ptr++ = *++efmp;           /* could be ']' */
+               while (efmp < efm + len
+                       && (*ptr++ = *++efmp) != ']')
+                   /* skip */;
+               if (efmp == efm + len)
+               {
+                   EMSG(_("E374: Missing ] in format string"));
+                   return NULL;
+               }
+           }
+       }
+       else if (efmp < efm + len)      /* %*\D, %*\s etc. */
+           *ptr++ = *++efmp;
+       *ptr++ = '\\';
+       *ptr++ = '+';
+     }
+     else
+     {
+       /* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */
+       sprintf((char *)errmsg,
+               _("E375: Unsupported %%%c in format string"), *efmp);
+       EMSG(errmsg);
+       return NULL;
+     }
+ 
+     *pefmp = efmp;
+ 
+     return ptr;
+ }
+ 
+ /*
+  * Analyze/parse an errorformat prefix.
+  */
+     static int
+ efm_analyze_prefix(char_u **pefmp, efm_T *fmt_ptr, char_u *errmsg)
+ {
+     char_u    *efmp = *pefmp;
+ 
+     if (vim_strchr((char_u *)"+-", *efmp) != NULL)
+       fmt_ptr->flags = *efmp++;
+     if (vim_strchr((char_u *)"DXAEWICZGOPQ", *efmp) != NULL)
+       fmt_ptr->prefix = *efmp;
+     else
+     {
+       sprintf((char *)errmsg,
+               _("E376: Invalid %%%c in format string prefix"), *efmp);
+       EMSG(errmsg);
+       return FAIL;
+     }
+ 
+     *pefmp = efmp;
+ 
+     return OK;
+ }
+ 
+ /*
   * Converts a 'errorformat' string to regular expression pattern
   */
      static int
  efm_to_regpat(
        char_u  *efm,
!       int     len,
        efm_T   *fmt_ptr,
        char_u  *regpat,
        char_u  *errmsg)
  {
      char_u    *ptr;
      char_u    *efmp;
      int               round;
      int               idx = 0;
  
***************
*** 260,361 ****
                    break;
            if (idx < FMT_PATTERNS)
            {
!               if (fmt_ptr->addr[idx])
!               {
!                   sprintf((char *)errmsg,
!                           _("E372: Too many %%%c in format string"), *efmp);
!                   EMSG(errmsg);
!                   return -1;
!               }
!               if ((idx
!                           && idx < 6
!                           && vim_strchr((char_u *)"DXOPQ",
!                               fmt_ptr->prefix) != NULL)
!                       || (idx == 6
!                           && vim_strchr((char_u *)"OPQ",
!                               fmt_ptr->prefix) == NULL))
!               {
!                   sprintf((char *)errmsg,
!                           _("E373: Unexpected %%%c in format string"), *efmp);
!                   EMSG(errmsg);
                    return -1;
!               }
!               fmt_ptr->addr[idx] = (char_u)++round;
!               *ptr++ = '\\';
!               *ptr++ = '(';
! #ifdef BACKSLASH_IN_FILENAME
!               if (*efmp == 'f')
!               {
!                   /* Also match "c:" in the file name, even when
!                    * checking for a colon next: "%f:".
!                    * "\%(\a:\)\=" */
!                   STRCPY(ptr, "\\%(\\a:\\)\\=");
!                   ptr += 10;
!               }
! #endif
!               if (*efmp == 'f' && efmp[1] != NUL)
!               {
!                   if (efmp[1] != '\\' && efmp[1] != '%')
!                   {
!                       /* A file name may contain spaces, but this isn't
!                        * in "\f".  For "%f:%l:%m" there may be a ":" in
!                        * the file name.  Use ".\{-1,}x" instead (x is
!                        * the next character), the requirement that :999:
!                        * follows should work. */
!                       STRCPY(ptr, ".\\{-1,}");
!                       ptr += 7;
!                   }
!                   else
!                   {
!                       /* File name followed by '\\' or '%': include as
!                        * many file name chars as possible. */
!                       STRCPY(ptr, "\\f\\+");
!                       ptr += 4;
!                   }
!               }
!               else
!               {
!                   srcptr = (char_u *)fmt_pat[idx].pattern;
!                   while ((*ptr = *srcptr++) != NUL)
!                       ++ptr;
!               }
!               *ptr++ = '\\';
!               *ptr++ = ')';
            }
            else if (*efmp == '*')
            {
!               if (*++efmp == '[' || *efmp == '\\')
!               {
!                   if ((*ptr++ = *efmp) == '[')        /* %*[^a-z0-9] etc. */
!                   {
!                       if (efmp[1] == '^')
!                           *ptr++ = *++efmp;
!                       if (efmp < efm + len)
!                       {
!                           *ptr++ = *++efmp;       /* could be ']' */
!                           while (efmp < efm + len
!                                   && (*ptr++ = *++efmp) != ']')
!                               /* skip */;
!                           if (efmp == efm + len)
!                           {
!                               EMSG(_("E374: Missing ] in format string"));
!                               return -1;
!                           }
!                       }
!                   }
!                   else if (efmp < efm + len)  /* %*\D, %*\s etc. */
!                       *ptr++ = *++efmp;
!                   *ptr++ = '\\';
!                   *ptr++ = '+';
!               }
!               else
!               {
!                   /* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */
!                   sprintf((char *)errmsg,
!                           _("E375: Unsupported %%%c in format string"), 
*efmp);
!                   EMSG(errmsg);
                    return -1;
-               }
            }
            else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
                *ptr++ = *efmp;         /* regexp magic characters */
--- 413,429 ----
                    break;
            if (idx < FMT_PATTERNS)
            {
!               ptr = fmtpat_to_regpat(efmp, fmt_ptr, idx, round, ptr,
!                                                               errmsg);
!               if (ptr == NULL)
                    return -1;
!               round++;
            }
            else if (*efmp == '*')
            {
!               ptr = scanf_fmt_to_regpat(efm, len, &efmp, ptr, errmsg);
!               if (ptr == NULL)
                    return -1;
            }
            else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
                *ptr++ = *efmp;         /* regexp magic characters */
***************
*** 365,381 ****
                fmt_ptr->conthere = TRUE;
            else if (efmp == efm + 1)           /* analyse prefix */
            {
!               if (vim_strchr((char_u *)"+-", *efmp) != NULL)
!                   fmt_ptr->flags = *efmp++;
!               if (vim_strchr((char_u *)"DXAEWICZGOPQ", *efmp) != NULL)
!                   fmt_ptr->prefix = *efmp;
!               else
!               {
!                   sprintf((char *)errmsg,
!                           _("E376: Invalid %%%c in format string prefix"), 
*efmp);
!                   EMSG(errmsg);
                    return -1;
-               }
            }
            else
            {
--- 433,440 ----
                fmt_ptr->conthere = TRUE;
            else if (efmp == efm + 1)           /* analyse prefix */
            {
!               if (efm_analyze_prefix(&efmp, fmt_ptr, errmsg) == FAIL)
                    return -1;
            }
            else
            {
*** ../vim-8.1.0009/src/version.c       2018-05-20 14:57:19.121429579 +0200
--- src/version.c       2018-05-20 15:37:57.138956740 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     10,
  /**/

-- 
SECOND SOLDIER: It could be carried by an African swallow!
FIRST SOLDIER:  Oh  yes! An African swallow maybe ... but not a European
                swallow. that's my point.
                 "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