diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java index 7c4b6670053..95547eedd39 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java @@ -682,6 +682,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + " -D'MACRO5=\"quoted value\"'" + " -DMACRO6=\\\"escape-quoted value\\\"" + " -DMACRO7=\"'single-quoted value'\"" + + " -DMACRO8=\"\\\"escape-quoted value\\\"\"" + " file.cpp"); parser.shutdown(); @@ -702,6 +703,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { assertEquals(new CMacroEntry("MACRO5", "\"quoted value\"", 0), entries.get(5)); assertEquals(new CMacroEntry("MACRO6", "\"escape-quoted value\"", 0), entries.get(6)); assertEquals(new CMacroEntry("MACRO7", "'single-quoted value'", 0), entries.get(7)); + assertEquals(new CMacroEntry("MACRO8", "\"escape-quoted value\"", 0), entries.get(8)); } /** diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java index 42296eb9998..c4ee1354914 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java @@ -49,7 +49,20 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting private static final String LEADING_PATH_PATTERN = "\\S+[/\\\\]"; //$NON-NLS-1$ - private static final Pattern OPTIONS_PATTERN = Pattern.compile("-[^\\s\"']*(\\s*((\".*?\")|('.*?')|([^-\\s][^\\s]+)))?"); //$NON-NLS-1$ + + /** + * "foo" + * Using look-ahead and look-behind to resolve ambiguity with "\" {@link #QUOTE_BSLASH_QUOTE} + */ + private static final String QUOTE = "(\"(?!\\\\).*?(?