173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===-- OptionValueFileSpecList.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/OptionValueFileSpecList.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 ClaytonOptionValueFileSpecList::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_current_value.GetSize() > 0 ? "\n" : ""); 3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.IndentMore(); 3273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t size = m_current_value.GetSize(); 3373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (uint32_t i = 0; i<size; ++i) 3473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 3573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Indent(); 3673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.Printf("[%u]: ", i); 3773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_current_value.GetFileSpecAtIndex(i).Dump(&strm); 3873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 3973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton strm.IndentLess(); 4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 4173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 4273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 4373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError 4473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueFileSpecList::SetValueFromCString (const char *value, VarSetOperationType op) 4573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 4673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Error error; 4773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Args args(value); 4873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const size_t argc = args.GetArgumentCount(); 4973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton switch (op) 5173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 5273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationClear: 5373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Clear (); 5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 5573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationReplace: 5773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 1) 5873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 5973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX); 6073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t count = m_current_value.GetSize(); 6173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx > count) 6273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 6373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid file list index %u, index must be 0 through %u", idx, count); 6473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 6573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 6673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 6773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=1; i<argc; ++i, ++idx) 6873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 6973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FileSpec file (args.GetArgumentAtIndex(i), false); 7073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx < count) 7173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_current_value.Replace(idx, file); 7273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 7373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_current_value.Append(file); 7473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 7573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 7673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 7873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("replace operation takes an array index followed by one or more values"); 8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 8173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationAssign: 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_current_value.Clear(); 8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Fall through to append case 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationAppend: 8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 0) 9073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_value_was_set = true; 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (size_t i=0; i<argc; ++i) 9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FileSpec file (args.GetArgumentAtIndex(i), false); 9573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_current_value.Append(file); 9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("assign operation takes at least one file path argument"); 10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 10273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInsertBefore: 10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInsertAfter: 10673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 1) 10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX); 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t count = m_current_value.GetSize(); 11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx > count) 11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid insert 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, ++idx) 11973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 12073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FileSpec file (args.GetArgumentAtIndex(i), false); 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_current_value.Insert (idx, file); 12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 12673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("insert operation takes an array index followed by one or more values"); 12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 12973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 13073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 13173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationRemove: 13273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (argc > 0) 13373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 13473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::vector<int> remove_indexes; 13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton bool all_indexes_valid = true; 13673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton size_t i; 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton for (i=0; all_indexes_valid && i<argc; ++i) 13873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 13973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const int idx = Args::StringToSInt32(args.GetArgumentAtIndex(i), INT32_MAX); 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (idx == INT32_MAX) 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton all_indexes_valid = false; 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton remove_indexes.push_back(idx); 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 14573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (all_indexes_valid) 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton size_t num_remove_indexes = remove_indexes.size(); 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (num_remove_indexes) 15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // Sort and then erase in reverse so indexes are always valid 15273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton std::sort(remove_indexes.begin(), remove_indexes.end()); 1533e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs for (size_t j=num_remove_indexes-1; j<num_remove_indexes; ++j) 15473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 155bf41e19c78f0c84671d21eadec3954ab6db550c1Jason Molenda m_current_value.Remove (j); 15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 16173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorStringWithFormat("invalid array index '%s', aborting remove operation", args.GetArgumentAtIndex(i)); 16273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 16373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 16473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 16573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 16673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error.SetErrorString("remove operation takes one or more array index"); 16773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 16873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 16973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 17073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton case eVarSetOperationInvalid: 17173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton error = OptionValue::SetValueFromCString (value, op); 17273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton break; 17373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 17473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return error; 17573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 17673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_value_was_set = true; 17773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return Error(); 17873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 17973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 18073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP 18173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueFileSpecList::DeepCopy () const 18273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 18373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return OptionValueSP(new OptionValueFileSpecList(*this)); 18473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 18573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 18673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 187