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
17*3eb2b44dSZachary Turner #include "lldb/Host/OptionParser.h"
184c05410fSGreg Clayton #include "lldb/Interpreter/Args.h"
19bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
2067cc0636SGreg Clayton 
2167cc0636SGreg Clayton using namespace lldb;
2267cc0636SGreg Clayton using namespace lldb_private;
2367cc0636SGreg Clayton 
24b9c1b51eSKate Stone void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
25b9c1b51eSKate Stone                                   uint32_t dump_mask) {
2667cc0636SGreg Clayton   if (dump_mask & eDumpOptionType)
2767cc0636SGreg Clayton     strm.Printf("(%s)", GetTypeAsCString());
28b9c1b51eSKate Stone   if (dump_mask & eDumpOptionValue) {
2967cc0636SGreg Clayton     if (dump_mask & eDumpOptionType)
3067cc0636SGreg Clayton       strm.PutCString(" = ");
31b9c1b51eSKate Stone     if (!m_current_value.empty() || m_value_was_set) {
32b9c1b51eSKate Stone       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
334c05410fSGreg Clayton         std::string expanded_escape_value;
34b9c1b51eSKate Stone         Args::ExpandEscapedCharacters(m_current_value.c_str(),
35b9c1b51eSKate Stone                                       expanded_escape_value);
364c05410fSGreg Clayton         if (dump_mask & eDumpOptionRaw)
374c05410fSGreg Clayton           strm.Printf("%s", expanded_escape_value.c_str());
384c05410fSGreg Clayton         else
394c05410fSGreg Clayton           strm.Printf("\"%s\"", expanded_escape_value.c_str());
40b9c1b51eSKate Stone       } else {
4167cc0636SGreg Clayton         if (dump_mask & eDumpOptionRaw)
4267cc0636SGreg Clayton           strm.Printf("%s", m_current_value.c_str());
4367cc0636SGreg Clayton         else
4467cc0636SGreg Clayton           strm.Printf("\"%s\"", m_current_value.c_str());
4567cc0636SGreg Clayton       }
4667cc0636SGreg Clayton     }
4767cc0636SGreg Clayton   }
484c05410fSGreg Clayton }
4967cc0636SGreg Clayton 
50b9c1b51eSKate Stone Error OptionValueString::SetValueFromString(llvm::StringRef value,
51b9c1b51eSKate Stone                                             VarSetOperationType op) {
5267cc0636SGreg Clayton   Error error;
5321c895e3SGreg Clayton 
54c95f7e2aSPavel Labath   std::string value_str = value.str();
55c95f7e2aSPavel Labath   value = value.trim();
56b9c1b51eSKate Stone   if (value.size() > 0) {
57b9c1b51eSKate Stone     switch (value.front()) {
5821c895e3SGreg Clayton     case '"':
59b9c1b51eSKate Stone     case '\'': {
60b9c1b51eSKate Stone       if (value.size() <= 1 || value.back() != value.front()) {
6121c895e3SGreg Clayton         error.SetErrorString("mismatched quotes");
6221c895e3SGreg Clayton         return error;
6321c895e3SGreg Clayton       }
644f2a9726SZachary Turner       value = value.drop_front().drop_back();
65b9c1b51eSKate Stone     } break;
6621c895e3SGreg Clayton     }
67c95f7e2aSPavel Labath     value_str = value.str();
6821c895e3SGreg Clayton   }
6921c895e3SGreg Clayton 
70b9c1b51eSKate Stone   switch (op) {
7167cc0636SGreg Clayton   case eVarSetOperationInvalid:
7267cc0636SGreg Clayton   case eVarSetOperationInsertBefore:
7367cc0636SGreg Clayton   case eVarSetOperationInsertAfter:
7467cc0636SGreg Clayton   case eVarSetOperationRemove:
75b9c1b51eSKate Stone     if (m_validator) {
76c95f7e2aSPavel Labath       error = m_validator(value_str.c_str(), m_validator_baton);
779d14084bSEnrico Granata       if (error.Fail())
789d14084bSEnrico Granata         return error;
799d14084bSEnrico Granata     }
80c95f7e2aSPavel Labath     error = OptionValue::SetValueFromString(value, op);
8167cc0636SGreg Clayton     break;
8267cc0636SGreg Clayton 
83b9c1b51eSKate Stone   case eVarSetOperationAppend: {
849d14084bSEnrico Granata     std::string new_value(m_current_value);
85b9c1b51eSKate Stone     if (value.size() > 0) {
86b9c1b51eSKate Stone       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
874c05410fSGreg Clayton         std::string str;
88c95f7e2aSPavel Labath         Args::EncodeEscapeSequences(value_str.c_str(), str);
899d14084bSEnrico Granata         new_value.append(str);
90b9c1b51eSKate Stone       } else
91c95f7e2aSPavel Labath         new_value.append(value);
929d14084bSEnrico Granata     }
93b9c1b51eSKate Stone     if (m_validator) {
949d14084bSEnrico Granata       error = m_validator(new_value.c_str(), m_validator_baton);
959d14084bSEnrico Granata       if (error.Fail())
969d14084bSEnrico Granata         return error;
979d14084bSEnrico Granata     }
989d14084bSEnrico Granata     m_current_value.assign(new_value);
99332e8b1cSGreg Clayton     NotifyValueChanged();
100b9c1b51eSKate Stone   } break;
10167cc0636SGreg Clayton 
10267cc0636SGreg Clayton   case eVarSetOperationClear:
10367cc0636SGreg Clayton     Clear();
104332e8b1cSGreg Clayton     NotifyValueChanged();
10567cc0636SGreg Clayton     break;
10667cc0636SGreg Clayton 
10767cc0636SGreg Clayton   case eVarSetOperationReplace:
10867cc0636SGreg Clayton   case eVarSetOperationAssign:
109b9c1b51eSKate Stone     if (m_validator) {
110c95f7e2aSPavel Labath       error = m_validator(value_str.c_str(), m_validator_baton);
1119d14084bSEnrico Granata       if (error.Fail())
1129d14084bSEnrico Granata         return error;
1139d14084bSEnrico Granata     }
11467cc0636SGreg Clayton     m_value_was_set = true;
115b9c1b51eSKate Stone     if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
116c95f7e2aSPavel Labath       Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
117b9c1b51eSKate Stone     } else {
1188cef4b0bSZachary Turner       SetCurrentValue(value_str);
1194c05410fSGreg Clayton     }
120332e8b1cSGreg Clayton     NotifyValueChanged();
12167cc0636SGreg Clayton     break;
12267cc0636SGreg Clayton   }
12367cc0636SGreg Clayton   return error;
12467cc0636SGreg Clayton }
12567cc0636SGreg Clayton 
126b9c1b51eSKate Stone lldb::OptionValueSP OptionValueString::DeepCopy() const {
12767cc0636SGreg Clayton   return OptionValueSP(new OptionValueString(*this));
12867cc0636SGreg Clayton }
1299d14084bSEnrico Granata 
1308cef4b0bSZachary Turner Error OptionValueString::SetCurrentValue(llvm::StringRef value) {
131b9c1b51eSKate Stone   if (m_validator) {
1328cef4b0bSZachary Turner     Error error(m_validator(value.str().c_str(), m_validator_baton));
1339d14084bSEnrico Granata     if (error.Fail())
1349d14084bSEnrico Granata       return error;
1359d14084bSEnrico Granata   }
1369d14084bSEnrico Granata   m_current_value.assign(value);
137c1edf566SMehdi Amini   return Error();
1389d14084bSEnrico Granata }
1399d14084bSEnrico Granata 
140b9c1b51eSKate Stone Error OptionValueString::AppendToCurrentValue(const char *value) {
141b9c1b51eSKate Stone   if (value && value[0]) {
142b9c1b51eSKate Stone     if (m_validator) {
1439d14084bSEnrico Granata       std::string new_value(m_current_value);
1449d14084bSEnrico Granata       new_value.append(value);
1459d14084bSEnrico Granata       Error error(m_validator(value, m_validator_baton));
1469d14084bSEnrico Granata       if (error.Fail())
1479d14084bSEnrico Granata         return error;
1489d14084bSEnrico Granata       m_current_value.assign(new_value);
149b9c1b51eSKate Stone     } else
1509d14084bSEnrico Granata       m_current_value.append(value);
1519d14084bSEnrico Granata   }
152c1edf566SMehdi Amini   return Error();
1539d14084bSEnrico Granata }
154