Fixed "format-string" based settings so they can have quotes on them without leaving the quotes in the format string:

(lldb) settings set thread-format "abc"
(lldb) settings set thread-format 'abc'
(lldb) settings set thread-format abc

We strip the quotes before processing the format string and return an "error: mismatched quotes" if mismatched quotes are given.

<rdar://problem/21210789>

llvm-svn: 238896
This commit is contained in:
Greg Clayton 2015-06-03 02:02:48 +00:00
parent da86b6d409
commit b2e0c11982
2 changed files with 28 additions and 1 deletions

View File

@ -66,7 +66,7 @@ OptionValueFormatEntity::DumpValue (const ExecutionContext *exe_ctx, Stream &str
Error
OptionValueFormatEntity::SetValueFromString (llvm::StringRef value_str,
VarSetOperationType op)
VarSetOperationType op)
{
Error error;
switch (op)
@ -79,6 +79,25 @@ OptionValueFormatEntity::SetValueFromString (llvm::StringRef value_str,
case eVarSetOperationReplace:
case eVarSetOperationAssign:
{
// Check if the string starts with a quote character after removing leading and trailing spaces.
// If it does start with a quote character, make sure it ends with the same quote character
// and remove the quotes before we parse the format string. If the string doesn't start with
// a quote, leave the string alone and parse as is.
llvm::StringRef trimmed_value_str = value_str.trim();
if (!trimmed_value_str.empty())
{
const char first_char = trimmed_value_str[0];
if (first_char == '"' || first_char == '\'')
{
const size_t trimmed_len = trimmed_value_str.size();
if (trimmed_len == 1 || value_str[trimmed_len-1] != first_char)
{
error.SetErrorStringWithFormat("mismatched quotes");
return error;
}
value_str = trimmed_value_str.substr(1,trimmed_len-2);
}
}
FormatEntity::Entry entry;
error = FormatEntity::Parse(value_str, entry);
if (error.Success())

View File

@ -358,6 +358,14 @@ class SettingsCommandTestCase(TestBase):
self.expect ("settings show target.env-vars",
substrs = [ 'MY_FILE=this is a file name with spaces.txt' ])
self.runCmd ("settings clear target.env-vars")
# Test and make sure that setting "format-string" settings obeys quotes if they are provided
self.runCmd ("settings set thread-format 'abc def' ")
self.expect ("settings show thread-format", 'thread-format (format-string) = "abc def"')
self.runCmd ('settings set thread-format "abc def" ')
self.expect ("settings show thread-format", 'thread-format (format-string) = "abc def"')
# Make sure when no quotes are provided that we maintain any trailing spaces
self.runCmd ('settings set thread-format abc def ')
self.expect ("settings show thread-format", 'thread-format (format-string) = "abc def "')
def test_settings_with_trailing_whitespace (self):