//===-- OptionValue.cpp -----------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "lldb/Interpreter/OptionValue.h" // C Includes // C++ Includes // Other libraries and framework includes // Project includes #include "lldb/Core/StringList.h" #include "lldb/Interpreter/OptionValues.h" using namespace lldb; using namespace lldb_private; //------------------------------------------------------------------------- // Get this value as a uint64_t value if it is encoded as a boolean, // uint64_t or int64_t. Other types will cause "fail_value" to be // returned //------------------------------------------------------------------------- uint64_t OptionValue::GetUInt64Value (uint64_t fail_value, bool *success_ptr) { if (success_ptr) *success_ptr = true; switch (GetType()) { case OptionValue::eTypeBoolean: return static_cast<OptionValueBoolean *>(this)->GetCurrentValue(); case OptionValue::eTypeSInt64: return static_cast<OptionValueSInt64 *>(this)->GetCurrentValue(); case OptionValue::eTypeUInt64: return static_cast<OptionValueUInt64 *>(this)->GetCurrentValue(); default: break; } if (success_ptr) *success_ptr = false; return fail_value; } Error OptionValue::SetSubValue (const ExecutionContext *exe_ctx, VarSetOperationType op, const char *name, const char *value) { Error error; error.SetErrorStringWithFormat("SetSubValue is not supported"); return error; } OptionValueBoolean * OptionValue::GetAsBoolean () { if (GetType () == OptionValue::eTypeBoolean) return static_cast<OptionValueBoolean *>(this); return NULL; } const OptionValueBoolean * OptionValue::GetAsBoolean () const { if (GetType () == OptionValue::eTypeBoolean) return static_cast<const OptionValueBoolean *>(this); return NULL; } OptionValueFileSpec * OptionValue::GetAsFileSpec () { if (GetType () == OptionValue::eTypeFileSpec) return static_cast<OptionValueFileSpec *>(this); return NULL; } const OptionValueFileSpec * OptionValue::GetAsFileSpec () const { if (GetType () == OptionValue::eTypeFileSpec) return static_cast<const OptionValueFileSpec *>(this); return NULL; } OptionValueFileSpecList * OptionValue::GetAsFileSpecList () { if (GetType () == OptionValue::eTypeFileSpecList) return static_cast<OptionValueFileSpecList *>(this); return NULL; } const OptionValueFileSpecList * OptionValue::GetAsFileSpecList () const { if (GetType () == OptionValue::eTypeFileSpecList) return static_cast<const OptionValueFileSpecList *>(this); return NULL; } OptionValueArch * OptionValue::GetAsArch () { if (GetType () == OptionValue::eTypeArch) return static_cast<OptionValueArch *>(this); return NULL; } const OptionValueArch * OptionValue::GetAsArch () const { if (GetType () == OptionValue::eTypeArch) return static_cast<const OptionValueArch *>(this); return NULL; } OptionValueArray * OptionValue::GetAsArray () { if (GetType () == OptionValue::eTypeArray) return static_cast<OptionValueArray *>(this); return NULL; } const OptionValueArray * OptionValue::GetAsArray () const { if (GetType () == OptionValue::eTypeArray) return static_cast<const OptionValueArray *>(this); return NULL; } OptionValueArgs * OptionValue::GetAsArgs () { if (GetType () == OptionValue::eTypeArgs) return static_cast<OptionValueArgs *>(this); return NULL; } const OptionValueArgs * OptionValue::GetAsArgs () const { if (GetType () == OptionValue::eTypeArgs) return static_cast<const OptionValueArgs *>(this); return NULL; } OptionValueDictionary * OptionValue::GetAsDictionary () { if (GetType () == OptionValue::eTypeDictionary) return static_cast<OptionValueDictionary *>(this); return NULL; } const OptionValueDictionary * OptionValue::GetAsDictionary () const { if (GetType () == OptionValue::eTypeDictionary) return static_cast<const OptionValueDictionary *>(this); return NULL; } OptionValueEnumeration * OptionValue::GetAsEnumeration () { if (GetType () == OptionValue::eTypeEnum) return static_cast<OptionValueEnumeration *>(this); return NULL; } const OptionValueEnumeration * OptionValue::GetAsEnumeration () const { if (GetType () == OptionValue::eTypeEnum) return static_cast<const OptionValueEnumeration *>(this); return NULL; } OptionValueFormat * OptionValue::GetAsFormat () { if (GetType () == OptionValue::eTypeFormat) return static_cast<OptionValueFormat *>(this); return NULL; } const OptionValueFormat * OptionValue::GetAsFormat () const { if (GetType () == OptionValue::eTypeFormat) return static_cast<const OptionValueFormat *>(this); return NULL; } OptionValuePathMappings * OptionValue::GetAsPathMappings () { if (GetType () == OptionValue::eTypePathMap) return static_cast<OptionValuePathMappings *>(this); return NULL; } const OptionValuePathMappings * OptionValue::GetAsPathMappings () const { if (GetType () == OptionValue::eTypePathMap) return static_cast<const OptionValuePathMappings *>(this); return NULL; } OptionValueProperties * OptionValue::GetAsProperties () { if (GetType () == OptionValue::eTypeProperties) return static_cast<OptionValueProperties *>(this); return NULL; } const OptionValueProperties * OptionValue::GetAsProperties () const { if (GetType () == OptionValue::eTypeProperties) return static_cast<const OptionValueProperties *>(this); return NULL; } OptionValueRegex * OptionValue::GetAsRegex () { if (GetType () == OptionValue::eTypeRegex) return static_cast<OptionValueRegex *>(this); return NULL; } const OptionValueRegex * OptionValue::GetAsRegex () const { if (GetType () == OptionValue::eTypeRegex) return static_cast<const OptionValueRegex *>(this); return NULL; } OptionValueSInt64 * OptionValue::GetAsSInt64 () { if (GetType () == OptionValue::eTypeSInt64) return static_cast<OptionValueSInt64 *>(this); return NULL; } const OptionValueSInt64 * OptionValue::GetAsSInt64 () const { if (GetType () == OptionValue::eTypeSInt64) return static_cast<const OptionValueSInt64 *>(this); return NULL; } OptionValueString * OptionValue::GetAsString () { if (GetType () == OptionValue::eTypeString) return static_cast<OptionValueString *>(this); return NULL; } const OptionValueString * OptionValue::GetAsString () const { if (GetType () == OptionValue::eTypeString) return static_cast<const OptionValueString *>(this); return NULL; } OptionValueUInt64 * OptionValue::GetAsUInt64 () { if (GetType () == OptionValue::eTypeUInt64) return static_cast<OptionValueUInt64 *>(this); return NULL; } const OptionValueUInt64 * OptionValue::GetAsUInt64 () const { if (GetType () == OptionValue::eTypeUInt64) return static_cast<const OptionValueUInt64 *>(this); return NULL; } OptionValueUUID * OptionValue::GetAsUUID () { if (GetType () == OptionValue::eTypeUUID) return static_cast<OptionValueUUID *>(this); return NULL; } const OptionValueUUID * OptionValue::GetAsUUID () const { if (GetType () == OptionValue::eTypeUUID) return static_cast<const OptionValueUUID *>(this); return NULL; } bool OptionValue::GetBooleanValue (bool fail_value) const { const OptionValueBoolean *option_value = GetAsBoolean (); if (option_value) return option_value->GetCurrentValue(); return fail_value; } bool OptionValue::SetBooleanValue (bool new_value) { OptionValueBoolean *option_value = GetAsBoolean (); if (option_value) { option_value->SetCurrentValue(new_value); return true; } return false; } int64_t OptionValue::GetEnumerationValue (int64_t fail_value) const { const OptionValueEnumeration *option_value = GetAsEnumeration(); if (option_value) return option_value->GetCurrentValue(); return fail_value; } bool OptionValue::SetEnumerationValue (int64_t value) { OptionValueEnumeration *option_value = GetAsEnumeration(); if (option_value) { option_value->SetCurrentValue(value); return true; } return false; } FileSpec OptionValue::GetFileSpecValue () const { const OptionValueFileSpec *option_value = GetAsFileSpec (); if (option_value) return option_value->GetCurrentValue(); return FileSpec(); } bool OptionValue::SetFileSpecValue (const FileSpec &file_spec) { OptionValueFileSpec *option_value = GetAsFileSpec (); if (option_value) { option_value->SetCurrentValue(file_spec, false); return true; } return false; } FileSpecList OptionValue::GetFileSpecListValue () const { const OptionValueFileSpecList *option_value = GetAsFileSpecList (); if (option_value) return option_value->GetCurrentValue(); return FileSpecList(); } lldb::Format OptionValue::GetFormatValue (lldb::Format fail_value) const { const OptionValueFormat *option_value = GetAsFormat (); if (option_value) return option_value->GetCurrentValue(); return fail_value; } bool OptionValue::SetFormatValue (lldb::Format new_value) { OptionValueFormat *option_value = GetAsFormat (); if (option_value) { option_value->SetCurrentValue(new_value); return true; } return false; } const RegularExpression * OptionValue::GetRegexValue () const { const OptionValueRegex *option_value = GetAsRegex (); if (option_value) return option_value->GetCurrentValue(); return NULL; } int64_t OptionValue::GetSInt64Value (int64_t fail_value) const { const OptionValueSInt64 *option_value = GetAsSInt64 (); if (option_value) return option_value->GetCurrentValue(); return fail_value; } bool OptionValue::SetSInt64Value (int64_t new_value) { OptionValueSInt64 *option_value = GetAsSInt64 (); if (option_value) { option_value->SetCurrentValue(new_value); return true; } return false; } const char * OptionValue::GetStringValue (const char *fail_value) const { const OptionValueString *option_value = GetAsString (); if (option_value) return option_value->GetCurrentValue(); return fail_value; } bool OptionValue::SetStringValue (const char *new_value) { OptionValueString *option_value = GetAsString (); if (option_value) { option_value->SetCurrentValue(new_value); return true; } return false; } uint64_t OptionValue::GetUInt64Value (uint64_t fail_value) const { const OptionValueUInt64 *option_value = GetAsUInt64 (); if (option_value) return option_value->GetCurrentValue(); return fail_value; } bool OptionValue::SetUInt64Value (uint64_t new_value) { OptionValueUInt64 *option_value = GetAsUInt64 (); if (option_value) { option_value->SetCurrentValue(new_value); return true; } return false; } UUID OptionValue::GetUUIDValue () const { const OptionValueUUID *option_value = GetAsUUID(); if (option_value) return option_value->GetCurrentValue(); return UUID(); } bool OptionValue::SetUUIDValue (const UUID &uuid) { OptionValueUUID *option_value = GetAsUUID(); if (option_value) { option_value->SetCurrentValue(uuid); return true; } return false; } const char * OptionValue::GetBuiltinTypeAsCString (Type t) { switch (t) { case eTypeInvalid: return "invalid"; case eTypeArch: return "arch"; case eTypeArgs: return "arguments"; case eTypeArray: return "array"; case eTypeBoolean: return "boolean"; case eTypeDictionary: return "dictionary"; case eTypeEnum: return "enum"; case eTypeFileSpec: return "file"; case eTypeFileSpecList: return "file-list"; case eTypeFormat: return "format"; case eTypePathMap: return "path-map"; case eTypeProperties: return "properties"; case eTypeRegex: return "regex"; case eTypeSInt64: return "int"; case eTypeString: return "string"; case eTypeUInt64: return "unsigned"; case eTypeUUID: return "uuid"; } return NULL; } lldb::OptionValueSP OptionValue::CreateValueFromCStringForTypeMask (const char *value_cstr, uint32_t type_mask, Error &error) { // If only 1 bit is set in the type mask for a dictionary or array // then we know how to decode a value from a cstring lldb::OptionValueSP value_sp; switch (type_mask) { case 1u << eTypeArch: value_sp.reset(new OptionValueArch()); break; case 1u << eTypeBoolean: value_sp.reset(new OptionValueBoolean(false)); break; case 1u << eTypeFileSpec: value_sp.reset(new OptionValueFileSpec()); break; case 1u << eTypeFormat: value_sp.reset(new OptionValueFormat(eFormatInvalid)); break; case 1u << eTypeSInt64: value_sp.reset(new OptionValueSInt64()); break; case 1u << eTypeString: value_sp.reset(new OptionValueString()); break; case 1u << eTypeUInt64: value_sp.reset(new OptionValueUInt64()); break; case 1u << eTypeUUID: value_sp.reset(new OptionValueUUID()); break; } if (value_sp) error = value_sp->SetValueFromCString (value_cstr, eVarSetOperationAssign); else error.SetErrorString("unsupported type mask"); return value_sp; } bool OptionValue::DumpQualifiedName (Stream &strm) const { bool dumped_something = false; lldb::OptionValueSP m_parent_sp(m_parent_wp.lock()); if (m_parent_sp) { if (m_parent_sp->DumpQualifiedName(strm)) dumped_something = true; } ConstString name (GetName()); if (name) { if (dumped_something) strm.PutChar('.'); else dumped_something = true; strm << name; } return dumped_something; } size_t OptionValue::AutoComplete (CommandInterpreter &interpreter, const char *s, int match_start_point, int max_return_elements, bool &word_complete, StringList &matches) { word_complete = false; matches.Clear(); return matches.GetSize(); } Error OptionValue::SetValueFromCString (const char *value, VarSetOperationType op) { Error error; switch (op) { case eVarSetOperationReplace: error.SetErrorStringWithFormat ("%s objects do not support the 'replace' operation", GetTypeAsCString()); break; case eVarSetOperationInsertBefore: error.SetErrorStringWithFormat ("%s objects do not support the 'insert-before' operation", GetTypeAsCString()); break; case eVarSetOperationInsertAfter: error.SetErrorStringWithFormat ("%s objects do not support the 'insert-after' operation", GetTypeAsCString()); break; case eVarSetOperationRemove: error.SetErrorStringWithFormat ("%s objects do not support the 'remove' operation", GetTypeAsCString()); break; case eVarSetOperationAppend: error.SetErrorStringWithFormat ("%s objects do not support the 'append' operation", GetTypeAsCString()); break; case eVarSetOperationClear: error.SetErrorStringWithFormat ("%s objects do not support the 'clear' operation", GetTypeAsCString()); break; case eVarSetOperationAssign: error.SetErrorStringWithFormat ("%s objects do not support the 'assign' operation", GetTypeAsCString()); break; case eVarSetOperationInvalid: error.SetErrorStringWithFormat ("invalid operation performed on a %s object", GetTypeAsCString()); break; } return error; }