X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fgnu%2Fregexp%2FREMatchEnumeration.java;fp=src%2Fgnu%2Fregexp%2FREMatchEnumeration.java;h=ee4b8ecc27c67e14ed07c8fe96df274976d9b959;hb=30a9ea29e92d4d079cd71b0ee8cdf2b2fd70c48f;hp=0000000000000000000000000000000000000000;hpb=52ffc2a48fc74d013ae7fa401d9d0d405543c38e;p=org.ibex.core.git diff --git a/src/gnu/regexp/REMatchEnumeration.java b/src/gnu/regexp/REMatchEnumeration.java new file mode 100644 index 0000000..ee4b8ec --- /dev/null +++ b/src/gnu/regexp/REMatchEnumeration.java @@ -0,0 +1,116 @@ +/* + * gnu/regexp/REMatchEnumeration.java + * Copyright (C) 1998-2001 Wes Biggs + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package gnu.regexp; +import java.io.Serializable; +import java.util.Enumeration; +import java.util.NoSuchElementException; + +/** + * An REMatchEnumeration enumerates regular expression matches over a + * given input text. You obtain a reference to an enumeration using + * the getMatchEnumeration() methods on an instance of + * RE. + * + *

+ * + * REMatchEnumeration does lazy computation; that is, it will not + * search for a match until it needs to. If you'd rather just get all + * the matches at once in a big array, use the + * getAllMatches() methods on RE. However, using an + * enumeration can help speed performance when the entire text does + * not need to be searched immediately. + * + *

+ * + * The enumerated type is especially useful when searching on a Reader + * or InputStream, because the InputStream read position cannot be + * guaranteed after calling getMatch() (see the + * description of that method for an explanation of why). Enumeration + * also saves a lot of overhead required when calling + * getMatch() multiple times. + * + * @author Wes Biggs + */ +public class REMatchEnumeration implements Enumeration, Serializable { + private static final int YES = 1; + private static final int MAYBE = 0; + private static final int NO = -1; + + private int more; + private REMatch match; + private RE expr; + private CharIndexed input; + private int eflags; + private int index; + + // Package scope constructor is used by RE.getMatchEnumeration() + REMatchEnumeration(RE expr, CharIndexed input, int index, int eflags) { + more = MAYBE; + this.expr = expr; + this.input = input; + this.index = index; + this.eflags = eflags; + } + + /** Returns true if there are more matches in the input text. */ + public boolean hasMoreElements() { + return hasMoreMatches(null); + } + + /** Returns true if there are more matches in the input text. */ + public boolean hasMoreMatches() { + return hasMoreMatches(null); + } + + /** Returns true if there are more matches in the input text. + * Saves the text leading up to the match (or to the end of the input) + * in the specified buffer. + */ + public boolean hasMoreMatches(StringBuffer buffer) { + if (more == MAYBE) { + match = expr.getMatchImpl(input,index,eflags,buffer); + if (match != null) { + input.move((match.end[0] > 0) ? match.end[0] : 1); + + index = (match.end[0] > 0) ? match.end[0] + match.offset : index + 1; + more = YES; + } else more = NO; + } + return (more == YES); + } + + /** Returns the next match in the input text. */ + public Object nextElement() throws NoSuchElementException { + return nextMatch(); + } + + /** + * Returns the next match in the input text. This method is provided + * for convenience to avoid having to explicitly cast the return value + * to class REMatch. + */ + public REMatch nextMatch() throws NoSuchElementException { + if (hasMoreElements()) { + more = (input.isValid()) ? MAYBE : NO; + return match; + } + throw new NoSuchElementException(); + } +} +