From 2d8cf20d0d5ca6b1fbdefc22229d4b7cf1497ede Mon Sep 17 00:00:00 2001 From: mark Date: Tue, 17 Jan 2006 18:09:40 +0000 Subject: Imported GNU Classpath 0.20 * Makefile.am (AM_CPPFLAGS): Add classpath/include. * java/nio/charset/spi/CharsetProvider.java: New override file. * java/security/Security.java: Likewise. * sources.am: Regenerated. * Makefile.in: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109831 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/classpath/gnu/regexp/RETokenRepeated.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'libjava/classpath/gnu/regexp/RETokenRepeated.java') diff --git a/libjava/classpath/gnu/regexp/RETokenRepeated.java b/libjava/classpath/gnu/regexp/RETokenRepeated.java index 3165a6f1654..6291a3c3960 100644 --- a/libjava/classpath/gnu/regexp/RETokenRepeated.java +++ b/libjava/classpath/gnu/regexp/RETokenRepeated.java @@ -108,6 +108,7 @@ final class RETokenRepeated extends REToken { REMatch doables; REMatch doablesLast; REMatch recurrent; + int lastIndex = mymatch.index; do { // Check for stingy match for each possibility. @@ -151,6 +152,15 @@ final class RETokenRepeated extends REToken { ++numRepeats; positions.addElement(newMatch); + + // doables.index == lastIndex means an empty string + // was the longest that matched this token. + // We break here, otherwise we will fall into an endless loop. + if (doables.index == lastIndex) { + if (numRepeats < min) numRepeats = min; + break; + } + lastIndex = doables.index; } while (numRepeats < max); // If there aren't enough repeats, then fail @@ -165,7 +175,16 @@ final class RETokenRepeated extends REToken { REMatch allResultsLast = null; REMatch results = null; - while (--posIndex >= min) { + int indexCount = posIndex - min; + if (indexCount <= 0) { + // This case occurs when we exited the previous do loop before + // numRepeats >= min because an empty string matched the token. + // In this case, an empty string can match as many times as + // desired. + indexCount = 1; + } + while (indexCount-- > 0) { + --posIndex; newMatch = (REMatch) positions.elementAt(posIndex); results = matchRest(input, newMatch); if (results != null) { -- cgit v1.2.3