Patch 7.3.1147
Problem:    New regexp engine: regstart is only used to find the first match.
Solution:   Use regstart whenever adding the start state.
Files:      src/regexp_nfa.c


*** ../vim-7.3.1146/src/regexp_nfa.c    2013-06-08 13:33:32.000000000 +0200
--- src/regexp_nfa.c    2013-06-08 14:37:36.000000000 +0200
***************
*** 4153,4158 ****
--- 4153,4159 ----
  }
  
  static int failure_chance __ARGS((nfa_state_T *state, int depth));
+ static int skip_to_start __ARGS((int c, colnr_T *colp));
  
  /*
   * Estimate the chance of a match with "state" failing.
***************
*** 4305,4310 ****
--- 4306,4336 ----
  }
  
  /*
+  * Skip until the char "c" we know a match must start with.
+  */
+     static int
+ skip_to_start(c, colp)
+     int               c;
+     colnr_T   *colp;
+ {
+     char_u *s;
+ 
+     /* Used often, do some work to avoid call overhead. */
+     if (!ireg_ic
+ #ifdef FEAT_MBYTE
+               && !has_mbyte
+ #endif
+               )
+       s = vim_strbyte(regline + *colp, c);
+     else
+       s = cstrchr(regline + *colp, c);
+     if (s == NULL)
+       return FAIL;
+     *colp = (int)(s - regline);
+     return OK;
+ }
+ 
+ /*
   * Main matching routine.
   *
   * Run NFA to determine whether it matches reginput.
***************
*** 5449,5460 ****
             * the first MOPEN. */
            if (toplevel)
            {
!               if (REG_MULTI)
!                   m->norm.list.multi[0].start.col =
                                         (colnr_T)(reginput - regline) + clen;
!               else
!                   m->norm.list.line[0].start = reginput + clen;
!               addstate(nextlist, start->out, m, clen);
            }
            else
                addstate(nextlist, start, m, clen);
--- 5475,5524 ----
             * the first MOPEN. */
            if (toplevel)
            {
!               int add = TRUE;
!               int c;
! 
!               if (prog->regstart != NUL && clen != 0)
!               {
!                   if (nextlist->n == 0)
!                   {
!                       colnr_T col = (colnr_T)(reginput - regline) + clen;
! 
!                       /* Nextlist is empty, we can skip ahead to the
!                        * character that must appear at the start. */
!                       if (skip_to_start(prog->regstart, &col) == FAIL)
!                           break;
! #ifdef ENABLE_LOG
!                       fprintf(log_fd, "  Skipping ahead %d bytes to 
regstart\n",
!                               col - ((colnr_T)(reginput - regline) + clen));
! #endif
!                       reginput = regline + col - clen;
!                   }
!                   else
!                   {
!                       /* Checking if the required start character matches is
!                        * cheaper than adding a state that won't match. */
!                       c = PTR2CHAR(reginput + clen);
!                       if (c != prog->regstart && (!ireg_ic || MB_TOLOWER(c)
!                                              != MB_TOLOWER(prog->regstart)))
!                       {
! #ifdef ENABLE_LOG
!                           fprintf(log_fd, "  Skipping start state, regstart 
does not match\n");
! #endif
!                           add = FALSE;
!                       }
!                   }
!               }
! 
!               if (add)
!               {
!                   if (REG_MULTI)
!                       m->norm.list.multi[0].start.col =
                                         (colnr_T)(reginput - regline) + clen;
!                   else
!                       m->norm.list.line[0].start = reginput + clen;
!                   addstate(nextlist, start->out, m, clen);
!               }
            }
            else
                addstate(nextlist, start, m, clen);
***************
*** 5701,5723 ****
        return 0L;
  
      if (prog->regstart != NUL)
!     {
!       char_u *s;
! 
!       /* Skip until the char we know it must start with.
!        * Used often, do some work to avoid call overhead. */
!       if (!ireg_ic
! #ifdef FEAT_MBYTE
!                   && !has_mbyte
! #endif
!                   )
!           s = vim_strbyte(regline + col, prog->regstart);
!       else
!           s = cstrchr(regline + col, prog->regstart);
!       if (s == NULL)
            return 0L;
-       col = (int)(s - regline);
-     }
  
      /* If the start column is past the maximum column: no need to try. */
      if (ireg_maxcol > 0 && col >= ireg_maxcol)
--- 5765,5774 ----
        return 0L;
  
      if (prog->regstart != NUL)
!       /* Skip ahead until a character we know the match must start with.
!        * When there is none there is no match. */
!       if (skip_to_start(prog->regstart, &col) == FAIL)
            return 0L;
  
      /* If the start column is past the maximum column: no need to try. */
      if (ireg_maxcol > 0 && col >= ireg_maxcol)
*** ../vim-7.3.1146/src/version.c       2013-06-08 13:33:32.000000000 +0200
--- src/version.c       2013-06-08 14:35:54.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
  {   /* Add new patch number below this line */
+ /**/
+     1147,
  /**/

-- 
Nobody will ever need more than 640 kB RAM.
                -- Bill Gates, 1983
Windows 98 requires 16 MB RAM.
                -- Bill Gates, 1999
Logical conclusion: Nobody will ever need Windows 98.

 /// 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/groups/opt_out.


Raspunde prin e-mail lui