1 //===-- OptionValueFileSpecList.cpp -----------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Interpreter/OptionValueFileSpecList.h"
14 // Other libraries and framework includes
16 #include "lldb/Core/Stream.h"
17 #include "lldb/Host/StringConvert.h"
18 #include "lldb/Interpreter/Args.h"
21 using namespace lldb_private;
24 OptionValueFileSpecList::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
26 if (dump_mask & eDumpOptionType)
27 strm.Printf ("(%s)", GetTypeAsCString ());
28 if (dump_mask & eDumpOptionValue)
30 if (dump_mask & eDumpOptionType)
31 strm.Printf (" =%s", m_current_value.GetSize() > 0 ? "\n" : "");
33 const uint32_t size = m_current_value.GetSize();
34 for (uint32_t i = 0; i<size; ++i)
37 strm.Printf("[%u]: ", i);
38 m_current_value.GetFileSpecAtIndex(i).Dump(&strm);
45 OptionValueFileSpecList::SetValueFromString (llvm::StringRef value, VarSetOperationType op)
48 Args args(value.str().c_str());
49 const size_t argc = args.GetArgumentCount();
53 case eVarSetOperationClear:
58 case eVarSetOperationReplace:
61 uint32_t idx = StringConvert::ToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
62 const uint32_t count = m_current_value.GetSize();
65 error.SetErrorStringWithFormat("invalid file list index %u, index must be 0 through %u", idx, count);
69 for (size_t i=1; i<argc; ++i, ++idx)
71 FileSpec file (args.GetArgumentAtIndex(i), false);
73 m_current_value.Replace(idx, file);
75 m_current_value.Append(file);
82 error.SetErrorString("replace operation takes an array index followed by one or more values");
88 case eVarSetOperationAssign:
89 m_current_value.Clear();
90 // Fall through to append case
92 case eVarSetOperationAppend:
95 m_value_was_set = true;
96 for (size_t i=0; i<argc; ++i)
98 FileSpec file (args.GetArgumentAtIndex(i), false);
99 m_current_value.Append(file);
101 NotifyValueChanged();
105 error.SetErrorString("assign operation takes at least one file path argument");
109 case eVarSetOperationInsertBefore:
110 case eVarSetOperationInsertAfter:
113 uint32_t idx = StringConvert::ToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
114 const uint32_t count = m_current_value.GetSize();
117 error.SetErrorStringWithFormat("invalid insert file list index %u, index must be 0 through %u", idx, count);
121 if (op == eVarSetOperationInsertAfter)
123 for (size_t i=1; i<argc; ++i, ++idx)
125 FileSpec file (args.GetArgumentAtIndex(i), false);
126 m_current_value.Insert (idx, file);
128 NotifyValueChanged();
133 error.SetErrorString("insert operation takes an array index followed by one or more values");
137 case eVarSetOperationRemove:
140 std::vector<int> remove_indexes;
141 bool all_indexes_valid = true;
143 for (i=0; all_indexes_valid && i<argc; ++i)
145 const int idx = StringConvert::ToSInt32(args.GetArgumentAtIndex(i), INT32_MAX);
146 if (idx == INT32_MAX)
147 all_indexes_valid = false;
149 remove_indexes.push_back(idx);
152 if (all_indexes_valid)
154 size_t num_remove_indexes = remove_indexes.size();
155 if (num_remove_indexes)
157 // Sort and then erase in reverse so indexes are always valid
158 std::sort(remove_indexes.begin(), remove_indexes.end());
159 for (size_t j=num_remove_indexes-1; j<num_remove_indexes; ++j)
161 m_current_value.Remove (j);
164 NotifyValueChanged();
168 error.SetErrorStringWithFormat("invalid array index '%s', aborting remove operation", args.GetArgumentAtIndex(i));
173 error.SetErrorString("remove operation takes one or more array index");
177 case eVarSetOperationInvalid:
178 error = OptionValue::SetValueFromString (value, op);
185 OptionValueFileSpecList::DeepCopy () const
187 return OptionValueSP(new OptionValueFileSpecList(*this));