Blob Blame History Raw
Index: batch/org/eclipse/jdt/internal/compiler/batch/Main.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java,v
retrieving revision 1.254.4.1
diff -u -r1.254.4.1 Main.java
--- batch/org/eclipse/jdt/internal/compiler/batch/Main.java	2 Jul 2006 10:11:58 -0000	1.254.4.1
+++ batch/org/eclipse/jdt/internal/compiler/batch/Main.java	1 Feb 2007 21:04:52 -0000
@@ -2989,6 +2989,10 @@
 	ArrayList currentRuleSpecs = new ArrayList(defaultSize);
 	StringTokenizer tokenizer = new StringTokenizer(currentPath,
 			File.pathSeparator + "[]", true); //$NON-NLS-1$
+	ArrayList tokens = new ArrayList();
+	while (tokenizer.hasMoreTokens()) {
+		tokens.add(tokenizer.nextToken());
+	}
 	// state machine
 	final int start = 0; 
 	final int readyToClose = 1;
@@ -3003,14 +3007,21 @@
 	// 'path[' 'path1;path2['
 	final int rulesReadyToClose = 6;
 	// 'path[rule' 'path[rule1;rule2'
+	final int bracketOpened = 7;
+	// '.*[.*'
+	final int bracketClosed = 8;
+	// '.*([.*])+'
+	
 	final int error = 99;
 	int state = start;
 	String token = null;
-	while (tokenizer.hasMoreTokens()) {
-		token = tokenizer.nextToken();
+	int cursor = 0, tokensNb = tokens.size(), bracket = -1;
+	while (cursor < tokensNb && state != error) {
+		token = (String) tokens.get(cursor++);
 		if (token.equals(File.pathSeparator)) {
 			switch (state) {
 			case start:
+			case bracketOpened:
 				break;
 			case readyToClose:
 			case readyToCloseEndingWithRules:
@@ -3022,14 +3033,21 @@
 			case rulesReadyToClose:
 				state = rulesNeedAnotherRule;
 				break;
+			case bracketClosed:
+				cursor = bracket + 1;
+				state = rulesStart;
+				break;
 			default:
 				state = error;
 			}
 		} else if (token.equals("[")) { //$NON-NLS-1$
 			switch (state) {
 			case readyToClose:
-				state = rulesStart;
+				bracket = cursor - 1;
+			case bracketClosed:
+				state = bracketOpened;
 				break;
+			case bracketOpened:
 			default:
 				state = error;
 			}
@@ -3038,6 +3056,10 @@
 			case rulesReadyToClose:
 				state = readyToCloseEndingWithRules;
 				break;
+			case bracketOpened:
+				state = bracketClosed;
+				break;
+			case bracketClosed:
 			default:
 				state = error;
 			}
@@ -3055,10 +3077,22 @@
 				state = rulesReadyToClose;
 				currentRuleSpecs.add(token);
 				break;
+			case bracketClosed:
+				for (int i = bracket; i < cursor ; i++) {
+					currentClasspathName += (String) tokens.get(i);
+				}
+				state = readyToClose;
+				break;
+			case bracketOpened:
+				break;
 			default:
 				state = error;
 			}
 		}
+		if (state == bracketClosed && cursor == tokensNb) {
+			cursor = bracket + 1;
+			state = rulesStart;
+		}
 	}
 	switch(state) {
 		case readyToClose :
@@ -3066,6 +3100,8 @@
 		case readyToCloseOrOtherEntry :
 			addNewEntry(paths, currentClasspathName, currentRuleSpecs, customEncoding, isSourceOnly);
 			break;
+		case bracketOpened:
+		case bracketClosed:
 		default :
 			// we go on anyway
 			this.logger.logIncorrectClasspath(currentPath);