blob: dad76951d15bb4f46f6fcdd3ba5ac1dc110d9318 [file] [log] [blame]
Index: src/java/org/apache/lucene/search/WildcardTermEnum.java
===================================================================
RCS file: /var/lib/cvs/libs/lucene/src/java/org/apache/lucene/search/WildcardTermEnum.java,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 WildcardTermEnum.java
--- src/java/org/apache/lucene/search/WildcardTermEnum.java 9 Nov 2001 14:10:25 -0000 1.1.1.1
+++ src/java/org/apache/lucene/search/WildcardTermEnum.java 14 Feb 2002 17:52:45 -0000
@@ -116,29 +116,75 @@
public static final char WILDCARD_STRING = '*';
public static final char WILDCARD_CHAR = '?';
-
- public static final boolean wildcardEquals(String pattern, int patternIdx, String string, int stringIdx) {
- for ( int p = patternIdx; ; ++p ) {
- for ( int s = stringIdx; ; ++p, ++s ) {
- boolean sEnd = (s >= string.length());
- boolean pEnd = (p >= pattern.length());
-
- if (sEnd && pEnd) return true;
- if (sEnd || pEnd) break;
- if (pattern.charAt(p) == WILDCARD_CHAR) continue;
- if (pattern.charAt(p) == WILDCARD_STRING) {
- int i;
- ++p;
- for (i = string.length(); i >= s; --i)
- if (wildcardEquals(pattern, p, string, i))
- return true;
- break;
+
+ /**
+ * Determines if a word matches a wildcard pattern.
+ * <small>Work released by Granta Design Ltd after originally being done on company time.</small>
+ */
+ public static final boolean wildcardEquals(String pattern, int patternIdx, String string, int stringIdx)
+ {
+ for (int p = patternIdx; ; ++p)
+ {
+ for (int s = stringIdx; ; ++p, ++s)
+ {
+ // End of string yet?
+ boolean sEnd = (s >= string.length());
+ // End of pattern yet?
+ boolean pEnd = (p >= pattern.length());
+
+ // If we're looking at the end of the string...
+ if (sEnd)
+ {
+ // Assume the only thing left on the pattern is/are wildcards
+ boolean justWildcardsLeft = true ;
+
+ // Current wildcard position
+ int wildcardSearchPos = p ;
+ // While we haven't found the end of the pattern, and haven't encountered any non-wildcard characters
+ while (wildcardSearchPos < pattern.length() && justWildcardsLeft)
+ {
+ // Check the character at the current position
+ char wildchar = pattern.charAt(wildcardSearchPos);
+ // If it's not a wildcard character, then there is more pattern information
+ // after this/these wildcards.
+
+ if (wildchar != WILDCARD_CHAR && wildchar != WILDCARD_STRING)
+ {
+ justWildcardsLeft = false ;
+ }
+ else
+ {
+ // Look at the next character
+ wildcardSearchPos++ ;
+ }
+ }
+
+ // This was a prefix wildcard search, and we've matched - return true.
+ if (justWildcardsLeft)
+ return true ;
+ }
+
+ // If we've gone past the end of the string, or the pattern, return false.
+ if (sEnd || pEnd) break;
+
+ // Match a single character, so continue.
+ if (pattern.charAt(p) == WILDCARD_CHAR) continue;
+
+ //
+ if (pattern.charAt(p) == WILDCARD_STRING)
+ {
+ // Look at the character beyond the '*'.
+ ++p;
+ // Examine the string, starting at the last character.
+ for (int i = string.length(); i >= s; --i)
+ {
+ if (wildcardEquals(pattern, p, string, i))
+ return true;
+ }
+ break;
+ }
+ if (pattern.charAt(p) != string.charAt(s)) break;
+ }
+ return false;
}
- if (pattern.charAt(p) != string.charAt(s)) break;
- }
- return false;
}
- }
public void close() throws IOException {
super.close();