Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Interpreter/OptionValueFileSpec.cpp
39587 views
1
//===-- OptionValueFileSpec.cpp -------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "lldb/Interpreter/OptionValueFileSpec.h"
10
11
#include "lldb/DataFormatters/FormatManager.h"
12
#include "lldb/Host/FileSystem.h"
13
#include "lldb/Interpreter/CommandCompletions.h"
14
#include "lldb/Interpreter/CommandInterpreter.h"
15
#include "lldb/Utility/Args.h"
16
#include "lldb/Utility/State.h"
17
18
using namespace lldb;
19
using namespace lldb_private;
20
21
OptionValueFileSpec::OptionValueFileSpec(bool resolve) : m_resolve(resolve) {}
22
23
OptionValueFileSpec::OptionValueFileSpec(const FileSpec &value, bool resolve)
24
: m_current_value(value), m_default_value(value),
25
26
m_resolve(resolve) {}
27
28
OptionValueFileSpec::OptionValueFileSpec(const FileSpec &current_value,
29
const FileSpec &default_value,
30
bool resolve)
31
: m_current_value(current_value), m_default_value(default_value),
32
33
m_resolve(resolve) {}
34
35
void OptionValueFileSpec::DumpValue(const ExecutionContext *exe_ctx,
36
Stream &strm, uint32_t dump_mask) {
37
if (dump_mask & eDumpOptionType)
38
strm.Printf("(%s)", GetTypeAsCString());
39
if (dump_mask & eDumpOptionValue) {
40
if (dump_mask & eDumpOptionType)
41
strm.PutCString(" = ");
42
43
if (m_current_value) {
44
strm << '"' << m_current_value.GetPath().c_str() << '"';
45
}
46
}
47
}
48
49
Status OptionValueFileSpec::SetValueFromString(llvm::StringRef value,
50
VarSetOperationType op) {
51
Status error;
52
switch (op) {
53
case eVarSetOperationClear:
54
Clear();
55
NotifyValueChanged();
56
break;
57
58
case eVarSetOperationReplace:
59
case eVarSetOperationAssign:
60
if (value.size() > 0) {
61
value = value.trim("\"' \t");
62
m_value_was_set = true;
63
m_current_value.SetFile(value.str(), FileSpec::Style::native);
64
if (m_resolve)
65
FileSystem::Instance().Resolve(m_current_value);
66
m_data_sp.reset();
67
m_data_mod_time = llvm::sys::TimePoint<>();
68
NotifyValueChanged();
69
} else {
70
error.SetErrorString("invalid value string");
71
}
72
break;
73
74
case eVarSetOperationInsertBefore:
75
case eVarSetOperationInsertAfter:
76
case eVarSetOperationRemove:
77
case eVarSetOperationAppend:
78
case eVarSetOperationInvalid:
79
error = OptionValue::SetValueFromString(value, op);
80
break;
81
}
82
return error;
83
}
84
85
void OptionValueFileSpec::AutoComplete(CommandInterpreter &interpreter,
86
CompletionRequest &request) {
87
lldb_private::CommandCompletions::InvokeCommonCompletionCallbacks(
88
interpreter, m_completion_mask, request, nullptr);
89
}
90
91
const lldb::DataBufferSP &OptionValueFileSpec::GetFileContents() {
92
if (m_current_value) {
93
const auto file_mod_time = FileSystem::Instance().GetModificationTime(m_current_value);
94
if (m_data_sp && m_data_mod_time == file_mod_time)
95
return m_data_sp;
96
m_data_sp =
97
FileSystem::Instance().CreateDataBuffer(m_current_value.GetPath());
98
m_data_mod_time = file_mod_time;
99
}
100
return m_data_sp;
101
}
102
103