Ben Konrath 158e040
Index: batch/org/eclipse/jdt/internal/compiler/batch/Main.java
Ben Konrath 158e040
===================================================================
Ben Konrath 158e040
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java,v
Ben Konrath 158e040
retrieving revision 1.254.4.1
Ben Konrath 158e040
diff -u -r1.254.4.1 Main.java
Ben Konrath 158e040
--- batch/org/eclipse/jdt/internal/compiler/batch/Main.java	2 Jul 2006 10:11:58 -0000	1.254.4.1
Ben Konrath 73706d7
+++ batch/org/eclipse/jdt/internal/compiler/batch/Main.java	19 Jan 2007 19:22:57 -0000
Ben Konrath 158e040
@@ -28,9 +28,11 @@
Ben Konrath 158e040
 import java.text.MessageFormat;
Ben Konrath 158e040
 import java.util.ArrayList;
Ben Konrath 158e040
 import java.util.Arrays;
Ben Konrath 158e040
+import java.util.Collections;
Ben Konrath 158e040
 import java.util.Date;
Ben Konrath 158e040
 import java.util.HashMap;
Ben Konrath 158e040
 import java.util.Iterator;
Ben Konrath 158e040
+import java.util.LinkedList;
Ben Konrath 158e040
 import java.util.Locale;
Ben Konrath 158e040
 import java.util.Map;
Ben Konrath 158e040
 import java.util.MissingResourceException;
Ben Konrath 158e040
@@ -40,8 +42,8 @@
Ben Konrath 158e040
 
Ben Konrath 158e040
 import org.eclipse.jdt.core.compiler.CategorizedProblem;
Ben Konrath 158e040
 import org.eclipse.jdt.core.compiler.CharOperation;
Ben Konrath 158e040
-import org.eclipse.jdt.core.compiler.InvalidInputException;
Ben Konrath 158e040
 import org.eclipse.jdt.core.compiler.IProblem;
Ben Konrath 158e040
+import org.eclipse.jdt.core.compiler.InvalidInputException;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.ClassFile;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.CompilationResult;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.Compiler;
Ben Konrath 158e040
@@ -59,9 +61,9 @@
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.problem.DefaultProblem;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
Ben Konrath 158e040
+import org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.util.Messages;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
Ben Konrath 158e040
-import org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
Ben Konrath 158e040
 import org.eclipse.jdt.internal.compiler.util.Util;
Ben Konrath 158e040
 
