|
Karsten Hopp |
34ad50 |
To: vim_dev@googlegroups.com
|
|
Karsten Hopp |
34ad50 |
Subject: Patch 7.3.1037
|
|
Karsten Hopp |
34ad50 |
Fcc: outbox
|
|
Karsten Hopp |
34ad50 |
From: Bram Moolenaar <Bram@moolenaar.net>
|
|
Karsten Hopp |
34ad50 |
Mime-Version: 1.0
|
|
Karsten Hopp |
34ad50 |
Content-Type: text/plain; charset=UTF-8
|
|
Karsten Hopp |
34ad50 |
Content-Transfer-Encoding: 8bit
|
|
Karsten Hopp |
34ad50 |
------------
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
Patch 7.3.1037
|
|
Karsten Hopp |
34ad50 |
Problem: Look-behind matching is very slow on long lines.
|
|
Karsten Hopp |
34ad50 |
Solution: Add a byte limit to how far back an attempt is made.
|
|
Karsten Hopp |
34ad50 |
Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
|
|
Karsten Hopp |
34ad50 |
src/testdir/test64.ok
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
*** ../vim-7.3.1036/src/regexp.c 2013-05-21 21:37:01.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
--- src/regexp.c 2013-05-29 14:34:51.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 701,706 ****
|
|
Karsten Hopp |
34ad50 |
--- 701,707 ----
|
|
Karsten Hopp |
34ad50 |
# define CASEMBC(x)
|
|
Karsten Hopp |
34ad50 |
#endif
|
|
Karsten Hopp |
34ad50 |
static void reginsert __ARGS((int, char_u *));
|
|
Karsten Hopp |
34ad50 |
+ static void reginsert_nr __ARGS((int op, long val, char_u *opnd));
|
|
Karsten Hopp |
34ad50 |
static void reginsert_limits __ARGS((int, long, long, char_u *));
|
|
Karsten Hopp |
34ad50 |
static char_u *re_put_long __ARGS((char_u *pr, long_u val));
|
|
Karsten Hopp |
34ad50 |
static int read_limits __ARGS((long *, long *));
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 1781,1787 ****
|
|
Karsten Hopp |
34ad50 |
--- 1782,1790 ----
|
|
Karsten Hopp |
34ad50 |
case Magic('@'):
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
int lop = END;
|
|
Karsten Hopp |
34ad50 |
+ int nr;
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
+ nr = getdecchrs();
|
|
Karsten Hopp |
34ad50 |
switch (no_Magic(getchr()))
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
case '=': lop = MATCH; break; /* \@= */
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 1803,1809 ****
|
|
Karsten Hopp |
34ad50 |
*flagp |= HASLOOKBH;
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
regtail(ret, regnode(END)); /* operand ends */
|
|
Karsten Hopp |
34ad50 |
! reginsert(lop, ret);
|
|
Karsten Hopp |
34ad50 |
break;
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
--- 1806,1819 ----
|
|
Karsten Hopp |
34ad50 |
*flagp |= HASLOOKBH;
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
regtail(ret, regnode(END)); /* operand ends */
|
|
Karsten Hopp |
34ad50 |
! if (lop == BEHIND || lop == NOBEHIND)
|
|
Karsten Hopp |
34ad50 |
! {
|
|
Karsten Hopp |
34ad50 |
! if (nr < 0)
|
|
Karsten Hopp |
34ad50 |
! nr = 0; /* no limit is same as zero limit */
|
|
Karsten Hopp |
34ad50 |
! reginsert_nr(lop, nr, ret);
|
|
Karsten Hopp |
34ad50 |
! }
|
|
Karsten Hopp |
34ad50 |
! else
|
|
Karsten Hopp |
34ad50 |
! reginsert(lop, ret);
|
|
Karsten Hopp |
34ad50 |
break;
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 2780,2785 ****
|
|
Karsten Hopp |
34ad50 |
--- 2790,2827 ----
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
/*
|
|
Karsten Hopp |
34ad50 |
* Insert an operator in front of already-emitted operand.
|
|
Karsten Hopp |
34ad50 |
+ * Add a number to the operator.
|
|
Karsten Hopp |
34ad50 |
+ */
|
|
Karsten Hopp |
34ad50 |
+ static void
|
|
Karsten Hopp |
34ad50 |
+ reginsert_nr(op, val, opnd)
|
|
Karsten Hopp |
34ad50 |
+ int op;
|
|
Karsten Hopp |
34ad50 |
+ long val;
|
|
Karsten Hopp |
34ad50 |
+ char_u *opnd;
|
|
Karsten Hopp |
34ad50 |
+ {
|
|
Karsten Hopp |
34ad50 |
+ char_u *src;
|
|
Karsten Hopp |
34ad50 |
+ char_u *dst;
|
|
Karsten Hopp |
34ad50 |
+ char_u *place;
|
|
Karsten Hopp |
34ad50 |
+
|
|
Karsten Hopp |
34ad50 |
+ if (regcode == JUST_CALC_SIZE)
|
|
Karsten Hopp |
34ad50 |
+ {
|
|
Karsten Hopp |
34ad50 |
+ regsize += 7;
|
|
Karsten Hopp |
34ad50 |
+ return;
|
|
Karsten Hopp |
34ad50 |
+ }
|
|
Karsten Hopp |
34ad50 |
+ src = regcode;
|
|
Karsten Hopp |
34ad50 |
+ regcode += 7;
|
|
Karsten Hopp |
34ad50 |
+ dst = regcode;
|
|
Karsten Hopp |
34ad50 |
+ while (src > opnd)
|
|
Karsten Hopp |
34ad50 |
+ *--dst = *--src;
|
|
Karsten Hopp |
34ad50 |
+
|
|
Karsten Hopp |
34ad50 |
+ place = opnd; /* Op node, where operand used to be. */
|
|
Karsten Hopp |
34ad50 |
+ *place++ = op;
|
|
Karsten Hopp |
34ad50 |
+ *place++ = NUL;
|
|
Karsten Hopp |
34ad50 |
+ *place++ = NUL;
|
|
Karsten Hopp |
34ad50 |
+ place = re_put_long(place, (long_u)val);
|
|
Karsten Hopp |
34ad50 |
+ }
|
|
Karsten Hopp |
34ad50 |
+
|
|
Karsten Hopp |
34ad50 |
+ /*
|
|
Karsten Hopp |
34ad50 |
+ * Insert an operator in front of already-emitted operand.
|
|
Karsten Hopp |
34ad50 |
* The operator has the given limit values as operands. Also set next pointer.
|
|
Karsten Hopp |
34ad50 |
*
|
|
Karsten Hopp |
34ad50 |
* Means relocating the operand.
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 3182,3188 ****
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
/*
|
|
Karsten Hopp |
34ad50 |
! * get and return the value of the decimal string immediately after the
|
|
Karsten Hopp |
34ad50 |
* current position. Return -1 for invalid. Consumes all digits.
|
|
Karsten Hopp |
34ad50 |
*/
|
|
Karsten Hopp |
34ad50 |
static int
|
|
Karsten Hopp |
34ad50 |
--- 3224,3230 ----
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
/*
|
|
Karsten Hopp |
34ad50 |
! * Get and return the value of the decimal string immediately after the
|
|
Karsten Hopp |
34ad50 |
* current position. Return -1 for invalid. Consumes all digits.
|
|
Karsten Hopp |
34ad50 |
*/
|
|
Karsten Hopp |
34ad50 |
static int
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 3200,3205 ****
|
|
Karsten Hopp |
34ad50 |
--- 3242,3248 ----
|
|
Karsten Hopp |
34ad50 |
nr *= 10;
|
|
Karsten Hopp |
34ad50 |
nr += c - '0';
|
|
Karsten Hopp |
34ad50 |
++regparse;
|
|
Karsten Hopp |
34ad50 |
+ curchr = -1; /* no longer valid */
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
if (i == 0)
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 5432,5438 ****
|
|
Karsten Hopp |
34ad50 |
/* save the position after the found match for next */
|
|
Karsten Hopp |
34ad50 |
reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
! /* start looking for a match with operand at the current
|
|
Karsten Hopp |
34ad50 |
* position. Go back one character until we find the
|
|
Karsten Hopp |
34ad50 |
* result, hitting the start of the line or the previous
|
|
Karsten Hopp |
34ad50 |
* line (for multi-line matching).
|
|
Karsten Hopp |
34ad50 |
--- 5475,5481 ----
|
|
Karsten Hopp |
34ad50 |
/* save the position after the found match for next */
|
|
Karsten Hopp |
34ad50 |
reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
! /* Start looking for a match with operand at the current
|
|
Karsten Hopp |
34ad50 |
* position. Go back one character until we find the
|
|
Karsten Hopp |
34ad50 |
* result, hitting the start of the line or the previous
|
|
Karsten Hopp |
34ad50 |
* line (for multi-line matching).
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 5444,5450 ****
|
|
Karsten Hopp |
34ad50 |
rp->rs_state = RS_BEHIND2;
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
reg_restore(&rp->rs_un.regsave, &backpos);
|
|
Karsten Hopp |
34ad50 |
! scan = OPERAND(rp->rs_scan);
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
break;
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
--- 5487,5493 ----
|
|
Karsten Hopp |
34ad50 |
rp->rs_state = RS_BEHIND2;
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
reg_restore(&rp->rs_un.regsave, &backpos);
|
|
Karsten Hopp |
34ad50 |
! scan = OPERAND(rp->rs_scan) + 4;
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
break;
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 5472,5480 ****
|
|
Karsten Hopp |
34ad50 |
--- 5515,5526 ----
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
else
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
+ long limit;
|
|
Karsten Hopp |
34ad50 |
+
|
|
Karsten Hopp |
34ad50 |
/* No match or a match that doesn't end where we want it: Go
|
|
Karsten Hopp |
34ad50 |
* back one character. May go to previous line once. */
|
|
Karsten Hopp |
34ad50 |
no = OK;
|
|
Karsten Hopp |
34ad50 |
+ limit = OPERAND_MIN(rp->rs_scan);
|
|
Karsten Hopp |
34ad50 |
if (REG_MULTI)
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
if (rp->rs_un.regsave.rs_u.pos.col == 0)
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 5493,5519 ****
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
else
|
|
Karsten Hopp |
34ad50 |
#ifdef FEAT_MBYTE
|
|
Karsten Hopp |
34ad50 |
! if (has_mbyte)
|
|
Karsten Hopp |
34ad50 |
! rp->rs_un.regsave.rs_u.pos.col -=
|
|
Karsten Hopp |
34ad50 |
! (*mb_head_off)(regline, regline
|
|
Karsten Hopp |
34ad50 |
+ rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
|
|
Karsten Hopp |
34ad50 |
! else
|
|
Karsten Hopp |
34ad50 |
#endif
|
|
Karsten Hopp |
34ad50 |
! --rp->rs_un.regsave.rs_u.pos.col;
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
else
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
if (rp->rs_un.regsave.rs_u.ptr == regline)
|
|
Karsten Hopp |
34ad50 |
no = FAIL;
|
|
Karsten Hopp |
34ad50 |
else
|
|
Karsten Hopp |
34ad50 |
! --rp->rs_un.regsave.rs_u.ptr;
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
if (no == OK)
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
/* Advanced, prepare for finding match again. */
|
|
Karsten Hopp |
34ad50 |
reg_restore(&rp->rs_un.regsave, &backpos);
|
|
Karsten Hopp |
34ad50 |
! scan = OPERAND(rp->rs_scan);
|
|
Karsten Hopp |
34ad50 |
if (status == RA_MATCH)
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
/* We did match, so subexpr may have been changed,
|
|
Karsten Hopp |
34ad50 |
--- 5539,5579 ----
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
else
|
|
Karsten Hopp |
34ad50 |
+ {
|
|
Karsten Hopp |
34ad50 |
#ifdef FEAT_MBYTE
|
|
Karsten Hopp |
34ad50 |
! if (has_mbyte)
|
|
Karsten Hopp |
34ad50 |
! rp->rs_un.regsave.rs_u.pos.col -=
|
|
Karsten Hopp |
34ad50 |
! (*mb_head_off)(regline, regline
|
|
Karsten Hopp |
34ad50 |
+ rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
|
|
Karsten Hopp |
34ad50 |
! else
|
|
Karsten Hopp |
34ad50 |
#endif
|
|
Karsten Hopp |
34ad50 |
! --rp->rs_un.regsave.rs_u.pos.col;
|
|
Karsten Hopp |
34ad50 |
! if (limit > 0
|
|
Karsten Hopp |
34ad50 |
! && ((rp->rs_un.regsave.rs_u.pos.lnum
|
|
Karsten Hopp |
34ad50 |
! < behind_pos.rs_u.pos.lnum
|
|
Karsten Hopp |
34ad50 |
! ? (colnr_T)STRLEN(regline)
|
|
Karsten Hopp |
34ad50 |
! : behind_pos.rs_u.pos.col)
|
|
Karsten Hopp |
34ad50 |
! - rp->rs_un.regsave.rs_u.pos.col > limit))
|
|
Karsten Hopp |
34ad50 |
! no = FAIL;
|
|
Karsten Hopp |
34ad50 |
! }
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
else
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
if (rp->rs_un.regsave.rs_u.ptr == regline)
|
|
Karsten Hopp |
34ad50 |
no = FAIL;
|
|
Karsten Hopp |
34ad50 |
else
|
|
Karsten Hopp |
34ad50 |
! {
|
|
Karsten Hopp |
34ad50 |
! mb_ptr_back(regline, rp->rs_un.regsave.rs_u.ptr);
|
|
Karsten Hopp |
34ad50 |
! if (limit > 0 && (long)(behind_pos.rs_u.ptr
|
|
Karsten Hopp |
34ad50 |
! - rp->rs_un.regsave.rs_u.ptr) > limit)
|
|
Karsten Hopp |
34ad50 |
! no = FAIL;
|
|
Karsten Hopp |
34ad50 |
! }
|
|
Karsten Hopp |
34ad50 |
}
|
|
Karsten Hopp |
34ad50 |
if (no == OK)
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
/* Advanced, prepare for finding match again. */
|
|
Karsten Hopp |
34ad50 |
reg_restore(&rp->rs_un.regsave, &backpos);
|
|
Karsten Hopp |
34ad50 |
! scan = OPERAND(rp->rs_scan) + 4;
|
|
Karsten Hopp |
34ad50 |
if (status == RA_MATCH)
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
/* We did match, so subexpr may have been changed,
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 7773,7779 ****
|
|
Karsten Hopp |
34ad50 |
#ifdef DEBUG
|
|
Karsten Hopp |
34ad50 |
static char_u regname[][30] = {
|
|
Karsten Hopp |
34ad50 |
"AUTOMATIC Regexp Engine",
|
|
Karsten Hopp |
34ad50 |
! "BACKTACKING Regexp Engine",
|
|
Karsten Hopp |
34ad50 |
"NFA Regexp Engine"
|
|
Karsten Hopp |
34ad50 |
};
|
|
Karsten Hopp |
34ad50 |
#endif
|
|
Karsten Hopp |
34ad50 |
--- 7833,7839 ----
|
|
Karsten Hopp |
34ad50 |
#ifdef DEBUG
|
|
Karsten Hopp |
34ad50 |
static char_u regname[][30] = {
|
|
Karsten Hopp |
34ad50 |
"AUTOMATIC Regexp Engine",
|
|
Karsten Hopp |
34ad50 |
! "BACKTRACKING Regexp Engine",
|
|
Karsten Hopp |
34ad50 |
"NFA Regexp Engine"
|
|
Karsten Hopp |
34ad50 |
};
|
|
Karsten Hopp |
34ad50 |
#endif
|
|
Karsten Hopp |
34ad50 |
*** ../vim-7.3.1036/src/regexp_nfa.c 2013-05-28 22:52:11.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
--- src/regexp_nfa.c 2013-05-29 16:31:13.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 1331,1336 ****
|
|
Karsten Hopp |
34ad50 |
--- 1331,1346 ----
|
|
Karsten Hopp |
34ad50 |
case '=':
|
|
Karsten Hopp |
34ad50 |
EMIT(NFA_PREV_ATOM_NO_WIDTH);
|
|
Karsten Hopp |
34ad50 |
break;
|
|
Karsten Hopp |
34ad50 |
+ case '0':
|
|
Karsten Hopp |
34ad50 |
+ case '1':
|
|
Karsten Hopp |
34ad50 |
+ case '2':
|
|
Karsten Hopp |
34ad50 |
+ case '3':
|
|
Karsten Hopp |
34ad50 |
+ case '4':
|
|
Karsten Hopp |
34ad50 |
+ case '5':
|
|
Karsten Hopp |
34ad50 |
+ case '6':
|
|
Karsten Hopp |
34ad50 |
+ case '7':
|
|
Karsten Hopp |
34ad50 |
+ case '8':
|
|
Karsten Hopp |
34ad50 |
+ case '9':
|
|
Karsten Hopp |
34ad50 |
case '!':
|
|
Karsten Hopp |
34ad50 |
case '<':
|
|
Karsten Hopp |
34ad50 |
case '>':
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 3817,3823 ****
|
|
Karsten Hopp |
34ad50 |
* because recursive calls should only start in the first position.
|
|
Karsten Hopp |
34ad50 |
* Also don't start a match past the first line. */
|
|
Karsten Hopp |
34ad50 |
if (nfa_match == FALSE && start->c == NFA_MOPEN + 0
|
|
Karsten Hopp |
34ad50 |
! && reglnum == 0 && clen != 0)
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
#ifdef ENABLE_LOG
|
|
Karsten Hopp |
34ad50 |
fprintf(log_fd, "(---) STARTSTATE\n");
|
|
Karsten Hopp |
34ad50 |
--- 3827,3835 ----
|
|
Karsten Hopp |
34ad50 |
* because recursive calls should only start in the first position.
|
|
Karsten Hopp |
34ad50 |
* Also don't start a match past the first line. */
|
|
Karsten Hopp |
34ad50 |
if (nfa_match == FALSE && start->c == NFA_MOPEN + 0
|
|
Karsten Hopp |
34ad50 |
! && reglnum == 0 && clen != 0
|
|
Karsten Hopp |
34ad50 |
! && (ireg_maxcol == 0
|
|
Karsten Hopp |
34ad50 |
! || (colnr_T)(reginput - regline) < ireg_maxcol))
|
|
Karsten Hopp |
34ad50 |
{
|
|
Karsten Hopp |
34ad50 |
#ifdef ENABLE_LOG
|
|
Karsten Hopp |
34ad50 |
fprintf(log_fd, "(---) STARTSTATE\n");
|
|
Karsten Hopp |
34ad50 |
*** ../vim-7.3.1036/src/testdir/test64.in 2013-05-28 22:03:13.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
--- src/testdir/test64.in 2013-05-29 14:56:44.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 336,341 ****
|
|
Karsten Hopp |
34ad50 |
--- 336,349 ----
|
|
Karsten Hopp |
34ad50 |
:"call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
|
|
Karsten Hopp |
34ad50 |
:call add(tl, [2, '\(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9', 'xabcddefghiabcddefghix', 'abcddefghiabcddefghi', 'a', 'b', 'c', 'dd', 'e', 'f', 'g', 'h', 'i'])
|
|
Karsten Hopp |
34ad50 |
:"
|
|
Karsten Hopp |
34ad50 |
+ :"""" Look-behind with limit
|
|
Karsten Hopp |
34ad50 |
+ :call add(tl, [0, '<\@<=span.', 'xxspanxx
|
|
Karsten Hopp |
34ad50 |
+ :call add(tl, [0, '<\@1<=span.', 'xxspanxx
|
|
Karsten Hopp |
34ad50 |
+ :call add(tl, [0, '<\@2<=span.', 'xxspanxx
|
|
Karsten Hopp |
34ad50 |
+ :call add(tl, [0, '\(<<\)\@<=span.', 'xxspanxxxx
|
|
Karsten Hopp |
34ad50 |
+ :call add(tl, [0, '\(<<\)\@1<=span.', 'xxspanxxxx
|
|
Karsten Hopp |
34ad50 |
+ :call add(tl, [0, '\(<<\)\@2<=span.', 'xxspanxxxx
|
|
Karsten Hopp |
34ad50 |
+ :"
|
|
Karsten Hopp |
34ad50 |
:"""" Run the tests
|
|
Karsten Hopp |
34ad50 |
:"
|
|
Karsten Hopp |
34ad50 |
:"
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 406,411 ****
|
|
Karsten Hopp |
34ad50 |
--- 414,425 ----
|
|
Karsten Hopp |
34ad50 |
y$Go?p:"
|
|
Karsten Hopp |
34ad50 |
:"
|
|
Karsten Hopp |
34ad50 |
:"
|
|
Karsten Hopp |
34ad50 |
+ :" Check a pattern with a look beind crossing a line boundary
|
|
Karsten Hopp |
34ad50 |
+ /^Behind:
|
|
Karsten Hopp |
34ad50 |
+ /\(<\_[xy]\+\)\@3<=start
|
|
Karsten Hopp |
34ad50 |
+ :.yank
|
|
Karsten Hopp |
34ad50 |
+ Go?p:"
|
|
Karsten Hopp |
34ad50 |
+ :"
|
|
Karsten Hopp |
34ad50 |
:/\%#=1^Results/,$wq! test.out
|
|
Karsten Hopp |
34ad50 |
ENDTEST
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 423,426 ****
|
|
Karsten Hopp |
34ad50 |
--- 437,448 ----
|
|
Karsten Hopp |
34ad50 |
xjk
|
|
Karsten Hopp |
34ad50 |
lmn
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
+ Behind:
|
|
Karsten Hopp |
34ad50 |
+ asdfasd
|
|
Karsten Hopp |
34ad50 |
+ xxstart1
|
|
Karsten Hopp |
34ad50 |
+ asdfasd
|
|
Karsten Hopp |
34ad50 |
+ xxxxstart2
|
|
Karsten Hopp |
34ad50 |
+ asdfasd
|
|
Karsten Hopp |
34ad50 |
+ xxxstart3
|
|
Karsten Hopp |
34ad50 |
+
|
|
Karsten Hopp |
34ad50 |
Results of test64:
|
|
Karsten Hopp |
34ad50 |
*** ../vim-7.3.1036/src/testdir/test64.ok 2013-05-28 22:03:13.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
--- src/testdir/test64.ok 2013-05-29 14:59:37.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 719,724 ****
|
|
Karsten Hopp |
34ad50 |
--- 719,736 ----
|
|
Karsten Hopp |
34ad50 |
OK 0 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
|
|
Karsten Hopp |
34ad50 |
OK 1 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
|
|
Karsten Hopp |
34ad50 |
OK 2 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
|
|
Karsten Hopp |
34ad50 |
+ OK 0 - <\@<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 1 - <\@<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 0 - <\@1<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 1 - <\@1<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 0 - <\@2<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 1 - <\@2<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 0 - \(<<\)\@<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 1 - \(<<\)\@<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 0 - \(<<\)\@1<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 1 - \(<<\)\@1<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 0 - \(<<\)\@2<=span.
|
|
Karsten Hopp |
34ad50 |
+ OK 1 - \(<<\)\@2<=span.
|
|
Karsten Hopp |
34ad50 |
192.168.0.1
|
|
Karsten Hopp |
34ad50 |
192.168.0.1
|
|
Karsten Hopp |
34ad50 |
192.168.0.1
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 726,728 ****
|
|
Karsten Hopp |
34ad50 |
--- 738,742 ----
|
|
Karsten Hopp |
34ad50 |
<T="5">Ta 5</Title>
|
|
Karsten Hopp |
34ad50 |
<T="7">Ac 7</Title>
|
|
Karsten Hopp |
34ad50 |
ghi
|
|
Karsten Hopp |
34ad50 |
+
|
|
Karsten Hopp |
34ad50 |
+ xxxstart3
|
|
Karsten Hopp |
34ad50 |
*** ../vim-7.3.1036/src/version.c 2013-05-28 22:52:11.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
--- src/version.c 2013-05-29 13:20:48.000000000 +0200
|
|
Karsten Hopp |
34ad50 |
***************
|
|
Karsten Hopp |
34ad50 |
*** 730,731 ****
|
|
Karsten Hopp |
34ad50 |
--- 730,733 ----
|
|
Karsten Hopp |
34ad50 |
{ /* Add new patch number below this line */
|
|
Karsten Hopp |
34ad50 |
+ /**/
|
|
Karsten Hopp |
34ad50 |
+ 1037,
|
|
Karsten Hopp |
34ad50 |
/**/
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
--
|
|
Karsten Hopp |
34ad50 |
hundred-and-one symptoms of being an internet addict:
|
|
Karsten Hopp |
34ad50 |
11. You find yourself typing "com" after every period when using a word
|
|
Karsten Hopp |
34ad50 |
processor.com
|
|
Karsten Hopp |
34ad50 |
|
|
Karsten Hopp |
34ad50 |
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
|
|
Karsten Hopp |
34ad50 |
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
|
|
Karsten Hopp |
34ad50 |
\\\ an exciting new programming language -- http://www.Zimbu.org ///
|
|
Karsten Hopp |
34ad50 |
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
|