Bug 498171 Propagate scanner info fix for Arduino.

Change-Id: I3ed23049f0364d8fe989f1fa0d8a9b7b47378f32
diff --git a/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java b/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java
index 16bbabe..60de2f5 100644
--- a/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java
+++ b/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java
@@ -204,7 +204,7 @@
 					// TODO optimize by dealing with multi arg options like -o
 					Path filePath = buildDirectory.resolve(commandLine.get(i));
 					IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(filePath.toUri());
-					if (files.length > 0) {
+					if (files.length > 0 && files[0].exists()) {
 						// replace it with a temp file
 						Path parentPath = filePath.getParent();
 						String extension = files[0].getFileExtension();
diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java
index e610c9f..01ba5a0 100644
--- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java
+++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java
@@ -18,7 +18,6 @@
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -129,6 +128,7 @@
 		return super.getAdapter(adapter);
 	}
 
+	@Override
 	public String getLaunchMode() {
 		return launchMode;
 	}
@@ -556,7 +556,8 @@
 			throw Activator.coreException("Upload command not specified", null);
 		}
 		if (isWindows) {
-			return splitCommand(command);
+			List<String> args = splitCommand(command);
+			return args.toArray(new String[args.size()]);
 		} else {
 			return new String[] { "sh", "-c", command }; //$NON-NLS-1$ //$NON-NLS-2$
 		}
@@ -659,9 +660,9 @@
 			}
 
 			ExtendedScannerInfo baseInfo = new ExtendedScannerInfo(null, includes);
-			String[] command = splitCommand(commandString);
-			IScannerInfo info = getToolChain().getScannerInfo(getBuildConfiguration(), Paths.get(command[0]),
-					Arrays.copyOfRange(command, 1, command.length), baseInfo, resource, getBuildDirectoryURI());
+			List<String> command = splitCommand(commandString);
+			IScannerInfo info = getToolChain().getScannerInfo(getBuildConfiguration(), command,
+					baseInfo, resource, getBuildDirectoryURI());
 
 			// cache the results
 			cachedScannerInfo = info;
@@ -683,9 +684,47 @@
 		return str;
 	}
 
-	private String[] splitCommand(String command) {
-		// TODO deal with quotes properly, for now just strip
-		return command.replaceAll("\"", "").split("\\s+"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	private List<String> splitCommand(String command) {
+		boolean inQuotes = false;
+		boolean inDouble = false;
+
+		List<String> args = new ArrayList<>();
+		StringBuilder builder = new StringBuilder();
+		for (int i = 0; i < command.length(); i++) {
+			char c = command.charAt(i);
+			switch (c) {
+			case ' ':
+				if (inQuotes || inDouble) {
+					builder.append(c);
+				} else if (builder.length() > 0) {
+					args.add(builder.toString());
+					builder = new StringBuilder();
+				}
+				break;
+			case '\'':
+				if (inDouble) {
+					builder.append(c);
+				} else {
+					inQuotes = !inQuotes;
+				}
+				break;
+			case '"':
+				if (inQuotes) {
+					builder.append(c);
+				} else {
+					inDouble = !inDouble;
+				}
+				break;
+			default:
+				builder.append(c);
+			}
+		}
+
+		if (builder.length() > 0) {
+			args.add(builder.toString());
+		}
+
+		return args;
 	}
 
 	@Override