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 ¤t_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