Patch 7.3.1146
Problem:    New regexp engine: look-behind match not checked when followed by
            zero-width match.
Solution:   Do the look-behind match before adding the zero-width state.
Files:      src/regexp_nfa.c


*** ../vim-7.3.1145/src/regexp_nfa.c    2013-06-07 22:39:35.000000000 +0200
--- src/regexp_nfa.c    2013-06-08 13:16:52.000000000 +0200
***************
*** 4332,4337 ****
--- 4332,4338 ----
      nfa_list_T        *nextlist;
      int               *listids = NULL;
      nfa_state_T *add_state;
+     int               add_here;
      int               add_count;
      int               add_off;
      garray_T  pimlist;
***************
*** 4495,4500 ****
--- 4496,4502 ----
             * The most important is NFA_MATCH.
             */
            add_state = NULL;
+           add_here = FALSE;
            add_count = 0;
            switch (t->state->c)
            {
***************
*** 4621,4638 ****
                            /* t->state->out1 is the corresponding
                             * END_INVISIBLE node; Add its out to the current
                             * list (zero-width match). */
!                           addstate_here(thislist, t->state->out1->out,
!                                                 &t->subs, t->pim, &listidx);
                        }
                    }
                    else
                    {
                        /*
                         * First try matching what follows at the current
!                        * position.  Only if a match is found, addstate() is
!                        * called, then verify the invisible match matches.
!                        * Add a nfa_pim_T to the following states, it
!                        * contains info about the invisible match.
                         */
                        if (ga_grow(&pimlist, 1) == FAIL)
                            goto theend;
--- 4623,4640 ----
                            /* t->state->out1 is the corresponding
                             * END_INVISIBLE node; Add its out to the current
                             * list (zero-width match). */
!                           add_here = TRUE;
!                           add_state = t->state->out1->out;
                        }
                    }
                    else
                    {
                        /*
                         * First try matching what follows at the current
!                        * position.  Only if a match is found, before
!                        * addstate() is called, then verify the invisible
!                        * match matches.  Add a nfa_pim_T to the following
!                        * states, it contains info about the invisible match.
                         */
                        if (ga_grow(&pimlist, 1) == FAIL)
                            goto theend;
***************
*** 4727,4734 ****
                        /* empty match, output of corresponding
                         * NFA_END_PATTERN/NFA_SKIP to be used at current
                         * position */
!                       addstate_here(thislist, t->state->out1->out->out,
!                                                 &t->subs, t->pim, &listidx);
                    }
                    else if (bytelen <= clen)
                    {
--- 4729,4736 ----
                        /* empty match, output of corresponding
                         * NFA_END_PATTERN/NFA_SKIP to be used at current
                         * position */
!                       add_here = TRUE;
!                       add_state = t->state->out1->out->out;
                    }
                    else if (bytelen <= clen)
                    {
***************
*** 4751,4764 ****
  
            case NFA_BOL:
                if (reginput == regline)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_EOL:
                if (curc == NUL)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_BOW:
--- 4753,4770 ----
  
            case NFA_BOL:
                if (reginput == regline)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_EOL:
                if (curc == NUL)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_BOW:
***************
*** 4784,4791 ****
                                   && vim_iswordc_buf(reginput[-1], reg_buf)))
                    result = FALSE;
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_EOW:
--- 4790,4799 ----
                                   && vim_iswordc_buf(reginput[-1], reg_buf)))
                    result = FALSE;
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_EOW:
***************
*** 4810,4830 ****
                                           && vim_iswordc_buf(curc, reg_buf)))
                    result = FALSE;
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_BOF:
                if (reglnum == 0 && reginput == regline
                                        && (!REG_MULTI || reg_firstlnum == 1))
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_EOF:
                if (reglnum == reg_maxline && curc == NUL)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
  #ifdef FEAT_MBYTE
--- 4818,4844 ----
                                           && vim_iswordc_buf(curc, reg_buf)))
                    result = FALSE;
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_BOF:
                if (reglnum == 0 && reginput == regline
                                        && (!REG_MULTI || reg_firstlnum == 1))
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_EOF:
                if (reglnum == reg_maxline && curc == NUL)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
  #ifdef FEAT_MBYTE
