|
|
073263 |
To: vim_dev@googlegroups.com
|
|
|
073263 |
Subject: Patch 7.4.497
|
|
|
073263 |
Fcc: outbox
|
|
|
073263 |
From: Bram Moolenaar <Bram@moolenaar.net>
|
|
|
073263 |
Mime-Version: 1.0
|
|
|
073263 |
Content-Type: text/plain; charset=UTF-8
|
|
|
073263 |
Content-Transfer-Encoding: 8bit
|
|
|
073263 |
------------
|
|
|
073263 |
|
|
|
073263 |
Patch 7.4.497
|
|
|
073263 |
Problem: With some regexp patterns the NFA engine uses many states and
|
|
|
073263 |
becomes very slow. To the user it looks like Vim freezes.
|
|
|
073263 |
Solution: When the number of states reaches a limit fall back to the old
|
|
|
073263 |
engine. (Christian Brabandt)
|
|
|
073263 |
Files: runtime/doc/options.txt, src/Makefile, src/regexp.c, src/regexp.h,
|
|
|
073263 |
src/regexp_nfa.c, src/testdir/Make_dos.mak,
|
|
|
073263 |
src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
|
|
|
073263 |
src/testdir/Makefile, src/testdir/samples/re.freeze.txt,
|
|
|
073263 |
src/testdir/bench_re_freeze.in, src/testdir/bench_re_freeze.vim,
|
|
|
073263 |
Filelist
|
|
|
073263 |
|
|
|
073263 |
|
|
|
073263 |
*** ../vim-7.4.496/runtime/doc/options.txt 2014-09-23 15:45:04.866801055 +0200
|
|
|
073263 |
--- runtime/doc/options.txt 2014-11-05 12:06:16.664961112 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 5622,5627 ****
|
|
|
073263 |
--- 5626,5635 ----
|
|
|
073263 |
Note that when using the NFA engine and the pattern contains something
|
|
|
073263 |
that is not supported the pattern will not match. This is only useful
|
|
|
073263 |
for debugging the regexp engine.
|
|
|
073263 |
+ Using automatic selection enables Vim to switch the engine, if the
|
|
|
073263 |
+ default engine becomes too costly. E.g., when the NFA engine uses too
|
|
|
073263 |
+ many states. This should prevent Vim from hanging on a combination of
|
|
|
073263 |
+ a complex pattern with long text.
|
|
|
073263 |
|
|
|
073263 |
*'relativenumber'* *'rnu'* *'norelativenumber'* *'nornu'*
|
|
|
073263 |
'relativenumber' 'rnu' boolean (default off)
|
|
|
073263 |
*** ../vim-7.4.496/src/Makefile 2014-08-17 17:05:39.155057796 +0200
|
|
|
073263 |
--- src/Makefile 2014-11-05 12:01:58.704967328 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 1879,1884 ****
|
|
|
073263 |
--- 1879,1887 ----
|
|
|
073263 |
cd testdir; $(MAKE) -f Makefile $(GUI_TESTTARGET) VIMPROG=../$(VIMTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
|
|
|
073263 |
$(MAKE) -f Makefile unittest
|
|
|
073263 |
|
|
|
073263 |
+ benchmark:
|
|
|
073263 |
+ cd testdir; $(MAKE) -f Makefile benchmark VIMPROG=../$(VIMTARGET) SCRIPTSOURCE=../$(SCRIPTSOURCE)
|
|
|
073263 |
+
|
|
|
073263 |
unittesttargets:
|
|
|
073263 |
$(MAKE) -f Makefile $(UNITTEST_TARGETS)
|
|
|
073263 |
|
|
|
073263 |
*** ../vim-7.4.496/src/regexp.c 2014-09-09 17:18:44.008540299 +0200
|
|
|
073263 |
--- src/regexp.c 2014-11-05 14:05:40.544788489 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8011,8023 ****
|
|
|
073263 |
bt_regcomp,
|
|
|
073263 |
bt_regfree,
|
|
|
073263 |
bt_regexec_nl,
|
|
|
073263 |
! bt_regexec_multi
|
|
|
073263 |
! #ifdef DEBUG
|
|
|
073263 |
! ,(char_u *)""
|
|
|
073263 |
! #endif
|
|
|
073263 |
};
|
|
|
073263 |
|
|
|
073263 |
-
|
|
|
073263 |
#include "regexp_nfa.c"
|
|
|
073263 |
|
|
|
073263 |
static regengine_T nfa_regengine =
|
|
|
073263 |
--- 8011,8020 ----
|
|
|
073263 |
bt_regcomp,
|
|
|
073263 |
bt_regfree,
|
|
|
073263 |
bt_regexec_nl,
|
|
|
073263 |
! bt_regexec_multi,
|
|
|
073263 |
! (char_u *)""
|
|
|
073263 |
};
|
|
|
073263 |
|
|
|
073263 |
#include "regexp_nfa.c"
|
|
|
073263 |
|
|
|
073263 |
static regengine_T nfa_regengine =
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8025,8042 ****
|
|
|
073263 |
nfa_regcomp,
|
|
|
073263 |
nfa_regfree,
|
|
|
073263 |
nfa_regexec_nl,
|
|
|
073263 |
! nfa_regexec_multi
|
|
|
073263 |
! #ifdef DEBUG
|
|
|
073263 |
! ,(char_u *)""
|
|
|
073263 |
! #endif
|
|
|
073263 |
};
|
|
|
073263 |
|
|
|
073263 |
/* Which regexp engine to use? Needed for vim_regcomp().
|
|
|
073263 |
* Must match with 'regexpengine'. */
|
|
|
073263 |
static int regexp_engine = 0;
|
|
|
073263 |
! #define AUTOMATIC_ENGINE 0
|
|
|
073263 |
! #define BACKTRACKING_ENGINE 1
|
|
|
073263 |
! #define NFA_ENGINE 2
|
|
|
073263 |
#ifdef DEBUG
|
|
|
073263 |
static char_u regname[][30] = {
|
|
|
073263 |
"AUTOMATIC Regexp Engine",
|
|
|
073263 |
--- 8022,8035 ----
|
|
|
073263 |
nfa_regcomp,
|
|
|
073263 |
nfa_regfree,
|
|
|
073263 |
nfa_regexec_nl,
|
|
|
073263 |
! nfa_regexec_multi,
|
|
|
073263 |
! (char_u *)""
|
|
|
073263 |
};
|
|
|
073263 |
|
|
|
073263 |
/* Which regexp engine to use? Needed for vim_regcomp().
|
|
|
073263 |
* Must match with 'regexpengine'. */
|
|
|
073263 |
static int regexp_engine = 0;
|
|
|
073263 |
!
|
|
|
073263 |
#ifdef DEBUG
|
|
|
073263 |
static char_u regname[][30] = {
|
|
|
073263 |
"AUTOMATIC Regexp Engine",
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8083,8092 ****
|
|
|
073263 |
regexp_engine = AUTOMATIC_ENGINE;
|
|
|
073263 |
}
|
|
|
073263 |
}
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
bt_regengine.expr = expr;
|
|
|
073263 |
nfa_regengine.expr = expr;
|
|
|
073263 |
- #endif
|
|
|
073263 |
|
|
|
073263 |
/*
|
|
|
073263 |
* First try the NFA engine, unless backtracking was requested.
|
|
|
073263 |
--- 8076,8083 ----
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8096,8102 ****
|
|
|
073263 |
else
|
|
|
073263 |
prog = bt_regengine.regcomp(expr, re_flags);
|
|
|
073263 |
|
|
|
073263 |
! if (prog == NULL) /* error compiling regexp with initial engine */
|
|
|
073263 |
{
|
|
|
073263 |
#ifdef BT_REGEXP_DEBUG_LOG
|
|
|
073263 |
if (regexp_engine != BACKTRACKING_ENGINE) /* debugging log for NFA */
|
|
|
073263 |
--- 8087,8094 ----
|
|
|
073263 |
else
|
|
|
073263 |
prog = bt_regengine.regcomp(expr, re_flags);
|
|
|
073263 |
|
|
|
073263 |
! /* Check for error compiling regexp with initial engine. */
|
|
|
073263 |
! if (prog == NULL)
|
|
|
073263 |
{
|
|
|
073263 |
#ifdef BT_REGEXP_DEBUG_LOG
|
|
|
073263 |
if (regexp_engine != BACKTRACKING_ENGINE) /* debugging log for NFA */
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8114,8126 ****
|
|
|
073263 |
}
|
|
|
073263 |
#endif
|
|
|
073263 |
/*
|
|
|
073263 |
! * If the NFA engine failed, the backtracking engine won't work either.
|
|
|
073263 |
*
|
|
|
073263 |
if (regexp_engine == AUTOMATIC_ENGINE)
|
|
|
073263 |
prog = bt_regengine.regcomp(expr, re_flags);
|
|
|
073263 |
*/
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
return prog;
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
--- 8106,8132 ----
|
|
|
073263 |
}
|
|
|
073263 |
#endif
|
|
|
073263 |
/*
|
|
|
073263 |
! * If the NFA engine failed, try the backtracking engine.
|
|
|
073263 |
! * Disabled for now, both engines fail on the same patterns.
|
|
|
073263 |
! * Re-enable when regcomp() fails when the pattern would work better
|
|
|
073263 |
! * with the other engine.
|
|
|
073263 |
*
|
|
|
073263 |
if (regexp_engine == AUTOMATIC_ENGINE)
|
|
|
073263 |
+ {
|
|
|
073263 |
prog = bt_regengine.regcomp(expr, re_flags);
|
|
|
073263 |
+ regexp_engine == BACKTRACKING_ENGINE;
|
|
|
073263 |
+ }
|
|
|
073263 |
*/
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
+ if (prog != NULL)
|
|
|
073263 |
+ {
|
|
|
073263 |
+ /* Store the info needed to call regcomp() again when the engine turns
|
|
|
073263 |
+ * out to be very slow when executing it. */
|
|
|
073263 |
+ prog->re_engine = regexp_engine;
|
|
|
073263 |
+ prog->re_flags = re_flags;
|
|
|
073263 |
+ }
|
|
|
073263 |
+
|
|
|
073263 |
return prog;
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8135,8154 ****
|
|
|
073263 |
prog->engine->regfree(prog);
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
/*
|
|
|
073263 |
* Match a regexp against a string.
|
|
|
073263 |
* "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
|
|
|
073263 |
* Uses curbuf for line count and 'iskeyword'.
|
|
|
073263 |
*
|
|
|
073263 |
* Return TRUE if there is a match, FALSE if not.
|
|
|
073263 |
*/
|
|
|
073263 |
int
|
|
|
073263 |
vim_regexec(rmp, line, col)
|
|
|
073263 |
! regmatch_T *rmp;
|
|
|
073263 |
! char_u *line; /* string to match against */
|
|
|
073263 |
! colnr_T col; /* column to start looking for match */
|
|
|
073263 |
{
|
|
|
073263 |
! return rmp->regprog->engine->regexec_nl(rmp, line, col, FALSE);
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
#if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
|
|
|
073263 |
--- 8141,8215 ----
|
|
|
073263 |
prog->engine->regfree(prog);
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
+ #ifdef FEAT_EVAL
|
|
|
073263 |
+ static void report_re_switch __ARGS((char_u *pat));
|
|
|
073263 |
+
|
|
|
073263 |
+ static void
|
|
|
073263 |
+ report_re_switch(pat)
|
|
|
073263 |
+ char_u *pat;
|
|
|
073263 |
+ {
|
|
|
073263 |
+ if (p_verbose > 0)
|
|
|
073263 |
+ {
|
|
|
073263 |
+ verbose_enter();
|
|
|
073263 |
+ MSG_PUTS(_("Switching to backtracking RE engine for pattern: "));
|
|
|
073263 |
+ MSG_PUTS(pat);
|
|
|
073263 |
+ verbose_leave();
|
|
|
073263 |
+ }
|
|
|
073263 |
+ }
|
|
|
073263 |
+ #endif
|
|
|
073263 |
+
|
|
|
073263 |
+ static int vim_regexec_both __ARGS((regmatch_T *rmp, char_u *line, colnr_T col, int nl));
|
|
|
073263 |
+
|
|
|
073263 |
/*
|
|
|
073263 |
* Match a regexp against a string.
|
|
|
073263 |
* "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
|
|
|
073263 |
* Uses curbuf for line count and 'iskeyword'.
|
|
|
073263 |
+ * When "nl" is TRUE consider a "\n" in "line" to be a line break.
|
|
|
073263 |
*
|
|
|
073263 |
* Return TRUE if there is a match, FALSE if not.
|
|
|
073263 |
*/
|
|
|
073263 |
+ static int
|
|
|
073263 |
+ vim_regexec_both(rmp, line, col, nl)
|
|
|
073263 |
+ regmatch_T *rmp;
|
|
|
073263 |
+ char_u *line; /* string to match against */
|
|
|
073263 |
+ colnr_T col; /* column to start looking for match */
|
|
|
073263 |
+ int nl;
|
|
|
073263 |
+ {
|
|
|
073263 |
+ int result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl);
|
|
|
073263 |
+
|
|
|
073263 |
+ /* NFA engine aborted because it's very slow. */
|
|
|
073263 |
+ if (rmp->regprog->re_engine == AUTOMATIC_ENGINE
|
|
|
073263 |
+ && result == NFA_TOO_EXPENSIVE)
|
|
|
073263 |
+ {
|
|
|
073263 |
+ int save_p_re = p_re;
|
|
|
073263 |
+ int re_flags = rmp->regprog->re_flags;
|
|
|
073263 |
+ char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern);
|
|
|
073263 |
+
|
|
|
073263 |
+ p_re = BACKTRACKING_ENGINE;
|
|
|
073263 |
+ vim_regfree(rmp->regprog);
|
|
|
073263 |
+ if (pat != NULL)
|
|
|
073263 |
+ {
|
|
|
073263 |
+ #ifdef FEAT_EVAL
|
|
|
073263 |
+ report_re_switch(pat);
|
|
|
073263 |
+ #endif
|
|
|
073263 |
+ rmp->regprog = vim_regcomp(pat, re_flags);
|
|
|
073263 |
+ if (rmp->regprog != NULL)
|
|
|
073263 |
+ result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl);
|
|
|
073263 |
+ vim_free(pat);
|
|
|
073263 |
+ }
|
|
|
073263 |
+
|
|
|
073263 |
+ p_re = save_p_re;
|
|
|
073263 |
+ }
|
|
|
073263 |
+ return result;
|
|
|
073263 |
+ }
|
|
|
073263 |
+
|
|
|
073263 |
int
|
|
|
073263 |
vim_regexec(rmp, line, col)
|
|
|
073263 |
! regmatch_T *rmp;
|
|
|
073263 |
! char_u *line;
|
|
|
073263 |
! colnr_T col;
|
|
|
073263 |
{
|
|
|
073263 |
! return vim_regexec_both(rmp, line, col, FALSE);
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
#if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8158,8168 ****
|
|
|
073263 |
*/
|
|
|
073263 |
int
|
|
|
073263 |
vim_regexec_nl(rmp, line, col)
|
|
|
073263 |
! regmatch_T *rmp;
|
|
|
073263 |
! char_u *line;
|
|
|
073263 |
! colnr_T col;
|
|
|
073263 |
{
|
|
|
073263 |
! return rmp->regprog->engine->regexec_nl(rmp, line, col, TRUE);
|
|
|
073263 |
}
|
|
|
073263 |
#endif
|
|
|
073263 |
|
|
|
073263 |
--- 8219,8229 ----
|
|
|
073263 |
*/
|
|
|
073263 |
int
|
|
|
073263 |
vim_regexec_nl(rmp, line, col)
|
|
|
073263 |
! regmatch_T *rmp;
|
|
|
073263 |
! char_u *line;
|
|
|
073263 |
! colnr_T col;
|
|
|
073263 |
{
|
|
|
073263 |
! return vim_regexec_both(rmp, line, col, TRUE);
|
|
|
073263 |
}
|
|
|
073263 |
#endif
|
|
|
073263 |
|
|
|
073263 |
***************
|
|
|
073263 |
*** 8183,8187 ****
|
|
|
073263 |
colnr_T col; /* column to start looking for match */
|
|
|
073263 |
proftime_T *tm; /* timeout limit or NULL */
|
|
|
073263 |
{
|
|
|
073263 |
! return rmp->regprog->engine->regexec_multi(rmp, win, buf, lnum, col, tm);
|
|
|
073263 |
}
|
|
|
073263 |
--- 8244,8275 ----
|
|
|
073263 |
colnr_T col; /* column to start looking for match */
|
|
|
073263 |
proftime_T *tm; /* timeout limit or NULL */
|
|
|
073263 |
{
|
|
|
073263 |
! int result = rmp->regprog->engine->regexec_multi(
|
|
|
073263 |
! rmp, win, buf, lnum, col, tm);
|
|
|
073263 |
!
|
|
|
073263 |
! /* NFA engine aborted because it's very slow. */
|
|
|
073263 |
! if (rmp->regprog->re_engine == AUTOMATIC_ENGINE
|
|
|
073263 |
! && result == NFA_TOO_EXPENSIVE)
|
|
|
073263 |
! {
|
|
|
073263 |
! int save_p_re = p_re;
|
|
|
073263 |
! int re_flags = rmp->regprog->re_flags;
|
|
|
073263 |
! char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern);
|
|
|
073263 |
!
|
|
|
073263 |
! p_re = BACKTRACKING_ENGINE;
|
|
|
073263 |
! vim_regfree(rmp->regprog);
|
|
|
073263 |
! if (pat != NULL)
|
|
|
073263 |
! {
|
|
|
073263 |
! #ifdef FEAT_EVAL
|
|
|
073263 |
! report_re_switch(pat);
|
|
|
073263 |
! #endif
|
|
|
073263 |
! rmp->regprog = vim_regcomp(pat, re_flags);
|
|
|
073263 |
! if (rmp->regprog != NULL)
|
|
|
073263 |
! result = rmp->regprog->engine->regexec_multi(
|
|
|
073263 |
! rmp, win, buf, lnum, col, tm);
|
|
|
073263 |
! vim_free(pat);
|
|
|
073263 |
! }
|
|
|
073263 |
! p_re = save_p_re;
|
|
|
073263 |
! }
|
|
|
073263 |
!
|
|
|
073263 |
! return result;
|
|
|
073263 |
}
|
|
|
073263 |
*** ../vim-7.4.496/src/regexp.h 2014-04-23 19:06:33.702828771 +0200
|
|
|
073263 |
--- src/regexp.h 2014-11-05 13:09:14.136870089 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 27,32 ****
|
|
|
073263 |
--- 27,44 ----
|
|
|
073263 |
*/
|
|
|
073263 |
#define NFA_MAX_BRACES 20
|
|
|
073263 |
|
|
|
073263 |
+ /*
|
|
|
073263 |
+ * In the NFA engine: how many states are allowed
|
|
|
073263 |
+ */
|
|
|
073263 |
+ #define NFA_MAX_STATES 100000
|
|
|
073263 |
+ #define NFA_TOO_EXPENSIVE -1
|
|
|
073263 |
+
|
|
|
073263 |
+ /* Which regexp engine to use? Needed for vim_regcomp().
|
|
|
073263 |
+ * Must match with 'regexpengine'. */
|
|
|
073263 |
+ #define AUTOMATIC_ENGINE 0
|
|
|
073263 |
+ #define BACKTRACKING_ENGINE 1
|
|
|
073263 |
+ #define NFA_ENGINE 2
|
|
|
073263 |
+
|
|
|
073263 |
typedef struct regengine regengine_T;
|
|
|
073263 |
|
|
|
073263 |
/*
|
|
|
073263 |
***************
|
|
|
073263 |
*** 38,43 ****
|
|
|
073263 |
--- 50,57 ----
|
|
|
073263 |
{
|
|
|
073263 |
regengine_T *engine;
|
|
|
073263 |
unsigned regflags;
|
|
|
073263 |
+ unsigned re_engine; /* automatic, backtracking or nfa engine */
|
|
|
073263 |
+ unsigned re_flags; /* second argument for vim_regcomp() */
|
|
|
073263 |
} regprog_T;
|
|
|
073263 |
|
|
|
073263 |
/*
|
|
|
073263 |
***************
|
|
|
073263 |
*** 47,55 ****
|
|
|
073263 |
*/
|
|
|
073263 |
typedef struct
|
|
|
073263 |
{
|
|
|
073263 |
! /* These two members implement regprog_T */
|
|
|
073263 |
regengine_T *engine;
|
|
|
073263 |
unsigned regflags;
|
|
|
073263 |
|
|
|
073263 |
int regstart;
|
|
|
073263 |
char_u reganch;
|
|
|
073263 |
--- 61,71 ----
|
|
|
073263 |
*/
|
|
|
073263 |
typedef struct
|
|
|
073263 |
{
|
|
|
073263 |
! /* These four members implement regprog_T */
|
|
|
073263 |
regengine_T *engine;
|
|
|
073263 |
unsigned regflags;
|
|
|
073263 |
+ unsigned re_engine;
|
|
|
073263 |
+ unsigned re_flags; /* second argument for vim_regcomp() */
|
|
|
073263 |
|
|
|
073263 |
int regstart;
|
|
|
073263 |
char_u reganch;
|
|
|
073263 |
***************
|
|
|
073263 |
*** 81,89 ****
|
|
|
073263 |
*/
|
|
|
073263 |
typedef struct
|
|
|
073263 |
{
|
|
|
073263 |
! /* These two members implement regprog_T */
|
|
|
073263 |
regengine_T *engine;
|
|
|
073263 |
unsigned regflags;
|
|
|
073263 |
|
|
|
073263 |
nfa_state_T *start; /* points into state[] */
|
|
|
073263 |
|
|
|
073263 |
--- 97,107 ----
|
|
|
073263 |
*/
|
|
|
073263 |
typedef struct
|
|
|
073263 |
{
|
|
|
073263 |
! /* These three members implement regprog_T */
|
|
|
073263 |
regengine_T *engine;
|
|
|
073263 |
unsigned regflags;
|
|
|
073263 |
+ unsigned re_engine;
|
|
|
073263 |
+ unsigned re_flags; /* second argument for vim_regcomp() */
|
|
|
073263 |
|
|
|
073263 |
nfa_state_T *start; /* points into state[] */
|
|
|
073263 |
|
|
|
073263 |
***************
|
|
|
073263 |
*** 96,104 ****
|
|
|
073263 |
#ifdef FEAT_SYN_HL
|
|
|
073263 |
int reghasz;
|
|
|
073263 |
#endif
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
char_u *pattern;
|
|
|
073263 |
- #endif
|
|
|
073263 |
int nsubexp; /* number of () */
|
|
|
073263 |
int nstate;
|
|
|
073263 |
nfa_state_T state[1]; /* actually longer.. */
|
|
|
073263 |
--- 114,120 ----
|
|
|
073263 |
***************
|
|
|
073263 |
*** 151,159 ****
|
|
|
073263 |
void (*regfree)(regprog_T *);
|
|
|
073263 |
int (*regexec_nl)(regmatch_T*, char_u*, colnr_T, int);
|
|
|
073263 |
long (*regexec_multi)(regmmatch_T*, win_T*, buf_T*, linenr_T, colnr_T, proftime_T*);
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
char_u *expr;
|
|
|
073263 |
- #endif
|
|
|
073263 |
};
|
|
|
073263 |
|
|
|
073263 |
#endif /* _REGEXP_H */
|
|
|
073263 |
--- 167,173 ----
|
|
|
073263 |
*** ../vim-7.4.496/src/regexp_nfa.c 2014-10-11 12:48:22.541259950 +0200
|
|
|
073263 |
--- src/regexp_nfa.c 2014-11-05 13:08:43.876870818 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 5522,5527 ****
|
|
|
073263 |
--- 5522,5534 ----
|
|
|
073263 |
nextlist->n = 0; /* clear nextlist */
|
|
|
073263 |
nextlist->has_pim = FALSE;
|
|
|
073263 |
++nfa_listid;
|
|
|
073263 |
+ if (prog->re_engine == AUTOMATIC_ENGINE && nfa_listid >= NFA_MAX_STATES)
|
|
|
073263 |
+ {
|
|
|
073263 |
+ /* too many states, retry with old engine */
|
|
|
073263 |
+ nfa_match = NFA_TOO_EXPENSIVE;
|
|
|
073263 |
+ goto theend;
|
|
|
073263 |
+ }
|
|
|
073263 |
+
|
|
|
073263 |
thislist->id = nfa_listid;
|
|
|
073263 |
nextlist->id = nfa_listid + 1;
|
|
|
073263 |
|
|
|
073263 |
***************
|
|
|
073263 |
*** 5704,5709 ****
|
|
|
073263 |
--- 5711,5721 ----
|
|
|
073263 |
*/
|
|
|
073263 |
result = recursive_regmatch(t->state, NULL, prog,
|
|
|
073263 |
submatch, m, &listids);
|
|
|
073263 |
+ if (result == NFA_TOO_EXPENSIVE)
|
|
|
073263 |
+ {
|
|
|
073263 |
+ nfa_match = result;
|
|
|
073263 |
+ goto theend;
|
|
|
073263 |
+ }
|
|
|
073263 |
|
|
|
073263 |
/* for \@! and \@
|
|
|
073263 |
* FALSE */
|
|
|
073263 |
***************
|
|
|
073263 |
*** 5817,5822 ****
|
|
|
073263 |
--- 5829,5839 ----
|
|
|
073263 |
/* First try matching the pattern. */
|
|
|
073263 |
result = recursive_regmatch(t->state, NULL, prog,
|
|
|
073263 |
submatch, m, &listids);
|
|
|
073263 |
+ if (result == NFA_TOO_EXPENSIVE)
|
|
|
073263 |
+ {
|
|
|
073263 |
+ nfa_match = result;
|
|
|
073263 |
+ goto theend;
|
|
|
073263 |
+ }
|
|
|
073263 |
if (result)
|
|
|
073263 |
{
|
|
|
073263 |
int bytelen;
|
|
|
073263 |
***************
|
|
|
073263 |
*** 6760,6765 ****
|
|
|
073263 |
--- 6777,6783 ----
|
|
|
073263 |
int i;
|
|
|
073263 |
regsubs_T subs, m;
|
|
|
073263 |
nfa_state_T *start = prog->start;
|
|
|
073263 |
+ int result;
|
|
|
073263 |
#ifdef ENABLE_LOG
|
|
|
073263 |
FILE *f;
|
|
|
073263 |
#endif
|
|
|
073263 |
***************
|
|
|
073263 |
*** 6791,6798 ****
|
|
|
073263 |
clear_sub(&m.synt);
|
|
|
073263 |
#endif
|
|
|
073263 |
|
|
|
073263 |
! if (nfa_regmatch(prog, start, &subs, &m) == FALSE)
|
|
|
073263 |
return 0;
|
|
|
073263 |
|
|
|
073263 |
cleanup_subexpr();
|
|
|
073263 |
if (REG_MULTI)
|
|
|
073263 |
--- 6809,6819 ----
|
|
|
073263 |
clear_sub(&m.synt);
|
|
|
073263 |
#endif
|
|
|
073263 |
|
|
|
073263 |
! result = nfa_regmatch(prog, start, &subs, &m);
|
|
|
073263 |
! if (result == FALSE)
|
|
|
073263 |
return 0;
|
|
|
073263 |
+ else if (result == NFA_TOO_EXPENSIVE)
|
|
|
073263 |
+ return result;
|
|
|
073263 |
|
|
|
073263 |
cleanup_subexpr();
|
|
|
073263 |
if (REG_MULTI)
|
|
|
073263 |
***************
|
|
|
073263 |
*** 6929,6937 ****
|
|
|
073263 |
nfa_nsubexpr = prog->nsubexp;
|
|
|
073263 |
nfa_listid = 1;
|
|
|
073263 |
nfa_alt_listid = 2;
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
nfa_regengine.expr = prog->pattern;
|
|
|
073263 |
- #endif
|
|
|
073263 |
|
|
|
073263 |
if (prog->reganch && col > 0)
|
|
|
073263 |
return 0L;
|
|
|
073263 |
--- 6950,6956 ----
|
|
|
073263 |
***************
|
|
|
073263 |
*** 6979,6987 ****
|
|
|
073263 |
|
|
|
073263 |
retval = nfa_regtry(prog, col);
|
|
|
073263 |
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
nfa_regengine.expr = NULL;
|
|
|
073263 |
- #endif
|
|
|
073263 |
|
|
|
073263 |
theend:
|
|
|
073263 |
return retval;
|
|
|
073263 |
--- 6998,7004 ----
|
|
|
073263 |
***************
|
|
|
073263 |
*** 7003,7011 ****
|
|
|
073263 |
if (expr == NULL)
|
|
|
073263 |
return NULL;
|
|
|
073263 |
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
nfa_regengine.expr = expr;
|
|
|
073263 |
- #endif
|
|
|
073263 |
|
|
|
073263 |
init_class_tab();
|
|
|
073263 |
|
|
|
073263 |
--- 7020,7026 ----
|
|
|
073263 |
***************
|
|
|
073263 |
*** 7082,7091 ****
|
|
|
073263 |
/* Remember whether this pattern has any \z specials in it. */
|
|
|
073263 |
prog->reghasz = re_has_z;
|
|
|
073263 |
#endif
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
prog->pattern = vim_strsave(expr);
|
|
|
073263 |
nfa_regengine.expr = NULL;
|
|
|
073263 |
- #endif
|
|
|
073263 |
|
|
|
073263 |
out:
|
|
|
073263 |
vim_free(post_start);
|
|
|
073263 |
--- 7097,7104 ----
|
|
|
073263 |
***************
|
|
|
073263 |
*** 7099,7107 ****
|
|
|
073263 |
#ifdef ENABLE_LOG
|
|
|
073263 |
nfa_postfix_dump(expr, FAIL);
|
|
|
073263 |
#endif
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
nfa_regengine.expr = NULL;
|
|
|
073263 |
- #endif
|
|
|
073263 |
goto out;
|
|
|
073263 |
}
|
|
|
073263 |
|
|
|
073263 |
--- 7112,7118 ----
|
|
|
073263 |
***************
|
|
|
073263 |
*** 7115,7123 ****
|
|
|
073263 |
if (prog != NULL)
|
|
|
073263 |
{
|
|
|
073263 |
vim_free(((nfa_regprog_T *)prog)->match_text);
|
|
|
073263 |
- #ifdef DEBUG
|
|
|
073263 |
vim_free(((nfa_regprog_T *)prog)->pattern);
|
|
|
073263 |
- #endif
|
|
|
073263 |
vim_free(prog);
|
|
|
073263 |
}
|
|
|
073263 |
}
|
|
|
073263 |
--- 7126,7132 ----
|
|
|
073263 |
*** ../vim-7.4.496/src/testdir/Make_dos.mak 2014-10-21 20:57:11.534295006 +0200
|
|
|
073263 |
--- src/testdir/Make_dos.mak 2014-11-05 14:14:56.536775091 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 87,92 ****
|
|
|
073263 |
--- 87,93 ----
|
|
|
073263 |
-if exist Xfind rd /s /q Xfind
|
|
|
073263 |
-if exist viminfo del viminfo
|
|
|
073263 |
-del test.log
|
|
|
073263 |
+ -if exists benchmark.out del benchmark.out
|
|
|
073263 |
|
|
|
073263 |
.in.out:
|
|
|
073263 |
-if exist $*.failed del $*.failed
|
|
|
073263 |
***************
|
|
|
073263 |
*** 103,105 ****
|
|
|
073263 |
--- 104,114 ----
|
|
|
073263 |
|
|
|
073263 |
nolog:
|
|
|
073263 |
-del test.log
|
|
|
073263 |
+
|
|
|
073263 |
+ benchmark:
|
|
|
073263 |
+ bench_re_freeze.out
|
|
|
073263 |
+
|
|
|
073263 |
+ bench_re_freeze.out: bench_re_freeze.vim
|
|
|
073263 |
+ -if exist benchmark.out del benchmark.out
|
|
|
073263 |
+ $(VIMPROG) -u dos.vim -U NONE --noplugin $*.in
|
|
|
073263 |
+ @IF EXIST benchmark.out ( type benchmark.out )
|
|
|
073263 |
*** ../vim-7.4.496/src/testdir/Make_ming.mak 2014-10-21 20:57:11.534295006 +0200
|
|
|
073263 |
--- src/testdir/Make_ming.mak 2014-11-05 14:15:09.608774776 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 12,22 ****
|
|
|
073263 |
--- 12,24 ----
|
|
|
073263 |
DEL = rm -f
|
|
|
073263 |
MV = mv
|
|
|
073263 |
CP = cp
|
|
|
073263 |
+ CAT = cat
|
|
|
073263 |
DIRSLASH = /
|
|
|
073263 |
else
|
|
|
073263 |
DEL = del
|
|
|
073263 |
MV = rename
|
|
|
073263 |
CP = copy
|
|
|
073263 |
+ CAT = type
|
|
|
073263 |
DIRSLASH = \\
|
|
|
073263 |
endif
|
|
|
073263 |
|
|
|
073263 |
***************
|
|
|
073263 |
*** 72,77 ****
|
|
|
073263 |
--- 74,81 ----
|
|
|
073263 |
|
|
|
073263 |
SCRIPTS_GUI = test16.out
|
|
|
073263 |
|
|
|
073263 |
+ SCRIPTS_BENCH = bench_re_freeze.out
|
|
|
073263 |
+
|
|
|
073263 |
.SUFFIXES: .in .out
|
|
|
073263 |
|
|
|
073263 |
vimall: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32)
|
|
|
073263 |
***************
|
|
|
073263 |
*** 80,85 ****
|
|
|
073263 |
--- 84,91 ----
|
|
|
073263 |
nongui: fixff $(SCRIPTS16) $(SCRIPTS)
|
|
|
073263 |
echo ALL DONE
|
|
|
073263 |
|
|
|
073263 |
+ benchmark: $(SCRIPTS_BENCH)
|
|
|
073263 |
+
|
|
|
073263 |
small:
|
|
|
073263 |
echo ALL DONE
|
|
|
073263 |
|
|
|
073263 |
***************
|
|
|
073263 |
*** 114,116 ****
|
|
|
073263 |
--- 120,127 ----
|
|
|
073263 |
-$(DEL) X*
|
|
|
073263 |
-$(DEL) test.ok
|
|
|
073263 |
-$(DEL) viminfo
|
|
|
073263 |
+
|
|
|
073263 |
+ bench_re_freeze.out: bench_re_freeze.vim
|
|
|
073263 |
+ -$(DEL) benchmark.out
|
|
|
073263 |
+ $(VIMPROG) -u dos.vim -U NONE --noplugin $*.in
|
|
|
073263 |
+ $(CAT) benchmark.out
|
|
|
073263 |
*** ../vim-7.4.496/src/testdir/Make_os2.mak 2014-10-21 20:57:11.538295006 +0200
|
|
|
073263 |
--- src/testdir/Make_os2.mak 2014-11-05 12:57:59.616886342 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 50,55 ****
|
|
|
073263 |
--- 50,57 ----
|
|
|
073263 |
test_signs.out \
|
|
|
073263 |
test_utf8.out
|
|
|
073263 |
|
|
|
073263 |
+ SCRIPTS_BENCH = bench_re_freeze.out
|
|
|
073263 |
+
|
|
|
073263 |
.SUFFIXES: .in .out
|
|
|
073263 |
|
|
|
073263 |
all: /tmp $(SCRIPTS)
|
|
|
073263 |
***************
|
|
|
073263 |
*** 57,62 ****
|
|
|
073263 |
--- 59,66 ----
|
|
|
073263 |
|
|
|
073263 |
$(SCRIPTS): $(VIMPROG)
|
|
|
073263 |
|
|
|
073263 |
+ benchmark: $(SCRIPTS_BENCH)
|
|
|
073263 |
+
|
|
|
073263 |
clean:
|
|
|
073263 |
-rm -rf *.out Xdotest test.ok tiny.vim small.vim mbyte.vim viminfo
|
|
|
073263 |
|
|
|
073263 |
***************
|
|
|
073263 |
*** 75,77 ****
|
|
|
073263 |
--- 79,88 ----
|
|
|
073263 |
# Create a directory for temp files
|
|
|
073263 |
/tmp:
|
|
|
073263 |
-mkdir /tmp
|
|
|
073263 |
+
|
|
|
073263 |
+ bench_re_freeze.out: bench_re_freeze.vim
|
|
|
073263 |
+ -del $*.failed test.ok benchmark.out
|
|
|
073263 |
+ copy $*.ok test.ok
|
|
|
073263 |
+ $(VIMPROG) -u os2.vim --noplugin -s dotest.in $*.in
|
|
|
073263 |
+ type benchmark.out
|
|
|
073263 |
+
|
|
|
073263 |
*** ../vim-7.4.496/src/testdir/Makefile 2014-10-21 20:57:11.538295006 +0200
|
|
|
073263 |
--- src/testdir/Makefile 2014-11-05 14:15:13.320774687 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 48,59 ****
|
|
|
073263 |
--- 48,63 ----
|
|
|
073263 |
|
|
|
073263 |
SCRIPTS_GUI = test16.out
|
|
|
073263 |
|
|
|
073263 |
+ SCRIPTS_BENCH = bench_re_freeze.out
|
|
|
073263 |
+
|
|
|
073263 |
.SUFFIXES: .in .out
|
|
|
073263 |
|
|
|
073263 |
nongui: nolog $(SCRIPTS) report
|
|
|
073263 |
|
|
|
073263 |
gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) report
|
|
|
073263 |
|
|
|
073263 |
+ benchmark: $(SCRIPTS_BENCH)
|
|
|
073263 |
+
|
|
|
073263 |
report:
|
|
|
073263 |
@echo
|
|
|
073263 |
@echo 'Test results:'
|
|
|
073263 |
***************
|
|
|
073263 |
*** 65,71 ****
|
|
|
073263 |
$(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
|
|
|
073263 |
|
|
|
073263 |
RM_ON_RUN = test.out X* viminfo
|
|
|
073263 |
! RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim lua.vim test.ok
|
|
|
073263 |
RUN_VIM = VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in
|
|
|
073263 |
|
|
|
073263 |
clean:
|
|
|
073263 |
--- 69,75 ----
|
|
|
073263 |
$(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
|
|
|
073263 |
|
|
|
073263 |
RM_ON_RUN = test.out X* viminfo
|
|
|
073263 |
! RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim lua.vim test.ok benchmark.out
|
|
|
073263 |
RUN_VIM = VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in
|
|
|
073263 |
|
|
|
073263 |
clean:
|
|
|
073263 |
***************
|
|
|
073263 |
*** 120,124 ****
|
|
|
073263 |
--- 124,137 ----
|
|
|
073263 |
|
|
|
073263 |
test60.out: test60.vim
|
|
|
073263 |
|
|
|
073263 |
+ bench_re_freeze.out: bench_re_freeze.vim
|
|
|
073263 |
+ -rm -rf benchmark.out $(RM_ON_RUN)
|
|
|
073263 |
+ # Sleep a moment to avoid that the xterm title is messed up.
|
|
|
073263 |
+ # 200 msec is sufficient, but only modern sleep supports a fraction of
|
|
|
073263 |
+ # a second, fall back to a second if it fails.
|
|
|
073263 |
+ @-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
|
|
|
073263 |
+ -$(RUN_VIM) $*.in
|
|
|
073263 |
+ @/bin/sh -c "if test -f benchmark.out; then cat benchmark.out; fi"
|
|
|
073263 |
+
|
|
|
073263 |
nolog:
|
|
|
073263 |
-rm -f test.log
|
|
|
073263 |
*** ../vim-7.4.496/src/testdir/samples/re.freeze.txt 1970-01-01 01:00:00.000000000 +0100
|
|
|
073263 |
--- src/testdir/samples/re.freeze.txt 2014-11-05 11:50:44.176983582 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 0 ****
|
|
|
073263 |
--- 1,6 ----
|
|
|
073263 |
+ :set re=0 or 2
|
|
|
073263 |
+ Search for the pattern: /\s\+\%#\@
|
|
|
073263 |
+ vim should not freeze.
|
|
|
073263 |
+
|
|
|
073263 |
+ <font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font>
|
|
|
073263 |
+
|
|
|
073263 |
*** ../vim-7.4.496/src/testdir/bench_re_freeze.in 2014-11-05 14:02:46.420792685 +0100
|
|
|
073263 |
--- src/testdir/bench_re_freeze.in 2014-11-05 14:24:33.000761201 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 0 ****
|
|
|
073263 |
--- 1,13 ----
|
|
|
073263 |
+ Test for Benchmarking RE engine
|
|
|
073263 |
+
|
|
|
073263 |
+ STARTTEST
|
|
|
073263 |
+ :so small.vim
|
|
|
073263 |
+ :if !has("reltime") | qa! | endif
|
|
|
073263 |
+ :set nocp cpo&vim
|
|
|
073263 |
+ :so bench_re_freeze.vim
|
|
|
073263 |
+ :call Measure('samples/re.freeze.txt', '\s\+\%#\@
|
|
|
073263 |
+ :/^" Benchmark/,$w! benchmark.out
|
|
|
073263 |
+ :qa!
|
|
|
073263 |
+ ENDTEST
|
|
|
073263 |
+
|
|
|
073263 |
+ " Benchmark_results:
|
|
|
073263 |
*** ../vim-7.4.496/src/testdir/bench_re_freeze.vim 2014-11-05 14:02:46.432792684 +0100
|
|
|
073263 |
--- src/testdir/bench_re_freeze.vim 2014-11-05 14:09:15.668783305 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 0 ****
|
|
|
073263 |
--- 1,13 ----
|
|
|
073263 |
+ "Test for benchmarking the RE engine
|
|
|
073263 |
+
|
|
|
073263 |
+ so small.vim
|
|
|
073263 |
+ if !has("reltime") | finish | endif
|
|
|
073263 |
+ func! Measure(file, pattern, arg)
|
|
|
073263 |
+ for re in range(3)
|
|
|
073263 |
+ let sstart=reltime()
|
|
|
073263 |
+ let cmd=printf("../vim -u NONE -N --cmd ':set re=%d'".
|
|
|
073263 |
+ \ " -c 'call search(\"%s\", \"\", \"\", 10000)' -c ':q!' %s", re, escape(a:pattern, '\\'), empty(a:arg) ? '' : a:arg)
|
|
|
073263 |
+ call system(cmd. ' '. a:file)
|
|
|
073263 |
+ $put =printf('file: %s, re: %d, time: %s', a:file, re, reltimestr(reltime(sstart)))
|
|
|
073263 |
+ endfor
|
|
|
073263 |
+ endfunc
|
|
|
073263 |
*** ../vim-7.4.497/Filelist 2014-11-05 13:53:13.188806497 +0100
|
|
|
073263 |
--- Filelist 2014-11-05 14:11:48.208779629 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 102,107 ****
|
|
|
073263 |
--- 102,110 ----
|
|
|
073263 |
src/testdir/pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py \
|
|
|
073263 |
src/testdir/python_after/*.py \
|
|
|
073263 |
src/testdir/python_before/*.py \
|
|
|
073263 |
+ src/testdir/bench*.in \
|
|
|
073263 |
+ src/testdir/bench*.vim \
|
|
|
073263 |
+ src/testdir/samples.*.txt \
|
|
|
073263 |
src/proto.h \
|
|
|
073263 |
src/proto/blowfish.pro \
|
|
|
073263 |
src/proto/buffer.pro \
|
|
|
073263 |
*** ../vim-7.4.496/src/version.c 2014-11-05 13:53:13.188806497 +0100
|
|
|
073263 |
--- src/version.c 2014-11-05 14:02:11.728793520 +0100
|
|
|
073263 |
***************
|
|
|
073263 |
*** 743,744 ****
|
|
|
073263 |
--- 743,746 ----
|
|
|
073263 |
{ /* Add new patch number below this line */
|
|
|
073263 |
+ /**/
|
|
|
073263 |
+ 497,
|
|
|
073263 |
/**/
|
|
|
073263 |
|
|
|
073263 |
--
|
|
|
073263 |
With sufficient thrust, pigs fly just fine.
|
|
|
073263 |
-- RFC 1925
|
|
|
073263 |
|
|
|
073263 |
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
|
|
|
073263 |
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
|
|
|
073263 |
\\\ an exciting new programming language -- http://www.Zimbu.org ///
|
|
|
073263 |
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
|