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/Host/StringConvert.h"
17 #include "lldb/Utility/Args.h"
18 #include "lldb/Utility/Stream.h"
21 using namespace lldb_private;
23 void OptionValueFileSpecList::DumpValue(const ExecutionContext *exe_ctx,
24 Stream &strm, uint32_t dump_mask) {
25 if (dump_mask & eDumpOptionType)
26 strm.Printf("(%s)", GetTypeAsCString());
27 if (dump_mask & eDumpOptionValue) {
28 if (dump_mask & eDumpOptionType)
29 strm.Printf(" =%s", m_current_value.GetSize() > 0 ? "\n" : "");
31 const uint32_t size = m_current_value.GetSize();
32 for (uint32_t i = 0; i < size; ++i) {
34 strm.Printf("[%u]: ", i);
35 m_current_value.GetFileSpecAtIndex(i).Dump(&strm);
41 Status OptionValueFileSpecList::SetValueFromString(llvm::StringRef value,
42 VarSetOperationType op) {
44 Args args(value.str());
45 const size_t argc = args.GetArgumentCount();
48 case eVarSetOperationClear:
53 case eVarSetOperationReplace:
56 StringConvert::ToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
57 const uint32_t count = m_current_value.GetSize();
59 error.SetErrorStringWithFormat(
60 "invalid file list index %u, index must be 0 through %u", idx,
63 for (size_t i = 1; i < argc; ++i, ++idx) {
64 FileSpec file(args.GetArgumentAtIndex(i), false);
66 m_current_value.Replace(idx, file);
68 m_current_value.Append(file);
73 error.SetErrorString("replace operation takes an array index followed by "
74 "one or more values");
78 case eVarSetOperationAssign:
79 m_current_value.Clear();
80 // Fall through to append case
82 case eVarSetOperationAppend:
84 m_value_was_set = true;
85 for (size_t i = 0; i < argc; ++i) {
86 FileSpec file(args.GetArgumentAtIndex(i), false);
87 m_current_value.Append(file);
92 "assign operation takes at least one file path argument");
96 case eVarSetOperationInsertBefore:
97 case eVarSetOperationInsertAfter:
100 StringConvert::ToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
101 const uint32_t count = m_current_value.GetSize();
103 error.SetErrorStringWithFormat(
104 "invalid insert file list index %u, index must be 0 through %u",
107 if (op == eVarSetOperationInsertAfter)
109 for (size_t i = 1; i < argc; ++i, ++idx) {
110 FileSpec file(args.GetArgumentAtIndex(i), false);
111 m_current_value.Insert(idx, file);
113 NotifyValueChanged();
116 error.SetErrorString("insert operation takes an array index followed by "
117 "one or more values");
121 case eVarSetOperationRemove:
123 std::vector<int> remove_indexes;
124 bool all_indexes_valid = true;
126 for (i = 0; all_indexes_valid && i < argc; ++i) {
128 StringConvert::ToSInt32(args.GetArgumentAtIndex(i), INT32_MAX);
129 if (idx == INT32_MAX)
130 all_indexes_valid = false;
132 remove_indexes.push_back(idx);
135 if (all_indexes_valid) {
136 size_t num_remove_indexes = remove_indexes.size();
137 if (num_remove_indexes) {
138 // Sort and then erase in reverse so indexes are always valid
139 std::sort(remove_indexes.begin(), remove_indexes.end());
140 for (size_t j = num_remove_indexes - 1; j < num_remove_indexes; ++j) {
141 m_current_value.Remove(j);
144 NotifyValueChanged();
146 error.SetErrorStringWithFormat(
147 "invalid array index '%s', aborting remove operation",
148 args.GetArgumentAtIndex(i));
151 error.SetErrorString("remove operation takes one or more array index");
155 case eVarSetOperationInvalid:
156 error = OptionValue::SetValueFromString(value, op);
162 lldb::OptionValueSP OptionValueFileSpecList::DeepCopy() const {
163 return OptionValueSP(new OptionValueFileSpecList(*this));