private static string GetQuotedArgument(string argument) {
// The argument is processed in reverse character order.
// Any quotes (except the outer quotes) are escaped with backslash.
// Any sequences of backslashes preceding a quote (including outer quotes) are doubled in length.
var resultBuilder = new StringBuilder();
var outerQuotesRequired = HasWhitespace(argument);
var precedingQuote = false;
if (outerQuotesRequired) {
resultBuilder.Append('"');
precedingQuote = true;
}
for (var index = argument.Length - 1; index >= 0; index--) {
var @char = argument[index];
resultBuilder.Append(@char);
if (@char == '"') {
precedingQuote = true;
resultBuilder.Append('\\');
} else if (@char == '\\' && precedingQuote) {
resultBuilder.Append('\\');
} else {
precedingQuote = false;
}
}
if (outerQuotesRequired) {
resultBuilder.Append('"');
}
return Reverse(resultBuilder.ToString());
}