***************
*** 5183,5190 ****
                    {
                        /* empty match always works, output of NFA_SKIP to be
                         * used next */
!                       addstate_here(thislist, t->state->out->out, &t->subs,
!                                                           t->pim, &listidx);
                    }
                    else if (bytelen <= clen)
                    {
--- 5197,5204 ----
                    {
                        /* empty match always works, output of NFA_SKIP to be
                         * used next */
!                       add_here = TRUE;
!                       add_state = t->state->out->out;
                    }
                    else if (bytelen <= clen)
                    {
***************
*** 5228,5235 ****
                        nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
                            (long_u)(reglnum + reg_firstlnum)));
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_COL:
--- 5242,5251 ----
                        nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
                            (long_u)(reglnum + reg_firstlnum)));
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_COL:
***************
*** 5238,5245 ****
                result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
                        (long_u)(reginput - regline) + 1);
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_VCOL:
--- 5254,5263 ----
                result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
                        (long_u)(reginput - regline) + 1);
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_VCOL:
***************
*** 5250,5257 ****
                            reg_win == NULL ? curwin : reg_win,
                            regline, (colnr_T)(reginput - regline)) + 1);
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_MARK:
--- 5268,5277 ----
                            reg_win == NULL ? curwin : reg_win,
                            regline, (colnr_T)(reginput - regline)) + 1);
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_MARK:
***************
*** 5273,5280 ****
                                    ? t->state->c == NFA_MARK_GT
                                    : t->state->c == NFA_MARK_LT)));
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
              }
  
--- 5293,5302 ----
                                    ? t->state->c == NFA_MARK_GT
                                    : t->state->c == NFA_MARK_LT)));
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
              }
  
***************
*** 5284,5299 ****
                        && ((colnr_T)(reginput - regline)
                                                   == reg_win->w_cursor.col));
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
                break;
  
            case NFA_VISUAL:
  #ifdef FEAT_VISUAL
                result = reg_match_visual();
                if (result)
!                   addstate_here(thislist, t->state->out, &t->subs,
!                                                           t->pim, &listidx);
  #endif
                break;
  
--- 5306,5325 ----
                        && ((colnr_T)(reginput - regline)
                                                   == reg_win->w_cursor.col));
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
                break;
  
            case NFA_VISUAL:
  #ifdef FEAT_VISUAL
                result = reg_match_visual();
                if (result)
!               {
!                   add_here = TRUE;
!                   add_state = t->state->out;
!               }
  #endif
                break;
  
***************
*** 5327,5333 ****
                if (t->pim != NULL)
                {
                    /* postponed invisible match */
-                   /* TODO: also do t->pim->pim recursively? */
                    if (t->pim->result == NFA_PIM_TODO)
                    {
  #ifdef ENABLE_LOG
--- 5353,5358 ----
***************
*** 5383,5391 ****
                        continue;
                }
  
!               addstate(nextlist, add_state, &t->subs, add_off);
!               if (add_count > 0)
!                   nextlist->t[nextlist->n - 1].count = add_count;
            }
  
        } /* for (thislist = thislist; thislist->state; thislist++) */
--- 5408,5421 ----
                        continue;
                }
  
!               if (add_here)
!                   addstate_here(thislist, add_state, &t->subs, NULL, 
&listidx);
!               else
!               {
!                   addstate(nextlist, add_state, &t->subs, add_off);
!                   if (add_count > 0)
!                       nextlist->t[nextlist->n - 1].count = add_count;
!               }
            }
  
        } /* for (thislist = thislist; thislist->state; thislist++) */
*** ../vim-7.3.1145/src/version.c       2013-06-07 22:39:35.000000000 +0200
--- src/version.c       2013-06-08 13:30:41.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
  {   /* Add new patch number below this line */
+ /**/
+     1146,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
111. You and your friends get together regularly on IRC, even though
     all of you live in the same city.

 /// 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