Revision: 919
http://vcs.pcre.org/viewvc?view=rev&revision=919
Author: ph10
Date: 2012-02-17 11:48:02 +0000 (Fri, 17 Feb 2012)
Log Message:
-----------
Fix partial match issues with CRLF and \r, and update tests.
Modified Paths:
--------------
code/trunk/ChangeLog
code/trunk/pcre_dfa_exec.c
code/trunk/pcre_exec.c
code/trunk/testdata/testinput2
code/trunk/testdata/testinput5
code/trunk/testdata/testinput8
code/trunk/testdata/testinput9
code/trunk/testdata/testoutput2
code/trunk/testdata/testoutput5
code/trunk/testdata/testoutput8
code/trunk/testdata/testoutput9
Modified: code/trunk/ChangeLog
===================================================================
--- code/trunk/ChangeLog 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/ChangeLog 2012-02-17 11:48:02 UTC (rev 919)
@@ -27,8 +27,11 @@
(c) \X did not give a hard partial match after matching one or more
characters at the end of the subject.
- (d) When newline was set to CRLF, a pattern such as /a$/ did not give a
- partial match for the string "\r".
+ (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize
+ a partial match for the string "\r".
+
+ (e) When newline was set to CRLF, the metacharacter "." did not recognize
+ a partial match for a CR character at the end of the subject string.
Version 8.30 04-February-2012
Modified: code/trunk/pcre_dfa_exec.c
===================================================================
--- code/trunk/pcre_dfa_exec.c 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/pcre_dfa_exec.c 2012-02-17 11:48:02 UTC (rev 919)
@@ -894,7 +894,20 @@
/*-----------------------------------------------------------------*/
case OP_ANY:
if (clen > 0 && !IS_NEWLINE(ptr))
- { ADD_NEW(state_offset + 1, 0); }
+ {
+ if (ptr + 1 >= md->end_subject &&
+ (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ could_continue = partial_newline = TRUE;
+ }
+ else
+ {
+ ADD_NEW(state_offset + 1, 0);
+ }
+ }
break;
/*-----------------------------------------------------------------*/
@@ -1122,7 +1135,15 @@
if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
if (clen > 0)
{
- if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ if (d == OP_ANY && ptr + 1 >= md->end_subject &&
+ (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ could_continue = partial_newline = TRUE;
+ }
+ else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
(c < 256 &&
(d != OP_ANY || !IS_NEWLINE(ptr)) &&
((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
@@ -1145,7 +1166,15 @@
ADD_ACTIVE(state_offset + 2, 0);
if (clen > 0)
{
- if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ if (d == OP_ANY && ptr + 1 >= md->end_subject &&
+ (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ could_continue = partial_newline = TRUE;
+ }
+ else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
(c < 256 &&
(d != OP_ANY || !IS_NEWLINE(ptr)) &&
((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
@@ -1167,7 +1196,15 @@
ADD_ACTIVE(state_offset + 2, 0);
if (clen > 0)
{
- if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ if (d == OP_ANY && ptr + 1 >= md->end_subject &&
+ (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ could_continue = partial_newline = TRUE;
+ }
+ else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
(c < 256 &&
(d != OP_ANY || !IS_NEWLINE(ptr)) &&
((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
@@ -1187,7 +1224,15 @@
count = current_state->count; /* Number already matched */
if (clen > 0)
{
- if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ if (d == OP_ANY && ptr + 1 >= md->end_subject &&
+ (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ could_continue = partial_newline = TRUE;
+ }
+ else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
(c < 256 &&
(d != OP_ANY || !IS_NEWLINE(ptr)) &&
((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
@@ -1208,7 +1253,15 @@
count = current_state->count; /* Number already matched */
if (clen > 0)
{
- if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+ if (d == OP_ANY && ptr + 1 >= md->end_subject &&
+ (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ could_continue = partial_newline = TRUE;
+ }
+ else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
(c < 256 &&
(d != OP_ANY || !IS_NEWLINE(ptr)) &&
((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
@@ -2988,7 +3041,7 @@
if (new_count <= 0)
{
if (rlevel == 1 && /* Top level, and */
- could_continue && /* Some could go on */
+ could_continue && /* Some could go on, and */
forced_fail != workspace[1] && /* Not all forced fail & */
( /* either... */
(md->moptions & PCRE_PARTIAL_HARD) != 0 /* Hard partial */
@@ -2997,10 +3050,12 @@
match_count < 0) /* no matches */
) && /* And... */
(
- ptr >= end_subject || /* Reached end of subject or */
- partial_newline /* a partial newline */
- ) &&
- ptr > md->start_used_ptr) /* Inspected non-empty string */
+ partial_newline || /* Either partial NL */
+ ( /* or ... */
+ ptr >= end_subject && /* End of subject and */
+ ptr > md->start_used_ptr) /* Inspected non-empty string */
+ )
+ )
{
if (offsetcount >= 2)
{
Modified: code/trunk/pcre_exec.c
===================================================================
--- code/trunk/pcre_exec.c 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/pcre_exec.c 2012-02-17 11:48:02 UTC (rev 919)
@@ -2068,8 +2068,8 @@
{
if (!IS_NEWLINE(eptr))
{
- if (eptr + 1 >= md->end_subject &&
- md->partial != 0 &&
+ if (md->partial != 0 &&
+ eptr + 1 >= md->end_subject &&
NLBLOCK->nltype == NLTYPE_FIXED &&
NLBLOCK->nllen == 2 &&
*eptr == NLBLOCK->nl[0])
@@ -2112,8 +2112,8 @@
if (eptr < md->end_subject &&
(!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen))
{
- if (eptr + 1 >= md->end_subject &&
- md->partial != 0 &&
+ if (md->partial != 0 &&
+ eptr + 1 >= md->end_subject &&
NLBLOCK->nltype == NLTYPE_FIXED &&
NLBLOCK->nllen == 2 &&
*eptr == NLBLOCK->nl[0])
@@ -2250,12 +2250,25 @@
}
break;
- /* Match a single character type; inline for speed */
+ /* Match any single character type except newline; have to take care with
+ CRLF newlines and partial matching. */
case OP_ANY:
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
+ if (md->partial != 0 &&
+ eptr + 1 >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ *eptr == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
+
/* Fall through */
+ /* Match any single character whatsoever. */
+
case OP_ALLANY:
if (eptr >= md->end_subject) /* DO NOT merge the eptr++ here; it must */
{ /* not be updated before SCHECK_PARTIAL. */
@@ -4233,6 +4246,15 @@
RRETURN(MATCH_NOMATCH);
}
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
+ if (md->partial != 0 &&
+ eptr + 1 >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ *eptr == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
eptr++;
ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
}
@@ -4517,6 +4539,15 @@
RRETURN(MATCH_NOMATCH);
}
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
+ if (md->partial != 0 &&
+ eptr + 1 >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ *eptr == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
eptr++;
}
break;
@@ -5021,7 +5052,18 @@
GETCHARINC(c, eptr);
switch(ctype)
{
- case OP_ANY: /* This is the non-NL case */
+ case OP_ANY: /* This is the non-NL case */
+ if (md->partial != 0 && /* Take care with CRLF partial */
+ eptr >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
+ break;
+
case OP_ALLANY:
case OP_ANYBYTE:
break;
@@ -5184,7 +5226,18 @@
c = *eptr++;
switch(ctype)
{
- case OP_ANY: /* This is the non-NL case */
+ case OP_ANY: /* This is the non-NL case */
+ if (md->partial != 0 && /* Take care with CRLF partial */
+ eptr >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ c == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
+ break;
+
case OP_ALLANY:
case OP_ANYBYTE:
break;
@@ -5585,6 +5638,15 @@
break;
}
if (IS_NEWLINE(eptr)) break;
+ if (md->partial != 0 && /* Take care with CRLF partial */
+ eptr + 1 >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ *eptr == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
eptr++;
ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
}
@@ -5602,6 +5664,15 @@
break;
}
if (IS_NEWLINE(eptr)) break;
+ if (md->partial != 0 && /* Take care with CRLF partial */
+ eptr + 1 >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ *eptr == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
eptr++;
ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);
}
@@ -5866,6 +5937,15 @@
break;
}
if (IS_NEWLINE(eptr)) break;
+ if (md->partial != 0 && /* Take care with CRLF partial */
+ eptr + 1 >= md->end_subject &&
+ NLBLOCK->nltype == NLTYPE_FIXED &&
+ NLBLOCK->nllen == 2 &&
+ *eptr == NLBLOCK->nl[0])
+ {
+ md->hitend = TRUE;
+ if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);
+ }
eptr++;
}
break;
Modified: code/trunk/testdata/testinput2
===================================================================
--- code/trunk/testdata/testinput2 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testinput2 2012-02-17 11:48:02 UTC (rev 919)
@@ -3660,4 +3660,77 @@
/^(..)(\1{2,3})ab/
abababab
+/^\R/
+ \r\P
+ \r\P\P
+
+/^\R{2,3}x/
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+ \r\rx
+ \r\r\rx
+
+/^\R{2,3}?x/
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+ \r\rx
+ \r\r\rx
+
+/^\R?x/
+ \r\P
+ \r\P\P
+ x
+ \rx
+
+/^\R+x/
+ \r\P
+ \r\P\P
+ \r\n\P
+ \r\n\P\P
+ \rx
+
+/^a$/<CRLF>
+ a\r\P
+ a\r\P\P
+
+/^a$/m<CRLF>
+ a\r\P
+ a\r\P\P
+
+/^(a$|a\r)/<CRLF>
+ a\r\P
+ a\r\P\P
+
+/^(a$|a\r)/m<CRLF>
+ a\r\P
+ a\r\P\P
+
+/./<CRLF>
+ \r\P
+ \r\P\P
+
+/.{2,3}/<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
+/.{2,3}?/<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
/-- End of testinput2 --/
Modified: code/trunk/testdata/testinput5
===================================================================
--- code/trunk/testdata/testinput5 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testinput5 2012-02-17 11:48:02 UTC (rev 919)
@@ -764,4 +764,25 @@
AA\P
AA\P\P
+
+/./8<CRLF>
+ \r\P
+ \r\P\P
+
+/.{2,3}/8<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
+/.{2,3}?/8<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
/-- End of testinput5 --/
Modified: code/trunk/testdata/testinput8
===================================================================
--- code/trunk/testdata/testinput8 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testinput8 2012-02-17 11:48:02 UTC (rev 919)
@@ -4762,4 +4762,24 @@
a\r\P
a\r\P\P
+/./<CRLF>
+ \r\P
+ \r\P\P
+
+/.{2,3}/<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
+/.{2,3}?/<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
/-- End of testinput8 --/
Modified: code/trunk/testdata/testinput9
===================================================================
--- code/trunk/testdata/testinput9 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testinput9 2012-02-17 11:48:02 UTC (rev 919)
@@ -720,4 +720,24 @@
AA\P
AA\P\P
+/./8<CRLF>
+ \r\P
+ \r\P\P
+
+/.{2,3}/8<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
+/.{2,3}?/8<CRLF>
+ \r\P
+ \r\P\P
+ \r\r\P
+ \r\r\P\P
+ \r\r\r\P
+ \r\r\r\P\P
+
/-- End of testinput9 --/
Modified: code/trunk/testdata/testoutput2
===================================================================
--- code/trunk/testdata/testoutput2 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testoutput2 2012-02-17 11:48:02 UTC (rev 919)
@@ -12124,4 +12124,128 @@
1: ab
2: abab
+/^\R/
+ \r\P
+ 0: \x0d
+ \r\P\P
+Partial match: \x0d
+
+/^\R{2,3}x/
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ \r\r\P
+Partial match: \x0d\x0d
+ \r\r\P\P
+Partial match: \x0d\x0d
+ \r\r\r\P
+Partial match: \x0d\x0d\x0d
+ \r\r\r\P\P
+Partial match: \x0d\x0d\x0d
+ \r\rx
+ 0: \x0d\x0dx
+ \r\r\rx
+ 0: \x0d\x0d\x0dx
+
+/^\R{2,3}?x/
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ \r\r\P
+Partial match: \x0d\x0d
+ \r\r\P\P
+Partial match: \x0d\x0d
+ \r\r\r\P
+Partial match: \x0d\x0d\x0d
+ \r\r\r\P\P
+Partial match: \x0d\x0d\x0d
+ \r\rx
+ 0: \x0d\x0dx
+ \r\r\rx
+ 0: \x0d\x0d\x0dx
+
+/^\R?x/
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ x
+ 0: x
+ \rx
+ 0: \x0dx
+
+/^\R+x/
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ \r\n\P
+Partial match: \x0d\x0a
+ \r\n\P\P
+Partial match: \x0d\x0a
+ \rx
+ 0: \x0dx
+
+/^a$/<CRLF>
+ a\r\P
+Partial match: a\x0d
+ a\r\P\P
+Partial match: a\x0d
+
+/^a$/m<CRLF>
+ a\r\P
+Partial match: a\x0d
+ a\r\P\P
+Partial match: a\x0d
+
+/^(a$|a\r)/<CRLF>
+ a\r\P
+ 0: a\x0d
+ 1: a\x0d
+ a\r\P\P
+Partial match: a\x0d
+
+/^(a$|a\r)/m<CRLF>
+ a\r\P
+ 0: a\x0d
+ 1: a\x0d
+ a\r\P\P
+Partial match: a\x0d
+
+/./<CRLF>
+ \r\P
+ 0: \x0d
+ \r\P\P
+Partial match: \x0d
+
+/.{2,3}/<CRLF>
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ \r\r\P
+ 0: \x0d\x0d
+ \r\r\P\P
+Partial match: \x0d\x0d
+ \r\r\r\P
+ 0: \x0d\x0d\x0d
+ \r\r\r\P\P
+Partial match: \x0d\x0d\x0d
+
+/.{2,3}?/<CRLF>
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ \r\r\P
+ 0: \x0d\x0d
+ \r\r\P\P
+Partial match: \x0d\x0d
+ \r\r\r\P
+ 0: \x0d\x0d
+ \r\r\r\P\P
+ 0: \x0d\x0d
+
/-- End of testinput2 --/
Modified: code/trunk/testdata/testoutput5
===================================================================
--- code/trunk/testdata/testoutput5 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testoutput5 2012-02-17 11:48:02 UTC (rev 919)
@@ -1780,4 +1780,39 @@
AA\P\P
Partial match: AA
+
+/./8<CRLF>
+ \r\P
+ 0: \x{0d}
+ \r\P\P
+Partial match: \x{0d}
+
+/.{2,3}/8<CRLF>
+ \r\P
+Partial match: \x{0d}
+ \r\P\P
+Partial match: \x{0d}
+ \r\r\P
+ 0: \x{0d}\x{0d}
+ \r\r\P\P
+Partial match: \x{0d}\x{0d}
+ \r\r\r\P
+ 0: \x{0d}\x{0d}\x{0d}
+ \r\r\r\P\P
+Partial match: \x{0d}\x{0d}\x{0d}
+
+/.{2,3}?/8<CRLF>
+ \r\P
+Partial match: \x{0d}
+ \r\P\P
+Partial match: \x{0d}
+ \r\r\P
+ 0: \x{0d}\x{0d}
+ \r\r\P\P
+Partial match: \x{0d}\x{0d}
+ \r\r\r\P
+ 0: \x{0d}\x{0d}
+ \r\r\r\P\P
+ 0: \x{0d}\x{0d}
+
/-- End of testinput5 --/
Modified: code/trunk/testdata/testoutput8
===================================================================
--- code/trunk/testdata/testoutput8 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testoutput8 2012-02-17 11:48:02 UTC (rev 919)
@@ -7954,4 +7954,40 @@
a\r\P\P
Partial match: a\x0d
+/./<CRLF>
+ \r\P
+ 0: \x0d
+ \r\P\P
+Partial match: \x0d
+
+/.{2,3}/<CRLF>
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ \r\r\P
+ 0: \x0d\x0d
+ \r\r\P\P
+Partial match: \x0d\x0d
+ \r\r\r\P
+ 0: \x0d\x0d\x0d
+ 1: \x0d\x0d
+ \r\r\r\P\P
+Partial match: \x0d\x0d\x0d
+
+/.{2,3}?/<CRLF>
+ \r\P
+Partial match: \x0d
+ \r\P\P
+Partial match: \x0d
+ \r\r\P
+ 0: \x0d\x0d
+ \r\r\P\P
+Partial match: \x0d\x0d
+ \r\r\r\P
+ 0: \x0d\x0d\x0d
+ 1: \x0d\x0d
+ \r\r\r\P\P
+Partial match: \x0d\x0d\x0d
+
/-- End of testinput8 --/
Modified: code/trunk/testdata/testoutput9
===================================================================
--- code/trunk/testdata/testoutput9 2012-02-16 06:39:20 UTC (rev 918)
+++ code/trunk/testdata/testoutput9 2012-02-17 11:48:02 UTC (rev 919)
@@ -1378,4 +1378,40 @@
AA\P\P
Partial match: AA
+/./8<CRLF>
+ \r\P
+ 0: \x{0d}
+ \r\P\P
+Partial match: \x{0d}
+
+/.{2,3}/8<CRLF>
+ \r\P
+Partial match: \x{0d}
+ \r\P\P
+Partial match: \x{0d}
+ \r\r\P
+ 0: \x{0d}\x{0d}
+ \r\r\P\P
+Partial match: \x{0d}\x{0d}
+ \r\r\r\P
+ 0: \x{0d}\x{0d}\x{0d}
+ 1: \x{0d}\x{0d}
+ \r\r\r\P\P
+Partial match: \x{0d}\x{0d}\x{0d}
+
+/.{2,3}?/8<CRLF>
+ \r\P
+Partial match: \x{0d}
+ \r\P\P
+Partial match: \x{0d}
+ \r\r\P
+ 0: \x{0d}\x{0d}
+ \r\r\P\P
+Partial match: \x{0d}\x{0d}
+ \r\r\r\P
+ 0: \x{0d}\x{0d}\x{0d}
+ 1: \x{0d}\x{0d}
+ \r\r\r\P\P
+Partial match: \x{0d}\x{0d}\x{0d}
+
/-- End of testinput9 --/