1254721Semaste//===-- OptionValueEnumeration.cpp ------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Interpreter/OptionValueEnumeration.h" 11254721Semaste 12254721Semaste// C Includes 13254721Semaste// C++ Includes 14254721Semaste// Other libraries and framework includes 15254721Semaste// Project includes 16254721Semaste#include "lldb/Core/StringList.h" 17254721Semaste 18254721Semasteusing namespace lldb; 19254721Semasteusing namespace lldb_private; 20254721Semaste 21254721SemasteOptionValueEnumeration::OptionValueEnumeration (const OptionEnumValueElement *enumerators, 22254721Semaste enum_type value) : 23254721Semaste OptionValue(), 24254721Semaste m_current_value (value), 25254721Semaste m_default_value (value), 26254721Semaste m_enumerations () 27254721Semaste{ 28254721Semaste SetEnumerations(enumerators); 29254721Semaste} 30254721Semaste 31254721SemasteOptionValueEnumeration::~OptionValueEnumeration() 32254721Semaste{ 33254721Semaste} 34254721Semaste 35254721Semastevoid 36254721SemasteOptionValueEnumeration::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) 37254721Semaste{ 38254721Semaste if (dump_mask & eDumpOptionType) 39254721Semaste strm.Printf ("(%s)", GetTypeAsCString ()); 40254721Semaste if (dump_mask & eDumpOptionValue) 41254721Semaste { 42254721Semaste if (dump_mask & eDumpOptionType) 43254721Semaste strm.PutCString (" = "); 44254721Semaste const size_t count = m_enumerations.GetSize (); 45254721Semaste for (size_t i=0; i<count; ++i) 46254721Semaste { 47254721Semaste if (m_enumerations.GetValueAtIndexUnchecked(i).value == m_current_value) 48254721Semaste { 49254721Semaste strm.PutCString(m_enumerations.GetCStringAtIndex(i)); 50254721Semaste return; 51254721Semaste } 52254721Semaste } 53254721Semaste strm.Printf("%" PRIu64, (uint64_t)m_current_value); 54254721Semaste } 55254721Semaste} 56254721Semaste 57254721SemasteError 58288943SdimOptionValueEnumeration::SetValueFromString (llvm::StringRef value, VarSetOperationType op) 59254721Semaste{ 60254721Semaste Error error; 61254721Semaste switch (op) 62254721Semaste { 63254721Semaste case eVarSetOperationClear: 64254721Semaste Clear (); 65280031Sdim NotifyValueChanged(); 66254721Semaste break; 67254721Semaste 68254721Semaste case eVarSetOperationReplace: 69254721Semaste case eVarSetOperationAssign: 70254721Semaste { 71288943Sdim ConstString const_enumerator_name(value.trim()); 72254721Semaste const EnumerationMapEntry *enumerator_entry = m_enumerations.FindFirstValueForName (const_enumerator_name.GetCString()); 73254721Semaste if (enumerator_entry) 74254721Semaste { 75254721Semaste m_current_value = enumerator_entry->value.value; 76280031Sdim NotifyValueChanged(); 77254721Semaste } 78254721Semaste else 79254721Semaste { 80254721Semaste StreamString error_strm; 81288943Sdim error_strm.Printf("invalid enumeration value '%s'", value.str().c_str()); 82254721Semaste const size_t count = m_enumerations.GetSize (); 83254721Semaste if (count) 84254721Semaste { 85254721Semaste error_strm.Printf(", valid values are: %s", m_enumerations.GetCStringAtIndex(0)); 86254721Semaste for (size_t i=1; i<count; ++i) 87254721Semaste { 88254721Semaste error_strm.Printf (", %s", m_enumerations.GetCStringAtIndex(i)); 89254721Semaste } 90254721Semaste } 91254721Semaste error.SetErrorString(error_strm.GetData()); 92254721Semaste } 93288943Sdim break; 94254721Semaste } 95254721Semaste 96254721Semaste case eVarSetOperationInsertBefore: 97254721Semaste case eVarSetOperationInsertAfter: 98254721Semaste case eVarSetOperationRemove: 99254721Semaste case eVarSetOperationAppend: 100254721Semaste case eVarSetOperationInvalid: 101288943Sdim error = OptionValue::SetValueFromString (value, op); 102254721Semaste break; 103254721Semaste } 104254721Semaste return error; 105254721Semaste} 106254721Semaste 107254721Semastevoid 108254721SemasteOptionValueEnumeration::SetEnumerations (const OptionEnumValueElement *enumerators) 109254721Semaste{ 110254721Semaste m_enumerations.Clear(); 111254721Semaste if (enumerators) 112254721Semaste { 113276479Sdim for (size_t i=0; enumerators[i].string_value != nullptr; ++i) 114254721Semaste { 115254721Semaste ConstString const_enumerator_name(enumerators[i].string_value); 116254721Semaste EnumeratorInfo enumerator_info = { enumerators[i].value, enumerators[i].usage }; 117254721Semaste m_enumerations.Append (const_enumerator_name.GetCString(), enumerator_info); 118254721Semaste } 119254721Semaste m_enumerations.Sort(); 120254721Semaste } 121254721Semaste} 122254721Semaste 123254721Semaste 124254721Semastelldb::OptionValueSP 125254721SemasteOptionValueEnumeration::DeepCopy () const 126254721Semaste{ 127254721Semaste return OptionValueSP(new OptionValueEnumeration(*this)); 128254721Semaste} 129254721Semaste 130254721Semastesize_t 131254721SemasteOptionValueEnumeration::AutoComplete (CommandInterpreter &interpreter, 132254721Semaste const char *s, 133254721Semaste int match_start_point, 134254721Semaste int max_return_elements, 135254721Semaste bool &word_complete, 136254721Semaste StringList &matches) 137254721Semaste{ 138254721Semaste word_complete = false; 139254721Semaste matches.Clear(); 140254721Semaste 141254721Semaste const uint32_t num_enumerators = m_enumerations.GetSize(); 142254721Semaste if (s && s[0]) 143254721Semaste { 144254721Semaste const size_t s_len = strlen(s); 145254721Semaste for (size_t i=0; i<num_enumerators; ++i) 146254721Semaste { 147254721Semaste const char *name = m_enumerations.GetCStringAtIndex(i); 148254721Semaste if (::strncmp(s, name, s_len) == 0) 149254721Semaste matches.AppendString(name); 150254721Semaste } 151254721Semaste } 152254721Semaste else 153254721Semaste { 154254721Semaste // only suggest "true" or "false" by default 155254721Semaste for (size_t i=0; i<num_enumerators; ++i) 156254721Semaste matches.AppendString(m_enumerations.GetCStringAtIndex(i)); 157254721Semaste } 158254721Semaste return matches.GetSize(); 159254721Semaste} 160254721Semaste 161254721Semaste 162254721Semaste 163254721Semaste 164