On 22/05/2013 04:02 p.m., Bram Moolenaar wrote:
>
> Patch 7.3.1005
> Problem:    Get stuck on regexp "\n*" and on "%s/^\n\+/\r".
> Solution:   Fix handling of matching a line break. (idea by Hirohito
> Higashi)
> Files:         src/regexp_nfa.c
>
>
> *** ../vim-7.3.1004/src/regexp_nfa.c       2013-05-21 22:00:42.000000000 +0200
> --- src/regexp_nfa.c       2013-05-22 22:53:08.000000000 +0200
> ***************
> *** 2462,2468 ****
>        List                *l;     /* runtime state list */
>        nfa_state_T         *state; /* state to update */
>        regsub_T            *m;     /* pointers to subexpressions */
> !     int                  off;
>        int                 lid;
>        int                 *match; /* found match? */
>    {
> --- 2462,2468 ----
>        List                *l;     /* runtime state list */
>        nfa_state_T         *state; /* state to update */
>        regsub_T            *m;     /* pointers to subexpressions */
> !     int                  off;    /* byte offset, when -1 go to next line */
>        int                 lid;
>        int                 *match; /* found match? */
>    {
> ***************
> *** 2585,2592 ****
>                {
>                    save.startpos[subidx] = m->startpos[subidx];
>                    save.endpos[subidx] = m->endpos[subidx];
> !          m->startpos[subidx].lnum = reglnum;
> !          m->startpos[subidx].col = (colnr_T)(reginput - regline + off);
>                }
>                else
>                {
> --- 2585,2601 ----
>                {
>                    save.startpos[subidx] = m->startpos[subidx];
>                    save.endpos[subidx] = m->endpos[subidx];
> !          if (off == -1)
> !          {
> !              m->startpos[subidx].lnum = reglnum + 1;
> !              m->startpos[subidx].col = 0;
> !          }
> !          else
> !          {
> !              m->startpos[subidx].lnum = reglnum;
> !              m->startpos[subidx].col =
> !                                    (colnr_T)(reginput - regline + off);
> !          }
>                }
>                else
>                {
> ***************
> *** 2633,2640 ****
>                {
>                    save.startpos[subidx] = m->startpos[subidx];
>                    save.endpos[subidx] = m->endpos[subidx];
> !          m->endpos[subidx].lnum = reglnum;
> !          m->endpos[subidx].col = (colnr_T)(reginput - regline + off);
>                }
>                else
>                {
> --- 2642,2657 ----
>                {
>                    save.startpos[subidx] = m->startpos[subidx];
>                    save.endpos[subidx] = m->endpos[subidx];
> !          if (off == -1)
> !          {
> !              m->endpos[subidx].lnum = reglnum + 1;
> !              m->endpos[subidx].col = 0;
> !          }
> !          else
> !          {
> !              m->endpos[subidx].lnum = reglnum;
> !              m->endpos[subidx].col = (colnr_T)(reginput - regline + off);
> !          }
>                }
>                else
>                {
> ***************
> *** 2834,2840 ****
>        int         match = FALSE;
>        int         flag = 0;
>        int         old_reglnum = -1;
> !     int          reginput_updated = FALSE;
>        thread_T    *t;
>        char_u      *old_reginput = NULL;
>        char_u      *old_regline = NULL;
> --- 2851,2857 ----
>        int         match = FALSE;
>        int         flag = 0;
>        int         old_reglnum = -1;
> !     int          go_to_nextline;
>        thread_T    *t;
>        char_u      *old_reginput = NULL;
>        char_u      *old_regline = NULL;
> ***************
> *** 2917,2924 ****
>        /*
>         * Run for each character.
>         */
> !     do {
> ! again:
>    #ifdef FEAT_MBYTE
>            if (has_mbyte)
>            {
> --- 2934,2941 ----
>        /*
>         * Run for each character.
>         */
> !     for (;;)
> !     {
>    #ifdef FEAT_MBYTE
>            if (has_mbyte)
>            {
> ***************
> *** 2932,2938 ****
> --- 2949,2958 ----
>                n = 1;
>            }
>            if (c == NUL)
> +  {
>                n = 0;
> +      go_to_nextline = FALSE;
> +  }
>
>            /* swap lists */
>            thislist =&list[flag];
> ***************
> *** 3007,3013 ****
>                                    (char *)t->sub.end[j]);
>                    fprintf(log_fd, "\n");
>    #endif
> !          goto nextchar;          /* found the left-most longest match */
>
>                case NFA_END_INVISIBLE:
>                    /* This is only encountered after a NFA_START_INVISIBLE 
node.
> --- 3027,3035 ----
>                                    (char *)t->sub.end[j]);
>                    fprintf(log_fd, "\n");
>    #endif
> !          /* Found the left-most longest match, do not look at any other
> !           * states at this position. */
> !          goto nextchar;
>
>                case NFA_END_INVISIBLE:
>                    /* This is only encountered after a NFA_START_INVISIBLE 
node.
> ***************
> *** 3206,3220 ****
>
>                case NFA_NEWL:
>                    if (!reg_line_lbr&&  REG_MULTI
> !                          &&  c == NUL&&  reglnum<= reg_maxline)
>                    {
> !              if (reginput_updated == FALSE)
> !              {
> !                  reg_nextline();
> !                  reginput_updated = TRUE;
> !              }
> !              addstate(nextlist, t->state->out,&t->sub, n, listid + 1,
> !                                                          &match);
>                    }
>                    break;
>
> --- 3228,3240 ----
>
>                case NFA_NEWL:
>                    if (!reg_line_lbr&&  REG_MULTI
> !                                  &&  c == NUL&&  reglnum<= reg_maxline)
>                    {
> !              go_to_nextline = TRUE;
> !              /* Pass -1 for the offset, which means taking the position
> !               * at the start of the next line. */
> !              addstate(nextlist, t->state->out,&t->sub, -1,
> !                                                    listid + 1,&match);
>                    }
>                    break;
>
> ***************
> *** 3247,3254 ****
>                    break;
>
>                case NFA_ANY:
> !          /* Any printable char, not just any char. '\0' (end of input)
> !           * must not match */
>                    if (c>  0)
>                        addstate(nextlist, t->state->out,&t->sub, n, listid + 
1,
>                                                                    &match);
> --- 3267,3273 ----
>                    break;
>
>                case NFA_ANY:
> !          /* Any char except '\0', (end of input) does not match. */
>                    if (c>  0)
>                        addstate(nextlist, t->state->out,&t->sub, n, listid + 
1,
>                                                                    &match);
> ***************
> *** 3433,3444 ****
>                addstate(nextlist, start, m, n, listid + 1,&match);
>            }
>
> -  if (reginput_updated)
> -  {
> -      reginput_updated = FALSE;
> -      goto again;
> -  }
> -
>    #ifdef ENABLE_LOG
> fprintf(log_fd, ">>> Thislist had %d states available: ", thislist->n);
>            for (i = 0; i<  thislist->n; i++)
> --- 3452,3457 ----
> ***************
> *** 3447,3454 ****
>    #endif
>
>    nextchar:
> !  reginput += n;
> !     } while (c || reginput_updated);
>
>    #ifdef ENABLE_LOG
>        if (log_fd != stderr)
> --- 3460,3474 ----
>    #endif
>
>    nextchar:
> !  /* Advance to the next character, or advance to the next line, or
> !   * finish. */
> !  if (n != 0)
> !      reginput += n;
> !  else if (go_to_nextline)
> !      reg_nextline();
> !  else
> !      break;
> !     }
>
>    #ifdef ENABLE_LOG
>        if (log_fd != stderr)
> *** ../vim-7.3.1004/src/version.c  2013-05-21 22:38:14.000000000 +0200
> --- src/version.c  2013-05-22 22:57:59.000000000 +0200
> ***************
> *** 730,731 ****
> --- 730,733 ----
>    {   /* Add new patch number below this line */
> + /**/
> +     1005,
>    /**/
>

It doesn't solve the issue for "%s/^\n\+/\r". It gets stuck as before.

Regards,

--
Cesar

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