1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-12 10:45:37 +02:00

Fix for PR 82408 [ScannerConfig] GCCScannerInfoConsoleParser throws exception on "quoted spaces".

The problem was incorrect parsing of lines containing "matched" characters (`, ' and ").
This commit is contained in:
Vladimir Hirsl 2005-01-11 17:28:26 +00:00
parent 70a3403e0b
commit 2758147c93

View file

@ -34,6 +34,7 @@ import java.util.Map;
public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser { public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
private final static String SINGLE_QUOTE_STRING = "\'"; //$NON-NLS-1$ private final static String SINGLE_QUOTE_STRING = "\'"; //$NON-NLS-1$
private final static String DOUBLE_QUOTE_STRING = "\""; //$NON-NLS-1$ private final static String DOUBLE_QUOTE_STRING = "\""; //$NON-NLS-1$
private final static char[] matchingChars = {'`', '\'', '\"'};
private IProject fProject = null; private IProject fProject = null;
private IScannerInfoConsoleParserUtility fUtil = null; private IScannerInfoConsoleParserUtility fUtil = null;
@ -89,7 +90,8 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
} }
// Known patterns: // Known patterns:
// (a) gcc|g++ ... -Dxxx -Iyyy ... // (a) gcc|g++ ... -Dxxx -Iyyy ...
ArrayList allTokens = new ArrayList(Arrays.asList(line.split("\\s")));//$NON-NLS-1$ List allTokens = tokenize(line);
// ArrayList allTokens = new ArrayList(Arrays.asList(line.split("\\s+")));//$NON-NLS-1$
if (allTokens.size() <= 1) if (allTokens.size() <= 1)
return false; return false;
Iterator I = allTokens.iterator(); Iterator I = allTokens.iterator();
@ -180,6 +182,43 @@ public class GCCScannerInfoConsoleParser implements IScannerInfoConsoleParser {
return rc; return rc;
} }
/**
* @param line
* @return
*/
private List tokenize(String line) {
List rv = new ArrayList(2);
// find special characters that need to be matched: `, ' and "
// First Matching Chararcter
int prevFmc = line.length();
int emc = -1;
char matchingChar = 0;
for (int i = 0; i < matchingChars.length; ++i) {
char ch = matchingChars[i];
int fmc = line.indexOf(ch);
if (fmc > -1 && fmc < prevFmc) {
emc = line.indexOf(ch, fmc+1);
if (emc > fmc) {
matchingChar = ch;
prevFmc = fmc;
}
}
}
if (matchingChar != 0) { // found matched chars
String prefix = line.substring(0, prevFmc).trim();
rv.addAll(Arrays.asList(prefix.split("\\s+")));//$NON-NLS-1$
rv.add(line.substring(prevFmc, emc+1));
// recursion
rv.addAll(tokenize(line.substring(emc+1).trim()));
}
else {
rv.addAll(Arrays.asList(line.split("\\s+")));//$NON-NLS-1$
}
return rv;
}
/** /**
* @param line * @param line
* @param includes * @param includes