13df9a8dfSCaroline Tice //====-- UserSettingsController.cpp ------------------------------*- C++ -*-===// 23df9a8dfSCaroline Tice // 33df9a8dfSCaroline Tice // The LLVM Compiler Infrastructure 43df9a8dfSCaroline Tice // 53df9a8dfSCaroline Tice // This file is distributed under the University of Illinois Open Source 63df9a8dfSCaroline Tice // License. See LICENSE.TXT for details. 73df9a8dfSCaroline Tice // 83df9a8dfSCaroline Tice //===----------------------------------------------------------------------===// 93df9a8dfSCaroline Tice 103df9a8dfSCaroline Tice #include <string.h> 113df9a8dfSCaroline Tice #include <algorithm> 123df9a8dfSCaroline Tice 133df9a8dfSCaroline Tice #include "lldb/Core/UserSettingsController.h" 143df9a8dfSCaroline Tice #include "lldb/Core/Error.h" 153df9a8dfSCaroline Tice #include "lldb/Core/Stream.h" 163df9a8dfSCaroline Tice #include "lldb/Core/StreamString.h" 173df9a8dfSCaroline Tice #include "lldb/Interpreter/CommandInterpreter.h" 183df9a8dfSCaroline Tice 193df9a8dfSCaroline Tice using namespace lldb_private; 203df9a8dfSCaroline Tice 213df9a8dfSCaroline Tice UserSettingsController::UserSettingsController (const char *level_name, 223df9a8dfSCaroline Tice const lldb::UserSettingsControllerSP &parent) : 233df9a8dfSCaroline Tice m_default_settings (), 243df9a8dfSCaroline Tice m_settings (), 253df9a8dfSCaroline Tice m_children (), 263df9a8dfSCaroline Tice m_pending_settings (), 273df9a8dfSCaroline Tice m_live_settings (), 283df9a8dfSCaroline Tice m_children_mutex (Mutex::eMutexTypeNormal), 29a767c9a3SJim Ingham m_pending_settings_mutex (Mutex::eMutexTypeRecursive), 30a767c9a3SJim Ingham m_live_settings_mutex (Mutex::eMutexTypeRecursive) 313df9a8dfSCaroline Tice { 323df9a8dfSCaroline Tice m_settings.parent = parent; 333df9a8dfSCaroline Tice m_settings.level_name.SetCString (level_name); 343df9a8dfSCaroline Tice } 353df9a8dfSCaroline Tice 363df9a8dfSCaroline Tice UserSettingsController::~UserSettingsController () 373df9a8dfSCaroline Tice { 383df9a8dfSCaroline Tice m_live_settings.clear(); 393df9a8dfSCaroline Tice } 403df9a8dfSCaroline Tice 4195852755SJim Ingham bool 4295852755SJim Ingham UserSettingsController::InitializeSettingsController (lldb::UserSettingsControllerSP &controller_sp, 4395852755SJim Ingham SettingEntry *global_settings, 4495852755SJim Ingham SettingEntry *instance_settings) 4595852755SJim Ingham { 4695852755SJim Ingham const lldb::UserSettingsControllerSP &parent = controller_sp->GetParent (); 4795852755SJim Ingham if (parent) 4895852755SJim Ingham parent->RegisterChild (controller_sp); 4995852755SJim Ingham 5095852755SJim Ingham controller_sp->CreateSettingsVector (global_settings, true); 5195852755SJim Ingham controller_sp->CreateSettingsVector (instance_settings, false); 5295852755SJim Ingham 5395852755SJim Ingham controller_sp->InitializeGlobalVariables (); 5495852755SJim Ingham controller_sp->CreateDefaultInstanceSettings (); 5595852755SJim Ingham 5695852755SJim Ingham return true; 5795852755SJim Ingham } 5895852755SJim Ingham 5995852755SJim Ingham void 6095852755SJim Ingham UserSettingsController::FinalizeSettingsController (lldb::UserSettingsControllerSP &controller_sp) 6195852755SJim Ingham { 6295852755SJim Ingham const lldb::UserSettingsControllerSP &parent = controller_sp->GetParent (); 6395852755SJim Ingham if (parent) 6495852755SJim Ingham parent->RemoveChild (controller_sp); 6595852755SJim Ingham } 6695852755SJim Ingham 673df9a8dfSCaroline Tice void 683df9a8dfSCaroline Tice UserSettingsController::InitializeGlobalVariables () 693df9a8dfSCaroline Tice { 703df9a8dfSCaroline Tice static bool global_initialized = false; 713df9a8dfSCaroline Tice int num_entries; 723df9a8dfSCaroline Tice const char *prefix = GetLevelName().AsCString(); 733df9a8dfSCaroline Tice 743df9a8dfSCaroline Tice if (! global_initialized) 753df9a8dfSCaroline Tice { 763df9a8dfSCaroline Tice num_entries = m_settings.global_settings.size(); 773df9a8dfSCaroline Tice for (int i = 0; i < num_entries; ++i) 783df9a8dfSCaroline Tice { 793df9a8dfSCaroline Tice SettingEntry &entry = m_settings.global_settings[i]; 803df9a8dfSCaroline Tice if (entry.default_value != NULL) 813df9a8dfSCaroline Tice { 823df9a8dfSCaroline Tice StreamString full_name; 833df9a8dfSCaroline Tice if (prefix[0] != '\0') 843df9a8dfSCaroline Tice full_name.Printf ("%s.%s", prefix, entry.var_name); 853df9a8dfSCaroline Tice else 863df9a8dfSCaroline Tice full_name.Printf ("%s", entry.var_name); 87101c7c20SCaroline Tice SetVariable (full_name.GetData(), entry.default_value, lldb::eVarSetOperationAssign, false, ""); 883df9a8dfSCaroline Tice } 893df9a8dfSCaroline Tice else if ((entry.var_type == lldb::eSetVarTypeEnum) 903df9a8dfSCaroline Tice && (entry.enum_values != NULL)) 913df9a8dfSCaroline Tice { 923df9a8dfSCaroline Tice StreamString full_name; 933df9a8dfSCaroline Tice if (prefix[0] != '\0') 943df9a8dfSCaroline Tice full_name.Printf ("%s.%s", prefix, entry.var_name); 953df9a8dfSCaroline Tice else 963df9a8dfSCaroline Tice full_name.Printf ("%s", entry.var_name); 973df9a8dfSCaroline Tice SetVariable (full_name.GetData(), entry.enum_values[0].string_value, lldb::eVarSetOperationAssign, 98101c7c20SCaroline Tice false, ""); 993df9a8dfSCaroline Tice } 1003df9a8dfSCaroline Tice } 1013df9a8dfSCaroline Tice global_initialized = true; 1023df9a8dfSCaroline Tice } 1033df9a8dfSCaroline Tice } 1043df9a8dfSCaroline Tice 1053df9a8dfSCaroline Tice const lldb::UserSettingsControllerSP & 1063df9a8dfSCaroline Tice UserSettingsController::GetParent () 1073df9a8dfSCaroline Tice { 1083df9a8dfSCaroline Tice return m_settings.parent; 1093df9a8dfSCaroline Tice } 1103df9a8dfSCaroline Tice 1113df9a8dfSCaroline Tice void 1123df9a8dfSCaroline Tice UserSettingsController::RegisterChild (const lldb::UserSettingsControllerSP &child) 1133df9a8dfSCaroline Tice { 1143df9a8dfSCaroline Tice Mutex::Locker locker (m_children_mutex); 1153df9a8dfSCaroline Tice 1163df9a8dfSCaroline Tice // Verify child is not already in m_children. 1173df9a8dfSCaroline Tice size_t num_children = m_children.size(); 1183df9a8dfSCaroline Tice bool found = false; 1193df9a8dfSCaroline Tice for (size_t i = 0; i < num_children; ++i) 1203df9a8dfSCaroline Tice { 1213df9a8dfSCaroline Tice if (m_children[i].get() == child.get()) 1223df9a8dfSCaroline Tice found = true; 1233df9a8dfSCaroline Tice } 1243df9a8dfSCaroline Tice 1253df9a8dfSCaroline Tice // Add child to m_children. 1263df9a8dfSCaroline Tice if (! found) 1273df9a8dfSCaroline Tice m_children.push_back (child); 1283df9a8dfSCaroline Tice } 1293df9a8dfSCaroline Tice 1303df9a8dfSCaroline Tice const ConstString & 1313df9a8dfSCaroline Tice UserSettingsController::GetLevelName () 1323df9a8dfSCaroline Tice { 1333df9a8dfSCaroline Tice return m_settings.level_name; 1343df9a8dfSCaroline Tice } 1353df9a8dfSCaroline Tice 1363df9a8dfSCaroline Tice size_t 1373df9a8dfSCaroline Tice UserSettingsController::GetNumChildren () 1383df9a8dfSCaroline Tice { 1393df9a8dfSCaroline Tice return m_children.size(); 1403df9a8dfSCaroline Tice } 1413df9a8dfSCaroline Tice 1423df9a8dfSCaroline Tice const lldb::UserSettingsControllerSP 1433df9a8dfSCaroline Tice UserSettingsController::GetChildAtIndex (size_t index) 1443df9a8dfSCaroline Tice { 1453df9a8dfSCaroline Tice if (index < m_children.size()) 1463df9a8dfSCaroline Tice return m_children[index]; 1473df9a8dfSCaroline Tice 1483df9a8dfSCaroline Tice lldb::UserSettingsControllerSP dummy_value; 1493df9a8dfSCaroline Tice 1503df9a8dfSCaroline Tice return dummy_value; 1513df9a8dfSCaroline Tice } 1523df9a8dfSCaroline Tice 1533df9a8dfSCaroline Tice const SettingEntry * 1543df9a8dfSCaroline Tice UserSettingsController::GetGlobalEntry (const ConstString &var_name) 1553df9a8dfSCaroline Tice { 1563df9a8dfSCaroline Tice 1573df9a8dfSCaroline Tice for (int i = 0; i < m_settings.global_settings.size(); ++i) 1583df9a8dfSCaroline Tice { 1593df9a8dfSCaroline Tice SettingEntry &entry = m_settings.global_settings[i]; 1603df9a8dfSCaroline Tice ConstString entry_name (entry.var_name); 1613df9a8dfSCaroline Tice if (entry_name == var_name) 1623df9a8dfSCaroline Tice return &entry; 1633df9a8dfSCaroline Tice } 1643df9a8dfSCaroline Tice 1653df9a8dfSCaroline Tice return NULL; 1663df9a8dfSCaroline Tice } 1673df9a8dfSCaroline Tice 1683df9a8dfSCaroline Tice const SettingEntry * 1693df9a8dfSCaroline Tice UserSettingsController::GetInstanceEntry (const ConstString &const_var_name) 1703df9a8dfSCaroline Tice { 1713df9a8dfSCaroline Tice 1723df9a8dfSCaroline Tice for (int i = 0; i < m_settings.instance_settings.size(); ++i) 1733df9a8dfSCaroline Tice { 1743df9a8dfSCaroline Tice SettingEntry &entry = m_settings.instance_settings[i]; 1753df9a8dfSCaroline Tice ConstString entry_name (entry.var_name); 1763df9a8dfSCaroline Tice if (entry_name == const_var_name) 1773df9a8dfSCaroline Tice return &entry; 1783df9a8dfSCaroline Tice } 1793df9a8dfSCaroline Tice 1803df9a8dfSCaroline Tice return NULL; 1813df9a8dfSCaroline Tice } 1823df9a8dfSCaroline Tice 1833df9a8dfSCaroline Tice void 1843df9a8dfSCaroline Tice UserSettingsController::BuildParentPrefix (std::string &parent_prefix) 1853df9a8dfSCaroline Tice { 1863df9a8dfSCaroline Tice lldb::UserSettingsControllerSP parent = GetParent(); 1873df9a8dfSCaroline Tice if (parent.get() != NULL) 1883df9a8dfSCaroline Tice { 1893df9a8dfSCaroline Tice parent->BuildParentPrefix (parent_prefix); 1903df9a8dfSCaroline Tice if (parent_prefix.length() > 0) 1913df9a8dfSCaroline Tice parent_prefix.append ("."); 1923df9a8dfSCaroline Tice } 1933df9a8dfSCaroline Tice parent_prefix.append (GetLevelName().AsCString()); 1943df9a8dfSCaroline Tice } 1953df9a8dfSCaroline Tice 1963df9a8dfSCaroline Tice void 1973df9a8dfSCaroline Tice UserSettingsController::RemoveChild (const lldb::UserSettingsControllerSP &child) 1983df9a8dfSCaroline Tice { 1993df9a8dfSCaroline Tice Mutex::Locker locker (m_children_mutex); 2003df9a8dfSCaroline Tice std::vector<lldb::UserSettingsControllerSP>::iterator pos, end = m_children.end(); 2013df9a8dfSCaroline Tice 2023df9a8dfSCaroline Tice for (pos = m_children.begin(); pos != end; ++pos) 2033df9a8dfSCaroline Tice { 2043df9a8dfSCaroline Tice lldb::UserSettingsControllerSP entry = *pos; 2053df9a8dfSCaroline Tice if (entry == child) 2063df9a8dfSCaroline Tice { 2073df9a8dfSCaroline Tice m_children.erase (pos); 2083df9a8dfSCaroline Tice break; 2093df9a8dfSCaroline Tice } 2103df9a8dfSCaroline Tice } 2113df9a8dfSCaroline Tice } 2123df9a8dfSCaroline Tice 2133df9a8dfSCaroline Tice Error 2143df9a8dfSCaroline Tice UserSettingsController::SetVariable (const char *full_dot_name, 2153df9a8dfSCaroline Tice const char *value, 2163df9a8dfSCaroline Tice const lldb::VarSetOperationType op, 2173df9a8dfSCaroline Tice const bool override, 218101c7c20SCaroline Tice const char *debugger_instance_name, 2193df9a8dfSCaroline Tice const char *index_value) 2203df9a8dfSCaroline Tice { 2213df9a8dfSCaroline Tice Error err; 2223df9a8dfSCaroline Tice ConstString const_var_name; 2233df9a8dfSCaroline Tice const ConstString &default_name = InstanceSettings::GetDefaultName(); 2243df9a8dfSCaroline Tice 2253df9a8dfSCaroline Tice Args names = UserSettingsController::BreakNameIntoPieces (full_dot_name); 2263df9a8dfSCaroline Tice int num_pieces = names.GetArgumentCount(); 2273df9a8dfSCaroline Tice 2283df9a8dfSCaroline Tice if (num_pieces < 1) 2293df9a8dfSCaroline Tice { 2303df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("'%s' is not a valid variable name; cannot assign value.\n", full_dot_name); 2313df9a8dfSCaroline Tice return err; 2323df9a8dfSCaroline Tice } 2333df9a8dfSCaroline Tice 2343df9a8dfSCaroline Tice ConstString prefix (names.GetArgumentAtIndex (0)); 2353df9a8dfSCaroline Tice 2363df9a8dfSCaroline Tice if ((prefix == m_settings.level_name) 2373df9a8dfSCaroline Tice || (m_settings.level_name.GetLength() == 0)) 2383df9a8dfSCaroline Tice { 2393df9a8dfSCaroline Tice 2403df9a8dfSCaroline Tice if (prefix == m_settings.level_name) 2413df9a8dfSCaroline Tice { 2423df9a8dfSCaroline Tice names.Shift (); 2433df9a8dfSCaroline Tice num_pieces = names.GetArgumentCount(); 2443df9a8dfSCaroline Tice } 2453df9a8dfSCaroline Tice 2463df9a8dfSCaroline Tice if (num_pieces == 0) 2473df9a8dfSCaroline Tice { 2483df9a8dfSCaroline Tice err.SetErrorString ("No variable name specified; cannot assign value.\n"); 2493df9a8dfSCaroline Tice return err; 2503df9a8dfSCaroline Tice } 2513df9a8dfSCaroline Tice else if (num_pieces == 1) 2523df9a8dfSCaroline Tice { 2533df9a8dfSCaroline Tice 2543df9a8dfSCaroline Tice // Must be one of the class-wide settings. 2553df9a8dfSCaroline Tice 2563df9a8dfSCaroline Tice const_var_name.SetCString (names.GetArgumentAtIndex (0)); 2573df9a8dfSCaroline Tice const SettingEntry *entry = GetGlobalEntry (const_var_name); 2583df9a8dfSCaroline Tice if (entry) 2593df9a8dfSCaroline Tice { 2603df9a8dfSCaroline Tice UserSettingsController::VerifyOperationForType (entry->var_type, op, const_var_name, err); 2613df9a8dfSCaroline Tice 2623df9a8dfSCaroline Tice if (err.Fail()) 2633df9a8dfSCaroline Tice return err; 2643df9a8dfSCaroline Tice 2653df9a8dfSCaroline Tice if ((value == NULL || value[0] == '\0') 2663df9a8dfSCaroline Tice && (op == lldb::eVarSetOperationAssign)) 2673df9a8dfSCaroline Tice { 2683df9a8dfSCaroline Tice if (entry->var_type != lldb::eSetVarTypeEnum) 2693df9a8dfSCaroline Tice value = entry->default_value; 2703df9a8dfSCaroline Tice else 2713df9a8dfSCaroline Tice value = entry->enum_values[0].string_value; 2723df9a8dfSCaroline Tice } 2733df9a8dfSCaroline Tice UpdateGlobalVariable (const_var_name, index_value, value, *entry, op, err); 2743df9a8dfSCaroline Tice } 2753df9a8dfSCaroline Tice else 2763df9a8dfSCaroline Tice { 2773df9a8dfSCaroline Tice // MIGHT be instance variable, to be for ALL instances. 2783df9a8dfSCaroline Tice 2793df9a8dfSCaroline Tice entry = GetInstanceEntry (const_var_name); 2803df9a8dfSCaroline Tice if (entry == NULL) 2813df9a8dfSCaroline Tice { 2823df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("Unable to find variable '%s.%s'; cannot assign value.\n", 2833df9a8dfSCaroline Tice prefix.AsCString(), const_var_name.AsCString()); 2843df9a8dfSCaroline Tice return err; 2853df9a8dfSCaroline Tice } 2863df9a8dfSCaroline Tice else 2873df9a8dfSCaroline Tice { 2883df9a8dfSCaroline Tice UserSettingsController::VerifyOperationForType (entry->var_type, op, const_var_name, err); 2893df9a8dfSCaroline Tice 2903df9a8dfSCaroline Tice if (err.Fail()) 2913df9a8dfSCaroline Tice return err; 2923df9a8dfSCaroline Tice 2933df9a8dfSCaroline Tice if ((value == NULL || value[0] == '\0') 2943df9a8dfSCaroline Tice && (op == lldb::eVarSetOperationAssign)) 2953df9a8dfSCaroline Tice { 2963df9a8dfSCaroline Tice if (entry->var_type != lldb::eSetVarTypeEnum) 2973df9a8dfSCaroline Tice value = entry->default_value; 2983df9a8dfSCaroline Tice else 2993df9a8dfSCaroline Tice value = entry->enum_values[0].string_value; 3003df9a8dfSCaroline Tice } 3013df9a8dfSCaroline Tice 302101c7c20SCaroline Tice if ((m_settings.level_name.GetLength() > 0) 303101c7c20SCaroline Tice || strlen (debugger_instance_name) == 0) 304101c7c20SCaroline Tice { 305101c7c20SCaroline Tice // Set the default settings 3063df9a8dfSCaroline Tice m_default_settings->UpdateInstanceSettingsVariable (const_var_name, index_value, value, 3073df9a8dfSCaroline Tice default_name, *entry, op, err, true); 308101c7c20SCaroline Tice } 309101c7c20SCaroline Tice else 310101c7c20SCaroline Tice { 311101c7c20SCaroline Tice // We're at the Debugger level; find the correct debugger instance and set those settings 312101c7c20SCaroline Tice StreamString tmp_name; 313101c7c20SCaroline Tice if (debugger_instance_name[0] != '[') 314101c7c20SCaroline Tice tmp_name.Printf ("[%s]", debugger_instance_name); 315101c7c20SCaroline Tice else 316101c7c20SCaroline Tice tmp_name.Printf ("%s", debugger_instance_name); 317101c7c20SCaroline Tice ConstString dbg_name (tmp_name.GetData()); 318101c7c20SCaroline Tice InstanceSettings *dbg_settings = FindSettingsForInstance (dbg_name); 319101c7c20SCaroline Tice if (dbg_settings) 320101c7c20SCaroline Tice dbg_settings->UpdateInstanceSettingsVariable (const_var_name, index_value, value, dbg_name, 321101c7c20SCaroline Tice *entry, op, err, false); 322101c7c20SCaroline Tice } 323101c7c20SCaroline Tice 3243df9a8dfSCaroline Tice if (override) 3253df9a8dfSCaroline Tice { 3263df9a8dfSCaroline Tice OverrideAllInstances (const_var_name, value, op, index_value, err); 3273df9a8dfSCaroline Tice 3283df9a8dfSCaroline Tice // Update all pending records as well. 3293df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pos, end = m_pending_settings.end(); 3303df9a8dfSCaroline Tice for (pos = m_pending_settings.begin(); pos != end; end++) 3313df9a8dfSCaroline Tice { 3323df9a8dfSCaroline Tice const ConstString instance_name (pos->first.c_str()); 3333df9a8dfSCaroline Tice lldb::InstanceSettingsSP setting_sp = pos->second; 3343df9a8dfSCaroline Tice setting_sp->UpdateInstanceSettingsVariable (const_var_name, index_value, value, 3353df9a8dfSCaroline Tice instance_name, *entry, op, err, true); 3363df9a8dfSCaroline Tice } 3373df9a8dfSCaroline Tice } 3383df9a8dfSCaroline Tice } 3393df9a8dfSCaroline Tice } 3403df9a8dfSCaroline Tice } 3413df9a8dfSCaroline Tice else 3423df9a8dfSCaroline Tice { 3433df9a8dfSCaroline Tice // Either a child's setting or an instance setting. 3443df9a8dfSCaroline Tice 3453df9a8dfSCaroline Tice if (names.GetArgumentAtIndex(0)[0] == '[') 3463df9a8dfSCaroline Tice { 3473df9a8dfSCaroline Tice // An instance setting. Supposedly. 3483df9a8dfSCaroline Tice 3493df9a8dfSCaroline Tice ConstString instance_name (names.GetArgumentAtIndex (0)); 3503df9a8dfSCaroline Tice 3513df9a8dfSCaroline Tice // First verify that there is only one more name. 3523df9a8dfSCaroline Tice 3533df9a8dfSCaroline Tice names.Shift(); 3543df9a8dfSCaroline Tice 3553df9a8dfSCaroline Tice if (names.GetArgumentCount() != 1) 3563df9a8dfSCaroline Tice { 3573df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("Invalid variable name format '%s'; cannot assign value.\n", 3583df9a8dfSCaroline Tice full_dot_name); 3593df9a8dfSCaroline Tice return err; 3603df9a8dfSCaroline Tice } 3613df9a8dfSCaroline Tice 3623df9a8dfSCaroline Tice // Next verify that it is a valid instance setting name. 3633df9a8dfSCaroline Tice 3643df9a8dfSCaroline Tice const_var_name.SetCString (names.GetArgumentAtIndex (0)); 3653df9a8dfSCaroline Tice const SettingEntry *entry = GetInstanceEntry (const_var_name); 3663df9a8dfSCaroline Tice 3673df9a8dfSCaroline Tice if (entry == NULL) 3683df9a8dfSCaroline Tice { 3693df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("Unknown instance variable '%s'; cannot assign value.\n", 3703df9a8dfSCaroline Tice const_var_name.AsCString()); 3713df9a8dfSCaroline Tice return err; 3723df9a8dfSCaroline Tice } 3733df9a8dfSCaroline Tice 3743df9a8dfSCaroline Tice UserSettingsController::VerifyOperationForType (entry->var_type, op, const_var_name, err); 3753df9a8dfSCaroline Tice 3763df9a8dfSCaroline Tice if (err.Fail()) 3773df9a8dfSCaroline Tice return err; 3783df9a8dfSCaroline Tice 3793df9a8dfSCaroline Tice if ((value == NULL || value[0] == '\0') 3803df9a8dfSCaroline Tice && (op == lldb::eVarSetOperationAssign)) 3813df9a8dfSCaroline Tice { 3823df9a8dfSCaroline Tice if (entry->var_type != lldb::eSetVarTypeEnum) 3833df9a8dfSCaroline Tice value = entry->default_value; 3843df9a8dfSCaroline Tice else 3853df9a8dfSCaroline Tice value = entry->enum_values[0].string_value; 3863df9a8dfSCaroline Tice } 3873df9a8dfSCaroline Tice 3883df9a8dfSCaroline Tice // Now look for existing instance with given instance name; if not found, find or create pending 3893df9a8dfSCaroline Tice // setting for instance with given name. 3903df9a8dfSCaroline Tice 3913df9a8dfSCaroline Tice InstanceSettings *current_settings = FindSettingsForInstance (instance_name); 3923df9a8dfSCaroline Tice 3933df9a8dfSCaroline Tice if (current_settings != NULL) 3943df9a8dfSCaroline Tice { 3953df9a8dfSCaroline Tice current_settings->UpdateInstanceSettingsVariable (const_var_name, index_value, value, 3963df9a8dfSCaroline Tice instance_name, *entry, op, err, false); 3973df9a8dfSCaroline Tice 3983df9a8dfSCaroline Tice } 3993df9a8dfSCaroline Tice else 4003df9a8dfSCaroline Tice { 4013df9a8dfSCaroline Tice // Instance does not currently exist; make or update a pending setting for it. 4023df9a8dfSCaroline Tice lldb::InstanceSettingsSP current_settings_sp = PendingSettingsForInstance (instance_name); 4033df9a8dfSCaroline Tice 4043df9a8dfSCaroline Tice // Now we have a settings record, update it appropriately. 4053df9a8dfSCaroline Tice 4063df9a8dfSCaroline Tice current_settings_sp->UpdateInstanceSettingsVariable (const_var_name, index_value, value, 4073df9a8dfSCaroline Tice instance_name, *entry, op, err, true); 4083df9a8dfSCaroline Tice 4093df9a8dfSCaroline Tice { // Scope for mutex. 4103df9a8dfSCaroline Tice Mutex::Locker locker (m_pending_settings_mutex); 4113df9a8dfSCaroline Tice m_pending_settings[instance_name.AsCString()] = current_settings_sp; 4123df9a8dfSCaroline Tice } 4133df9a8dfSCaroline Tice 4143df9a8dfSCaroline Tice if (override) 4153df9a8dfSCaroline Tice { 4163df9a8dfSCaroline Tice OverrideAllInstances (const_var_name, value, op, index_value, err); 4173df9a8dfSCaroline Tice 4183df9a8dfSCaroline Tice // Update all pending records as well. 4193df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pos; 4203df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator end = m_pending_settings.end(); 4213df9a8dfSCaroline Tice for (pos = m_pending_settings.begin(); pos != end; end++) 4223df9a8dfSCaroline Tice { 4233df9a8dfSCaroline Tice const ConstString tmp_inst_name (pos->first.c_str()); 4243df9a8dfSCaroline Tice lldb::InstanceSettingsSP setting_sp = pos->second; 4253df9a8dfSCaroline Tice setting_sp->UpdateInstanceSettingsVariable (const_var_name, index_value, value, 4263df9a8dfSCaroline Tice tmp_inst_name, *entry, op, err, true); 4273df9a8dfSCaroline Tice } 4283df9a8dfSCaroline Tice } 4293df9a8dfSCaroline Tice } 4303df9a8dfSCaroline Tice } 4313df9a8dfSCaroline Tice else 4323df9a8dfSCaroline Tice { 4333df9a8dfSCaroline Tice // A child setting. 4343df9a8dfSCaroline Tice lldb::UserSettingsControllerSP child; 4353df9a8dfSCaroline Tice ConstString child_prefix (names.GetArgumentAtIndex (0)); 4363df9a8dfSCaroline Tice int num_children = GetNumChildren(); 4373df9a8dfSCaroline Tice bool found = false; 4383df9a8dfSCaroline Tice for (int i = 0; i < num_children && !found; ++i) 4393df9a8dfSCaroline Tice { 4403df9a8dfSCaroline Tice child = GetChildAtIndex (i); 4413df9a8dfSCaroline Tice ConstString current_prefix = child->GetLevelName(); 4423df9a8dfSCaroline Tice if (current_prefix == child_prefix) 4433df9a8dfSCaroline Tice { 4443df9a8dfSCaroline Tice found = true; 4453df9a8dfSCaroline Tice std::string new_name; 4463df9a8dfSCaroline Tice for (int j = 0; j < names.GetArgumentCount(); ++j) 4473df9a8dfSCaroline Tice { 4483df9a8dfSCaroline Tice if (j > 0) 4493df9a8dfSCaroline Tice new_name += '.'; 4503df9a8dfSCaroline Tice new_name += names.GetArgumentAtIndex (j); 4513df9a8dfSCaroline Tice } 452101c7c20SCaroline Tice return child->SetVariable (new_name.c_str(), value, op, override, debugger_instance_name, 453101c7c20SCaroline Tice index_value); 4543df9a8dfSCaroline Tice } 4553df9a8dfSCaroline Tice } 4563df9a8dfSCaroline Tice if (!found) 4573df9a8dfSCaroline Tice { 4583df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("Unable to find variable '%s'; cannot assign value.\n", 4593df9a8dfSCaroline Tice full_dot_name); 4603df9a8dfSCaroline Tice return err; 4613df9a8dfSCaroline Tice } 4623df9a8dfSCaroline Tice } 4633df9a8dfSCaroline Tice } 4643df9a8dfSCaroline Tice } 4653df9a8dfSCaroline Tice else 4663df9a8dfSCaroline Tice { 4673df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("'%s' is not a valid level name; was expecting '%s'. Cannot assign value.\n", 4683df9a8dfSCaroline Tice prefix.AsCString(), m_settings.level_name.AsCString()); 4693df9a8dfSCaroline Tice } 4703df9a8dfSCaroline Tice 4713df9a8dfSCaroline Tice return err; 4723df9a8dfSCaroline Tice } 4733df9a8dfSCaroline Tice 4743df9a8dfSCaroline Tice StringList 475101c7c20SCaroline Tice UserSettingsController::GetVariable (const char *full_dot_name, lldb::SettableVariableType &var_type, 476101c7c20SCaroline Tice const char *debugger_instance_name) 4773df9a8dfSCaroline Tice { 4783df9a8dfSCaroline Tice Args names = UserSettingsController::BreakNameIntoPieces (full_dot_name); 4793df9a8dfSCaroline Tice ConstString const_var_name; 4803df9a8dfSCaroline Tice StringList value; 4813df9a8dfSCaroline Tice 4823df9a8dfSCaroline Tice int num_pieces = names.GetArgumentCount(); 4833df9a8dfSCaroline Tice 4843df9a8dfSCaroline Tice ConstString prefix (names.GetArgumentAtIndex (0)); 4853df9a8dfSCaroline Tice const_var_name.SetCString (names.GetArgumentAtIndex (num_pieces - 1)); 4863df9a8dfSCaroline Tice 4873df9a8dfSCaroline Tice const SettingEntry *global_entry = GetGlobalEntry (const_var_name); 4883df9a8dfSCaroline Tice const SettingEntry *instance_entry = GetInstanceEntry (const_var_name); 4893df9a8dfSCaroline Tice 4903df9a8dfSCaroline Tice if ((prefix != m_settings.level_name) 4913df9a8dfSCaroline Tice && (m_settings.level_name.GetLength () > 0)) 4923df9a8dfSCaroline Tice { 4933df9a8dfSCaroline Tice value.AppendString ("Invalid variable name"); 4943df9a8dfSCaroline Tice return value; 4953df9a8dfSCaroline Tice } 4963df9a8dfSCaroline Tice 4973df9a8dfSCaroline Tice // prefix name matched; remove it from names. 4983df9a8dfSCaroline Tice if (m_settings.level_name.GetLength() > 0) 4993df9a8dfSCaroline Tice names.Shift(); 5003df9a8dfSCaroline Tice 5013df9a8dfSCaroline Tice // Should we pass this off to a child? If there is more than one name piece left, and the next name piece 5023df9a8dfSCaroline Tice // matches a child prefix, then yes. 5033df9a8dfSCaroline Tice 5043df9a8dfSCaroline Tice lldb::UserSettingsControllerSP child; 5053df9a8dfSCaroline Tice if (names.GetArgumentCount() > 1) 5063df9a8dfSCaroline Tice { 5073df9a8dfSCaroline Tice ConstString child_prefix (names.GetArgumentAtIndex (0)); 5083df9a8dfSCaroline Tice bool found = false; 5093df9a8dfSCaroline Tice for (int i = 0; i < m_children.size() && !found; ++i) 5103df9a8dfSCaroline Tice { 5113df9a8dfSCaroline Tice if (child_prefix == m_children[i]->GetLevelName()) 5123df9a8dfSCaroline Tice { 5133df9a8dfSCaroline Tice found = true; 5143df9a8dfSCaroline Tice child = m_children[i]; 5153df9a8dfSCaroline Tice std::string new_name; 5163df9a8dfSCaroline Tice for (int j = 0; j < names.GetArgumentCount(); ++j) 5173df9a8dfSCaroline Tice { 5183df9a8dfSCaroline Tice if (j > 0) 5193df9a8dfSCaroline Tice new_name += '.'; 5203df9a8dfSCaroline Tice new_name += names.GetArgumentAtIndex (j); 5213df9a8dfSCaroline Tice } 522101c7c20SCaroline Tice return child->GetVariable (new_name.c_str(), var_type, debugger_instance_name); 5233df9a8dfSCaroline Tice } 5243df9a8dfSCaroline Tice } 5253df9a8dfSCaroline Tice 5263df9a8dfSCaroline Tice if (!found) 5273df9a8dfSCaroline Tice { 5283df9a8dfSCaroline Tice // Cannot be handled by a child, because name did not match any child prefixes. 5293df9a8dfSCaroline Tice // Cannot be a class-wide variable because there are too many name pieces. 5303df9a8dfSCaroline Tice 5313df9a8dfSCaroline Tice if (instance_entry != NULL) 5323df9a8dfSCaroline Tice { 5333df9a8dfSCaroline Tice var_type = instance_entry->var_type; 5343df9a8dfSCaroline Tice ConstString instance_name (names.GetArgumentAtIndex (0)); 5353df9a8dfSCaroline Tice InstanceSettings *current_settings = FindSettingsForInstance (instance_name); 5363df9a8dfSCaroline Tice 5373df9a8dfSCaroline Tice if (current_settings != NULL) 5383df9a8dfSCaroline Tice { 5393df9a8dfSCaroline Tice current_settings->GetInstanceSettingsValue (*instance_entry, const_var_name, value); 5403df9a8dfSCaroline Tice } 5413df9a8dfSCaroline Tice else 5423df9a8dfSCaroline Tice { 5433df9a8dfSCaroline Tice // Look for instance name setting in pending settings. 5443df9a8dfSCaroline Tice 5453df9a8dfSCaroline Tice std::string inst_name_str = instance_name.AsCString(); 5463df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pos; 5473df9a8dfSCaroline Tice 5483df9a8dfSCaroline Tice pos = m_pending_settings.find (inst_name_str); 5493df9a8dfSCaroline Tice if (pos != m_pending_settings.end()) 5503df9a8dfSCaroline Tice { 5513df9a8dfSCaroline Tice lldb::InstanceSettingsSP settings_sp = pos->second; 5523df9a8dfSCaroline Tice settings_sp->GetInstanceSettingsValue (*instance_entry, const_var_name, value); 5533df9a8dfSCaroline Tice } 5543df9a8dfSCaroline Tice else 5553df9a8dfSCaroline Tice { 556101c7c20SCaroline Tice if (m_settings.level_name.GetLength() > 0) 557101c7c20SCaroline Tice { 5583df9a8dfSCaroline Tice // No valid instance name; assume they want the default settings. 5593df9a8dfSCaroline Tice m_default_settings->GetInstanceSettingsValue (*instance_entry, const_var_name, value); 5603df9a8dfSCaroline Tice } 561101c7c20SCaroline Tice else 562101c7c20SCaroline Tice { 563101c7c20SCaroline Tice // We're at the Debugger level; use the debugger's instance settings. 564101c7c20SCaroline Tice StreamString tmp_name; 565101c7c20SCaroline Tice if (debugger_instance_name[0] != '[') 566101c7c20SCaroline Tice tmp_name.Printf ("[%s]", debugger_instance_name); 567101c7c20SCaroline Tice else 568101c7c20SCaroline Tice tmp_name.Printf ("%s", debugger_instance_name); 569101c7c20SCaroline Tice ConstString dbg_name (debugger_instance_name); 570101c7c20SCaroline Tice InstanceSettings *dbg_settings = FindSettingsForInstance (dbg_name); 571101c7c20SCaroline Tice if (dbg_settings) 572101c7c20SCaroline Tice dbg_settings->GetInstanceSettingsValue (*instance_entry, const_var_name, value); 573101c7c20SCaroline Tice } 574101c7c20SCaroline Tice } 5753df9a8dfSCaroline Tice } 5763df9a8dfSCaroline Tice } 5773df9a8dfSCaroline Tice else 5783df9a8dfSCaroline Tice value.AppendString ("Invalid variable name"); 5793df9a8dfSCaroline Tice } 5803df9a8dfSCaroline Tice } 5813df9a8dfSCaroline Tice else 5823df9a8dfSCaroline Tice { 5833df9a8dfSCaroline Tice // Only one name left. It must belong to the current level, or be an error. 5843df9a8dfSCaroline Tice if ((global_entry == NULL) 5853df9a8dfSCaroline Tice && (instance_entry == NULL)) 5863df9a8dfSCaroline Tice { 5873df9a8dfSCaroline Tice value.AppendString ("Invalid variable name"); 5883df9a8dfSCaroline Tice } 5893df9a8dfSCaroline Tice else if (global_entry) 5903df9a8dfSCaroline Tice { 5913df9a8dfSCaroline Tice var_type = global_entry->var_type; 5923df9a8dfSCaroline Tice GetGlobalSettingsValue (const_var_name, value); 5933df9a8dfSCaroline Tice } 5943df9a8dfSCaroline Tice else if (instance_entry) 5953df9a8dfSCaroline Tice { 5963df9a8dfSCaroline Tice var_type = instance_entry->var_type; 597101c7c20SCaroline Tice if (m_settings.level_name.GetLength() > 0) 5983df9a8dfSCaroline Tice m_default_settings->GetInstanceSettingsValue (*instance_entry, const_var_name, value); 599101c7c20SCaroline Tice else 600101c7c20SCaroline Tice { 601101c7c20SCaroline Tice // We're at the Debugger level; use the debugger's instance settings. 602101c7c20SCaroline Tice StreamString tmp_name; 603101c7c20SCaroline Tice if (debugger_instance_name[0] != '[') 604101c7c20SCaroline Tice tmp_name.Printf ("[%s]", debugger_instance_name); 605101c7c20SCaroline Tice else 606101c7c20SCaroline Tice tmp_name.Printf ("%s", debugger_instance_name); 607101c7c20SCaroline Tice ConstString dbg_name (tmp_name.GetData()); 608101c7c20SCaroline Tice InstanceSettings *dbg_settings = FindSettingsForInstance (dbg_name); 609101c7c20SCaroline Tice if (dbg_settings) 610101c7c20SCaroline Tice dbg_settings->GetInstanceSettingsValue (*instance_entry, const_var_name, value); 611101c7c20SCaroline Tice } 6123df9a8dfSCaroline Tice } 6133df9a8dfSCaroline Tice } 6143df9a8dfSCaroline Tice 6153df9a8dfSCaroline Tice return value; 6163df9a8dfSCaroline Tice } 6173df9a8dfSCaroline Tice 6183df9a8dfSCaroline Tice void 6193df9a8dfSCaroline Tice UserSettingsController::RemovePendingSettings (const ConstString &instance_name) 6203df9a8dfSCaroline Tice { 62191123da2SCaroline Tice StreamString tmp_name; 62291123da2SCaroline Tice 62391123da2SCaroline Tice // Add surrounding brackets to instance name if not already present. 62491123da2SCaroline Tice 62591123da2SCaroline Tice if (instance_name.AsCString()[0] != '[') 62691123da2SCaroline Tice tmp_name.Printf ("[%s]", instance_name.AsCString()); 62791123da2SCaroline Tice else 62891123da2SCaroline Tice tmp_name.Printf ("%s", instance_name.AsCString()); 62991123da2SCaroline Tice 63091123da2SCaroline Tice std::string instance_name_str (tmp_name.GetData()); 6313df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pos; 6323df9a8dfSCaroline Tice Mutex::Locker locker (m_pending_settings_mutex); 6333df9a8dfSCaroline Tice 6343df9a8dfSCaroline Tice m_pending_settings.erase (instance_name_str); 6353df9a8dfSCaroline Tice } 6363df9a8dfSCaroline Tice 6373df9a8dfSCaroline Tice const lldb::InstanceSettingsSP & 6383df9a8dfSCaroline Tice UserSettingsController::FindPendingSettings (const ConstString &instance_name) 6393df9a8dfSCaroline Tice { 6403df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pos; 64191123da2SCaroline Tice StreamString tmp_name; 64291123da2SCaroline Tice 64391123da2SCaroline Tice // Add surrounding brackets to instance name if not already present. 64491123da2SCaroline Tice 64591123da2SCaroline Tice if (instance_name.AsCString()[0] != '[') 64691123da2SCaroline Tice tmp_name.Printf ("[%s]", instance_name.AsCString()); 64791123da2SCaroline Tice else 64891123da2SCaroline Tice tmp_name.Printf ("%s", instance_name.AsCString()); 64991123da2SCaroline Tice 65091123da2SCaroline Tice std::string instance_name_str (tmp_name.GetData()); // Need std::string for std::map look-up 6513df9a8dfSCaroline Tice 6523df9a8dfSCaroline Tice { // Scope for mutex. 6533df9a8dfSCaroline Tice Mutex::Locker locker (m_pending_settings_mutex); 6543df9a8dfSCaroline Tice 6553df9a8dfSCaroline Tice pos = m_pending_settings.find (instance_name_str); 6563df9a8dfSCaroline Tice if (pos != m_pending_settings.end()) 6573df9a8dfSCaroline Tice return pos->second; 6583df9a8dfSCaroline Tice } 6593df9a8dfSCaroline Tice 6603df9a8dfSCaroline Tice return m_default_settings; 6613df9a8dfSCaroline Tice } 6623df9a8dfSCaroline Tice 6633df9a8dfSCaroline Tice void 6643df9a8dfSCaroline Tice UserSettingsController::CreateDefaultInstanceSettings () 6653df9a8dfSCaroline Tice { 6663df9a8dfSCaroline Tice Error err; 6673df9a8dfSCaroline Tice const ConstString &default_name = InstanceSettings::GetDefaultName(); 6683df9a8dfSCaroline Tice for (int i = 0; i < m_settings.instance_settings.size(); ++i) 6693df9a8dfSCaroline Tice { 6703df9a8dfSCaroline Tice SettingEntry &entry = m_settings.instance_settings[i]; 6713df9a8dfSCaroline Tice ConstString var_name (entry.var_name); 6723df9a8dfSCaroline Tice const char *value = entry.default_value; 6733df9a8dfSCaroline Tice 6743df9a8dfSCaroline Tice if (entry.var_type == lldb::eSetVarTypeEnum) 6753df9a8dfSCaroline Tice value = entry.enum_values[0].string_value; 6763df9a8dfSCaroline Tice 6773df9a8dfSCaroline Tice m_default_settings->UpdateInstanceSettingsVariable (var_name, NULL, value, default_name, entry, 6783df9a8dfSCaroline Tice lldb::eVarSetOperationAssign, err, true); 6793df9a8dfSCaroline Tice } 6803df9a8dfSCaroline Tice } 6813df9a8dfSCaroline Tice 6823df9a8dfSCaroline Tice void 6833df9a8dfSCaroline Tice UserSettingsController::CopyDefaultSettings (const lldb::InstanceSettingsSP &actual_settings, 6843df9a8dfSCaroline Tice const ConstString &instance_name, 6853df9a8dfSCaroline Tice bool pending) 6863df9a8dfSCaroline Tice { 6873df9a8dfSCaroline Tice Error err; 6883df9a8dfSCaroline Tice for (int i = 0; i < m_settings.instance_settings.size(); ++i) 6893df9a8dfSCaroline Tice { 6903df9a8dfSCaroline Tice SettingEntry &entry = m_settings.instance_settings[i]; 6913df9a8dfSCaroline Tice ConstString var_name (entry.var_name); 6923df9a8dfSCaroline Tice StringList value; 6933df9a8dfSCaroline Tice m_default_settings->GetInstanceSettingsValue (entry, var_name, value); 6943df9a8dfSCaroline Tice 6953df9a8dfSCaroline Tice std::string value_str; 6963df9a8dfSCaroline Tice if (value.GetSize() == 1) 6973df9a8dfSCaroline Tice value_str.append (value.GetStringAtIndex (0)); 6983df9a8dfSCaroline Tice else if (value.GetSize() > 1) 6993df9a8dfSCaroline Tice { 7003df9a8dfSCaroline Tice for (int j = 0; j < value.GetSize(); ++j) 7013df9a8dfSCaroline Tice { 7023df9a8dfSCaroline Tice if (j > 0) 7033df9a8dfSCaroline Tice value_str.append (" "); 7043df9a8dfSCaroline Tice value_str.append (value.GetStringAtIndex (j)); 7053df9a8dfSCaroline Tice } 7063df9a8dfSCaroline Tice } 7073df9a8dfSCaroline Tice 7083df9a8dfSCaroline Tice actual_settings->UpdateInstanceSettingsVariable (var_name, NULL, value_str.c_str(), instance_name, entry, 7093df9a8dfSCaroline Tice lldb::eVarSetOperationAssign, err, pending); 7103df9a8dfSCaroline Tice 7113df9a8dfSCaroline Tice } 7123df9a8dfSCaroline Tice } 7133df9a8dfSCaroline Tice 7143df9a8dfSCaroline Tice lldb::InstanceSettingsSP 7153df9a8dfSCaroline Tice UserSettingsController::PendingSettingsForInstance (const ConstString &instance_name) 7163df9a8dfSCaroline Tice { 7173df9a8dfSCaroline Tice std::string name_str (instance_name.AsCString()); 7183df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pos; 7193df9a8dfSCaroline Tice Mutex::Locker locker (m_pending_settings_mutex); 7203df9a8dfSCaroline Tice 7213df9a8dfSCaroline Tice pos = m_pending_settings.find (name_str); 7223df9a8dfSCaroline Tice if (pos != m_pending_settings.end()) 7233df9a8dfSCaroline Tice { 7243df9a8dfSCaroline Tice lldb::InstanceSettingsSP settings_sp = pos->second; 7253df9a8dfSCaroline Tice return settings_sp; 7263df9a8dfSCaroline Tice } 7273df9a8dfSCaroline Tice else 7283df9a8dfSCaroline Tice { 72991123da2SCaroline Tice lldb::InstanceSettingsSP new_settings_sp = CreateNewInstanceSettings (instance_name.AsCString()); 7303df9a8dfSCaroline Tice CopyDefaultSettings (new_settings_sp, instance_name, true); 7313df9a8dfSCaroline Tice m_pending_settings[name_str] = new_settings_sp; 7323df9a8dfSCaroline Tice return new_settings_sp; 7333df9a8dfSCaroline Tice } 7343df9a8dfSCaroline Tice 7353df9a8dfSCaroline Tice // Should never reach this line. 7363df9a8dfSCaroline Tice 7373df9a8dfSCaroline Tice lldb::InstanceSettingsSP dummy; 7383df9a8dfSCaroline Tice 7393df9a8dfSCaroline Tice return dummy; 7403df9a8dfSCaroline Tice } 7413df9a8dfSCaroline Tice 7423df9a8dfSCaroline Tice void 7433df9a8dfSCaroline Tice UserSettingsController::GetAllDefaultSettingValues (StreamString &result_stream) 7443df9a8dfSCaroline Tice { 7453df9a8dfSCaroline Tice std::string parent_prefix; 7463df9a8dfSCaroline Tice BuildParentPrefix (parent_prefix); 7473df9a8dfSCaroline Tice const char *prefix = parent_prefix.c_str(); 7483df9a8dfSCaroline Tice 7493df9a8dfSCaroline Tice for (int i = 0; i < m_settings.instance_settings.size(); ++i) 7503df9a8dfSCaroline Tice { 7513df9a8dfSCaroline Tice SettingEntry &entry = m_settings.instance_settings[i]; 7523df9a8dfSCaroline Tice ConstString var_name (entry.var_name); 7533df9a8dfSCaroline Tice StringList tmp_value; 7543df9a8dfSCaroline Tice m_default_settings->GetInstanceSettingsValue (entry, var_name, tmp_value); 7553df9a8dfSCaroline Tice 7563df9a8dfSCaroline Tice StreamString value_string; 7573df9a8dfSCaroline Tice 7583df9a8dfSCaroline Tice if (tmp_value.GetSize() == 1) 7593df9a8dfSCaroline Tice value_string.Printf ("%s", tmp_value.GetStringAtIndex (0)); 7603df9a8dfSCaroline Tice else 7613df9a8dfSCaroline Tice { 7623df9a8dfSCaroline Tice for (int j = 0; j < tmp_value.GetSize(); ++j) 7633df9a8dfSCaroline Tice value_string.Printf ("%s ", tmp_value.GetStringAtIndex (j)); 7643df9a8dfSCaroline Tice } 7653df9a8dfSCaroline Tice 766*ded2fa39SCaroline Tice if (! parent_prefix.empty()) 767*ded2fa39SCaroline Tice result_stream.Printf ("%s.%s (%s) = '%s'\n", prefix, var_name.AsCString(), 7683df9a8dfSCaroline Tice UserSettingsController::GetTypeString (entry.var_type), value_string.GetData()); 7693df9a8dfSCaroline Tice } 7703df9a8dfSCaroline Tice } 7713df9a8dfSCaroline Tice 7723df9a8dfSCaroline Tice void 7733df9a8dfSCaroline Tice UserSettingsController::GetAllPendingSettingValues (StreamString &result_stream) 7743df9a8dfSCaroline Tice { 7753df9a8dfSCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pos; 7763df9a8dfSCaroline Tice 7773df9a8dfSCaroline Tice std::string parent_prefix; 7783df9a8dfSCaroline Tice BuildParentPrefix (parent_prefix); 7793df9a8dfSCaroline Tice const char *prefix = parent_prefix.c_str(); 7803df9a8dfSCaroline Tice 7813df9a8dfSCaroline Tice for (pos = m_pending_settings.begin(); pos != m_pending_settings.end(); ++pos) 7823df9a8dfSCaroline Tice { 7833df9a8dfSCaroline Tice std::string tmp_name = pos->first; 7843df9a8dfSCaroline Tice lldb::InstanceSettingsSP settings_sp = pos->second; 7853df9a8dfSCaroline Tice 7863df9a8dfSCaroline Tice const ConstString instance_name (tmp_name.c_str()); 7873df9a8dfSCaroline Tice 7883df9a8dfSCaroline Tice for (int i = 0; i < m_settings.instance_settings.size(); ++i) 7893df9a8dfSCaroline Tice { 7903df9a8dfSCaroline Tice SettingEntry &entry = m_settings.instance_settings[i]; 7913df9a8dfSCaroline Tice ConstString var_name (entry.var_name); 7923df9a8dfSCaroline Tice StringList tmp_value; 7933df9a8dfSCaroline Tice settings_sp->GetInstanceSettingsValue (entry, var_name, tmp_value); 7943df9a8dfSCaroline Tice 7953df9a8dfSCaroline Tice StreamString value_str; 7963df9a8dfSCaroline Tice 7973df9a8dfSCaroline Tice if (tmp_value.GetSize() == 0) 798*ded2fa39SCaroline Tice value_str.Printf (""); 799*ded2fa39SCaroline Tice else if (tmp_value.GetSize() == 1) 8003df9a8dfSCaroline Tice value_str.Printf ("%s", tmp_value.GetStringAtIndex (0)); 8013df9a8dfSCaroline Tice else 8023df9a8dfSCaroline Tice { 8033df9a8dfSCaroline Tice for (int j = 0; j < tmp_value.GetSize(); ++j) 8043df9a8dfSCaroline Tice value_str.Printf ("%s ", tmp_value.GetStringAtIndex (j)); 8053df9a8dfSCaroline Tice } 8063df9a8dfSCaroline Tice 8073df9a8dfSCaroline Tice if (parent_prefix.length() > 0) 8083df9a8dfSCaroline Tice { 8093df9a8dfSCaroline Tice result_stream.Printf ("%s.%s.%s (%s) = '%s' [pending]\n", prefix, instance_name.AsCString(), 8103df9a8dfSCaroline Tice var_name.AsCString(), UserSettingsController::GetTypeString (entry.var_type), 8113df9a8dfSCaroline Tice value_str.GetData()); 8123df9a8dfSCaroline Tice } 8133df9a8dfSCaroline Tice else 8143df9a8dfSCaroline Tice { 8153df9a8dfSCaroline Tice result_stream.Printf ("%s (%s) = '%s' [pending]\n", var_name.AsCString(), 8163df9a8dfSCaroline Tice UserSettingsController::GetTypeString (entry.var_type), 8173df9a8dfSCaroline Tice value_str.GetData()); 8183df9a8dfSCaroline Tice } 8193df9a8dfSCaroline Tice } 8203df9a8dfSCaroline Tice } 8213df9a8dfSCaroline Tice } 8223df9a8dfSCaroline Tice 8233df9a8dfSCaroline Tice InstanceSettings * 8243df9a8dfSCaroline Tice UserSettingsController::FindSettingsForInstance (const ConstString &instance_name) 8253df9a8dfSCaroline Tice { 8263df9a8dfSCaroline Tice std::string instance_name_str (instance_name.AsCString()); 8273df9a8dfSCaroline Tice std::map<std::string, InstanceSettings *>::iterator pos; 8283df9a8dfSCaroline Tice 8293df9a8dfSCaroline Tice pos = m_live_settings.find (instance_name_str); 8303df9a8dfSCaroline Tice if (pos != m_live_settings.end ()) 8313df9a8dfSCaroline Tice { 8323df9a8dfSCaroline Tice InstanceSettings *settings = pos->second; 8333df9a8dfSCaroline Tice return settings; 8343df9a8dfSCaroline Tice } 8353df9a8dfSCaroline Tice 8363df9a8dfSCaroline Tice return NULL; 8373df9a8dfSCaroline Tice } 8383df9a8dfSCaroline Tice 8393df9a8dfSCaroline Tice void 8403df9a8dfSCaroline Tice UserSettingsController::GetAllInstanceVariableValues (CommandInterpreter &interpreter, 8413df9a8dfSCaroline Tice StreamString &result_stream) 8423df9a8dfSCaroline Tice { 8433df9a8dfSCaroline Tice std::map<std::string, InstanceSettings *>::iterator pos; 8443df9a8dfSCaroline Tice std::string parent_prefix; 8453df9a8dfSCaroline Tice BuildParentPrefix (parent_prefix); 8463df9a8dfSCaroline Tice const char *prefix = parent_prefix.c_str(); 8473df9a8dfSCaroline Tice StreamString description; 8483df9a8dfSCaroline Tice 8493df9a8dfSCaroline Tice for (pos = m_live_settings.begin(); pos != m_live_settings.end(); ++pos) 8503df9a8dfSCaroline Tice { 8513df9a8dfSCaroline Tice std::string instance_name = pos->first; 8523df9a8dfSCaroline Tice InstanceSettings *settings = pos->second; 8533df9a8dfSCaroline Tice 8543df9a8dfSCaroline Tice for (int i = 0; i < m_settings.instance_settings.size(); ++i) 8553df9a8dfSCaroline Tice { 8563df9a8dfSCaroline Tice SettingEntry &entry = m_settings.instance_settings[i]; 8573df9a8dfSCaroline Tice const ConstString var_name (entry.var_name); 8583df9a8dfSCaroline Tice StringList tmp_value; 8593df9a8dfSCaroline Tice settings->GetInstanceSettingsValue (entry, var_name, tmp_value); 8603df9a8dfSCaroline Tice StreamString tmp_value_str; 8613df9a8dfSCaroline Tice 8623df9a8dfSCaroline Tice if (tmp_value.GetSize() == 0) 863*ded2fa39SCaroline Tice tmp_value_str.Printf (""); 864*ded2fa39SCaroline Tice else if (tmp_value.GetSize() == 1) 8653df9a8dfSCaroline Tice tmp_value_str.Printf ("%s", tmp_value.GetStringAtIndex (0)); 8663df9a8dfSCaroline Tice else 8673df9a8dfSCaroline Tice { 8683df9a8dfSCaroline Tice for (int j = 0; j < tmp_value.GetSize(); ++j) 8693df9a8dfSCaroline Tice tmp_value_str.Printf ("%s ",tmp_value.GetStringAtIndex (j)); 8703df9a8dfSCaroline Tice } 8713df9a8dfSCaroline Tice 8723df9a8dfSCaroline Tice description.Clear(); 8733df9a8dfSCaroline Tice if (parent_prefix.length() > 0) 8743df9a8dfSCaroline Tice { 8753df9a8dfSCaroline Tice description.Printf ("%s.%s.%s (%s) = '%s'", prefix, instance_name.c_str(), var_name.AsCString(), 8763df9a8dfSCaroline Tice UserSettingsController::GetTypeString (entry.var_type), 8773df9a8dfSCaroline Tice tmp_value_str.GetData()); 8783df9a8dfSCaroline Tice } 8793df9a8dfSCaroline Tice else 8803df9a8dfSCaroline Tice { 8813df9a8dfSCaroline Tice description.Printf ("%s (%s) = '%s'", var_name.AsCString(), 8823df9a8dfSCaroline Tice UserSettingsController::GetTypeString (entry.var_type), tmp_value_str.GetData()); 8833df9a8dfSCaroline Tice } 8843df9a8dfSCaroline Tice result_stream.Printf ("%s\n", description.GetData()); 8853df9a8dfSCaroline Tice } 8863df9a8dfSCaroline Tice } 8873df9a8dfSCaroline Tice } 8883df9a8dfSCaroline Tice 8893df9a8dfSCaroline Tice void 8903df9a8dfSCaroline Tice UserSettingsController::OverrideAllInstances (const ConstString &var_name, 8913df9a8dfSCaroline Tice const char *value, 8923df9a8dfSCaroline Tice lldb::VarSetOperationType op, 8933df9a8dfSCaroline Tice const char *index_value, 8943df9a8dfSCaroline Tice Error &err) 8953df9a8dfSCaroline Tice { 8963df9a8dfSCaroline Tice std::map<std::string, InstanceSettings *>::iterator pos; 8973df9a8dfSCaroline Tice StreamString description; 8983df9a8dfSCaroline Tice 8993df9a8dfSCaroline Tice for (pos = m_live_settings.begin(); pos != m_live_settings.end(); ++pos) 9003df9a8dfSCaroline Tice { 9013df9a8dfSCaroline Tice InstanceSettings *settings = pos->second; 9023df9a8dfSCaroline Tice StreamString tmp_name; 9033df9a8dfSCaroline Tice tmp_name.Printf ("[%s]", settings->GetInstanceName().AsCString()); 9043df9a8dfSCaroline Tice const ConstString instance_name (tmp_name.GetData()); 9053df9a8dfSCaroline Tice const SettingEntry *entry = GetInstanceEntry (var_name); 9063df9a8dfSCaroline Tice settings->UpdateInstanceSettingsVariable (var_name, index_value, value, instance_name, *entry, op, err, false); 9073df9a8dfSCaroline Tice 9083df9a8dfSCaroline Tice } 9093df9a8dfSCaroline Tice } 9103df9a8dfSCaroline Tice 9113df9a8dfSCaroline Tice void 9123df9a8dfSCaroline Tice UserSettingsController::RegisterInstanceSettings (InstanceSettings *instance_settings) 9133df9a8dfSCaroline Tice { 9143df9a8dfSCaroline Tice Mutex::Locker locker (m_live_settings_mutex); 9153df9a8dfSCaroline Tice StreamString tmp_name; 9163df9a8dfSCaroline Tice tmp_name.Printf ("[%s]", instance_settings->GetInstanceName().AsCString()); 9173df9a8dfSCaroline Tice const ConstString instance_name (tmp_name.GetData()); 9183df9a8dfSCaroline Tice std::string instance_name_str (instance_name.AsCString()); 9193df9a8dfSCaroline Tice if (instance_name_str.compare (InstanceSettings::GetDefaultName().AsCString()) != 0) 9203df9a8dfSCaroline Tice m_live_settings[instance_name_str] = instance_settings; 9213df9a8dfSCaroline Tice } 9223df9a8dfSCaroline Tice 9233df9a8dfSCaroline Tice void 9243df9a8dfSCaroline Tice UserSettingsController::UnregisterInstanceSettings (InstanceSettings *instance) 9253df9a8dfSCaroline Tice { 9263df9a8dfSCaroline Tice Mutex::Locker locker (m_live_settings_mutex); 9273df9a8dfSCaroline Tice StreamString tmp_name; 9283df9a8dfSCaroline Tice tmp_name.Printf ("[%s]", instance->GetInstanceName().AsCString()); 9293df9a8dfSCaroline Tice std::string instance_name (tmp_name.GetData()); 9303df9a8dfSCaroline Tice 9313df9a8dfSCaroline Tice std::map <std::string, InstanceSettings *>::iterator pos; 9323df9a8dfSCaroline Tice 9333df9a8dfSCaroline Tice pos = m_live_settings.find (instance_name); 9343df9a8dfSCaroline Tice if (pos != m_live_settings.end()) 9353df9a8dfSCaroline Tice m_live_settings.erase (pos); 9363df9a8dfSCaroline Tice } 9373df9a8dfSCaroline Tice 9383df9a8dfSCaroline Tice void 9393df9a8dfSCaroline Tice UserSettingsController::CreateSettingsVector (const SettingEntry *table, 9403df9a8dfSCaroline Tice bool global) 9413df9a8dfSCaroline Tice { 9423df9a8dfSCaroline Tice int i = 0; 9433df9a8dfSCaroline Tice while (table[i].var_name != NULL) 9443df9a8dfSCaroline Tice { 9453df9a8dfSCaroline Tice const SettingEntry &table_entry = table[i]; 9463df9a8dfSCaroline Tice ConstString const_var_name (table_entry.var_name); 9473df9a8dfSCaroline Tice SettingEntry new_entry; 9483df9a8dfSCaroline Tice 9493df9a8dfSCaroline Tice new_entry = table_entry; 9503df9a8dfSCaroline Tice new_entry.var_name = const_var_name.AsCString(); 9513df9a8dfSCaroline Tice 9523df9a8dfSCaroline Tice if (global) 9533df9a8dfSCaroline Tice m_settings.global_settings.push_back (new_entry); 9543df9a8dfSCaroline Tice else 9553df9a8dfSCaroline Tice m_settings.instance_settings.push_back (new_entry); 9563df9a8dfSCaroline Tice 9573df9a8dfSCaroline Tice ++i; 9583df9a8dfSCaroline Tice } 9593df9a8dfSCaroline Tice } 9603df9a8dfSCaroline Tice 9613df9a8dfSCaroline Tice //---------------------------------------------------------------------- 9623df9a8dfSCaroline Tice // UserSettingsController static methods 9633df9a8dfSCaroline Tice //---------------------------------------------------------------------- 9643df9a8dfSCaroline Tice 9653df9a8dfSCaroline Tice int 9663df9a8dfSCaroline Tice FindMaxNameLength (std::vector<SettingEntry> table) 9673df9a8dfSCaroline Tice { 9683df9a8dfSCaroline Tice int max_length = 1; 9693df9a8dfSCaroline Tice 9703df9a8dfSCaroline Tice for (int i = 0; i < table.size(); ++i) 9713df9a8dfSCaroline Tice { 9723df9a8dfSCaroline Tice int len = strlen (table[i].var_name); 9733df9a8dfSCaroline Tice if (len > max_length) 9743df9a8dfSCaroline Tice max_length = len; 9753df9a8dfSCaroline Tice } 9763df9a8dfSCaroline Tice 9773df9a8dfSCaroline Tice return max_length; 9783df9a8dfSCaroline Tice } 9793df9a8dfSCaroline Tice 9803df9a8dfSCaroline Tice const char * 9813df9a8dfSCaroline Tice UserSettingsController::GetTypeString (lldb::SettableVariableType var_type) 9823df9a8dfSCaroline Tice { 9833df9a8dfSCaroline Tice switch (var_type) 9843df9a8dfSCaroline Tice { 9853df9a8dfSCaroline Tice case lldb::eSetVarTypeInt: 9863df9a8dfSCaroline Tice return "int"; 9873df9a8dfSCaroline Tice case lldb::eSetVarTypeBool: 9883df9a8dfSCaroline Tice return "boolean"; 9893df9a8dfSCaroline Tice case lldb::eSetVarTypeString: 9903df9a8dfSCaroline Tice return "string"; 9913df9a8dfSCaroline Tice case lldb::eSetVarTypeArray: 9923df9a8dfSCaroline Tice return "array"; 9933df9a8dfSCaroline Tice case lldb::eSetVarTypeDictionary: 9943df9a8dfSCaroline Tice return "dictionary"; 9953df9a8dfSCaroline Tice case lldb::eSetVarTypeEnum: 9963df9a8dfSCaroline Tice return "enum"; 9973df9a8dfSCaroline Tice case lldb::eSetVarTypeNone: 9983df9a8dfSCaroline Tice return "no type"; 9993df9a8dfSCaroline Tice } 10003df9a8dfSCaroline Tice 10013df9a8dfSCaroline Tice return ""; 10023df9a8dfSCaroline Tice } 10033df9a8dfSCaroline Tice 10043df9a8dfSCaroline Tice void 10053df9a8dfSCaroline Tice UserSettingsController::PrintEnumValues (const lldb::OptionEnumValueElement *enum_values, Stream &str) 10063df9a8dfSCaroline Tice { 10073df9a8dfSCaroline Tice int i = 0; 10083df9a8dfSCaroline Tice while (enum_values[i].string_value != NULL) 10093df9a8dfSCaroline Tice { 10103df9a8dfSCaroline Tice str.Printf ("%s ", enum_values[i].string_value); 10113df9a8dfSCaroline Tice ++i; 10123df9a8dfSCaroline Tice } 10133df9a8dfSCaroline Tice 10143df9a8dfSCaroline Tice } 10153df9a8dfSCaroline Tice 10163df9a8dfSCaroline Tice void 10173df9a8dfSCaroline Tice UserSettingsController::FindAllSettingsDescriptions (CommandInterpreter &interpreter, 10183df9a8dfSCaroline Tice lldb::UserSettingsControllerSP root, 10193df9a8dfSCaroline Tice std::string ¤t_prefix, 10203df9a8dfSCaroline Tice StreamString &result_stream, 10213df9a8dfSCaroline Tice Error &err) 10223df9a8dfSCaroline Tice { 10233df9a8dfSCaroline Tice // Write out current prefix line. 10243df9a8dfSCaroline Tice StreamString prefix_line; 10253df9a8dfSCaroline Tice StreamString description; 10263df9a8dfSCaroline Tice uint32_t max_len; 10273df9a8dfSCaroline Tice int num_entries = root->m_settings.global_settings.size(); 10283df9a8dfSCaroline Tice 10293df9a8dfSCaroline Tice max_len = FindMaxNameLength (root->m_settings.global_settings); 10303df9a8dfSCaroline Tice 10313df9a8dfSCaroline Tice if (! current_prefix.empty()) 10323df9a8dfSCaroline Tice result_stream.Printf ("\n'%s' variables:\n\n", current_prefix.c_str()); 10333df9a8dfSCaroline Tice else 10343df9a8dfSCaroline Tice result_stream.Printf ("\nTop level variables:\n\n"); 10353df9a8dfSCaroline Tice 10363df9a8dfSCaroline Tice if (num_entries > 0) 10373df9a8dfSCaroline Tice { 10383df9a8dfSCaroline Tice // Write out all "global" variables. 10393df9a8dfSCaroline Tice for (int i = 0; i < num_entries; ++i) 10403df9a8dfSCaroline Tice { 10413df9a8dfSCaroline Tice SettingEntry entry = root->m_settings.global_settings[i]; 10423df9a8dfSCaroline Tice description.Clear(); 10433df9a8dfSCaroline Tice if (entry.var_type == lldb::eSetVarTypeEnum) 10443df9a8dfSCaroline Tice { 10453df9a8dfSCaroline Tice StreamString enum_values_str; 10463df9a8dfSCaroline Tice UserSettingsController::PrintEnumValues (entry.enum_values, enum_values_str); 10473df9a8dfSCaroline Tice description.Printf ("[static, enum] %s. Valid values: {%s} (default: '%s')", entry.description, 10483df9a8dfSCaroline Tice enum_values_str.GetData(), entry.enum_values[0].string_value); 10493df9a8dfSCaroline Tice } 10503df9a8dfSCaroline Tice else if (entry.default_value != NULL) 10513df9a8dfSCaroline Tice description.Printf ("[static, %s] %s (default: '%s')", GetTypeString (entry.var_type), 10523df9a8dfSCaroline Tice entry.description, entry.default_value); 10533df9a8dfSCaroline Tice 10543df9a8dfSCaroline Tice else 10553df9a8dfSCaroline Tice description.Printf ("[static, %s] %s (default: '')", GetTypeString (entry.var_type), 10563df9a8dfSCaroline Tice entry.description); 10573df9a8dfSCaroline Tice interpreter.OutputFormattedHelpText (result_stream, entry.var_name, "--", description.GetData(), 10583df9a8dfSCaroline Tice max_len); 10593df9a8dfSCaroline Tice } 10603df9a8dfSCaroline Tice } 10613df9a8dfSCaroline Tice 10623df9a8dfSCaroline Tice num_entries = root->m_settings.instance_settings.size(); 10633df9a8dfSCaroline Tice max_len = FindMaxNameLength (root->m_settings.instance_settings); 10643df9a8dfSCaroline Tice 10653df9a8dfSCaroline Tice if (num_entries > 0) 10663df9a8dfSCaroline Tice { 10673df9a8dfSCaroline Tice // Write out all instance variables. 10683df9a8dfSCaroline Tice for (int i = 0; i < num_entries; ++i) 10693df9a8dfSCaroline Tice { 10703df9a8dfSCaroline Tice SettingEntry entry = root->m_settings.instance_settings[i]; 10713df9a8dfSCaroline Tice description.Clear(); 10723df9a8dfSCaroline Tice if (entry.var_type == lldb::eSetVarTypeEnum) 10733df9a8dfSCaroline Tice { 10743df9a8dfSCaroline Tice StreamString enum_values_str; 10753df9a8dfSCaroline Tice UserSettingsController::PrintEnumValues (entry.enum_values, enum_values_str); 10763df9a8dfSCaroline Tice description.Printf ("[instance, enum] %s. Valid values: {%s} (default: '%s')", entry.description, 10773df9a8dfSCaroline Tice enum_values_str.GetData(), entry.enum_values[0].string_value); 10783df9a8dfSCaroline Tice } 10793df9a8dfSCaroline Tice else if (entry.default_value != NULL) 10803df9a8dfSCaroline Tice description.Printf ("[instance, %s] %s (default: '%s')", GetTypeString (entry.var_type), 10813df9a8dfSCaroline Tice entry.description, entry.default_value); 10823df9a8dfSCaroline Tice else 10833df9a8dfSCaroline Tice description.Printf ("[instance, %s] %s (default: '')", GetTypeString (entry.var_type), 10843df9a8dfSCaroline Tice entry.description); 10853df9a8dfSCaroline Tice interpreter.OutputFormattedHelpText (result_stream, entry.var_name, "--", description.GetData(), 10863df9a8dfSCaroline Tice max_len); 10873df9a8dfSCaroline Tice } 10883df9a8dfSCaroline Tice 10893df9a8dfSCaroline Tice } 10903df9a8dfSCaroline Tice 10913df9a8dfSCaroline Tice // Now, recurse across all children. 10923df9a8dfSCaroline Tice int num_children = root->GetNumChildren(); 10933df9a8dfSCaroline Tice for (int i = 0; i < num_children; ++i) 10943df9a8dfSCaroline Tice { 10953df9a8dfSCaroline Tice lldb::UserSettingsControllerSP child = root->GetChildAtIndex (i); 10963df9a8dfSCaroline Tice 10973df9a8dfSCaroline Tice if (child) 10983df9a8dfSCaroline Tice { 10993df9a8dfSCaroline Tice ConstString child_prefix = child->GetLevelName(); 11003df9a8dfSCaroline Tice StreamString new_prefix; 1101*ded2fa39SCaroline Tice if (! current_prefix.empty()) 11023df9a8dfSCaroline Tice new_prefix.Printf ("%s.%s", current_prefix.c_str(), child_prefix.AsCString()); 11033df9a8dfSCaroline Tice else 11043df9a8dfSCaroline Tice new_prefix.Printf ("%s", child_prefix.AsCString()); 11053df9a8dfSCaroline Tice std::string new_prefix_str = new_prefix.GetData(); 11063df9a8dfSCaroline Tice UserSettingsController::FindAllSettingsDescriptions (interpreter, child, new_prefix_str, result_stream, 11073df9a8dfSCaroline Tice err); 11083df9a8dfSCaroline Tice } 11093df9a8dfSCaroline Tice } 11103df9a8dfSCaroline Tice } 11113df9a8dfSCaroline Tice 11123df9a8dfSCaroline Tice void 11133df9a8dfSCaroline Tice UserSettingsController::GetAllVariableValues (CommandInterpreter &interpreter, 11143df9a8dfSCaroline Tice lldb::UserSettingsControllerSP root, 11153df9a8dfSCaroline Tice std::string ¤t_prefix, 11163df9a8dfSCaroline Tice StreamString &result_stream, 11173df9a8dfSCaroline Tice Error &err) 11183df9a8dfSCaroline Tice { 11193df9a8dfSCaroline Tice StreamString description; 11203df9a8dfSCaroline Tice int num_entries = root->m_settings.global_settings.size(); 11213df9a8dfSCaroline Tice lldb::SettableVariableType var_type; 11223df9a8dfSCaroline Tice 11233df9a8dfSCaroline Tice 11243df9a8dfSCaroline Tice for (int i = 0; i < num_entries; ++i) 11253df9a8dfSCaroline Tice { 11263df9a8dfSCaroline Tice StreamString full_var_name; 11273df9a8dfSCaroline Tice SettingEntry entry = root->m_settings.global_settings[i]; 1128*ded2fa39SCaroline Tice if (! current_prefix.empty()) 11293df9a8dfSCaroline Tice full_var_name.Printf ("%s.%s", current_prefix.c_str(), entry.var_name); 11303df9a8dfSCaroline Tice else 11313df9a8dfSCaroline Tice full_var_name.Printf ("%s", entry.var_name); 1132101c7c20SCaroline Tice StringList value = root->GetVariable (full_var_name.GetData(), var_type, 1133101c7c20SCaroline Tice interpreter.GetDebugger().GetInstanceName().AsCString()); 11343df9a8dfSCaroline Tice description.Clear(); 11353df9a8dfSCaroline Tice if (value.GetSize() == 1) 113649e2737eSCaroline Tice description.Printf ("%s (%s) = '%s'", full_var_name.GetData(), GetTypeString (entry.var_type), 11373df9a8dfSCaroline Tice value.GetStringAtIndex (0)); 11383df9a8dfSCaroline Tice else 11393df9a8dfSCaroline Tice { 114049e2737eSCaroline Tice description.Printf ("%s (%s) = '", full_var_name.GetData(), GetTypeString (entry.var_type)); 11413df9a8dfSCaroline Tice for (int j = 0; j < value.GetSize(); ++j) 11423df9a8dfSCaroline Tice description.Printf ("%s ", value.GetStringAtIndex (j)); 114349e2737eSCaroline Tice description.Printf ("'"); 11443df9a8dfSCaroline Tice } 11453df9a8dfSCaroline Tice 11463df9a8dfSCaroline Tice result_stream.Printf ("%s\n", description.GetData()); 11473df9a8dfSCaroline Tice } 11483df9a8dfSCaroline Tice 11493df9a8dfSCaroline Tice root->GetAllInstanceVariableValues (interpreter, result_stream); 11503df9a8dfSCaroline Tice root->GetAllPendingSettingValues (result_stream); 1151101c7c20SCaroline Tice if (root->GetLevelName().GetLength() > 0) // Don't bother with default values for Debugger level. 11523df9a8dfSCaroline Tice root->GetAllDefaultSettingValues (result_stream); 11533df9a8dfSCaroline Tice 11543df9a8dfSCaroline Tice 11553df9a8dfSCaroline Tice // Now, recurse across all children. 11563df9a8dfSCaroline Tice int num_children = root->GetNumChildren(); 11573df9a8dfSCaroline Tice for (int i = 0; i < num_children; ++i) 11583df9a8dfSCaroline Tice { 11593df9a8dfSCaroline Tice lldb::UserSettingsControllerSP child = root->GetChildAtIndex (i); 11603df9a8dfSCaroline Tice 11613df9a8dfSCaroline Tice if (child) 11623df9a8dfSCaroline Tice { 11633df9a8dfSCaroline Tice ConstString child_prefix = child->GetLevelName(); 11643df9a8dfSCaroline Tice StreamString new_prefix; 1165*ded2fa39SCaroline Tice if (! current_prefix.empty()) 11663df9a8dfSCaroline Tice new_prefix.Printf ("%s.%s", current_prefix.c_str(), child_prefix.AsCString()); 11673df9a8dfSCaroline Tice else 11683df9a8dfSCaroline Tice new_prefix.Printf ("%s", child_prefix.AsCString()); 11693df9a8dfSCaroline Tice std::string new_prefix_str = new_prefix.GetData(); 11703df9a8dfSCaroline Tice UserSettingsController::GetAllVariableValues (interpreter, child, new_prefix_str, result_stream, 11713df9a8dfSCaroline Tice err); 11723df9a8dfSCaroline Tice } 11733df9a8dfSCaroline Tice } 11743df9a8dfSCaroline Tice 11753df9a8dfSCaroline Tice } 11763df9a8dfSCaroline Tice 11773df9a8dfSCaroline Tice Args 11783df9a8dfSCaroline Tice UserSettingsController::BreakNameIntoPieces (const char *full_dot_name) 11793df9a8dfSCaroline Tice { 11803df9a8dfSCaroline Tice Args return_value; 11813df9a8dfSCaroline Tice std::string name_string (full_dot_name); 11823df9a8dfSCaroline Tice bool done = false; 11833df9a8dfSCaroline Tice 11843df9a8dfSCaroline Tice std::string piece; 11853df9a8dfSCaroline Tice std::string remainder (full_dot_name); 11863df9a8dfSCaroline Tice 11873df9a8dfSCaroline Tice while (!done) 11883df9a8dfSCaroline Tice { 11893df9a8dfSCaroline Tice size_t idx = remainder.find_first_of ('.'); 11903df9a8dfSCaroline Tice piece = remainder.substr (0, idx); 11913df9a8dfSCaroline Tice return_value.AppendArgument (piece.c_str()); 11923df9a8dfSCaroline Tice if (idx != std::string::npos) 11933df9a8dfSCaroline Tice remainder = remainder.substr (idx+1); 11943df9a8dfSCaroline Tice else 11953df9a8dfSCaroline Tice done = true; 11963df9a8dfSCaroline Tice } 11973df9a8dfSCaroline Tice 11983df9a8dfSCaroline Tice return return_value; 11993df9a8dfSCaroline Tice } 12003df9a8dfSCaroline Tice 12013df9a8dfSCaroline Tice bool 12023df9a8dfSCaroline Tice UserSettingsController::IsLiveInstance (const std::string &instance_name) 12033df9a8dfSCaroline Tice { 12043df9a8dfSCaroline Tice std::map<std::string, InstanceSettings *>::iterator pos; 12053df9a8dfSCaroline Tice 12063df9a8dfSCaroline Tice pos = m_live_settings.find (instance_name); 12073df9a8dfSCaroline Tice if (pos != m_live_settings.end()) 12083df9a8dfSCaroline Tice return true; 12093df9a8dfSCaroline Tice 12103df9a8dfSCaroline Tice return false; 12113df9a8dfSCaroline Tice } 12123df9a8dfSCaroline Tice 12133df9a8dfSCaroline Tice int 12143df9a8dfSCaroline Tice UserSettingsController::CompleteSettingsValue (lldb::UserSettingsControllerSP root_settings, 12153df9a8dfSCaroline Tice const char *full_dot_name, 12163df9a8dfSCaroline Tice const char *partial_value, 12173df9a8dfSCaroline Tice bool &word_complete, 12183df9a8dfSCaroline Tice StringList &matches) 12193df9a8dfSCaroline Tice { 12203df9a8dfSCaroline Tice Args names = UserSettingsController::BreakNameIntoPieces (full_dot_name); 12213df9a8dfSCaroline Tice int num_pieces = names.GetArgumentCount(); 12223df9a8dfSCaroline Tice word_complete = true; 12233df9a8dfSCaroline Tice 12243df9a8dfSCaroline Tice ConstString root_level = root_settings->GetLevelName(); 12253df9a8dfSCaroline Tice int num_extra_levels = num_pieces - 2; 12263df9a8dfSCaroline Tice if ((num_extra_levels > 0) 12273df9a8dfSCaroline Tice && root_level.GetLength() > 0) 12283df9a8dfSCaroline Tice { 12293df9a8dfSCaroline Tice ConstString current_level (names.GetArgumentAtIndex (0)); 12303df9a8dfSCaroline Tice if (current_level == root_level) 12313df9a8dfSCaroline Tice { 12323df9a8dfSCaroline Tice names.Shift(); 12333df9a8dfSCaroline Tice --num_extra_levels; 12343df9a8dfSCaroline Tice } 12353df9a8dfSCaroline Tice else 12363df9a8dfSCaroline Tice return 0; 12373df9a8dfSCaroline Tice } 12383df9a8dfSCaroline Tice 12393df9a8dfSCaroline Tice for (int i = 0; i < num_extra_levels; ++i) 12403df9a8dfSCaroline Tice { 12413df9a8dfSCaroline Tice ConstString child_level (names.GetArgumentAtIndex (0)); 12423df9a8dfSCaroline Tice bool found = false; 12433df9a8dfSCaroline Tice int num_children = root_settings->GetNumChildren(); 12443df9a8dfSCaroline Tice for (int j = 0; j < num_children && !found; ++j) 12453df9a8dfSCaroline Tice { 12463df9a8dfSCaroline Tice if (root_settings->GetChildAtIndex (j)->GetLevelName() == child_level) 12473df9a8dfSCaroline Tice { 12483df9a8dfSCaroline Tice found = true; 12493df9a8dfSCaroline Tice root_settings = root_settings->GetChildAtIndex (j); 12503df9a8dfSCaroline Tice names.Shift(); 12513df9a8dfSCaroline Tice } 12523df9a8dfSCaroline Tice } 12533df9a8dfSCaroline Tice if (!found) 12543df9a8dfSCaroline Tice return 0; 12553df9a8dfSCaroline Tice } 12563df9a8dfSCaroline Tice 12573df9a8dfSCaroline Tice if (names.GetArgumentCount() != 2) 12583df9a8dfSCaroline Tice return 0; 12593df9a8dfSCaroline Tice 12603df9a8dfSCaroline Tice std::string next_name (names.GetArgumentAtIndex (0)); 12613df9a8dfSCaroline Tice int len = next_name.length(); 12623df9a8dfSCaroline Tice names.Shift(); 12633df9a8dfSCaroline Tice 12643df9a8dfSCaroline Tice if ((next_name[0] == '[') && (next_name[len-1] == ']')) 12653df9a8dfSCaroline Tice { 12663df9a8dfSCaroline Tice // 'next_name' is instance name. Instance names are irrelevent here. 12673df9a8dfSCaroline Tice } 12683df9a8dfSCaroline Tice else 12693df9a8dfSCaroline Tice { 12703df9a8dfSCaroline Tice // 'next_name' is child name. 12713df9a8dfSCaroline Tice bool found = false; 12723df9a8dfSCaroline Tice int num_children = root_settings->GetNumChildren(); 12733df9a8dfSCaroline Tice ConstString child_level (next_name.c_str()); 12743df9a8dfSCaroline Tice for (int j = 0; j < num_children && !found; ++j) 12753df9a8dfSCaroline Tice { 12763df9a8dfSCaroline Tice if (root_settings->GetChildAtIndex (j)->GetLevelName() == child_level) 12773df9a8dfSCaroline Tice { 12783df9a8dfSCaroline Tice found = true; 12793df9a8dfSCaroline Tice root_settings = root_settings->GetChildAtIndex (j); 12803df9a8dfSCaroline Tice } 12813df9a8dfSCaroline Tice } 12823df9a8dfSCaroline Tice if (!found) 12833df9a8dfSCaroline Tice return 0; 12843df9a8dfSCaroline Tice } 12853df9a8dfSCaroline Tice 12863df9a8dfSCaroline Tice ConstString var_name (names.GetArgumentAtIndex(0)); 12873df9a8dfSCaroline Tice const SettingEntry *entry = root_settings->GetGlobalEntry (var_name); 12883df9a8dfSCaroline Tice if (entry == NULL) 12893df9a8dfSCaroline Tice entry = root_settings->GetInstanceEntry (var_name); 12903df9a8dfSCaroline Tice 12913df9a8dfSCaroline Tice if (entry == NULL) 12923df9a8dfSCaroline Tice return 0; 12933df9a8dfSCaroline Tice 12943df9a8dfSCaroline Tice if (entry->var_type == lldb::eSetVarTypeBool) 12953df9a8dfSCaroline Tice return UserSettingsController::BooleanMatches (partial_value, word_complete, matches); 12963df9a8dfSCaroline Tice else if (entry->var_type == lldb::eSetVarTypeEnum) 12973df9a8dfSCaroline Tice return UserSettingsController::EnumMatches (partial_value, entry->enum_values, word_complete, matches); 12983df9a8dfSCaroline Tice else 12993df9a8dfSCaroline Tice return 0; 13003df9a8dfSCaroline Tice } 13013df9a8dfSCaroline Tice 13023df9a8dfSCaroline Tice int 13033df9a8dfSCaroline Tice UserSettingsController::BooleanMatches (const char *partial_value, 13043df9a8dfSCaroline Tice bool &word_complete, 13053df9a8dfSCaroline Tice StringList &matches) 13063df9a8dfSCaroline Tice { 13073df9a8dfSCaroline Tice static const std::string true_string ("true"); 13083df9a8dfSCaroline Tice static const std::string false_string ("false"); 13093df9a8dfSCaroline Tice 13103df9a8dfSCaroline Tice if (partial_value == NULL) 13113df9a8dfSCaroline Tice { 13123df9a8dfSCaroline Tice matches.AppendString ("true"); 13133df9a8dfSCaroline Tice matches.AppendString ("false"); 13143df9a8dfSCaroline Tice } 13153df9a8dfSCaroline Tice else 13163df9a8dfSCaroline Tice { 13173df9a8dfSCaroline Tice int partial_len = strlen (partial_value); 13183df9a8dfSCaroline Tice 13193df9a8dfSCaroline Tice if ((partial_len <= true_string.length()) 13203df9a8dfSCaroline Tice && (true_string.find (partial_value) == 0)) 13213df9a8dfSCaroline Tice matches.AppendString ("true"); 13223df9a8dfSCaroline Tice else if ((partial_len <= false_string.length()) 13233df9a8dfSCaroline Tice && (false_string.find (partial_value) == 0)) 13243df9a8dfSCaroline Tice matches.AppendString ("false"); 13253df9a8dfSCaroline Tice } 13263df9a8dfSCaroline Tice 13273df9a8dfSCaroline Tice word_complete = false; 13283df9a8dfSCaroline Tice if (matches.GetSize() == 1) 13293df9a8dfSCaroline Tice word_complete = true; 13303df9a8dfSCaroline Tice 13313df9a8dfSCaroline Tice return matches.GetSize(); 13323df9a8dfSCaroline Tice } 13333df9a8dfSCaroline Tice 13343df9a8dfSCaroline Tice int 13353df9a8dfSCaroline Tice UserSettingsController::EnumMatches (const char *partial_value, 13363df9a8dfSCaroline Tice lldb::OptionEnumValueElement *enum_values, 13373df9a8dfSCaroline Tice bool &word_complete, 13383df9a8dfSCaroline Tice StringList &matches) 13393df9a8dfSCaroline Tice { 13403df9a8dfSCaroline Tice int len = (partial_value != NULL) ? strlen (partial_value) : 0; 13413df9a8dfSCaroline Tice 13423df9a8dfSCaroline Tice int i = 0; 13433df9a8dfSCaroline Tice while (enum_values[i].string_value != NULL) 13443df9a8dfSCaroline Tice { 13453df9a8dfSCaroline Tice if (len == 0) 13463df9a8dfSCaroline Tice matches.AppendString (enum_values[i].string_value); 13473df9a8dfSCaroline Tice else 13483df9a8dfSCaroline Tice { 13493df9a8dfSCaroline Tice std::string tmp_value (enum_values[i].string_value); 13503df9a8dfSCaroline Tice if ((len <= tmp_value.length()) 13513df9a8dfSCaroline Tice && tmp_value.find (partial_value) == 0) 13523df9a8dfSCaroline Tice matches.AppendString (enum_values[i].string_value); 13533df9a8dfSCaroline Tice } 13543df9a8dfSCaroline Tice ++i; 13553df9a8dfSCaroline Tice } 13563df9a8dfSCaroline Tice 13573df9a8dfSCaroline Tice word_complete = false; 13583df9a8dfSCaroline Tice if (matches.GetSize() == 1) 13593df9a8dfSCaroline Tice word_complete = true; 13603df9a8dfSCaroline Tice 13613df9a8dfSCaroline Tice return matches.GetSize(); 13623df9a8dfSCaroline Tice } 13633df9a8dfSCaroline Tice 13643df9a8dfSCaroline Tice int 13653df9a8dfSCaroline Tice UserSettingsController::CompleteSettingsNames (lldb::UserSettingsControllerSP root_settings, 13663df9a8dfSCaroline Tice Args &partial_setting_name_pieces, 13673df9a8dfSCaroline Tice bool &word_complete, 13683df9a8dfSCaroline Tice StringList &matches) 13693df9a8dfSCaroline Tice { 13703df9a8dfSCaroline Tice int num_matches = 0; 13713df9a8dfSCaroline Tice int num_name_pieces = partial_setting_name_pieces.GetArgumentCount(); 13723df9a8dfSCaroline Tice 13733df9a8dfSCaroline Tice if (num_name_pieces > 1) 13743df9a8dfSCaroline Tice { 13753df9a8dfSCaroline Tice // There are at least two pieces, perhaps with multiple level names preceding them. 13763df9a8dfSCaroline Tice // First traverse all the extra levels, until we have exactly two pieces left. 13773df9a8dfSCaroline Tice 13783df9a8dfSCaroline Tice int num_extra_levels = num_name_pieces - 2; 13793df9a8dfSCaroline Tice 13803df9a8dfSCaroline Tice // Deal with current level first. 13813df9a8dfSCaroline Tice 13823df9a8dfSCaroline Tice ConstString root_level = root_settings->GetLevelName(); 13833df9a8dfSCaroline Tice if ((num_extra_levels > 0) 13843df9a8dfSCaroline Tice && (root_level.GetLength() > 0)) 13853df9a8dfSCaroline Tice { 13863df9a8dfSCaroline Tice ConstString current_level (partial_setting_name_pieces.GetArgumentAtIndex (0)); 13873df9a8dfSCaroline Tice if (current_level == root_level) 13883df9a8dfSCaroline Tice { 13893df9a8dfSCaroline Tice partial_setting_name_pieces.Shift(); 13903df9a8dfSCaroline Tice --num_extra_levels; 13913df9a8dfSCaroline Tice } 13923df9a8dfSCaroline Tice else 13933df9a8dfSCaroline Tice return 0; // The current level did not match the name pieces; something is wrong, so return immediately 13943df9a8dfSCaroline Tice 13953df9a8dfSCaroline Tice } 13963df9a8dfSCaroline Tice 13973df9a8dfSCaroline Tice for (int i = 0; i < num_extra_levels; ++i) 13983df9a8dfSCaroline Tice { 13993df9a8dfSCaroline Tice ConstString child_level (partial_setting_name_pieces.GetArgumentAtIndex (0)); 14003df9a8dfSCaroline Tice bool found = false; 14013df9a8dfSCaroline Tice int num_children = root_settings->GetNumChildren(); 14023df9a8dfSCaroline Tice for (int j = 0; j < num_children && !found; ++j) 14033df9a8dfSCaroline Tice { 14043df9a8dfSCaroline Tice if (root_settings->GetChildAtIndex (j)->GetLevelName() == child_level) 14053df9a8dfSCaroline Tice { 14063df9a8dfSCaroline Tice found = true; 14073df9a8dfSCaroline Tice root_settings = root_settings->GetChildAtIndex (j); 14083df9a8dfSCaroline Tice partial_setting_name_pieces.Shift(); 14093df9a8dfSCaroline Tice } 14103df9a8dfSCaroline Tice } 14113df9a8dfSCaroline Tice if (! found) 14123df9a8dfSCaroline Tice { 14133df9a8dfSCaroline Tice return 0; // Unable to find a matching child level name; something is wrong, so return immediately. 14143df9a8dfSCaroline Tice } 14153df9a8dfSCaroline Tice } 14163df9a8dfSCaroline Tice 14173df9a8dfSCaroline Tice // Now there should be exactly two name pieces left. If not there is an error, so return immediately 14183df9a8dfSCaroline Tice 14193df9a8dfSCaroline Tice if (partial_setting_name_pieces.GetArgumentCount() != 2) 14203df9a8dfSCaroline Tice return 0; 14213df9a8dfSCaroline Tice 14223df9a8dfSCaroline Tice std::string next_name (partial_setting_name_pieces.GetArgumentAtIndex (0)); 14233df9a8dfSCaroline Tice int len = next_name.length(); 14243df9a8dfSCaroline Tice partial_setting_name_pieces.Shift(); 14253df9a8dfSCaroline Tice 14263df9a8dfSCaroline Tice if ((next_name[0] == '[') && (next_name[len-1] == ']')) 14273df9a8dfSCaroline Tice { 14283df9a8dfSCaroline Tice // 'next_name' is an instance name. The last name piece must be a non-empty partial match against an 14293df9a8dfSCaroline Tice // instance_name, assuming 'next_name' is valid. 14303df9a8dfSCaroline Tice 14313df9a8dfSCaroline Tice if (root_settings->IsLiveInstance (next_name)) 14323df9a8dfSCaroline Tice { 14333df9a8dfSCaroline Tice std::string complete_prefix; 14343df9a8dfSCaroline Tice root_settings->BuildParentPrefix (complete_prefix); 14353df9a8dfSCaroline Tice 14363df9a8dfSCaroline Tice num_matches = root_settings->InstanceVariableMatches(partial_setting_name_pieces.GetArgumentAtIndex(0), 14373df9a8dfSCaroline Tice complete_prefix, 14383df9a8dfSCaroline Tice next_name.c_str(), 14393df9a8dfSCaroline Tice matches); 14403df9a8dfSCaroline Tice word_complete = true; 14413df9a8dfSCaroline Tice if (num_matches > 1) 14423df9a8dfSCaroline Tice word_complete = false; 14433df9a8dfSCaroline Tice 14443df9a8dfSCaroline Tice return num_matches; 14453df9a8dfSCaroline Tice } 14463df9a8dfSCaroline Tice else 14473df9a8dfSCaroline Tice return 0; // Invalid instance_name 14483df9a8dfSCaroline Tice } 14493df9a8dfSCaroline Tice else 14503df9a8dfSCaroline Tice { 14513df9a8dfSCaroline Tice // 'next_name' must be a child name. Find the correct child and pass the remaining piece to be resolved. 14523df9a8dfSCaroline Tice bool found = false; 14533df9a8dfSCaroline Tice int num_children = root_settings->GetNumChildren(); 14543df9a8dfSCaroline Tice ConstString child_level (next_name.c_str()); 14553df9a8dfSCaroline Tice for (int i = 0; i < num_children; ++i) 14563df9a8dfSCaroline Tice { 14573df9a8dfSCaroline Tice if (root_settings->GetChildAtIndex (i)->GetLevelName() == child_level) 14583df9a8dfSCaroline Tice { 14593df9a8dfSCaroline Tice found = true; 14603df9a8dfSCaroline Tice return UserSettingsController::CompleteSettingsNames (root_settings->GetChildAtIndex (i), 14613df9a8dfSCaroline Tice partial_setting_name_pieces, 14623df9a8dfSCaroline Tice word_complete, matches); 14633df9a8dfSCaroline Tice } 14643df9a8dfSCaroline Tice } 14653df9a8dfSCaroline Tice if (!found) 14663df9a8dfSCaroline Tice return 0; 14673df9a8dfSCaroline Tice } 14683df9a8dfSCaroline Tice } 14693df9a8dfSCaroline Tice else if (num_name_pieces == 1) 14703df9a8dfSCaroline Tice { 14713df9a8dfSCaroline Tice std::string complete_prefix; 14723df9a8dfSCaroline Tice root_settings->BuildParentPrefix (complete_prefix); 14733df9a8dfSCaroline Tice 14743df9a8dfSCaroline Tice word_complete = true; 14753df9a8dfSCaroline Tice std::string name (partial_setting_name_pieces.GetArgumentAtIndex (0)); 14763df9a8dfSCaroline Tice 14773df9a8dfSCaroline Tice if (name[0] == '[') 14783df9a8dfSCaroline Tice { 14793df9a8dfSCaroline Tice // It's a partial instance name. 14803df9a8dfSCaroline Tice 14813df9a8dfSCaroline Tice num_matches = root_settings->LiveInstanceMatches (name.c_str(), complete_prefix, word_complete, matches); 14823df9a8dfSCaroline Tice } 14833df9a8dfSCaroline Tice else 14843df9a8dfSCaroline Tice { 14853df9a8dfSCaroline Tice // It could be anything *except* an instance name... 14863df9a8dfSCaroline Tice 14873df9a8dfSCaroline Tice num_matches = root_settings->GlobalVariableMatches (name.c_str(), complete_prefix, matches); 14883df9a8dfSCaroline Tice num_matches += root_settings->InstanceVariableMatches (name.c_str(), complete_prefix, NULL, matches); 14893df9a8dfSCaroline Tice num_matches += root_settings->ChildMatches (name.c_str(), complete_prefix, word_complete, matches); 14903df9a8dfSCaroline Tice } 14913df9a8dfSCaroline Tice 14923df9a8dfSCaroline Tice if (num_matches > 1) 14933df9a8dfSCaroline Tice word_complete = false; 14943df9a8dfSCaroline Tice 14953df9a8dfSCaroline Tice return num_matches; 14963df9a8dfSCaroline Tice } 14973df9a8dfSCaroline Tice else 14983df9a8dfSCaroline Tice { 14993df9a8dfSCaroline Tice // We have a user settings controller with a blank partial string. Return everything possible at this level. 15003df9a8dfSCaroline Tice 15013df9a8dfSCaroline Tice std::string complete_prefix; 15023df9a8dfSCaroline Tice root_settings->BuildParentPrefix (complete_prefix); 15033df9a8dfSCaroline Tice num_matches = root_settings->GlobalVariableMatches (NULL, complete_prefix, matches); 15043df9a8dfSCaroline Tice num_matches += root_settings->InstanceVariableMatches (NULL, complete_prefix, NULL, matches); 15053df9a8dfSCaroline Tice num_matches += root_settings->LiveInstanceMatches (NULL, complete_prefix, word_complete, matches); 15063df9a8dfSCaroline Tice num_matches += root_settings->ChildMatches (NULL, complete_prefix, word_complete, matches); 15073df9a8dfSCaroline Tice word_complete = false; 15083df9a8dfSCaroline Tice return num_matches; 15093df9a8dfSCaroline Tice } 15103df9a8dfSCaroline Tice 15113df9a8dfSCaroline Tice return num_matches; 15123df9a8dfSCaroline Tice } 15133df9a8dfSCaroline Tice 15143df9a8dfSCaroline Tice int 15153df9a8dfSCaroline Tice UserSettingsController::GlobalVariableMatches (const char *partial_name, 15163df9a8dfSCaroline Tice const std::string &complete_prefix, 15173df9a8dfSCaroline Tice StringList &matches) 15183df9a8dfSCaroline Tice { 15193df9a8dfSCaroline Tice int partial_len = (partial_name != NULL) ? strlen (partial_name) : 0; 15203df9a8dfSCaroline Tice int num_matches = 0; 15213df9a8dfSCaroline Tice 15223df9a8dfSCaroline Tice for (size_t i = 0; i < m_settings.global_settings.size(); ++i) 15233df9a8dfSCaroline Tice { 15243df9a8dfSCaroline Tice SettingEntry &entry = m_settings.global_settings[i]; 15253df9a8dfSCaroline Tice std::string var_name (entry.var_name); 15263df9a8dfSCaroline Tice if ((partial_len == 0) 15273df9a8dfSCaroline Tice || ((partial_len <= var_name.length()) 15283df9a8dfSCaroline Tice && (var_name.find (partial_name) == 0))) 15293df9a8dfSCaroline Tice { 15303df9a8dfSCaroline Tice StreamString match_name; 15313df9a8dfSCaroline Tice if (complete_prefix.length() > 0) 15323df9a8dfSCaroline Tice { 15333df9a8dfSCaroline Tice match_name.Printf ("%s.%s", complete_prefix.c_str(), var_name.c_str()); 15343df9a8dfSCaroline Tice matches.AppendString (match_name.GetData()); 15353df9a8dfSCaroline Tice } 15363df9a8dfSCaroline Tice else 15373df9a8dfSCaroline Tice matches.AppendString (var_name.c_str()); 15383df9a8dfSCaroline Tice ++num_matches; 15393df9a8dfSCaroline Tice } 15403df9a8dfSCaroline Tice } 15413df9a8dfSCaroline Tice return num_matches; 15423df9a8dfSCaroline Tice } 15433df9a8dfSCaroline Tice 15443df9a8dfSCaroline Tice int 15453df9a8dfSCaroline Tice UserSettingsController::InstanceVariableMatches (const char *partial_name, 15463df9a8dfSCaroline Tice const std::string &complete_prefix, 15473df9a8dfSCaroline Tice const char *instance_name, 15483df9a8dfSCaroline Tice StringList &matches) 15493df9a8dfSCaroline Tice { 15503df9a8dfSCaroline Tice int partial_len = (partial_name != NULL) ? strlen (partial_name) : 0; 15513df9a8dfSCaroline Tice int num_matches = 0; 15523df9a8dfSCaroline Tice 15533df9a8dfSCaroline Tice for (size_t i = 0; i < m_settings.instance_settings.size(); ++i) 15543df9a8dfSCaroline Tice { 15553df9a8dfSCaroline Tice SettingEntry &entry = m_settings.instance_settings[i]; 15563df9a8dfSCaroline Tice std::string var_name (entry.var_name); 15573df9a8dfSCaroline Tice if ((partial_len == 0) 15583df9a8dfSCaroline Tice || ((partial_len <= var_name.length()) 15593df9a8dfSCaroline Tice && (var_name.find (partial_name) == 0))) 15603df9a8dfSCaroline Tice { 15613df9a8dfSCaroline Tice StreamString match_name; 15623df9a8dfSCaroline Tice if (complete_prefix.length() > 0) 15633df9a8dfSCaroline Tice { 15643df9a8dfSCaroline Tice if (instance_name != NULL) 15653df9a8dfSCaroline Tice match_name.Printf ("%s.%s.%s", complete_prefix.c_str(), instance_name, var_name.c_str()); 15663df9a8dfSCaroline Tice else 15673df9a8dfSCaroline Tice match_name.Printf ("%s.%s", complete_prefix.c_str(), var_name.c_str()); 15683df9a8dfSCaroline Tice 15693df9a8dfSCaroline Tice matches.AppendString (match_name.GetData()); 15703df9a8dfSCaroline Tice } 15713df9a8dfSCaroline Tice else 15723df9a8dfSCaroline Tice { 15733df9a8dfSCaroline Tice if (instance_name != NULL) 15743df9a8dfSCaroline Tice { 15753df9a8dfSCaroline Tice match_name.Printf ("%s.%s", instance_name, var_name.c_str()); 15763df9a8dfSCaroline Tice matches.AppendString (match_name.GetData()); 15773df9a8dfSCaroline Tice } 15783df9a8dfSCaroline Tice else 15793df9a8dfSCaroline Tice matches.AppendString (var_name.c_str()); 15803df9a8dfSCaroline Tice } 15813df9a8dfSCaroline Tice ++num_matches; 15823df9a8dfSCaroline Tice } 15833df9a8dfSCaroline Tice } 15843df9a8dfSCaroline Tice return num_matches; 15853df9a8dfSCaroline Tice } 15863df9a8dfSCaroline Tice 15873df9a8dfSCaroline Tice int 15883df9a8dfSCaroline Tice UserSettingsController::LiveInstanceMatches (const char *partial_name, 15893df9a8dfSCaroline Tice const std::string &complete_prefix, 15903df9a8dfSCaroline Tice bool &word_complete, 15913df9a8dfSCaroline Tice StringList &matches) 15923df9a8dfSCaroline Tice { 15933df9a8dfSCaroline Tice int partial_len = (partial_name != NULL) ? strlen (partial_name) : 0; 15943df9a8dfSCaroline Tice int num_matches = 0; 15953df9a8dfSCaroline Tice 15963df9a8dfSCaroline Tice std::map<std::string, InstanceSettings*>::iterator pos; 15973df9a8dfSCaroline Tice for (pos = m_live_settings.begin(); pos != m_live_settings.end(); ++pos) 15983df9a8dfSCaroline Tice { 15993df9a8dfSCaroline Tice std::string instance_name = pos->first; 16003df9a8dfSCaroline Tice if ((partial_len == 0) 16013df9a8dfSCaroline Tice || ((partial_len <= instance_name.length()) 16023df9a8dfSCaroline Tice && (instance_name.find (partial_name) == 0))) 16033df9a8dfSCaroline Tice { 16043df9a8dfSCaroline Tice StreamString match_name; 16053df9a8dfSCaroline Tice if (complete_prefix.length() > 0) 16063df9a8dfSCaroline Tice match_name.Printf ("%s.%s.", complete_prefix.c_str(), instance_name.c_str()); 16073df9a8dfSCaroline Tice else 16083df9a8dfSCaroline Tice match_name.Printf ("%s.", instance_name.c_str()); 16093df9a8dfSCaroline Tice matches.AppendString (match_name.GetData()); 16103df9a8dfSCaroline Tice ++num_matches; 16113df9a8dfSCaroline Tice } 16123df9a8dfSCaroline Tice } 16133df9a8dfSCaroline Tice 16143df9a8dfSCaroline Tice if (num_matches > 0) 16153df9a8dfSCaroline Tice word_complete = false; 16163df9a8dfSCaroline Tice 16173df9a8dfSCaroline Tice return num_matches; 16183df9a8dfSCaroline Tice } 16193df9a8dfSCaroline Tice 16203df9a8dfSCaroline Tice int 16213df9a8dfSCaroline Tice UserSettingsController::ChildMatches (const char *partial_name, 16223df9a8dfSCaroline Tice const std::string &complete_prefix, 16233df9a8dfSCaroline Tice bool &word_complete, 16243df9a8dfSCaroline Tice StringList &matches) 16253df9a8dfSCaroline Tice { 16263df9a8dfSCaroline Tice int partial_len = (partial_name != NULL) ? strlen (partial_name) : 0; 16273df9a8dfSCaroline Tice int num_children = GetNumChildren(); 16283df9a8dfSCaroline Tice int num_matches = 0; 16293df9a8dfSCaroline Tice for (int i = 0; i < num_children; ++i) 16303df9a8dfSCaroline Tice { 16313df9a8dfSCaroline Tice std::string child_name (GetChildAtIndex(i)->GetLevelName().AsCString()); 16323df9a8dfSCaroline Tice StreamString match_name; 16333df9a8dfSCaroline Tice if ((partial_len == 0) 16343df9a8dfSCaroline Tice || ((partial_len <= child_name.length()) 16353df9a8dfSCaroline Tice && (child_name.find (partial_name) == 0))) 16363df9a8dfSCaroline Tice { 16373df9a8dfSCaroline Tice if (complete_prefix.length() > 0) 16383df9a8dfSCaroline Tice match_name.Printf ("%s.%s.", complete_prefix.c_str(), child_name.c_str()); 16393df9a8dfSCaroline Tice else 16403df9a8dfSCaroline Tice match_name.Printf ("%s.", child_name.c_str()); 16413df9a8dfSCaroline Tice matches.AppendString (match_name.GetData()); 16423df9a8dfSCaroline Tice ++num_matches; 16433df9a8dfSCaroline Tice } 16443df9a8dfSCaroline Tice } 16453df9a8dfSCaroline Tice 16463df9a8dfSCaroline Tice if (num_matches > 0) 16473df9a8dfSCaroline Tice word_complete = false; 16483df9a8dfSCaroline Tice 16493df9a8dfSCaroline Tice return num_matches; 16503df9a8dfSCaroline Tice } 16513df9a8dfSCaroline Tice 16523df9a8dfSCaroline Tice void 16533df9a8dfSCaroline Tice UserSettingsController::VerifyOperationForType (lldb::SettableVariableType var_type, 16543df9a8dfSCaroline Tice lldb::VarSetOperationType op, 16553df9a8dfSCaroline Tice const ConstString &var_name, 16563df9a8dfSCaroline Tice Error &err) 16573df9a8dfSCaroline Tice { 16583df9a8dfSCaroline Tice if (op == lldb::eVarSetOperationAssign) 16593df9a8dfSCaroline Tice return; 16603df9a8dfSCaroline Tice 16613df9a8dfSCaroline Tice 16623df9a8dfSCaroline Tice if (op == lldb::eVarSetOperationInvalid) 16633df9a8dfSCaroline Tice { 16643df9a8dfSCaroline Tice err.SetErrorString ("Invalid 'settings ' subcommand operation.\n"); 16653df9a8dfSCaroline Tice return; 16663df9a8dfSCaroline Tice } 16673df9a8dfSCaroline Tice 16683df9a8dfSCaroline Tice switch (op) 16693df9a8dfSCaroline Tice { 16703df9a8dfSCaroline Tice case lldb::eVarSetOperationInsertBefore: 16713df9a8dfSCaroline Tice case lldb::eVarSetOperationInsertAfter: 16723df9a8dfSCaroline Tice if (var_type != lldb::eSetVarTypeArray) 16733df9a8dfSCaroline Tice err.SetErrorString ("Invalid operation: This operation can only be performed on array variables.\n"); 16743df9a8dfSCaroline Tice break; 16753df9a8dfSCaroline Tice case lldb::eVarSetOperationReplace: 16763df9a8dfSCaroline Tice case lldb::eVarSetOperationRemove: 16773df9a8dfSCaroline Tice if ((var_type != lldb::eSetVarTypeArray) 16783df9a8dfSCaroline Tice && (var_type != lldb::eSetVarTypeDictionary)) 16793df9a8dfSCaroline Tice err.SetErrorString ("Invalid operation: This operation can only be performed on array or dictionary" 16803df9a8dfSCaroline Tice " variables.\n"); 16813df9a8dfSCaroline Tice break; 16823df9a8dfSCaroline Tice case lldb::eVarSetOperationAppend: 16833df9a8dfSCaroline Tice case lldb::eVarSetOperationClear: 16843df9a8dfSCaroline Tice if ((var_type != lldb::eSetVarTypeArray) 16853df9a8dfSCaroline Tice && (var_type != lldb::eSetVarTypeDictionary) 16863df9a8dfSCaroline Tice && (var_type != lldb::eSetVarTypeString)) 16873df9a8dfSCaroline Tice err.SetErrorString ("Invalid operation: This operation can only be performed on array, dictionary " 16883df9a8dfSCaroline Tice "or string variables.\n"); 16893df9a8dfSCaroline Tice break; 16903df9a8dfSCaroline Tice default: 16913df9a8dfSCaroline Tice break; 16923df9a8dfSCaroline Tice } 16933df9a8dfSCaroline Tice 16943df9a8dfSCaroline Tice return; 16953df9a8dfSCaroline Tice } 16963df9a8dfSCaroline Tice 16973df9a8dfSCaroline Tice void 16983df9a8dfSCaroline Tice UserSettingsController::UpdateStringVariable (lldb::VarSetOperationType op, 16993df9a8dfSCaroline Tice std::string &string_var, 17003df9a8dfSCaroline Tice const char *new_value, 17013df9a8dfSCaroline Tice Error &err) 17023df9a8dfSCaroline Tice { 17033df9a8dfSCaroline Tice if (op == lldb::eVarSetOperationAssign) 17043df9a8dfSCaroline Tice string_var = new_value; 17053df9a8dfSCaroline Tice else if (op == lldb::eVarSetOperationAppend) 17063df9a8dfSCaroline Tice string_var.append (new_value); 17073df9a8dfSCaroline Tice else if (op == lldb::eVarSetOperationClear) 17083df9a8dfSCaroline Tice string_var.clear(); 17093df9a8dfSCaroline Tice else 17103df9a8dfSCaroline Tice err.SetErrorString ("Unrecognized operation. Cannot update value.\n"); 17113df9a8dfSCaroline Tice } 17123df9a8dfSCaroline Tice 17133df9a8dfSCaroline Tice void 17143df9a8dfSCaroline Tice UserSettingsController::UpdateBooleanVariable (lldb::VarSetOperationType op, 17153df9a8dfSCaroline Tice bool &bool_var, 17163df9a8dfSCaroline Tice const char *new_value, 17173df9a8dfSCaroline Tice Error &err) 17183df9a8dfSCaroline Tice { 17193df9a8dfSCaroline Tice if (op != lldb::eVarSetOperationAssign) 17203df9a8dfSCaroline Tice err.SetErrorString ("Invalid operation for Boolean variable. Cannot update value.\n"); 17213df9a8dfSCaroline Tice 17223df9a8dfSCaroline Tice 17233df9a8dfSCaroline Tice if ((new_value == NULL) 17243df9a8dfSCaroline Tice || (new_value[0] == '\0')) 17253df9a8dfSCaroline Tice err.SetErrorString ("Invalid value. Cannot perform update.\n"); 17263df9a8dfSCaroline Tice 17273df9a8dfSCaroline Tice std::string bool_val_str (new_value); 17283df9a8dfSCaroline Tice 17293df9a8dfSCaroline Tice std::transform (bool_val_str.begin(), bool_val_str.end(), bool_val_str.begin(), ::tolower); 17303df9a8dfSCaroline Tice 17313df9a8dfSCaroline Tice if (bool_val_str == "true") 17323df9a8dfSCaroline Tice bool_var = true; 17333df9a8dfSCaroline Tice else if (bool_val_str == "false") 17343df9a8dfSCaroline Tice bool_var = false; 17353df9a8dfSCaroline Tice } 17363df9a8dfSCaroline Tice 17373df9a8dfSCaroline Tice void 17383df9a8dfSCaroline Tice UserSettingsController::UpdateStringArrayVariable (lldb::VarSetOperationType op, 17393df9a8dfSCaroline Tice const char *index_value, 17403df9a8dfSCaroline Tice Args &array_var, 17413df9a8dfSCaroline Tice const char *new_value, 17423df9a8dfSCaroline Tice Error &err) 17433df9a8dfSCaroline Tice { 17443df9a8dfSCaroline Tice int index = -1; 17453df9a8dfSCaroline Tice bool valid_index = true; 17463df9a8dfSCaroline Tice 17473df9a8dfSCaroline Tice if (index_value != NULL) 17483df9a8dfSCaroline Tice { 17493df9a8dfSCaroline Tice for (int i = 0; i < strlen(index_value); ++i) 17503df9a8dfSCaroline Tice if (!isdigit (index_value[i])) 17513df9a8dfSCaroline Tice { 17523df9a8dfSCaroline Tice valid_index = false; 17533df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("'%s' is not a valid integer index. Cannot update array value.\n", 17543df9a8dfSCaroline Tice index_value); 17553df9a8dfSCaroline Tice } 17563df9a8dfSCaroline Tice 17573df9a8dfSCaroline Tice if (valid_index) 17583df9a8dfSCaroline Tice index = atoi (index_value); 17593df9a8dfSCaroline Tice 17603df9a8dfSCaroline Tice if (index < 0 17613df9a8dfSCaroline Tice || index >= array_var.GetArgumentCount()) 17623df9a8dfSCaroline Tice { 17633df9a8dfSCaroline Tice valid_index = false; 17643df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("%d is outside the bounds of the specified array variable. " 17653df9a8dfSCaroline Tice "Cannot update array value.\n", index); 17663df9a8dfSCaroline Tice } 17673df9a8dfSCaroline Tice } 17683df9a8dfSCaroline Tice 17693df9a8dfSCaroline Tice switch (op) 17703df9a8dfSCaroline Tice { 17713df9a8dfSCaroline Tice case lldb::eVarSetOperationAssign: 17723df9a8dfSCaroline Tice array_var.SetCommandString (new_value); 17733df9a8dfSCaroline Tice break; 17743df9a8dfSCaroline Tice case lldb::eVarSetOperationReplace: 17753df9a8dfSCaroline Tice { 17763df9a8dfSCaroline Tice if (valid_index) 17773df9a8dfSCaroline Tice array_var.ReplaceArgumentAtIndex (index, new_value); 17783df9a8dfSCaroline Tice break; 17793df9a8dfSCaroline Tice } 17803df9a8dfSCaroline Tice case lldb::eVarSetOperationInsertBefore: 17813df9a8dfSCaroline Tice case lldb::eVarSetOperationInsertAfter: 17823df9a8dfSCaroline Tice { 17833df9a8dfSCaroline Tice if (valid_index) 17843df9a8dfSCaroline Tice { 17853df9a8dfSCaroline Tice Args new_array (new_value); 17863df9a8dfSCaroline Tice if (op == lldb::eVarSetOperationInsertAfter) 17873df9a8dfSCaroline Tice ++index; 17883df9a8dfSCaroline Tice for (int i = 0; i < new_array.GetArgumentCount(); ++i) 17893df9a8dfSCaroline Tice array_var.InsertArgumentAtIndex (index, new_array.GetArgumentAtIndex (i)); 17903df9a8dfSCaroline Tice } 17913df9a8dfSCaroline Tice break; 17923df9a8dfSCaroline Tice } 17933df9a8dfSCaroline Tice case lldb::eVarSetOperationRemove: 17943df9a8dfSCaroline Tice { 17953df9a8dfSCaroline Tice if (valid_index) 17963df9a8dfSCaroline Tice array_var.DeleteArgumentAtIndex (index); 17973df9a8dfSCaroline Tice break; 17983df9a8dfSCaroline Tice } 17993df9a8dfSCaroline Tice case lldb::eVarSetOperationAppend: 18003df9a8dfSCaroline Tice { 18013df9a8dfSCaroline Tice Args new_array (new_value); 18023df9a8dfSCaroline Tice array_var.AppendArguments (new_array); 18033df9a8dfSCaroline Tice break; 18043df9a8dfSCaroline Tice } 18053df9a8dfSCaroline Tice case lldb::eVarSetOperationClear: 18063df9a8dfSCaroline Tice array_var.Clear(); 18073df9a8dfSCaroline Tice break; 18083df9a8dfSCaroline Tice default: 18093df9a8dfSCaroline Tice err.SetErrorString ("Unrecognized operation. Cannot update value.\n"); 18103df9a8dfSCaroline Tice break; 18113df9a8dfSCaroline Tice } 18123df9a8dfSCaroline Tice } 18133df9a8dfSCaroline Tice 18143df9a8dfSCaroline Tice void 18153df9a8dfSCaroline Tice UserSettingsController::UpdateDictionaryVariable (lldb::VarSetOperationType op, 18163df9a8dfSCaroline Tice const char *index_value, 18173df9a8dfSCaroline Tice std::map<std::string, std::string> &dictionary, 18183df9a8dfSCaroline Tice const char *new_value, 18193df9a8dfSCaroline Tice Error &err) 18203df9a8dfSCaroline Tice { 18213df9a8dfSCaroline Tice switch (op) 18223df9a8dfSCaroline Tice { 18233df9a8dfSCaroline Tice case lldb::eVarSetOperationReplace: 18243df9a8dfSCaroline Tice if (index_value != NULL) 18253df9a8dfSCaroline Tice { 18263df9a8dfSCaroline Tice std::string key (index_value); 18273df9a8dfSCaroline Tice std::map<std::string, std::string>::iterator pos; 18283df9a8dfSCaroline Tice 18293df9a8dfSCaroline Tice pos = dictionary.find (key); 18303df9a8dfSCaroline Tice if (pos != dictionary.end()) 18313df9a8dfSCaroline Tice dictionary[key] = new_value; 18323df9a8dfSCaroline Tice else 18333df9a8dfSCaroline Tice err.SetErrorStringWithFormat ("'%s' is not an existing key; cannot replace value.\n", index_value); 18343df9a8dfSCaroline Tice } 18353df9a8dfSCaroline Tice else 18363df9a8dfSCaroline Tice err.SetErrorString ("'settings replace' requires a key for dictionary variables. No key supplied.\n"); 18373df9a8dfSCaroline Tice break; 18383df9a8dfSCaroline Tice case lldb::eVarSetOperationRemove: 18393df9a8dfSCaroline Tice if (index_value != NULL) 18403df9a8dfSCaroline Tice { 18413df9a8dfSCaroline Tice std::string key (index_value); 18423df9a8dfSCaroline Tice dictionary.erase (key); 18433df9a8dfSCaroline Tice } 18443df9a8dfSCaroline Tice else 18453df9a8dfSCaroline Tice err.SetErrorString ("'settings remove' requires a key for dictionary variables. No key supplied.\n"); 18463df9a8dfSCaroline Tice break; 18473df9a8dfSCaroline Tice case lldb::eVarSetOperationClear: 18483df9a8dfSCaroline Tice dictionary.clear (); 18493df9a8dfSCaroline Tice break; 18503df9a8dfSCaroline Tice case lldb::eVarSetOperationAppend: 18513df9a8dfSCaroline Tice case lldb::eVarSetOperationAssign: 18523df9a8dfSCaroline Tice { 18533df9a8dfSCaroline Tice Args args (new_value); 18543df9a8dfSCaroline Tice size_t num_args = args.GetArgumentCount(); 18553df9a8dfSCaroline Tice for (size_t i = 0; i < num_args; ++i) 18563df9a8dfSCaroline Tice { 18573df9a8dfSCaroline Tice std::string tmp_arg = args.GetArgumentAtIndex (i); 18583df9a8dfSCaroline Tice size_t eq_sign = tmp_arg.find ('='); 18593df9a8dfSCaroline Tice if (eq_sign != std::string::npos) 18603df9a8dfSCaroline Tice { 18613df9a8dfSCaroline Tice if (eq_sign > 4) 18623df9a8dfSCaroline Tice { 18633df9a8dfSCaroline Tice std::string tmp_key = tmp_arg.substr (0, eq_sign); 18643df9a8dfSCaroline Tice std::string real_value = tmp_arg.substr (eq_sign+1); 18653df9a8dfSCaroline Tice if ((tmp_key[0] == '[') 18663df9a8dfSCaroline Tice && (tmp_key[1] == '"') 18673df9a8dfSCaroline Tice && (tmp_key[eq_sign-2] == '"') 18683df9a8dfSCaroline Tice && (tmp_key[eq_sign-1] == ']')) 18693df9a8dfSCaroline Tice { 18703df9a8dfSCaroline Tice std::string real_key = tmp_key.substr (2, eq_sign-4); 18713df9a8dfSCaroline Tice dictionary[real_key] = real_value; 18723df9a8dfSCaroline Tice } 18733df9a8dfSCaroline Tice else 18743df9a8dfSCaroline Tice err.SetErrorString ("Invalid key format for dictionary assignment. " 18753df9a8dfSCaroline Tice "Expected '[\"<key>\"]'\n"); 18763df9a8dfSCaroline Tice } 18773df9a8dfSCaroline Tice else 18783df9a8dfSCaroline Tice err.SetErrorString ("Invalid key format for dictionary assignment. " 18793df9a8dfSCaroline Tice "Expected '[\"<key>\"]'\n"); 18803df9a8dfSCaroline Tice } 18813df9a8dfSCaroline Tice else 18823df9a8dfSCaroline Tice err.SetErrorString ("Invalid format for dictionary value. Expected '[\"<key>\"]=<value>'\n"); 18833df9a8dfSCaroline Tice } 18843df9a8dfSCaroline Tice } 18853df9a8dfSCaroline Tice break; 18863df9a8dfSCaroline Tice case lldb::eVarSetOperationInsertBefore: 18873df9a8dfSCaroline Tice case lldb::eVarSetOperationInsertAfter: 18883df9a8dfSCaroline Tice err.SetErrorString ("Specified operation cannot be performed on dictionary variables.\n"); 18893df9a8dfSCaroline Tice break; 18903df9a8dfSCaroline Tice default: 18913df9a8dfSCaroline Tice err.SetErrorString ("Unrecognized operation.\n"); 18923df9a8dfSCaroline Tice break; 18933df9a8dfSCaroline Tice } 18943df9a8dfSCaroline Tice } 18953df9a8dfSCaroline Tice 18963df9a8dfSCaroline Tice const char * 18973df9a8dfSCaroline Tice UserSettingsController::EnumToString (const lldb::OptionEnumValueElement *enum_values, 18983df9a8dfSCaroline Tice int value) 18993df9a8dfSCaroline Tice { 19003df9a8dfSCaroline Tice int i = 0; 19013df9a8dfSCaroline Tice while (enum_values[i].string_value != NULL) 19023df9a8dfSCaroline Tice { 19033df9a8dfSCaroline Tice if (enum_values[i].value == value) 19043df9a8dfSCaroline Tice return enum_values[i].string_value; 19053df9a8dfSCaroline Tice ++i; 19063df9a8dfSCaroline Tice } 19073df9a8dfSCaroline Tice 19083df9a8dfSCaroline Tice return "Invalid enumeration value"; 19093df9a8dfSCaroline Tice } 19103df9a8dfSCaroline Tice 19113df9a8dfSCaroline Tice 19123df9a8dfSCaroline Tice void 19133df9a8dfSCaroline Tice UserSettingsController::UpdateEnumVariable (lldb::OptionEnumValueElement *enum_values, 19143df9a8dfSCaroline Tice int *enum_var, 19153df9a8dfSCaroline Tice const char *new_value, 19163df9a8dfSCaroline Tice Error &err) 19173df9a8dfSCaroline Tice { 19183df9a8dfSCaroline Tice bool found_one; 19193df9a8dfSCaroline Tice 19203df9a8dfSCaroline Tice *enum_var = Args::StringToOptionEnum (new_value, enum_values, enum_values[0].value, &found_one); 19213df9a8dfSCaroline Tice 19223df9a8dfSCaroline Tice if (!found_one) 19233df9a8dfSCaroline Tice err.SetErrorString ("Invalid enumeration value; cannot update variable.\n"); 19243df9a8dfSCaroline Tice } 19253df9a8dfSCaroline Tice 1926*ded2fa39SCaroline Tice void 1927*ded2fa39SCaroline Tice UserSettingsController::RenameInstanceSettings (const char *old_name, const char *new_name) 1928*ded2fa39SCaroline Tice { 1929*ded2fa39SCaroline Tice Mutex::Locker live_mutex (m_live_settings_mutex); 1930*ded2fa39SCaroline Tice Mutex::Locker pending_mutex (m_pending_settings_mutex); 1931*ded2fa39SCaroline Tice std::string old_name_key (old_name); 1932*ded2fa39SCaroline Tice std::string new_name_key (new_name); 1933*ded2fa39SCaroline Tice 1934*ded2fa39SCaroline Tice // First, find the live instance settings for the old_name. If they don't exist in the live settings 1935*ded2fa39SCaroline Tice // list, then this is not a setting that can be renamed. 1936*ded2fa39SCaroline Tice 1937*ded2fa39SCaroline Tice if ((old_name_key[0] != '[') || (old_name_key[old_name_key.size() -1] != ']')) 1938*ded2fa39SCaroline Tice { 1939*ded2fa39SCaroline Tice StreamString tmp_str; 1940*ded2fa39SCaroline Tice tmp_str.Printf ("[%s]", old_name); 1941*ded2fa39SCaroline Tice old_name_key = tmp_str.GetData(); 1942*ded2fa39SCaroline Tice } 1943*ded2fa39SCaroline Tice 1944*ded2fa39SCaroline Tice if ((new_name_key[0] != '[') || (new_name_key[new_name_key.size() -1] != ']')) 1945*ded2fa39SCaroline Tice { 1946*ded2fa39SCaroline Tice StreamString tmp_str; 1947*ded2fa39SCaroline Tice tmp_str.Printf ("[%s]", new_name); 1948*ded2fa39SCaroline Tice new_name_key = tmp_str.GetData(); 1949*ded2fa39SCaroline Tice } 1950*ded2fa39SCaroline Tice 1951*ded2fa39SCaroline Tice std::map<std::string, InstanceSettings *>::iterator pos; 1952*ded2fa39SCaroline Tice 1953*ded2fa39SCaroline Tice pos = m_live_settings.find (old_name_key); 1954*ded2fa39SCaroline Tice if (pos != m_live_settings.end()) 1955*ded2fa39SCaroline Tice { 1956*ded2fa39SCaroline Tice InstanceSettings *live_settings = pos->second; 1957*ded2fa39SCaroline Tice 1958*ded2fa39SCaroline Tice // Rename the settings. 1959*ded2fa39SCaroline Tice live_settings->ChangeInstanceName (new_name_key); 1960*ded2fa39SCaroline Tice 1961*ded2fa39SCaroline Tice // Now see if there are any pending settings for the new name; if so, copy them into live_settings. 1962*ded2fa39SCaroline Tice std::map<std::string, lldb::InstanceSettingsSP>::iterator pending_pos; 1963*ded2fa39SCaroline Tice pending_pos = m_pending_settings.find (new_name_key); 1964*ded2fa39SCaroline Tice if (pending_pos != m_pending_settings.end()) 1965*ded2fa39SCaroline Tice { 1966*ded2fa39SCaroline Tice lldb::InstanceSettingsSP pending_settings_sp = pending_pos->second; 1967*ded2fa39SCaroline Tice live_settings->CopyInstanceSettings (pending_settings_sp, false); 1968*ded2fa39SCaroline Tice } 1969*ded2fa39SCaroline Tice 1970*ded2fa39SCaroline Tice // Erase the old entry (under the old name) from live settings. 1971*ded2fa39SCaroline Tice m_live_settings.erase (pos); 1972*ded2fa39SCaroline Tice 1973*ded2fa39SCaroline Tice // Add the new entry, with the new name, into live settings. 1974*ded2fa39SCaroline Tice m_live_settings[new_name_key] = live_settings; 1975*ded2fa39SCaroline Tice } 1976*ded2fa39SCaroline Tice } 1977*ded2fa39SCaroline Tice 19783df9a8dfSCaroline Tice //---------------------------------------------------------------------- 19793df9a8dfSCaroline Tice // class InstanceSettings 19803df9a8dfSCaroline Tice //---------------------------------------------------------------------- 19813df9a8dfSCaroline Tice 198291123da2SCaroline Tice InstanceSettings::InstanceSettings (UserSettingsController &owner, const char *instance_name, bool live_instance) : 19833df9a8dfSCaroline Tice m_owner (owner), 19843df9a8dfSCaroline Tice m_instance_name (instance_name) 19853df9a8dfSCaroline Tice { 198691123da2SCaroline Tice if ((m_instance_name != InstanceSettings::GetDefaultName()) 198791123da2SCaroline Tice && live_instance) 19883df9a8dfSCaroline Tice m_owner.RegisterInstanceSettings (this); 19893df9a8dfSCaroline Tice } 19903df9a8dfSCaroline Tice 19913df9a8dfSCaroline Tice InstanceSettings::~InstanceSettings () 19923df9a8dfSCaroline Tice { 19933df9a8dfSCaroline Tice if (m_instance_name != InstanceSettings::GetDefaultName()) 19943df9a8dfSCaroline Tice m_owner.UnregisterInstanceSettings (this); 19953df9a8dfSCaroline Tice } 19963df9a8dfSCaroline Tice 19973df9a8dfSCaroline Tice const ConstString & 19983df9a8dfSCaroline Tice InstanceSettings::GetDefaultName () 19993df9a8dfSCaroline Tice { 20003df9a8dfSCaroline Tice static const ConstString g_default_settings_name ("[DEFAULT]"); 20013df9a8dfSCaroline Tice 20023df9a8dfSCaroline Tice return g_default_settings_name; 20033df9a8dfSCaroline Tice } 2004*ded2fa39SCaroline Tice 2005*ded2fa39SCaroline Tice void 2006*ded2fa39SCaroline Tice InstanceSettings::ChangeInstanceName (const std::string &new_instance_name) 2007*ded2fa39SCaroline Tice { 2008*ded2fa39SCaroline Tice m_instance_name.SetCString (new_instance_name.c_str()); 2009*ded2fa39SCaroline Tice } 2010*ded2fa39SCaroline Tice 2011*ded2fa39SCaroline Tice 2012