diff --git a/7.3.1005 b/7.3.1005 new file mode 100644 index 0000000..dbc05c2 --- /dev/null +++ b/7.3.1005 @@ -0,0 +1,265 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.1005 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +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, + /**/ + +-- +"Lisp has all the visual appeal of oatmeal with nail clippings thrown in." + -- Larry Wall + + /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///