173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===-- OptionValueArray.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/OptionValueArray.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 ClaytonOptionValueArray::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) 2473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 2573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const Type array_element_type = ConvertTypeMaskToType (m_type_mask); 2673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (dump_mask & eDumpOptionType) 2773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 2873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if ((GetType() == eTypeArray) && (m_type_mask != eTypeInvalid)) 2973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Printf ("(%s of %ss)", GetTypeAsCString(), GetBuiltinTypeAsCString(array_element_type)); 3073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Printf ("(%s)", GetTypeAsCString()); 3273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 3373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (dump_mask & eDumpOptionValue) 3473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 3573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (dump_mask & eDumpOptionType) 3673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Printf (" =%s", (m_values.size() > 0) ? "\n" : ""); 3773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.IndentMore(); 3873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t size = m_values.size(); 3973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (uint32_t i = 0; i<size; ++i) 4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 4173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Indent(); 4273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Printf("[%u]: ", i); 4373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t extra_dump_options = m_raw_value_dump ? eDumpOptionRaw : 0; 4473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton switch (array_element_type) 4573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 4673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton default: 4773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeArray: 4873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeDictionary: 4973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeProperties: 5073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeFileSpecList: 5173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypePathMap: 5273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values[i]->DumpValue(exe_ctx, strm, dump_mask | extra_dump_options); 5373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeBoolean: 5673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeEnum: 5773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeFileSpec: 5873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeFormat: 5973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeSInt64: 6073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeString: 6173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeUInt64: 6273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eTypeUUID: 6373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // No need to show the type for dictionaries of simple items 6473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values[i]->DumpValue(exe_ctx, strm, (dump_mask & (~eDumpOptionType)) | extra_dump_options); 6573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 6673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 6773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (i < (size - 1)) 6873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.EOL(); 6973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 7073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.IndentLess(); 7173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 7273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 7373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 7473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError 7573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::SetValueFromCString (const char *value, VarSetOperationType op) 7673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Args args(value); 7873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return SetArgs (args, op); 7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP 8373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::GetSubValue (const ExecutionContext *exe_ctx, 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *name, 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton bool will_modify, 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Error &error) const 8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (name && name[0] == '[') 8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 9073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *end_bracket = strchr (name+1, ']'); 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (end_bracket) 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *sub_value = NULL; 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (end_bracket[1]) 9573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton sub_value = end_bracket + 1; 9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::string index_str (name+1, end_bracket); 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const size_t array_count = m_values.size(); 9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton int32_t idx = Args::StringToSInt32(index_str.c_str(), INT32_MAX, 0, NULL); 9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx != INT32_MAX) 10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ; 10273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton uint32_t new_idx = UINT32_MAX; 10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx < 0) 10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Access from the end of the array if the index is negative 10673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton new_idx = array_count - idx; 10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Just a standard index 11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton new_idx = idx; 11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 11373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (new_idx < array_count) 11573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 11673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (m_values[new_idx]) 11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 11873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (sub_value) 11973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_values[new_idx]->GetSubValue (exe_ctx, sub_value, will_modify, error); 12073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_values[new_idx]; 12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 12573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 12673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (array_count == 0) 12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("index %i is not valid for an empty array", idx); 12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else if (idx > 0) 1295f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat("index %i out of range, valid values are 0 through %" PRIu64, idx, (uint64_t)(array_count - 1)); 13073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 1315f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat("negative index %i out of range, valid values are -1 through -%" PRIu64, idx, (uint64_t)array_count); 13273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 13373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 13473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 13673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 13873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid value path '%s', %s values only support '[<index>]' subvalues where <index> is a positive or negative array index", name, GetTypeAsCString()); 13973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return OptionValueSP(); 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t 14573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::GetArgs (Args &args) const 14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t size = m_values.size(); 14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::vector<const char *> argv; 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (uint32_t i = 0; i<size; ++i) 15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *string_value = m_values[i]->GetStringValue (); 15273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (string_value) 15373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton argv.push_back(string_value); 15473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 15573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argv.empty()) 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton args.Clear(); 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton args.SetArguments(argv.size(), &argv[0]); 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return args.GetArgumentCount(); 16173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 16273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 16373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError 16473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::SetArgs (const Args &args, VarSetOperationType op) 16573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 16673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Error error; 16773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const size_t argc = args.GetArgumentCount(); 16873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton switch (op) 16973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 17073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInvalid: 17173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("unsupported operation"); 17273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 17373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 17473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInsertBefore: 17573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInsertAfter: 17673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 1) 17773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 17873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX); 17973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t count = GetSize(); 18073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx > count) 18173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 18273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid insert array index %u, index must be 0 through %u", idx, count); 18373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 18473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 18573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 18673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (op == eVarSetOperationInsertAfter) 18773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ++idx; 18873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=1; i<argc; ++i, ++idx) 18973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 19073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton lldb::OptionValueSP value_sp (CreateValueFromCStringForTypeMask (args.GetArgumentAtIndex(i), 19173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_type_mask, 19273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error)); 19373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (value_sp) 19473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 19573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (error.Fail()) 19673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 19773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx >= m_values.size()) 19873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values.push_back(value_sp); 19973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 20073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values.insert(m_values.begin() + idx, value_sp); 20173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 20273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 20373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 20473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("array of complex types must subclass OptionValueArray"); 20573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 20673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 20773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 20873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 20973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 21073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 21173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 21273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("insert operation takes an array index followed by one or more values"); 21373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 21473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 21573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 21673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationRemove: 21773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 0) 21873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 21973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t size = m_values.size(); 22073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::vector<int> remove_indexes; 22173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton bool all_indexes_valid = true; 22273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton size_t i; 22373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (i=0; i<argc; ++i) 22473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 22573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const int idx = Args::StringToSInt32(args.GetArgumentAtIndex(i), INT32_MAX); 22673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx >= size) 22773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 22873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton all_indexes_valid = false; 22973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 23073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 23173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 23273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton remove_indexes.push_back(idx); 23373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 23473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 23573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (all_indexes_valid) 23673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 23773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton size_t num_remove_indexes = remove_indexes.size(); 23873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (num_remove_indexes) 23973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 24073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Sort and then erase in reverse so indexes are always valid 24173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (num_remove_indexes > 1) 24273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 24373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::sort(remove_indexes.begin(), remove_indexes.end()); 24473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (std::vector<int>::const_reverse_iterator pos = remove_indexes.rbegin(), end = remove_indexes.rend(); pos != end; ++pos) 24573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 24673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values.erase(m_values.begin() + *pos); 24773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 24873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 24973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 25073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 25173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Only one index 25273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values.erase(m_values.begin() + remove_indexes.front()); 25373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 25473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 25573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 25673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 25773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 25873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid array index '%s', aborting remove operation", args.GetArgumentAtIndex(i)); 25973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 26073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 26173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 26273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 26373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("remove operation takes one or more array indices"); 26473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 26573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 26673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 26773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationClear: 26873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Clear (); 26973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 27073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 27173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationReplace: 27273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 1) 27373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 27473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX); 27573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t count = GetSize(); 27673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx > count) 27773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 27873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid replace array index %u, index must be 0 through %u", idx, count); 27973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 28073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 28173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 28273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=1; i<argc; ++i, ++idx) 28373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 28473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton lldb::OptionValueSP value_sp (CreateValueFromCStringForTypeMask (args.GetArgumentAtIndex(i), 28573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_type_mask, 28673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error)); 28773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (value_sp) 28873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 28973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (error.Fail()) 29073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 29173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx < count) 29273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values[idx] = value_sp; 29373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 29473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values.push_back(value_sp); 29573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 29673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 29773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 29873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("array of complex types must subclass OptionValueArray"); 29973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 30073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 30173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 30273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 30373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 30473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 30573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 30673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("replace operation takes an array index followed by one or more values"); 30773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 30873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 30973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 31073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationAssign: 31173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_values.clear(); 31273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Fall through to append case 31373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationAppend: 31473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=0; i<argc; ++i) 31573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 31673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton lldb::OptionValueSP value_sp (CreateValueFromCStringForTypeMask (args.GetArgumentAtIndex(i), 31773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_type_mask, 31873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error)); 31973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (value_sp) 32073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 32173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (error.Fail()) 32273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 32373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_value_was_set = true; 32473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton AppendValue(value_sp); 32573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 32673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 32773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 32873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("array of complex types must subclass OptionValueArray"); 32973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 33073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 33173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 33273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 33373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 33473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 33573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 33673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP 33773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::DeepCopy () const 33873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 33973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton OptionValueArray *copied_array = new OptionValueArray (m_type_mask, m_raw_value_dump); 34073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton lldb::OptionValueSP copied_value_sp(copied_array); 34173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t size = m_values.size(); 34273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (uint32_t i = 0; i<size; ++i) 34373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 34473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton copied_array->AppendValue (m_values[i]->DeepCopy()); 34573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 34673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return copied_value_sp; 34773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 34873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 34973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 35073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 351