Skip to content

Commit

Permalink
Merge 66dd30b into fde70b0
Browse files Browse the repository at this point in the history
  • Loading branch information
stevebillings committed Mar 31, 2020
2 parents fde70b0 + 66dd30b commit c59f502
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 33 deletions.
Expand Up @@ -28,8 +28,8 @@ public String generateFromBazelTarget(final String bazelTarget) {
String projectName = bazelTarget
.replaceAll("^//", "")
.replaceAll("^:", "")
.replaceAll("/", "_")
.replaceAll(":", "_");
.replace("/", "_")
.replace(":", "_");
return projectName;
}
}
Expand Up @@ -56,7 +56,6 @@ public List<String> parseCommand(final CompileCommand compileCommand, final Map<
return commandList;
}

// This method will be used in future CMake support (in addition to CLang)
public List<String> parseCommandString(final String commandString, final Map<String, String> optionOverrides) {
logger.trace(String.format("origCompileCommand : %s", commandString));
final String quotesRemovedCompileCommand = escapeQuotedWhitespace(commandString);
Expand Down Expand Up @@ -90,7 +89,9 @@ public List<String> parseCommandString(final String commandString, final Map<Str
}

private String restoreWhitespace(final String givenString) {
final String newString = givenString.replaceAll(ESCAPE_SEQUENCE_FOR_SPACE_CHAR, SPACE_CHAR_AS_STRING).replaceAll(ESCAPE_SEQUENCE_FOR_TAB_CHAR, TAB_CHAR_AS_STRING);
final String newString = givenString
.replace(ESCAPE_SEQUENCE_FOR_SPACE_CHAR, SPACE_CHAR_AS_STRING)
.replace(ESCAPE_SEQUENCE_FOR_TAB_CHAR, TAB_CHAR_AS_STRING);
logger.trace(String.format("restoreWhitespace() changed %s to %s", givenString, newString));
return newString;
}
Expand All @@ -103,38 +104,74 @@ private String unEscapeDoubleQuotes(final String givenString) {

private String escapeQuotedWhitespace(final String givenString) {
final StringBuilder newString = new StringBuilder();
boolean lastCharWasEscapeChar = false;
boolean inQuotes = false;
boolean quoteTypeIsDouble = false;
final ParserState parserState = new ParserState();
for (int i = 0; i < givenString.length(); i++) {
final char c = givenString.charAt(i);
if (!inQuotes) {
if (!lastCharWasEscapeChar && (c == SINGLE_QUOTE_CHAR)) {
inQuotes = true;
quoteTypeIsDouble = false;
} else if (!lastCharWasEscapeChar && (c == DOUBLE_QUOTE_CHAR)) {
inQuotes = true;
quoteTypeIsDouble = true;
} else {
newString.append(c);
}
if (parserState.isInQuotes()) {
processQuotedChar(parserState, c, newString);
} else {
// Currently inside a quoted substring
if (!lastCharWasEscapeChar && (c == SINGLE_QUOTE_CHAR) && !quoteTypeIsDouble) {
inQuotes = false;
} else if (!lastCharWasEscapeChar && (c == DOUBLE_QUOTE_CHAR) && quoteTypeIsDouble) {
inQuotes = false;
} else if (c == SPACE_CHAR) {
newString.append(ESCAPE_SEQUENCE_FOR_SPACE_CHAR);
} else if (c == TAB_CHAR) {
newString.append(ESCAPE_SEQUENCE_FOR_TAB_CHAR);
} else {
newString.append(c);
}
processNonQuotedChar(parserState, c, newString);
}
lastCharWasEscapeChar = (c == ESCAPE_CHAR);
parserState.setLastCharWasEscapeChar(c == ESCAPE_CHAR);
}
logger.trace(String.format("escapeQuotedWhitespace() changed %s to %s", givenString, newString.toString()));
return newString.toString();
}

private void processQuotedChar(final ParserState parserState, final char c, final StringBuilder newString) {
// Currently inside a quoted substring
if (!parserState.isLastCharEscapeChar() && (c == SINGLE_QUOTE_CHAR) && !parserState.isDoubleQuoteType()) {
parserState.setInQuotes(false);
} else if (!parserState.isLastCharEscapeChar() && (c == DOUBLE_QUOTE_CHAR) && parserState.isDoubleQuoteType()) {
parserState.setInQuotes(false);
} else if (c == SPACE_CHAR) {
newString.append(ESCAPE_SEQUENCE_FOR_SPACE_CHAR);
} else if (c == TAB_CHAR) {
newString.append(ESCAPE_SEQUENCE_FOR_TAB_CHAR);
} else {
newString.append(c);
}
}

private void processNonQuotedChar(final ParserState parserState, final char c, final StringBuilder newString) {
if (!parserState.isLastCharEscapeChar() && (c == SINGLE_QUOTE_CHAR)) {
parserState.setInQuotes(true);
parserState.setQuoteTypeIsDouble(false);
} else if (!parserState.isLastCharEscapeChar() && (c == DOUBLE_QUOTE_CHAR)) {
parserState.setInQuotes(true);
parserState.setQuoteTypeIsDouble(true);
} else {
newString.append(c);
}
}

private class ParserState {
private boolean lastCharWasEscapeChar = false;
private boolean inQuotes = false;
private boolean quoteTypeIsDouble = false;

public boolean isLastCharEscapeChar() {
return lastCharWasEscapeChar;
}

public boolean isInQuotes() {
return inQuotes;
}

public boolean isDoubleQuoteType() {
return quoteTypeIsDouble;
}

public void setLastCharWasEscapeChar(final boolean lastCharWasEscapeChar) {
this.lastCharWasEscapeChar = lastCharWasEscapeChar;
}

public void setInQuotes(final boolean inQuotes) {
this.inQuotes = inQuotes;
}

public void setQuoteTypeIsDouble(final boolean quoteTypeIsDouble) {
this.quoteTypeIsDouble = quoteTypeIsDouble;
}
}
}
Expand Up @@ -25,6 +25,9 @@
import com.synopsys.integration.bdio.model.Forge;

public class ClangPackageManagerInfoFactory {

private static final String VERSION_FLAG = "--version";

public static ClangPackageManagerInfoFactory standardFactory() {
return new ClangPackageManagerInfoFactory();
}
Expand All @@ -34,7 +37,7 @@ public ClangPackageManagerInfo rpm() {
rpm.setName("rpm");
rpm.setCmd("rpm");
rpm.setForge(Forge.CENTOS, Forge.FEDORA, Forge.REDHAT);
rpm.setPresenceCheckArguments("--version");
rpm.setPresenceCheckArguments(VERSION_FLAG);
rpm.setPresenceCheckExpectedText("RPM version");
rpm.setGetOwnerArguments("-qf", "--queryformat=\\{ epoch: \\\"%{E}\\\", name: \\\"%{N}\\\", version: \\\"%{V}-%{R}\\\", arch: \\\"%{ARCH}\\\" \\}");
return rpm.build();
Expand All @@ -45,7 +48,7 @@ public ClangPackageManagerInfo dpkg() {
dpkg.setName("dpkg");
dpkg.setCmd("dpkg");
dpkg.setForge(Forge.UBUNTU, Forge.DEBIAN);
dpkg.setPresenceCheckArguments("--version");
dpkg.setPresenceCheckArguments(VERSION_FLAG);
dpkg.setPresenceCheckExpectedText("package management program version");
dpkg.setGetOwnerArguments("-S");
dpkg.setPackageInfoArguments("-s");
Expand All @@ -57,7 +60,7 @@ public ClangPackageManagerInfo apk() {
apk.setName("apk");
apk.setCmd("apk");
apk.setForge(Forge.ALPINE);
apk.setPresenceCheckArguments("--version");
apk.setPresenceCheckArguments(VERSION_FLAG);
apk.setPresenceCheckExpectedText("apk-tools ");
apk.setGetOwnerArguments("info", "--who-owns");
apk.setArchitectureArguments("info", "--print-arch");
Expand Down

0 comments on commit c59f502

Please sign in to comment.