summaryrefslogtreecommitdiffstats
path: root/kjs/regexp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kjs/regexp.cpp')
-rw-r--r--kjs/regexp.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/kjs/regexp.cpp b/kjs/regexp.cpp
index 06defcc53..e4db2b956 100644
--- a/kjs/regexp.cpp
+++ b/kjs/regexp.cpp
@@ -325,13 +325,15 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
++startPos;
nextPos = startPos;
- while (originalPos[nextPos] < (i + 1))
- ++nextPos;
+ if (i < s.size()) {
+ while (originalPos[nextPos] < (i + 1))
+ ++nextPos;
+ }
} else
#endif
{
startPos = i;
- nextPos = i + 1;
+ nextPos = i + (i < s.size() ? 1 : 0);
}
int baseFlags =
@@ -339,12 +341,13 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
utf8Support == Supported ? PCRE_NO_UTF8_CHECK :
#endif
0;
- if (pcre_exec(pcregex, NULL, buffer, bufferSize, startPos,
- m_notEmpty ? (PCRE_NOTEMPTY | PCRE_ANCHORED | baseFlags) : baseFlags, // see man pcretest
- ovector ? *ovector : 0L, ovecsize) == PCRE_ERROR_NOMATCH)
+ int numMatches = pcre_exec(pcregex, NULL, buffer, bufferSize, startPos,
+ m_notEmpty ? (PCRE_NOTEMPTY | PCRE_ANCHORED | baseFlags) : baseFlags, // see man pcretest
+ ovector ? *ovector : 0L, ovecsize);
+ if (numMatches < 0)
{
// Failed to match.
- if ((flgs & Global) && m_notEmpty && ovector)
+ if (numMatches == PCRE_ERROR_NOMATCH && (flgs & Global) && m_notEmpty && ovector && startPos < nextPos)
{
// We set m_notEmpty ourselves, to look for a non-empty match
// (see man pcretest or pcretest.c for details).
@@ -353,8 +356,9 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
fprintf(stderr, "No match after m_notEmpty. +1 and keep going.\n");
#endif
m_notEmpty = 0;
- if (pcre_exec(pcregex, NULL, buffer, bufferSize, nextPos, baseFlags,
- ovector ? *ovector : 0L, ovecsize) == PCRE_ERROR_NOMATCH)
+ numMatches = pcre_exec(pcregex, NULL, buffer, bufferSize, nextPos, baseFlags,
+ ovector ? *ovector : 0L, ovecsize);
+ if (numMatches < 0)
return UString::null;
}
else // done
@@ -364,7 +368,7 @@ UString RegExp::match(const UString &s, int i, int *pos, int **ovector)
// Got a match, proceed with it.
// But fix up the ovector if need be..
if (ovector && originalPos) {
- for (unsigned c = 0; c < 2 * (nrSubPatterns + 1); ++c) {
+ for (unsigned c = 0; c < 2 * TQMIN((unsigned)numMatches, nrSubPatterns+1); ++c) {
if ((*ovector)[c] != -1)
(*ovector)[c] = originalPos[(*ovector)[c]];
}