173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===-- OptionValuePathMappings.cpp -----------------------------*- C++ -*-===// 273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// The LLVM Compiler Infrastructure 473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// This file is distributed under the University of Illinois Open Source 673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// License. See LICENSE.TXT for details. 773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===----------------------------------------------------------------------===// 973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValuePathMappings.h" 1173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C Includes 1373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C++ Includes 1473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Other libraries and framework includes 1573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Project includes 1673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Core/Stream.h" 1773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/Args.h" 1873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb; 2073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb_private; 2173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 2273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid 2373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValuePathMappings::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) 2473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 2573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (dump_mask & eDumpOptionType) 2673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Printf ("(%s)", GetTypeAsCString ()); 2773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (dump_mask & eDumpOptionValue) 2873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 2973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (dump_mask & eDumpOptionType) 3073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Printf (" =%s", (m_path_mappings.GetSize() > 0) ? "\n" : ""); 3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_path_mappings.Dump(&strm); 3273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 3373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 3473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 3573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError 3673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValuePathMappings::SetValueFromCString (const char *value, VarSetOperationType op) 3773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 3873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Error error; 3973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Args args(value); 4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const size_t argc = args.GetArgumentCount(); 4173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 4273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton switch (op) 4373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 4473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationClear: 4573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Clear (); 4673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 4773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 4873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationReplace: 4973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Must be at least one index + 1 pair of paths, and the pair count must be even 5073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc >= 3 && (((argc - 1) & 1) == 0)) 5173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 5273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX); 5373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t count = m_path_mappings.GetSize(); 5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx > count) 5573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 5673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid file list index %u, index must be 0 through %u", idx, count); 5773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 5873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 5973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 6073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=1; i<argc; i += 2, ++idx) 6173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 6273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString a(args.GetArgumentAtIndex(i)); 6373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString b(args.GetArgumentAtIndex(i+1)); 6473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (!m_path_mappings.Replace (a, b, idx, m_notify_changes)) 6573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_path_mappings.Append(a, b, m_notify_changes); 6673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 6773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 6873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 6973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 7073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 7173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("replace operation takes an array index followed by one or more path pairs"); 7273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 7373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 7473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 7573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 7673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationAssign: 7873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc < 2 || (argc & 1)) 7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("assign operation takes one or more path pairs"); 8173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 8373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_path_mappings.Clear(m_notify_changes); 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Fall through to append case 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationAppend: 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc < 2 || (argc & 1)) 8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("append operation takes one or more path pairs"); 8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 9073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=0; i<argc; i += 2) 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 9573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString a(args.GetArgumentAtIndex(i)); 9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString b(args.GetArgumentAtIndex(i+1)); 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_path_mappings.Append(a, b, m_notify_changes); 9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_value_was_set = true; 9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 10273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInsertBefore: 10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInsertAfter: 10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Must be at least one index + 1 pair of paths, and the pair count must be even 10673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc >= 3 && (((argc - 1) & 1) == 0)) 10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX); 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t count = m_path_mappings.GetSize(); 11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx > count) 11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid file list index %u, index must be 0 through %u", idx, count); 11373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 11473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 11573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 11673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (op == eVarSetOperationInsertAfter) 11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ++idx; 11873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=1; i<argc; i += 2, ++idx) 11973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 12073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString a(args.GetArgumentAtIndex(i)); 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString b(args.GetArgumentAtIndex(i+1)); 12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_path_mappings.Insert (a, b, idx, m_notify_changes); 12373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("insert operation takes an array index followed by one or more path pairs"); 12973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 13073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 13173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 13273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationRemove: 13373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 0) 13473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::vector<int> remove_indexes; 13673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton bool all_indexes_valid = true; 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton size_t i; 13873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (i=0; all_indexes_valid && i<argc; ++i) 13973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const int idx = Args::StringToSInt32(args.GetArgumentAtIndex(i), INT32_MAX); 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx == INT32_MAX) 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton all_indexes_valid = false; 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton remove_indexes.push_back(idx); 14573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (all_indexes_valid) 14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton size_t num_remove_indexes = remove_indexes.size(); 15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (num_remove_indexes) 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 15273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Sort and then erase in reverse so indexes are always valid 15373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::sort(remove_indexes.begin(), remove_indexes.end()); 1543e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs for (size_t j=num_remove_indexes-1; j<num_remove_indexes; ++j) 15573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 156bf41e19c78f0c84671d21eadec3954ab6db550c1Jason Molenda m_path_mappings.Remove (j, m_notify_changes); 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 16173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 16273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid array index '%s', aborting remove operation", args.GetArgumentAtIndex(i)); 16373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 16473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 16573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 16673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 16773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("remove operation takes one or more array index"); 16873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 16973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 17073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 17173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInvalid: 17273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error = OptionValue::SetValueFromCString (value, op); 17373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 17473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 17573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 17673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 17773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_value_was_set = true; 17873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return Error(); 17973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 18073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 18173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP 18273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValuePathMappings::DeepCopy () const 18373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 18473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return OptionValueSP(new OptionValuePathMappings(*this)); 18573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 186