1b9c1b51eSKate Stone //===-- OptionValueString.cpp ------------------------------------*- C++
2b9c1b51eSKate Stone //-*-===//
367cc0636SGreg Clayton //
467cc0636SGreg Clayton //                     The LLVM Compiler Infrastructure
567cc0636SGreg Clayton //
667cc0636SGreg Clayton // This file is distributed under the University of Illinois Open Source
767cc0636SGreg Clayton // License. See LICENSE.TXT for details.
867cc0636SGreg Clayton //
967cc0636SGreg Clayton //===----------------------------------------------------------------------===//
1067cc0636SGreg Clayton 
1167cc0636SGreg Clayton #include "lldb/Interpreter/OptionValueString.h"
1267cc0636SGreg Clayton 
1367cc0636SGreg Clayton // C Includes
1467cc0636SGreg Clayton // C++ Includes
1567cc0636SGreg Clayton // Other libraries and framework includes
1667cc0636SGreg Clayton // Project includes
1767cc0636SGreg Clayton #include "lldb/Core/Stream.h"
184c05410fSGreg Clayton #include "lldb/Interpreter/Args.h"
1967cc0636SGreg Clayton 
2067cc0636SGreg Clayton using namespace lldb;
2167cc0636SGreg Clayton using namespace lldb_private;
2267cc0636SGreg Clayton 
23b9c1b51eSKate Stone void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
24b9c1b51eSKate Stone                                   uint32_t dump_mask) {
2567cc0636SGreg Clayton   if (dump_mask & eDumpOptionType)
2667cc0636SGreg Clayton     strm.Printf("(%s)", GetTypeAsCString());
27b9c1b51eSKate Stone   if (dump_mask & eDumpOptionValue) {
2867cc0636SGreg Clayton     if (dump_mask & eDumpOptionType)
2967cc0636SGreg Clayton       strm.PutCString(" = ");
30b9c1b51eSKate Stone     if (!m_current_value.empty() || m_value_was_set) {
31b9c1b51eSKate Stone       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
324c05410fSGreg Clayton         std::string expanded_escape_value;
33b9c1b51eSKate Stone         Args::ExpandEscapedCharacters(m_current_value.c_str(),
34b9c1b51eSKate Stone                                       expanded_escape_value);
354c05410fSGreg Clayton         if (dump_mask & eDumpOptionRaw)
364c05410fSGreg Clayton           strm.Printf("%s", expanded_escape_value.c_str());
374c05410fSGreg Clayton         else
384c05410fSGreg Clayton           strm.Printf("\"%s\"", expanded_escape_value.c_str());
39b9c1b51eSKate Stone       } else {
4067cc0636SGreg Clayton         if (dump_mask & eDumpOptionRaw)
4167cc0636SGreg Clayton           strm.Printf("%s", m_current_value.c_str());
4267cc0636SGreg Clayton         else
4367cc0636SGreg Clayton           strm.Printf("\"%s\"", m_current_value.c_str());
4467cc0636SGreg Clayton       }
4567cc0636SGreg Clayton     }
4667cc0636SGreg Clayton   }
474c05410fSGreg Clayton }
4867cc0636SGreg Clayton 
49b9c1b51eSKate Stone Error OptionValueString::SetValueFromString(llvm::StringRef value,
50b9c1b51eSKate Stone                                             VarSetOperationType op) {
5167cc0636SGreg Clayton   Error error;
5221c895e3SGreg Clayton 
53c95f7e2aSPavel Labath   std::string value_str = value.str();
54c95f7e2aSPavel Labath   value = value.trim();
55b9c1b51eSKate Stone   if (value.size() > 0) {
56b9c1b51eSKate Stone     switch (value.front()) {
5721c895e3SGreg Clayton     case '"':
58b9c1b51eSKate Stone     case '\'': {
59b9c1b51eSKate Stone       if (value.size() <= 1 || value.back() != value.front()) {
6021c895e3SGreg Clayton         error.SetErrorString("mismatched quotes");
6121c895e3SGreg Clayton         return error;
6221c895e3SGreg Clayton       }
634f2a9726SZachary Turner       value = value.drop_front().drop_back();
64b9c1b51eSKate Stone     } break;
6521c895e3SGreg Clayton     }
66c95f7e2aSPavel Labath     value_str = value.str();
6721c895e3SGreg Clayton   }
6821c895e3SGreg Clayton 
69b9c1b51eSKate Stone   switch (op) {
7067cc0636SGreg Clayton   case eVarSetOperationInvalid:
7167cc0636SGreg Clayton   case eVarSetOperationInsertBefore:
7267cc0636SGreg Clayton   case eVarSetOperationInsertAfter:
7367cc0636SGreg Clayton   case eVarSetOperationRemove:
74b9c1b51eSKate Stone     if (m_validator) {
75c95f7e2aSPavel Labath       error = m_validator(value_str.c_str(), m_validator_baton);
769d14084bSEnrico Granata       if (error.Fail())
779d14084bSEnrico Granata         return error;
789d14084bSEnrico Granata     }
79c95f7e2aSPavel Labath     error = OptionValue::SetValueFromString(value, op);
8067cc0636SGreg Clayton     break;
8167cc0636SGreg Clayton 
82b9c1b51eSKate Stone   case eVarSetOperationAppend: {
839d14084bSEnrico Granata     std::string new_value(m_current_value);
84b9c1b51eSKate Stone     if (value.size() > 0) {
85b9c1b51eSKate Stone       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
864c05410fSGreg Clayton         std::string str;
87c95f7e2aSPavel Labath         Args::EncodeEscapeSequences(value_str.c_str(), str);
889d14084bSEnrico Granata         new_value.append(str);
89b9c1b51eSKate Stone       } else
90c95f7e2aSPavel Labath         new_value.append(value);
919d14084bSEnrico Granata     }
92b9c1b51eSKate Stone     if (m_validator) {
939d14084bSEnrico Granata       error = m_validator(new_value.c_str(), m_validator_baton);
949d14084bSEnrico Granata       if (error.Fail())
959d14084bSEnrico Granata         return error;
969d14084bSEnrico Granata     }
979d14084bSEnrico Granata     m_current_value.assign(new_value);
98332e8b1cSGreg Clayton     NotifyValueChanged();
99b9c1b51eSKate Stone   } break;
10067cc0636SGreg Clayton 
10167cc0636SGreg Clayton   case eVarSetOperationClear:
10267cc0636SGreg Clayton     Clear();
103332e8b1cSGreg Clayton     NotifyValueChanged();
10467cc0636SGreg Clayton     break;
10567cc0636SGreg Clayton 
10667cc0636SGreg Clayton   case eVarSetOperationReplace:
10767cc0636SGreg Clayton   case eVarSetOperationAssign:
108b9c1b51eSKate Stone     if (m_validator) {
109c95f7e2aSPavel Labath       error = m_validator(value_str.c_str(), m_validator_baton);
1109d14084bSEnrico Granata       if (error.Fail())
1119d14084bSEnrico Granata         return error;
1129d14084bSEnrico Granata     }
11367cc0636SGreg Clayton     m_value_was_set = true;
114b9c1b51eSKate Stone     if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
115c95f7e2aSPavel Labath       Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
116b9c1b51eSKate Stone     } else {
1178cef4b0bSZachary Turner       SetCurrentValue(value_str);
1184c05410fSGreg Clayton     }
119332e8b1cSGreg Clayton     NotifyValueChanged();
12067cc0636SGreg Clayton     break;
12167cc0636SGreg Clayton   }
12267cc0636SGreg Clayton   return error;
12367cc0636SGreg Clayton }
12467cc0636SGreg Clayton 
125b9c1b51eSKate Stone lldb::OptionValueSP OptionValueString::DeepCopy() const {
12667cc0636SGreg Clayton   return OptionValueSP(new OptionValueString(*this));
12767cc0636SGreg Clayton }
1289d14084bSEnrico Granata 
1298cef4b0bSZachary Turner Error OptionValueString::SetCurrentValue(llvm::StringRef value) {
130b9c1b51eSKate Stone   if (m_validator) {
1318cef4b0bSZachary Turner     Error error(m_validator(value.str().c_str(), m_validator_baton));
1329d14084bSEnrico Granata     if (error.Fail())
1339d14084bSEnrico Granata       return error;
1349d14084bSEnrico Granata   }
1359d14084bSEnrico Granata   m_current_value.assign(value);
136*c1edf566SMehdi Amini   return Error();
1379d14084bSEnrico Granata }
1389d14084bSEnrico Granata 
139b9c1b51eSKate Stone Error OptionValueString::AppendToCurrentValue(const char *value) {
140b9c1b51eSKate Stone   if (value && value[0]) {
141b9c1b51eSKate Stone     if (m_validator) {
1429d14084bSEnrico Granata       std::string new_value(m_current_value);
1439d14084bSEnrico Granata       new_value.append(value);
1449d14084bSEnrico Granata       Error error(m_validator(value, m_validator_baton));
1459d14084bSEnrico Granata       if (error.Fail())
1469d14084bSEnrico Granata         return error;
1479d14084bSEnrico Granata       m_current_value.assign(new_value);
148b9c1b51eSKate Stone     } else
1499d14084bSEnrico Granata       m_current_value.append(value);
1509d14084bSEnrico Granata   }
151*c1edf566SMehdi Amini   return Error();
1529d14084bSEnrico Granata }
153