Fixed "format-string" based settings so they can have quotes on them without leaving...
authorGreg Clayton <gclayton@apple.com>
Wed, 3 Jun 2015 02:02:48 +0000 (02:02 +0000)
committerGreg Clayton <gclayton@apple.com>
Wed, 3 Jun 2015 02:02:48 +0000 (02:02 +0000)
(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

lldb/source/Interpreter/OptionValueFormatEntity.cpp
lldb/test/settings/TestSettings.py

index 27a11ee..66d8d84 100644 (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())
index ff08215..3960968 100644 (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):