diff --git a/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java b/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java
index f60cad29a..f028c7953 100644
--- a/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java
+++ b/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java
@@ -318,7 +318,7 @@ public final class SelectorUtils {
* Must not be null
.
* @param str The string which must be matched against the pattern.
* Must not be null
.
- * @param isCaseSensitive Whether or not matching should be performed
+ * @param caseSensitive Whether or not matching should be performed
* case sensitively.
*
*
@@ -326,7 +326,7 @@ public final class SelectorUtils {
* or false
otherwise.
*/
public static boolean match(String pattern, String str,
- boolean isCaseSensitive) {
+ boolean caseSensitive) {
char[] patArr = pattern.toCharArray();
char[] strArr = str.toCharArray();
int patIdxStart = 0;
@@ -351,13 +351,9 @@ public final class SelectorUtils {
for (int i = 0; i <= patIdxEnd; i++) {
ch = patArr[i];
if (ch != '?') {
- if (isCaseSensitive && ch != strArr[i]) {
+ if (different(caseSensitive, ch, strArr[i])) {
return false; // Character mismatch
}
- if (!isCaseSensitive && Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[i])) {
- return false; // Character mismatch
- }
}
}
return true; // String matches against pattern
@@ -368,13 +364,13 @@ public final class SelectorUtils {
}
// Process characters before first star
- while ((ch = patArr[patIdxStart]) != '*' && strIdxStart <= strIdxEnd) {
+ while (true) {
+ ch = patArr[patIdxStart];
+ if (ch == '*' || strIdxStart > strIdxEnd) {
+ break;
+ }
if (ch != '?') {
- if (isCaseSensitive && ch != strArr[strIdxStart]) {
- return false; // Character mismatch
- }
- if (!isCaseSensitive && Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[strIdxStart])) {
+ if (different(caseSensitive, ch, strArr[strIdxStart])) {
return false; // Character mismatch
}
}
@@ -384,22 +380,17 @@ public final class SelectorUtils {
if (strIdxStart > strIdxEnd) {
// All characters in the string are used. Check if only '*'s are
// left in the pattern. If so, we succeeded. Otherwise failure.
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (patArr[i] != '*') {
- return false;
- }
- }
- return true;
+ return allStars(patArr, patIdxStart, patIdxEnd);
}
// Process characters after last star
- while ((ch = patArr[patIdxEnd]) != '*' && strIdxStart <= strIdxEnd) {
+ while (true) {
+ ch = patArr[patIdxEnd];
+ if (ch == '*' || strIdxStart > strIdxEnd) {
+ break;
+ }
if (ch != '?') {
- if (isCaseSensitive && ch != strArr[strIdxEnd]) {
- return false; // Character mismatch
- }
- if (!isCaseSensitive && Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[strIdxEnd])) {
+ if (different(caseSensitive, ch, strArr[strIdxEnd])) {
return false; // Character mismatch
}
}
@@ -409,12 +400,7 @@ public final class SelectorUtils {
if (strIdxStart > strIdxEnd) {
// All characters in the string are used. Check if only '*'s are
// left in the pattern. If so, we succeeded. Otherwise failure.
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (patArr[i] != '*') {
- return false;
- }
- }
- return true;
+ return allStars(patArr, patIdxStart, patIdxEnd);
}
// process pattern between stars. padIdxStart and patIdxEnd point
@@ -442,13 +428,8 @@ public final class SelectorUtils {
for (int j = 0; j < patLength; j++) {
ch = patArr[patIdxStart + j + 1];
if (ch != '?') {
- if (isCaseSensitive && ch != strArr[strIdxStart + i
- + j]) {
- continue strLoop;
- }
- if (!isCaseSensitive
- && Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[strIdxStart + i + j])) {
+ if (different(caseSensitive, ch,
+ strArr[strIdxStart + i + j])) {
continue strLoop;
}
}
@@ -468,14 +449,25 @@ public final class SelectorUtils {
// All characters in the string are used. Check if only '*'s are left
// in the pattern. If so, we succeeded. Otherwise failure.
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (patArr[i] != '*') {
+ return allStars(patArr, patIdxStart, patIdxEnd);
+ }
+
+ private static boolean allStars(char[] chars, int start, int end) {
+ for (int i = start; i <= end; ++i) {
+ if (chars[i] != '*') {
return false;
}
}
return true;
}
+ private static boolean different(
+ boolean caseSensitive, char ch, char other) {
+ return caseSensitive
+ ? ch != other
+ : Character.toUpperCase(ch) != Character.toUpperCase(other);
+ }
+
/**
* Breaks a path up into a Vector of path elements, tokenizing on
* File.separator
.