1 //===-- OptionValueFileSpec.cpp ---------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/lldb-python.h"
11 
12 #include "lldb/Interpreter/OptionValueFileSpec.h"
13 
14 // C Includes
15 // C++ Includes
16 // Other libraries and framework includes
17 // Project includes
18 #include "lldb/Core/State.h"
19 #include "lldb/DataFormatters/FormatManager.h"
20 #include "lldb/Interpreter/Args.h"
21 #include "lldb/Interpreter/CommandCompletions.h"
22 
23 using namespace lldb;
24 using namespace lldb_private;
25 
26 
27 OptionValueFileSpec::OptionValueFileSpec (bool resolve) :
28     OptionValue(),
29     m_current_value (),
30     m_default_value (),
31     m_data_sp(),
32     m_completion_mask (CommandCompletions::eDiskFileCompletion),
33     m_resolve (resolve)
34 {
35 }
36 
37 OptionValueFileSpec::OptionValueFileSpec (const FileSpec &value,
38                                           bool resolve) :
39     OptionValue(),
40     m_current_value (value),
41     m_default_value (value),
42     m_data_sp(),
43     m_completion_mask (CommandCompletions::eDiskFileCompletion),
44     m_resolve (resolve)
45 {
46 }
47 
48 OptionValueFileSpec::OptionValueFileSpec (const FileSpec &current_value,
49                                           const FileSpec &default_value,
50                                           bool resolve) :
51     OptionValue(),
52     m_current_value (current_value),
53     m_default_value (default_value),
54     m_data_sp(),
55     m_completion_mask (CommandCompletions::eDiskFileCompletion),
56     m_resolve (resolve)
57 {
58 }
59 
60 void
61 OptionValueFileSpec::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
62 {
63     if (dump_mask & eDumpOptionType)
64         strm.Printf ("(%s)", GetTypeAsCString ());
65     if (dump_mask & eDumpOptionValue)
66     {
67         if (dump_mask & eDumpOptionType)
68             strm.PutCString (" = ");
69 
70         if (m_current_value)
71         {
72             strm << '"' << m_current_value.GetPath().c_str() << '"';
73         }
74     }
75 }
76 
77 Error
78 OptionValueFileSpec::SetValueFromString (llvm::StringRef value,
79                                           VarSetOperationType op)
80 {
81     Error error;
82     switch (op)
83     {
84     case eVarSetOperationClear:
85         Clear ();
86         NotifyValueChanged();
87         break;
88 
89     case eVarSetOperationReplace:
90     case eVarSetOperationAssign:
91         if (value.size() > 0)
92         {
93             // The setting value may have whitespace, double-quotes, or single-quotes around the file
94             // path to indicate that internal spaces are not word breaks.  Strip off any ws & quotes
95             // from the start and end of the file path - we aren't doing any word // breaking here so
96             // the quoting is unnecessary.  NB this will cause a problem if someone tries to specify
97             // a file path that legitimately begins or ends with a " or ' character, or whitespace.
98             value = value.trim("\"' \t");
99             m_value_was_set = true;
100             m_current_value.SetFile(value.str().c_str(), m_resolve);
101             m_data_sp.reset();
102             NotifyValueChanged();
103         }
104         else
105         {
106             error.SetErrorString("invalid value string");
107         }
108         break;
109 
110     case eVarSetOperationInsertBefore:
111     case eVarSetOperationInsertAfter:
112     case eVarSetOperationRemove:
113     case eVarSetOperationAppend:
114     case eVarSetOperationInvalid:
115         error = OptionValue::SetValueFromString (value, op);
116         break;
117     }
118     return error;
119 }
120 
121 lldb::OptionValueSP
122 OptionValueFileSpec::DeepCopy () const
123 {
124     return OptionValueSP(new OptionValueFileSpec(*this));
125 }
126 
127 
128 size_t
129 OptionValueFileSpec::AutoComplete (CommandInterpreter &interpreter,
130                                    const char *s,
131                                    int match_start_point,
132                                    int max_return_elements,
133                                    bool &word_complete,
134                                    StringList &matches)
135 {
136     word_complete = false;
137     matches.Clear();
138     CommandCompletions::InvokeCommonCompletionCallbacks (interpreter,
139                                                          m_completion_mask,
140                                                          s,
141                                                          match_start_point,
142                                                          max_return_elements,
143                                                          nullptr,
144                                                          word_complete,
145                                                          matches);
146     return matches.GetSize();
147 }
148 
149 
150 
151 const lldb::DataBufferSP &
152 OptionValueFileSpec::GetFileContents(bool null_terminate)
153 {
154     if (!m_data_sp && m_current_value)
155     {
156         if (null_terminate)
157             m_data_sp = m_current_value.ReadFileContentsAsCString();
158         else
159             m_data_sp = m_current_value.ReadFileContents();
160     }
161     return m_data_sp;
162 }
163 
164 
165