180814287SRaphael Isemann //===-- OptionValueString.cpp ---------------------------------------------===//
267cc0636SGreg Clayton //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667cc0636SGreg Clayton //
767cc0636SGreg Clayton //===----------------------------------------------------------------------===//
867cc0636SGreg Clayton 
967cc0636SGreg Clayton #include "lldb/Interpreter/OptionValueString.h"
1067cc0636SGreg Clayton 
113eb2b44dSZachary Turner #include "lldb/Host/OptionParser.h"
12145d95c9SPavel Labath #include "lldb/Utility/Args.h"
13bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1467cc0636SGreg Clayton 
1567cc0636SGreg Clayton using namespace lldb;
1667cc0636SGreg Clayton using namespace lldb_private;
1767cc0636SGreg Clayton 
DumpValue(const ExecutionContext * exe_ctx,Stream & strm,uint32_t dump_mask)18b9c1b51eSKate Stone void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
19b9c1b51eSKate Stone                                   uint32_t dump_mask) {
2067cc0636SGreg Clayton   if (dump_mask & eDumpOptionType)
2167cc0636SGreg Clayton     strm.Printf("(%s)", GetTypeAsCString());
22b9c1b51eSKate Stone   if (dump_mask & eDumpOptionValue) {
2367cc0636SGreg Clayton     if (dump_mask & eDumpOptionType)
2467cc0636SGreg Clayton       strm.PutCString(" = ");
25b9c1b51eSKate Stone     if (!m_current_value.empty() || m_value_was_set) {
26b9c1b51eSKate Stone       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
274c05410fSGreg Clayton         std::string expanded_escape_value;
28b9c1b51eSKate Stone         Args::ExpandEscapedCharacters(m_current_value.c_str(),
29b9c1b51eSKate Stone                                       expanded_escape_value);
304c05410fSGreg Clayton         if (dump_mask & eDumpOptionRaw)
314c05410fSGreg Clayton           strm.Printf("%s", expanded_escape_value.c_str());
324c05410fSGreg Clayton         else
334c05410fSGreg Clayton           strm.Printf("\"%s\"", expanded_escape_value.c_str());
34b9c1b51eSKate Stone       } else {
3567cc0636SGreg Clayton         if (dump_mask & eDumpOptionRaw)
3667cc0636SGreg Clayton           strm.Printf("%s", m_current_value.c_str());
3767cc0636SGreg Clayton         else
3867cc0636SGreg Clayton           strm.Printf("\"%s\"", m_current_value.c_str());
3967cc0636SGreg Clayton       }
4067cc0636SGreg Clayton     }
4167cc0636SGreg Clayton   }
424c05410fSGreg Clayton }
4367cc0636SGreg Clayton 
SetValueFromString(llvm::StringRef value,VarSetOperationType op)4497206d57SZachary Turner Status OptionValueString::SetValueFromString(llvm::StringRef value,
45b9c1b51eSKate Stone                                              VarSetOperationType op) {
4697206d57SZachary Turner   Status error;
4721c895e3SGreg Clayton 
48c95f7e2aSPavel Labath   std::string value_str = value.str();
49c95f7e2aSPavel Labath   value = value.trim();
50b9c1b51eSKate Stone   if (value.size() > 0) {
51b9c1b51eSKate Stone     switch (value.front()) {
5221c895e3SGreg Clayton     case '"':
53b9c1b51eSKate Stone     case '\'': {
54b9c1b51eSKate Stone       if (value.size() <= 1 || value.back() != value.front()) {
5521c895e3SGreg Clayton         error.SetErrorString("mismatched quotes");
5621c895e3SGreg Clayton         return error;
5721c895e3SGreg Clayton       }
584f2a9726SZachary Turner       value = value.drop_front().drop_back();
59b9c1b51eSKate Stone     } break;
6021c895e3SGreg Clayton     }
61c95f7e2aSPavel Labath     value_str = value.str();
6221c895e3SGreg Clayton   }
6321c895e3SGreg Clayton 
64b9c1b51eSKate Stone   switch (op) {
6567cc0636SGreg Clayton   case eVarSetOperationInvalid:
6667cc0636SGreg Clayton   case eVarSetOperationInsertBefore:
6767cc0636SGreg Clayton   case eVarSetOperationInsertAfter:
6867cc0636SGreg Clayton   case eVarSetOperationRemove:
69b9c1b51eSKate Stone     if (m_validator) {
70c95f7e2aSPavel Labath       error = m_validator(value_str.c_str(), m_validator_baton);
719d14084bSEnrico Granata       if (error.Fail())
729d14084bSEnrico Granata         return error;
739d14084bSEnrico Granata     }
74c95f7e2aSPavel Labath     error = OptionValue::SetValueFromString(value, op);
7567cc0636SGreg Clayton     break;
7667cc0636SGreg Clayton 
77b9c1b51eSKate Stone   case eVarSetOperationAppend: {
789d14084bSEnrico Granata     std::string new_value(m_current_value);
79b9c1b51eSKate Stone     if (value.size() > 0) {
80b9c1b51eSKate Stone       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
814c05410fSGreg Clayton         std::string str;
82c95f7e2aSPavel Labath         Args::EncodeEscapeSequences(value_str.c_str(), str);
839d14084bSEnrico Granata         new_value.append(str);
84b9c1b51eSKate Stone       } else
85*adcd0268SBenjamin Kramer         new_value.append(std::string(value));
869d14084bSEnrico Granata     }
87b9c1b51eSKate Stone     if (m_validator) {
889d14084bSEnrico Granata       error = m_validator(new_value.c_str(), m_validator_baton);
899d14084bSEnrico Granata       if (error.Fail())
909d14084bSEnrico Granata         return error;
919d14084bSEnrico Granata     }
929d14084bSEnrico Granata     m_current_value.assign(new_value);
93332e8b1cSGreg Clayton     NotifyValueChanged();
94b9c1b51eSKate Stone   } break;
9567cc0636SGreg Clayton 
9667cc0636SGreg Clayton   case eVarSetOperationClear:
9767cc0636SGreg Clayton     Clear();
98332e8b1cSGreg Clayton     NotifyValueChanged();
9967cc0636SGreg Clayton     break;
10067cc0636SGreg Clayton 
10167cc0636SGreg Clayton   case eVarSetOperationReplace:
10267cc0636SGreg Clayton   case eVarSetOperationAssign:
103b9c1b51eSKate Stone     if (m_validator) {
104c95f7e2aSPavel Labath       error = m_validator(value_str.c_str(), m_validator_baton);
1059d14084bSEnrico Granata       if (error.Fail())
1069d14084bSEnrico Granata         return error;
1079d14084bSEnrico Granata     }
10867cc0636SGreg Clayton     m_value_was_set = true;
109b9c1b51eSKate Stone     if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
110c95f7e2aSPavel Labath       Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
111b9c1b51eSKate Stone     } else {
1128cef4b0bSZachary Turner       SetCurrentValue(value_str);
1134c05410fSGreg Clayton     }
114332e8b1cSGreg Clayton     NotifyValueChanged();
11567cc0636SGreg Clayton     break;
11667cc0636SGreg Clayton   }
11767cc0636SGreg Clayton   return error;
11867cc0636SGreg Clayton }
11967cc0636SGreg Clayton 
SetCurrentValue(llvm::StringRef value)12097206d57SZachary Turner Status OptionValueString::SetCurrentValue(llvm::StringRef value) {
121b9c1b51eSKate Stone   if (m_validator) {
12297206d57SZachary Turner     Status error(m_validator(value.str().c_str(), m_validator_baton));
1239d14084bSEnrico Granata     if (error.Fail())
1249d14084bSEnrico Granata       return error;
1259d14084bSEnrico Granata   }
126*adcd0268SBenjamin Kramer   m_current_value.assign(std::string(value));
12797206d57SZachary Turner   return Status();
1289d14084bSEnrico Granata }
1299d14084bSEnrico Granata 
AppendToCurrentValue(const char * value)13097206d57SZachary Turner Status OptionValueString::AppendToCurrentValue(const char *value) {
131b9c1b51eSKate Stone   if (value && value[0]) {
132b9c1b51eSKate Stone     if (m_validator) {
1339d14084bSEnrico Granata       std::string new_value(m_current_value);
1349d14084bSEnrico Granata       new_value.append(value);
13597206d57SZachary Turner       Status error(m_validator(value, m_validator_baton));
1369d14084bSEnrico Granata       if (error.Fail())
1379d14084bSEnrico Granata         return error;
1389d14084bSEnrico Granata       m_current_value.assign(new_value);
139b9c1b51eSKate Stone     } else
1409d14084bSEnrico Granata       m_current_value.append(value);
1419d14084bSEnrico Granata   }
14297206d57SZachary Turner   return Status();
1439d14084bSEnrico Granata }
144