- patchlevel 1147
This commit is contained in:
parent
d17aa00703
commit
3ea9d86f22
183
7.3.1147
Normal file
183
7.3.1147
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
To: vim_dev@googlegroups.com
|
||||||
|
Subject: Patch 7.3.1147
|
||||||
|
Fcc: outbox
|
||||||
|
From: Bram Moolenaar <Bram@moolenaar.net>
|
||||||
|
Mime-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
------------
|
||||||
|
|
||||||
|
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 -- 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 ///
|
Loading…
Reference in New Issue
Block a user