]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Interpreter/OptionValueString.cpp
Update mandoc to 1.14.5
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Interpreter / OptionValueString.cpp
1 //===-- OptionValueString.cpp ------------------------------------*- C++
2 //-*-===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #include "lldb/Interpreter/OptionValueString.h"
12
13 #include "lldb/Host/OptionParser.h"
14 #include "lldb/Utility/Args.h"
15 #include "lldb/Utility/Stream.h"
16
17 using namespace lldb;
18 using namespace lldb_private;
19
20 void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
21                                   uint32_t dump_mask) {
22   if (dump_mask & eDumpOptionType)
23     strm.Printf("(%s)", GetTypeAsCString());
24   if (dump_mask & eDumpOptionValue) {
25     if (dump_mask & eDumpOptionType)
26       strm.PutCString(" = ");
27     if (!m_current_value.empty() || m_value_was_set) {
28       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
29         std::string expanded_escape_value;
30         Args::ExpandEscapedCharacters(m_current_value.c_str(),
31                                       expanded_escape_value);
32         if (dump_mask & eDumpOptionRaw)
33           strm.Printf("%s", expanded_escape_value.c_str());
34         else
35           strm.Printf("\"%s\"", expanded_escape_value.c_str());
36       } else {
37         if (dump_mask & eDumpOptionRaw)
38           strm.Printf("%s", m_current_value.c_str());
39         else
40           strm.Printf("\"%s\"", m_current_value.c_str());
41       }
42     }
43   }
44 }
45
46 Status OptionValueString::SetValueFromString(llvm::StringRef value,
47                                              VarSetOperationType op) {
48   Status error;
49
50   std::string value_str = value.str();
51   value = value.trim();
52   if (value.size() > 0) {
53     switch (value.front()) {
54     case '"':
55     case '\'': {
56       if (value.size() <= 1 || value.back() != value.front()) {
57         error.SetErrorString("mismatched quotes");
58         return error;
59       }
60       value = value.drop_front().drop_back();
61     } break;
62     }
63     value_str = value.str();
64   }
65
66   switch (op) {
67   case eVarSetOperationInvalid:
68   case eVarSetOperationInsertBefore:
69   case eVarSetOperationInsertAfter:
70   case eVarSetOperationRemove:
71     if (m_validator) {
72       error = m_validator(value_str.c_str(), m_validator_baton);
73       if (error.Fail())
74         return error;
75     }
76     error = OptionValue::SetValueFromString(value, op);
77     break;
78
79   case eVarSetOperationAppend: {
80     std::string new_value(m_current_value);
81     if (value.size() > 0) {
82       if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
83         std::string str;
84         Args::EncodeEscapeSequences(value_str.c_str(), str);
85         new_value.append(str);
86       } else
87         new_value.append(value);
88     }
89     if (m_validator) {
90       error = m_validator(new_value.c_str(), m_validator_baton);
91       if (error.Fail())
92         return error;
93     }
94     m_current_value.assign(new_value);
95     NotifyValueChanged();
96   } break;
97
98   case eVarSetOperationClear:
99     Clear();
100     NotifyValueChanged();
101     break;
102
103   case eVarSetOperationReplace:
104   case eVarSetOperationAssign:
105     if (m_validator) {
106       error = m_validator(value_str.c_str(), m_validator_baton);
107       if (error.Fail())
108         return error;
109     }
110     m_value_was_set = true;
111     if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
112       Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
113     } else {
114       SetCurrentValue(value_str);
115     }
116     NotifyValueChanged();
117     break;
118   }
119   return error;
120 }
121
122 lldb::OptionValueSP OptionValueString::DeepCopy() const {
123   return OptionValueSP(new OptionValueString(*this));
124 }
125
126 Status OptionValueString::SetCurrentValue(llvm::StringRef value) {
127   if (m_validator) {
128     Status error(m_validator(value.str().c_str(), m_validator_baton));
129     if (error.Fail())
130       return error;
131   }
132   m_current_value.assign(value);
133   return Status();
134 }
135
136 Status OptionValueString::AppendToCurrentValue(const char *value) {
137   if (value && value[0]) {
138     if (m_validator) {
139       std::string new_value(m_current_value);
140       new_value.append(value);
141       Status error(m_validator(value, m_validator_baton));
142       if (error.Fail())
143         return error;
144       m_current_value.assign(new_value);
145     } else
146       m_current_value.append(value);
147   }
148   return Status();
149 }