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 () : 28 OptionValue(), 29 m_current_value (), 30 m_default_value (), 31 m_data_sp(), 32 m_completion_mask (CommandCompletions::eDiskFileCompletion) 33 { 34 } 35 36 OptionValueFileSpec::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 45 OptionValueFileSpec::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 55 void 56 OptionValueFileSpec::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 72 Error 73 OptionValueFileSpec::SetValueFromCString (const char *value_cstr, 74 VarSetOperationType op) 75 { 76 Error error; 77 switch (op) 78 { 79 case eVarSetOperationClear: 80 Clear (); 81 break; 82 83 case eVarSetOperationReplace: 84 case eVarSetOperationAssign: 85 if (value_cstr && value_cstr[0]) 86 { 87 // The setting value may have whitespace, double-quotes, or single-quotes around the file 88 // path to indicate that internal spaces are not word breaks. Strip off any ws & quotes 89 // from the start and end of the file path - we aren't doing any word // breaking here so 90 // the quoting is unnecessary. NB this will cause a problem if someone tries to specify 91 // a file path that legitimately begins or ends with a " or ' character, or whitespace. 92 std::string filepath(value_cstr); 93 auto prefix_chars_to_trim = filepath.find_first_not_of ("\"' \t"); 94 if (prefix_chars_to_trim != std::string::npos && prefix_chars_to_trim > 0) 95 filepath.erase(0, prefix_chars_to_trim); 96 auto suffix_chars_to_trim = filepath.find_last_not_of ("\"' \t"); 97 if (suffix_chars_to_trim != std::string::npos && suffix_chars_to_trim < filepath.size()) 98 filepath.erase (suffix_chars_to_trim + 1); 99 100 m_value_was_set = true; 101 m_current_value.SetFile(filepath.c_str(), true); 102 } 103 else 104 { 105 error.SetErrorString("invalid value string"); 106 } 107 break; 108 109 case eVarSetOperationInsertBefore: 110 case eVarSetOperationInsertAfter: 111 case eVarSetOperationRemove: 112 case eVarSetOperationAppend: 113 case eVarSetOperationInvalid: 114 error = OptionValue::SetValueFromCString (value_cstr, op); 115 break; 116 } 117 return error; 118 } 119 120 lldb::OptionValueSP 121 OptionValueFileSpec::DeepCopy () const 122 { 123 return OptionValueSP(new OptionValueFileSpec(*this)); 124 } 125 126 127 size_t 128 OptionValueFileSpec::AutoComplete (CommandInterpreter &interpreter, 129 const char *s, 130 int match_start_point, 131 int max_return_elements, 132 bool &word_complete, 133 StringList &matches) 134 { 135 word_complete = false; 136 matches.Clear(); 137 CommandCompletions::InvokeCommonCompletionCallbacks (interpreter, 138 m_completion_mask, 139 s, 140 match_start_point, 141 max_return_elements, 142 NULL, 143 word_complete, 144 matches); 145 return matches.GetSize(); 146 } 147 148 149 150 const lldb::DataBufferSP & 151 OptionValueFileSpec::GetFileContents(bool null_terminate) 152 { 153 if (!m_data_sp && m_current_value) 154 { 155 if (null_terminate) 156 m_data_sp = m_current_value.ReadFileContentsAsCString(); 157 else 158 m_data_sp = m_current_value.ReadFileContents(); 159 } 160 return m_data_sp; 161 } 162 163 164