- 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