167cc0636SGreg Clayton //===-- OptionValueString.cpp ------------------------------------*- C++ -*-===//
267cc0636SGreg Clayton //
367cc0636SGreg Clayton //                     The LLVM Compiler Infrastructure
467cc0636SGreg Clayton //
567cc0636SGreg Clayton // This file is distributed under the University of Illinois Open Source
667cc0636SGreg Clayton // License. See LICENSE.TXT for details.
767cc0636SGreg Clayton //
867cc0636SGreg Clayton //===----------------------------------------------------------------------===//
967cc0636SGreg Clayton 
1067cc0636SGreg Clayton #include "lldb/Interpreter/OptionValueString.h"
1167cc0636SGreg Clayton 
1267cc0636SGreg Clayton // C Includes
1367cc0636SGreg Clayton // C++ Includes
1467cc0636SGreg Clayton // Other libraries and framework includes
1567cc0636SGreg Clayton // Project includes
1667cc0636SGreg Clayton #include "lldb/Core/Stream.h"
174c05410fSGreg Clayton #include "lldb/Interpreter/Args.h"
1867cc0636SGreg Clayton 
1967cc0636SGreg Clayton using namespace lldb;
2067cc0636SGreg Clayton using namespace lldb_private;
2167cc0636SGreg Clayton 
2267cc0636SGreg Clayton void
2367cc0636SGreg Clayton OptionValueString::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
2467cc0636SGreg Clayton {
2567cc0636SGreg Clayton     if (dump_mask & eDumpOptionType)
2667cc0636SGreg Clayton         strm.Printf ("(%s)", GetTypeAsCString ());
2767cc0636SGreg Clayton     if (dump_mask & eDumpOptionValue)
2867cc0636SGreg Clayton     {
2967cc0636SGreg Clayton         if (dump_mask & eDumpOptionType)
3067cc0636SGreg Clayton             strm.PutCString (" = ");
3167cc0636SGreg Clayton         if (!m_current_value.empty() || m_value_was_set)
3267cc0636SGreg Clayton         {
334c05410fSGreg Clayton             if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
344c05410fSGreg Clayton             {
354c05410fSGreg Clayton                 std::string expanded_escape_value;
364c05410fSGreg Clayton                 Args::ExpandEscapedCharacters(m_current_value.c_str(), expanded_escape_value);
374c05410fSGreg Clayton                 if (dump_mask & eDumpOptionRaw)
384c05410fSGreg Clayton                     strm.Printf ("%s", expanded_escape_value.c_str());
394c05410fSGreg Clayton                 else
404c05410fSGreg Clayton                     strm.Printf ("\"%s\"", expanded_escape_value.c_str());
414c05410fSGreg Clayton             }
424c05410fSGreg Clayton             else
434c05410fSGreg Clayton             {
4467cc0636SGreg Clayton                 if (dump_mask & eDumpOptionRaw)
4567cc0636SGreg Clayton                     strm.Printf ("%s", m_current_value.c_str());
4667cc0636SGreg Clayton                 else
4767cc0636SGreg Clayton                     strm.Printf ("\"%s\"", m_current_value.c_str());
4867cc0636SGreg Clayton             }
4967cc0636SGreg Clayton         }
5067cc0636SGreg Clayton     }
514c05410fSGreg Clayton }
5267cc0636SGreg Clayton 
5367cc0636SGreg Clayton Error
54*c95f7e2aSPavel Labath OptionValueString::SetValueFromString (llvm::StringRef value,
5567cc0636SGreg Clayton                                         VarSetOperationType op)
5667cc0636SGreg Clayton {
5767cc0636SGreg Clayton     Error error;
5821c895e3SGreg Clayton 
59*c95f7e2aSPavel Labath     std::string value_str = value.str();
60*c95f7e2aSPavel Labath     value = value.trim();
61*c95f7e2aSPavel Labath     if (value.size() > 0)
6221c895e3SGreg Clayton     {
63*c95f7e2aSPavel Labath         switch (value.front())
6421c895e3SGreg Clayton         {
6521c895e3SGreg Clayton         case '"':
6621c895e3SGreg Clayton         case '\'':
6721c895e3SGreg Clayton             {
68*c95f7e2aSPavel Labath                 if (value.size() <= 1 || value.back() != value.front())
6921c895e3SGreg Clayton                 {
7021c895e3SGreg Clayton                     error.SetErrorString("mismatched quotes");
7121c895e3SGreg Clayton                     return error;
7221c895e3SGreg Clayton                 }
73*c95f7e2aSPavel Labath                 value = value.drop_front().drop_back().str();
7421c895e3SGreg Clayton             }
7521c895e3SGreg Clayton             break;
7621c895e3SGreg Clayton         }
77*c95f7e2aSPavel Labath         value_str = value.str();
7821c895e3SGreg Clayton     }
7921c895e3SGreg Clayton 
8067cc0636SGreg Clayton     switch (op)
8167cc0636SGreg Clayton     {
8267cc0636SGreg Clayton     case eVarSetOperationInvalid:
8367cc0636SGreg Clayton     case eVarSetOperationInsertBefore:
8467cc0636SGreg Clayton     case eVarSetOperationInsertAfter:
8567cc0636SGreg Clayton     case eVarSetOperationRemove:
869d14084bSEnrico Granata         if (m_validator)
879d14084bSEnrico Granata         {
88*c95f7e2aSPavel Labath             error = m_validator(value_str.c_str(),m_validator_baton);
899d14084bSEnrico Granata             if (error.Fail())
909d14084bSEnrico Granata                 return error;
919d14084bSEnrico Granata         }
92*c95f7e2aSPavel Labath         error = OptionValue::SetValueFromString (value, op);
9367cc0636SGreg Clayton         break;
9467cc0636SGreg Clayton 
9567cc0636SGreg Clayton     case eVarSetOperationAppend:
969d14084bSEnrico Granata         {
979d14084bSEnrico Granata             std::string new_value(m_current_value);
98*c95f7e2aSPavel Labath             if (value.size() > 0)
994c05410fSGreg Clayton             {
1004c05410fSGreg Clayton                 if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
1014c05410fSGreg Clayton                 {
1024c05410fSGreg Clayton                     std::string str;
103*c95f7e2aSPavel Labath                     Args::EncodeEscapeSequences (value_str.c_str(), str);
1049d14084bSEnrico Granata                     new_value.append(str);
1054c05410fSGreg Clayton                 }
1064c05410fSGreg Clayton                 else
107*c95f7e2aSPavel Labath                     new_value.append(value);
1089d14084bSEnrico Granata             }
1099d14084bSEnrico Granata             if (m_validator)
1109d14084bSEnrico Granata             {
1119d14084bSEnrico Granata                 error = m_validator(new_value.c_str(),m_validator_baton);
1129d14084bSEnrico Granata                 if (error.Fail())
1139d14084bSEnrico Granata                     return error;
1149d14084bSEnrico Granata             }
1159d14084bSEnrico Granata             m_current_value.assign(new_value);
116332e8b1cSGreg Clayton             NotifyValueChanged();
1174c05410fSGreg Clayton         }
11867cc0636SGreg Clayton         break;
11967cc0636SGreg Clayton 
12067cc0636SGreg Clayton     case eVarSetOperationClear:
12167cc0636SGreg Clayton         Clear ();
122332e8b1cSGreg Clayton         NotifyValueChanged();
12367cc0636SGreg Clayton         break;
12467cc0636SGreg Clayton 
12567cc0636SGreg Clayton     case eVarSetOperationReplace:
12667cc0636SGreg Clayton     case eVarSetOperationAssign:
1279d14084bSEnrico Granata         if (m_validator)
1289d14084bSEnrico Granata         {
129*c95f7e2aSPavel Labath             error = m_validator(value_str.c_str(), m_validator_baton);
1309d14084bSEnrico Granata             if (error.Fail())
1319d14084bSEnrico Granata                 return error;
1329d14084bSEnrico Granata         }
13367cc0636SGreg Clayton         m_value_was_set = true;
1344c05410fSGreg Clayton         if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
1354c05410fSGreg Clayton         {
136*c95f7e2aSPavel Labath             Args::EncodeEscapeSequences (value_str.c_str(), m_current_value);
1374c05410fSGreg Clayton         }
1384c05410fSGreg Clayton         else
1394c05410fSGreg Clayton         {
140*c95f7e2aSPavel Labath             SetCurrentValue (value_str.c_str());
1414c05410fSGreg Clayton         }
142332e8b1cSGreg Clayton         NotifyValueChanged();
14367cc0636SGreg Clayton         break;
14467cc0636SGreg Clayton     }
14567cc0636SGreg Clayton     return error;
14667cc0636SGreg Clayton }
14767cc0636SGreg Clayton 
14867cc0636SGreg Clayton 
14967cc0636SGreg Clayton lldb::OptionValueSP
15067cc0636SGreg Clayton OptionValueString::DeepCopy () const
15167cc0636SGreg Clayton {
15267cc0636SGreg Clayton     return OptionValueSP(new OptionValueString(*this));
15367cc0636SGreg Clayton }
1549d14084bSEnrico Granata 
1559d14084bSEnrico Granata Error
1569d14084bSEnrico Granata OptionValueString::SetCurrentValue (const char *value)
1579d14084bSEnrico Granata {
1589d14084bSEnrico Granata     if (m_validator)
1599d14084bSEnrico Granata     {
1609d14084bSEnrico Granata         Error error(m_validator(value,m_validator_baton));
1619d14084bSEnrico Granata         if (error.Fail())
1629d14084bSEnrico Granata             return error;
1639d14084bSEnrico Granata     }
1649d14084bSEnrico Granata     if (value && value[0])
1659d14084bSEnrico Granata         m_current_value.assign (value);
1669d14084bSEnrico Granata     else
1679d14084bSEnrico Granata         m_current_value.clear();
1689d14084bSEnrico Granata     return Error();
1699d14084bSEnrico Granata }
1709d14084bSEnrico Granata 
1719d14084bSEnrico Granata Error
1729d14084bSEnrico Granata OptionValueString::AppendToCurrentValue (const char *value)
1739d14084bSEnrico Granata {
1749d14084bSEnrico Granata     if (value && value[0])
1759d14084bSEnrico Granata     {
1769d14084bSEnrico Granata         if (m_validator)
1779d14084bSEnrico Granata         {
1789d14084bSEnrico Granata             std::string new_value(m_current_value);
1799d14084bSEnrico Granata             new_value.append(value);
1809d14084bSEnrico Granata             Error error(m_validator(value,m_validator_baton));
1819d14084bSEnrico Granata             if (error.Fail())
1829d14084bSEnrico Granata                 return error;
1839d14084bSEnrico Granata             m_current_value.assign(new_value);
1849d14084bSEnrico Granata         }
1859d14084bSEnrico Granata         else
1869d14084bSEnrico Granata             m_current_value.append (value);
1879d14084bSEnrico Granata     }
1889d14084bSEnrico Granata     return Error();
1899d14084bSEnrico Granata }
190