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"
12 #include "lldb/Host/StringConvert.h"
13 #include "lldb/Utility/Args.h"
14 #include "lldb/Utility/Stream.h"
17 using namespace lldb_private;
19 void OptionValueFileSpecList::DumpValue(const ExecutionContext *exe_ctx,
20 Stream &strm, uint32_t dump_mask) {
21 if (dump_mask & eDumpOptionType)
22 strm.Printf("(%s)", GetTypeAsCString());
23 if (dump_mask & eDumpOptionValue) {
24 const bool one_line = dump_mask & eDumpOptionCommand;
25 const uint32_t size = m_current_value.GetSize();
26 if (dump_mask & eDumpOptionType)
28 (m_current_value.GetSize() > 0 && !one_line) ? "\n" : "");
31 for (uint32_t i = 0; i < size; ++i) {
34 strm.Printf("[%u]: ", i);
36 m_current_value.GetFileSpecAtIndex(i).Dump(&strm);
45 Status OptionValueFileSpecList::SetValueFromString(llvm::StringRef value,
46 VarSetOperationType op) {
48 Args args(value.str());
49 const size_t argc = args.GetArgumentCount();
52 case eVarSetOperationClear:
57 case eVarSetOperationReplace:
60 StringConvert::ToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
61 const uint32_t count = m_current_value.GetSize();
63 error.SetErrorStringWithFormat(
64 "invalid file list index %u, index must be 0 through %u", idx,
67 for (size_t i = 1; i < argc; ++i, ++idx) {
68 FileSpec file(args.GetArgumentAtIndex(i));
70 m_current_value.Replace(idx, file);
72 m_current_value.Append(file);
77 error.SetErrorString("replace operation takes an array index followed by "
78 "one or more values");
82 case eVarSetOperationAssign:
83 m_current_value.Clear();
84 // Fall through to append case
86 case eVarSetOperationAppend:
88 m_value_was_set = true;
89 for (size_t i = 0; i < argc; ++i) {
90 FileSpec file(args.GetArgumentAtIndex(i));
91 m_current_value.Append(file);
96 "assign operation takes at least one file path argument");
100 case eVarSetOperationInsertBefore:
101 case eVarSetOperationInsertAfter:
104 StringConvert::ToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
105 const uint32_t count = m_current_value.GetSize();
107 error.SetErrorStringWithFormat(
108 "invalid insert file list index %u, index must be 0 through %u",
111 if (op == eVarSetOperationInsertAfter)
113 for (size_t i = 1; i < argc; ++i, ++idx) {
114 FileSpec file(args.GetArgumentAtIndex(i));
115 m_current_value.Insert(idx, file);
117 NotifyValueChanged();
120 error.SetErrorString("insert operation takes an array index followed by "
121 "one or more values");
125 case eVarSetOperationRemove:
127 std::vector<int> remove_indexes;
128 bool all_indexes_valid = true;
130 for (i = 0; all_indexes_valid && i < argc; ++i) {
132 StringConvert::ToSInt32(args.GetArgumentAtIndex(i), INT32_MAX);
133 if (idx == INT32_MAX)
134 all_indexes_valid = false;
136 remove_indexes.push_back(idx);
139 if (all_indexes_valid) {
140 size_t num_remove_indexes = remove_indexes.size();
141 if (num_remove_indexes) {
142 // Sort and then erase in reverse so indexes are always valid
143 llvm::sort(remove_indexes.begin(), remove_indexes.end());
144 for (size_t j = num_remove_indexes - 1; j < num_remove_indexes; ++j) {
145 m_current_value.Remove(j);
148 NotifyValueChanged();
150 error.SetErrorStringWithFormat(
151 "invalid array index '%s', aborting remove operation",
152 args.GetArgumentAtIndex(i));
155 error.SetErrorString("remove operation takes one or more array index");
159 case eVarSetOperationInvalid:
160 error = OptionValue::SetValueFromString(value, op);
166 lldb::OptionValueSP OptionValueFileSpecList::DeepCopy() const {
167 return OptionValueSP(new OptionValueFileSpecList(*this));