From 8b5a3c56f3aeabdffc273658a2021c22b5475a66 Mon Sep 17 00:00:00 2001
From: Vladimir Hirsl <vhirsl@ca.ibm.com>
Date: Tue, 7 Dec 2004 22:25:07 +0000
Subject: [PATCH] Propagated from 2.1 branch. Fix for SCD bugs 80269 & 80271.
 Test for bug 80271.

---
 .../gnu/GCCScannerInfoConsoleParser.java      | 16 +++++++---
 .../core/tests/AllStandardBuildTests.java     |  2 +-
 .../ScannerConfigConsoleParserTests.java      | 31 ++++++++++++-------
 3 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java
index a6c23b4432c..e043164cdb0 100644
--- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java
+++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java
@@ -94,7 +94,7 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
 			return false;
 		Iterator I = allTokens.iterator();
 		String token = ((String) I.next()).toLowerCase();
-		if (token.indexOf("gcc") != -1 || token.indexOf("g++") != -1 || token.indexOf("gcc") != -1) {//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		if (token.indexOf("gcc") != -1 || token.indexOf("g++") != -1) {//$NON-NLS-1$ //$NON-NLS-2$
 			// Recognized gcc or g++ compiler invocation
 			List includes = new ArrayList();
 			List symbols = new ArrayList();
@@ -121,6 +121,12 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
 				}
 				else if (fileName == null) {
 					String possibleFileName = token.toLowerCase();
+					if ((possibleFileName.startsWith(DOUBLE_QUOTE_STRING) && 
+						 possibleFileName.endsWith(DOUBLE_QUOTE_STRING)) ||
+						(possibleFileName.startsWith(SINGLE_QUOTE_STRING) && 
+						 possibleFileName.endsWith(SINGLE_QUOTE_STRING))) {
+						possibleFileName = possibleFileName.substring(1, possibleFileName.length()-1).trim();
+					}
 					if (possibleFileName.endsWith(".c") || 		//$NON-NLS-1$
 						possibleFileName.endsWith(".cpp") ||	//$NON-NLS-1$
 						possibleFileName.endsWith(".cc") ||		//$NON-NLS-1$
@@ -183,7 +189,7 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
 		int prevIndex = 0;
 		for (int index = line.indexOf(fDashI, prevIndex); index != -1; 
 			 prevIndex = index+2, index = line.indexOf(fDashI, prevIndex)) {
-			String delimiter = "\\s"; //$NON-NLS-1$
+			String delimiter = "\\s+"; //$NON-NLS-1$
 			if (line.charAt(index-1) == '\'' || line.charAt(index-1) == '\"') {
 				// look for only one more ' or "
 				delimiter = String.valueOf(line.charAt(index-1));
@@ -225,9 +231,10 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
 	private void parseLineForSymbolDefinitions(String line, List symbols) {
 		final String fDashD = "-D"; //$NON-NLS-1$
 		int prevIndex = 0;
+		String delimiter = null;
+		String splitRegex = "\\s+"; //$NON-NLS-1$
 		for (int index = line.indexOf(fDashD, prevIndex); index != -1; 
 			 prevIndex = index+2, index = line.indexOf(fDashD, prevIndex)) {
-			String delimiter = "\\s"; //$NON-NLS-1$
 			int nDelimiterSymbols = 2;
 			String postfix = line.substring(index+2).trim();
 			if (postfix.charAt(0) == '-') {	// empty -D
@@ -239,7 +246,7 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
 				nDelimiterSymbols = 1;
 			}
 			else {
-				String[] tokens = postfix.split(delimiter, 2);
+				String[] tokens = postfix.split(splitRegex, 2);
 				if (tokens.length > 0 && tokens[0].length() > 0) {
 					int sQuoteIndex = tokens[0].indexOf(SINGLE_QUOTE_STRING);
 					int dQuoteIndex = tokens[0].indexOf(DOUBLE_QUOTE_STRING);
@@ -248,6 +255,7 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
 						if (!symbols.contains(tokens[0])) {
 							symbols.add(tokens[0]);
 						}
+						continue;
 					}
 					else {
 						delimiter = (sQuoteIndex != -1 && (dQuoteIndex == -1 || sQuoteIndex < dQuoteIndex)) ? SINGLE_QUOTE_STRING : DOUBLE_QUOTE_STRING;
diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/AllStandardBuildTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/AllStandardBuildTests.java
index 8626d6b9df8..01a9b57efc0 100644
--- a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/AllStandardBuildTests.java
+++ b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/AllStandardBuildTests.java
@@ -34,7 +34,7 @@ public class AllStandardBuildTests extends TestSuite {
 	public static Test suite() {
 		TestSuite suite = new AllStandardBuildTests("Test for org.eclipse.cdt.standardbuild.core.tests");
 		//$JUnit-BEGIN$
-		suite.addTest(ScannerConfigConsoleParserTests.suite());
+		suite.addTestSuite(ScannerConfigConsoleParserTests.class);
 		//$JUnit-END$
 		return suite;
 	}
diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigConsoleParserTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigConsoleParserTests.java
index a07087c8a85..3f7cab7f37f 100644
--- a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigConsoleParserTests.java
+++ b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigConsoleParserTests.java
@@ -19,9 +19,7 @@ import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
 import org.eclipse.cdt.make.internal.core.scannerconfig.gnu.GCCScannerInfoConsoleParser;
 import org.eclipse.core.resources.IResource;
 
-import junit.framework.Test;
 import junit.framework.TestCase;
-import junit.framework.TestSuite;
 
 /**
  * Scanner configuration console parser tests
@@ -55,15 +53,6 @@ public class ScannerConfigConsoleParserTests extends TestCase {
 		clParser = null;
 	}
 
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ScannerConfigConsoleParserTests.class.getName());
-		
-		suite.addTest(new ScannerConfigConsoleParserTests("testParsingIncludePaths"));
-		suite.addTest(new ScannerConfigConsoleParserTests("testParsingSymbolDefinitions"));
-		
-		return suite;
-	}
-
 	/*
 	 * Tests GCCScannerInfoConsoleParser. Utility object not provided.
 	 * Only tests parsing of the imput (make build output) 
@@ -115,6 +104,7 @@ public class ScannerConfigConsoleParserTests extends TestCase {
 		assertTrue(sumIncludes.contains("//server5/include"));
 		assertTrue(sumIncludes.contains("//server6/include"));
 		assertTrue(sumIncludes.contains("/multiline/dir"));
+		assertTrue(sumIncludes.size() == 24);
 	}
 	
 	public void testParsingSymbolDefinitions() {
@@ -152,5 +142,22 @@ public class ScannerConfigConsoleParserTests extends TestCase {
 		assertTrue(sumSymbols.contains("MACRO13=\"value 13\""));
 		assertTrue(sumSymbols.contains("MULTILINE=TRUE"));
 		assertTrue(sumSymbols.contains("SUM(x, y) = (x) + (y)"));
+		assertTrue(sumSymbols.size() == 15);
+		
 	}
-}
\ No newline at end of file
+	
+	public void testParsingSymbolDefinitions_bug80271() {
+		final ArrayList sumSymbols = new ArrayList();
+		// initialize it with the utility
+		clParser.startup(null, null, new IScannerInfoCollector() {
+			public void contributeToScannerConfig(IResource resource, List includes, List symbols, Map extraInfo) {
+				sumSymbols.addAll(symbols);
+			}
+		});
+		
+		clParser.processLine("gcc -DMACRO1 -I ..\\inc -c ..\\source\\source.c");	// PR 80271
+
+		assertTrue(sumSymbols.contains("MACRO1"));
+		assertTrue(sumSymbols.size() == 1);
+	}
+}