Ben Konrath 158e040
 public class Main implements ProblemSeverities, SuffixConstants {
Ben Konrath 73706d7
@@ -2989,56 +2991,74 @@
Ben Konrath 158e040
 	ArrayList currentRuleSpecs = new ArrayList(defaultSize);
Ben Konrath 158e040
 	StringTokenizer tokenizer = new StringTokenizer(currentPath,
Ben Konrath 158e040
 			File.pathSeparator + "[]", true); //$NON-NLS-1$
Ben Konrath 158e040
+	LinkedList list = new LinkedList(Collections.list(tokenizer));
Ben Konrath 158e040
+	
Ben Konrath 158e040
 	// state machine
Ben Konrath 158e040
-	final int start = 0; 
Ben Konrath 158e040
-	final int readyToClose = 1;
Ben Konrath 158e040
-	// 'path' 'path1[rule];path2'
Ben Konrath 158e040
-	final int readyToCloseEndingWithRules = 2;
Ben Konrath 158e040
-	// 'path[rule]' 'path1;path2[rule]'
Ben Konrath 158e040
-	final int readyToCloseOrOtherEntry = 3;
Ben Konrath 158e040
-	// 'path[rule];' 'path;' 'path1;path2;'
Ben Konrath 158e040
-	final int rulesNeedAnotherRule = 4;
Ben Konrath 158e040
-	// 'path[rule1;'
Ben Konrath 158e040
-	final int rulesStart = 5;
Ben Konrath 158e040
-	// 'path[' 'path1;path2['
Ben Konrath 158e040
-	final int rulesReadyToClose = 6;
Ben Konrath 158e040
-	// 'path[rule' 'path[rule1;rule2'
Ben Konrath 158e040
+	// process list in reverse order, start refers to end of list
Ben Konrath 158e040
+	final int start = 0;
Ben Konrath 158e040
+	final int rulesStart = 1;
Ben Konrath 158e040
+	// ']' '];path'
Ben Konrath 158e040
+	final int rulesReadyToCloseOrOtherRule = 2;
Ben Konrath 158e040
+	// 'rule]' 'rule1;rule2]'
Ben Konrath 158e040
+	final int rulesNeedAnotherRule = 3;
Ben Konrath 158e040
+	// ';rule2]' ';rule2;rule3];path'
Ben Konrath 158e040
+	final int readyForPath = 4;
Ben Konrath 158e040
+	// '[rule]' '[rule1;rule2]'
Ben Konrath 158e040
+	final int readyToCloseOrOtherEntry = 5;
Ben Konrath 158e040
+	// 'path[rule]' 'path' 'path1;path2'
Ben Konrath 158e040
+	final int readyForPathOrRules = 6;
Ben Konrath 158e040
+	// ';path[rule]' ';path'
Ben Konrath 158e040
 	final int error = 99;
Ben Konrath 158e040
 	int state = start;
Ben Konrath 158e040
+
Ben Konrath 158e040
 	String token = null;
Ben Konrath 158e040
-	while (tokenizer.hasMoreTokens()) {
Ben Konrath 158e040
-		token = tokenizer.nextToken();
Ben Konrath 158e040
+	while (!list.isEmpty()) {
Ben Konrath 158e040
+		token = (String)list.removeLast();
Ben Konrath 158e040
 		if (token.equals(File.pathSeparator)) {
Ben Konrath 158e040
 			switch (state) {
Ben Konrath 158e040
 			case start:
Ben Konrath 158e040
 				break;
Ben Konrath 158e040
-			case readyToClose:
Ben Konrath 158e040
-			case readyToCloseEndingWithRules:
Ben Konrath 158e040
 			case readyToCloseOrOtherEntry:
Ben Konrath 158e040
-				state = readyToCloseOrOtherEntry;
Ben Konrath 73706d7
+				Collections.reverse(currentRuleSpecs);
Ben Konrath 158e040
 				addNewEntry(paths, currentClasspathName, currentRuleSpecs, customEncoding, isSourceOnly);
Ben Konrath 158e040
 				currentRuleSpecs.clear();
Ben Konrath 158e040
+				state = readyForPathOrRules;
Ben Konrath 158e040
 				break;
Ben Konrath 158e040
-			case rulesReadyToClose:
Ben Konrath 158e040
+			case rulesReadyToCloseOrOtherRule:
Ben Konrath 158e040
 				state = rulesNeedAnotherRule;
Ben Konrath 158e040
 				break;
Ben Konrath 158e040
+			case rulesNeedAnotherRule:
Ben Konrath 158e040
+				break;
Ben Konrath 158e040
+			case readyForPathOrRules:
Ben Konrath 158e040
+				break;
Ben Konrath 158e040
 			default:
Ben Konrath 158e040
 				state = error;
Ben Konrath 158e040
 			}
Ben Konrath 158e040
 		} else if (token.equals("[")) { //$NON-NLS-1$
Ben Konrath 158e040
 			switch (state) {
Ben Konrath 158e040
-			case readyToClose:
Ben Konrath 158e040
-				state = rulesStart;
Ben Konrath 158e040
+			case start:
Ben Konrath 158e040
+			case readyForPath:
Ben Konrath 158e040
+			case readyForPathOrRules:
Ben Konrath 158e040
+				currentClasspathName = getPath(list, token);
Ben Konrath 158e040
+				state = readyToCloseOrOtherEntry;
Ben Konrath 158e040
 				break;
Ben Konrath 158e040
-			default:
Ben Konrath 158e040
+			case rulesReadyToCloseOrOtherRule:
Ben Konrath 158e040
+				state =  readyForPath;
Ben Konrath 158e040
+				break;
Ben Konrath 158e040
+			default:  
Ben Konrath 158e040
 				state = error;
Ben Konrath 158e040
 			}
Ben Konrath 158e040
 		} else if (token.equals("]")) { //$NON-NLS-1$
Ben Konrath 158e040
 			switch (state) {
Ben Konrath 158e040
-			case rulesReadyToClose:
Ben Konrath 158e040
-				state = readyToCloseEndingWithRules;
Ben Konrath 158e040
+			case start:
Ben Konrath 158e040
+			case readyForPathOrRules:
Ben Konrath 158e040
+				state = rulesStart;
Ben Konrath 158e040
 				break;
Ben Konrath 158e040
-			default:
Ben Konrath 158e040
+			case readyForPath:
Ben Konrath 158e040
+				currentClasspathName = getPath(list, token);
Ben Konrath 158e040
+				state = readyToCloseOrOtherEntry;
Ben Konrath 158e040
+				break;
Ben Konrath 158e040
+			default:  
Ben Konrath 158e040
 				state = error;
Ben Konrath 158e040
 			}
Ben Konrath 158e040
 
Ben Konrath 73706d7
@@ -3046,24 +3066,26 @@
Ben Konrath 158e040
 			// regular word
Ben Konrath 158e040
 			switch (state) {
Ben Konrath 158e040
 			case start:
Ben Konrath 158e040
-			case readyToCloseOrOtherEntry:
Ben Konrath 158e040
-				state = readyToClose;
Ben Konrath 158e040
-				currentClasspathName = token;
Ben Konrath 158e040
+			case readyForPath:
Ben Konrath 158e040
+			case readyForPathOrRules:
Ben Konrath 158e040
+				currentClasspathName = getPath(list, token);
Ben Konrath 158e040
+				state = readyToCloseOrOtherEntry;
Ben Konrath 158e040
 				break;
Ben Konrath 158e040
-			case rulesNeedAnotherRule:
Ben Konrath 158e040
 			case rulesStart:
Ben Konrath 158e040
-				state = rulesReadyToClose;
Ben Konrath 158e040
+			case rulesNeedAnotherRule:
Ben Konrath 158e040
 				currentRuleSpecs.add(token);
Ben Konrath 158e040
+				state = rulesReadyToCloseOrOtherRule;
Ben Konrath 158e040
 				break;
Ben Konrath 158e040
 			default:
Ben Konrath 158e040
 				state = error;
Ben Konrath 158e040
 			}
Ben Konrath 158e040
 		}
Ben Konrath 158e040
 	}
Ben Konrath 158e040
+
Ben Konrath 158e040
 	switch(state) {
Ben Konrath 158e040
-		case readyToClose :
Ben Konrath 158e040
-		case readyToCloseEndingWithRules :
Ben Konrath 158e040
-		case readyToCloseOrOtherEntry :
Ben Konrath 158e040
+		case readyForPathOrRules:
Ben Konrath 158e040
+		case readyToCloseOrOtherEntry:
Ben Konrath 73706d7
+			Collections.reverse(currentRuleSpecs);
Ben Konrath 158e040
 			addNewEntry(paths, currentClasspathName, currentRuleSpecs, customEncoding, isSourceOnly);
Ben Konrath 158e040
 			break;
Ben Konrath 158e040
 		default :
Ben Konrath 73706d7
@@ -3071,4 +3093,13 @@
Ben Konrath 158e040
 			this.logger.logIncorrectClasspath(currentPath);
Ben Konrath 158e040
 	}
Ben Konrath 158e040
 }
Ben Konrath 158e040
+
Ben Konrath 158e040
+private String getPath(LinkedList list, String path) {
Ben Konrath 158e040
+	while (!list.isEmpty()) {
Ben Konrath 158e040
+		if (File.pathSeparator.equalsIgnoreCase((String)list.getLast()))
Ben Konrath 158e040
+			break;
Ben Konrath 158e040
+		path = (String)list.removeLast() + path;
Ben Konrath 158e040
+	}
Ben Konrath 158e040
+	return path;
Ben Konrath 158e040
+}
Ben Konrath 158e040
 }