OptionValueFileSpec.cpp revision 280031
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 23using namespace lldb; 24using namespace lldb_private; 25 26 27OptionValueFileSpec::OptionValueFileSpec () : 28 OptionValue(), 29 m_current_value (), 30 m_default_value (), 31 m_data_sp(), 32 m_completion_mask (CommandCompletions::eDiskFileCompletion) 33{ 34} 35 36OptionValueFileSpec::OptionValueFileSpec (const FileSpec &value) : 37 OptionValue(), 38 m_current_value (value), 39 m_default_value (value), 40 m_data_sp(), 41 m_completion_mask (CommandCompletions::eDiskFileCompletion) 42{ 43} 44 45OptionValueFileSpec::OptionValueFileSpec (const FileSpec ¤t_value, 46 const FileSpec &default_value) : 47 OptionValue(), 48 m_current_value (current_value), 49 m_default_value (default_value), 50 m_data_sp(), 51 m_completion_mask (CommandCompletions::eDiskFileCompletion) 52{ 53} 54 55void 56OptionValueFileSpec::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) 57{ 58 if (dump_mask & eDumpOptionType) 59 strm.Printf ("(%s)", GetTypeAsCString ()); 60 if (dump_mask & eDumpOptionValue) 61 { 62 if (dump_mask & eDumpOptionType) 63 strm.PutCString (" = "); 64 65 if (m_current_value) 66 { 67 strm << '"' << m_current_value.GetPath().c_str() << '"'; 68 } 69 } 70} 71 72Error 73OptionValueFileSpec::SetValueFromCString (const char *value_cstr, 74 VarSetOperationType op) 75{ 76 Error error; 77 switch (op) 78 { 79 case eVarSetOperationClear: 80 Clear (); 81 NotifyValueChanged(); 82 break; 83 84 case eVarSetOperationReplace: 85 case eVarSetOperationAssign: 86 if (value_cstr && value_cstr[0]) 87 { 88 // The setting value may have whitespace, double-quotes, or single-quotes around the file 89 // path to indicate that internal spaces are not word breaks. Strip off any ws & quotes 90 // from the start and end of the file path - we aren't doing any word // breaking here so 91 // the quoting is unnecessary. NB this will cause a problem if someone tries to specify 92 // a file path that legitimately begins or ends with a " or ' character, or whitespace. 93 std::string filepath(value_cstr); 94 auto prefix_chars_to_trim = filepath.find_first_not_of ("\"' \t"); 95 if (prefix_chars_to_trim != std::string::npos && prefix_chars_to_trim > 0) 96 filepath.erase(0, prefix_chars_to_trim); 97 auto suffix_chars_to_trim = filepath.find_last_not_of ("\"' \t"); 98 if (suffix_chars_to_trim != std::string::npos && suffix_chars_to_trim < filepath.size()) 99 filepath.erase (suffix_chars_to_trim + 1); 100 101 m_value_was_set = true; 102 m_current_value.SetFile(filepath.c_str(), true); 103 m_data_sp.reset(); 104 NotifyValueChanged(); 105 } 106 else 107 { 108 error.SetErrorString("invalid value string"); 109 } 110 break; 111 112 case eVarSetOperationInsertBefore: 113 case eVarSetOperationInsertAfter: 114 case eVarSetOperationRemove: 115 case eVarSetOperationAppend: 116 case eVarSetOperationInvalid: 117 error = OptionValue::SetValueFromCString (value_cstr, op); 118 break; 119 } 120 return error; 121} 122 123lldb::OptionValueSP 124OptionValueFileSpec::DeepCopy () const 125{ 126 return OptionValueSP(new OptionValueFileSpec(*this)); 127} 128 129 130size_t 131OptionValueFileSpec::AutoComplete (CommandInterpreter &interpreter, 132 const char *s, 133 int match_start_point, 134 int max_return_elements, 135 bool &word_complete, 136 StringList &matches) 137{ 138 word_complete = false; 139 matches.Clear(); 140 CommandCompletions::InvokeCommonCompletionCallbacks (interpreter, 141 m_completion_mask, 142 s, 143 match_start_point, 144 max_return_elements, 145 nullptr, 146 word_complete, 147 matches); 148 return matches.GetSize(); 149} 150 151 152 153const lldb::DataBufferSP & 154OptionValueFileSpec::GetFileContents(bool null_terminate) 155{ 156 if (!m_data_sp && m_current_value) 157 { 158 if (null_terminate) 159 m_data_sp = m_current_value.ReadFileContentsAsCString(); 160 else 161 m_data_sp = m_current_value.ReadFileContents(); 162 } 163 return m_data_sp; 164} 165 166 167