Loading ...
Sorry, an error occurred while loading the content.

70015Re: Patch 7.3.1005

Expand Messages
  • Cesar Romani
    May 22, 2013
      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 vim_dev+unsubscribe@....
      For more options, visit https://groups.google.com/groups/opt_out.
    • Show all 7 messages in this topic