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();
