Path: blob/main/contrib/llvm-project/lldb/source/Interpreter/OptionValueString.cpp
39587 views
//===-- OptionValueString.cpp ---------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Interpreter/OptionValueString.h"910#include "lldb/Host/OptionParser.h"11#include "lldb/Utility/Args.h"12#include "lldb/Utility/Stream.h"1314using namespace lldb;15using namespace lldb_private;1617void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,18uint32_t dump_mask) {19if (dump_mask & eDumpOptionType)20strm.Printf("(%s)", GetTypeAsCString());21if (dump_mask & eDumpOptionValue) {22if (dump_mask & eDumpOptionType)23strm.PutCString(" = ");24if (!m_current_value.empty() || m_value_was_set) {25if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {26std::string expanded_escape_value;27Args::ExpandEscapedCharacters(m_current_value.c_str(),28expanded_escape_value);29if (dump_mask & eDumpOptionRaw)30strm.Printf("%s", expanded_escape_value.c_str());31else32strm.Printf("\"%s\"", expanded_escape_value.c_str());33} else {34if (dump_mask & eDumpOptionRaw)35strm.Printf("%s", m_current_value.c_str());36else37strm.Printf("\"%s\"", m_current_value.c_str());38}39}40}41}4243Status OptionValueString::SetValueFromString(llvm::StringRef value,44VarSetOperationType op) {45Status error;4647std::string value_str = value.str();48value = value.trim();49if (value.size() > 0) {50switch (value.front()) {51case '"':52case '\'': {53if (value.size() <= 1 || value.back() != value.front()) {54error.SetErrorString("mismatched quotes");55return error;56}57value = value.drop_front().drop_back();58} break;59}60value_str = value.str();61}6263switch (op) {64case eVarSetOperationInvalid:65case eVarSetOperationInsertBefore:66case eVarSetOperationInsertAfter:67case eVarSetOperationRemove:68if (m_validator) {69error = m_validator(value_str.c_str(), m_validator_baton);70if (error.Fail())71return error;72}73error = OptionValue::SetValueFromString(value, op);74break;7576case eVarSetOperationAppend: {77std::string new_value(m_current_value);78if (value.size() > 0) {79if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {80std::string str;81Args::EncodeEscapeSequences(value_str.c_str(), str);82new_value.append(str);83} else84new_value.append(std::string(value));85}86if (m_validator) {87error = m_validator(new_value.c_str(), m_validator_baton);88if (error.Fail())89return error;90}91m_current_value.assign(new_value);92NotifyValueChanged();93} break;9495case eVarSetOperationClear:96Clear();97NotifyValueChanged();98break;99100case eVarSetOperationReplace:101case eVarSetOperationAssign:102if (m_validator) {103error = m_validator(value_str.c_str(), m_validator_baton);104if (error.Fail())105return error;106}107m_value_was_set = true;108if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {109Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);110} else {111SetCurrentValue(value_str);112}113NotifyValueChanged();114break;115}116return error;117}118119Status OptionValueString::SetCurrentValue(llvm::StringRef value) {120if (m_validator) {121Status error(m_validator(value.str().c_str(), m_validator_baton));122if (error.Fail())123return error;124}125m_current_value.assign(std::string(value));126return Status();127}128129Status OptionValueString::AppendToCurrentValue(const char *value) {130if (value && value[0]) {131if (m_validator) {132std::string new_value(m_current_value);133new_value.append(value);134Status error(m_validator(value, m_validator_baton));135if (error.Fail())136return error;137m_current_value.assign(new_value);138} else139m_current_value.append(value);140}141return Status();142}143144145