blob: 91a980340add3ee7fc0da1d93eed7575bc0b3763 [file] [log] [blame]
Greg Clayton73844aa2012-08-22 17:17:09 +00001//===-- OptionValueString.cpp ------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Interpreter/OptionValueString.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16#include "lldb/Core/Stream.h"
Greg Clayton3b1afc62012-09-01 00:38:36 +000017#include "lldb/Interpreter/Args.h"
Greg Clayton73844aa2012-08-22 17:17:09 +000018
19using namespace lldb;
20using namespace lldb_private;
21
22void
23OptionValueString::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
24{
25 if (dump_mask & eDumpOptionType)
26 strm.Printf ("(%s)", GetTypeAsCString ());
27 if (dump_mask & eDumpOptionValue)
28 {
29 if (dump_mask & eDumpOptionType)
30 strm.PutCString (" = ");
31 if (!m_current_value.empty() || m_value_was_set)
32 {
Greg Clayton3b1afc62012-09-01 00:38:36 +000033 if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
34 {
35 std::string expanded_escape_value;
36 Args::ExpandEscapedCharacters(m_current_value.c_str(), expanded_escape_value);
37 if (dump_mask & eDumpOptionRaw)
38 strm.Printf ("%s", expanded_escape_value.c_str());
39 else
40 strm.Printf ("\"%s\"", expanded_escape_value.c_str());
41 }
Greg Clayton73844aa2012-08-22 17:17:09 +000042 else
Greg Clayton3b1afc62012-09-01 00:38:36 +000043 {
44 if (dump_mask & eDumpOptionRaw)
45 strm.Printf ("%s", m_current_value.c_str());
46 else
47 strm.Printf ("\"%s\"", m_current_value.c_str());
48 }
Greg Clayton73844aa2012-08-22 17:17:09 +000049 }
50 }
51}
52
53Error
54OptionValueString::SetValueFromCString (const char *value_cstr,
55 VarSetOperationType op)
56{
57 Error error;
58 switch (op)
59 {
60 case eVarSetOperationInvalid:
61 case eVarSetOperationInsertBefore:
62 case eVarSetOperationInsertAfter:
63 case eVarSetOperationRemove:
Enrico Granata729e99e2012-12-11 22:42:19 +000064 if (m_validator)
65 {
66 error = m_validator(value_cstr,m_validator_baton);
67 if (error.Fail())
68 return error;
69 }
Greg Clayton73844aa2012-08-22 17:17:09 +000070 error = OptionValue::SetValueFromCString (value_cstr, op);
71 break;
72
73 case eVarSetOperationAppend:
Enrico Granata729e99e2012-12-11 22:42:19 +000074 {
75 std::string new_value(m_current_value);
Greg Clayton73844aa2012-08-22 17:17:09 +000076 if (value_cstr && value_cstr[0])
Greg Clayton3b1afc62012-09-01 00:38:36 +000077 {
78 if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
79 {
80 std::string str;
81 Args::EncodeEscapeSequences (value_cstr, str);
Enrico Granata729e99e2012-12-11 22:42:19 +000082 new_value.append(str);
Greg Clayton3b1afc62012-09-01 00:38:36 +000083 }
84 else
Enrico Granata729e99e2012-12-11 22:42:19 +000085 new_value.append(value_cstr);
86 }
87 if (m_validator)
88 {
89 error = m_validator(new_value.c_str(),m_validator_baton);
90 if (error.Fail())
91 return error;
92 }
93 m_current_value.assign(new_value);
Greg Clayton3b1afc62012-09-01 00:38:36 +000094 }
Greg Clayton73844aa2012-08-22 17:17:09 +000095 break;
96
97 case eVarSetOperationClear:
98 Clear ();
99 break;
100
101 case eVarSetOperationReplace:
102 case eVarSetOperationAssign:
Enrico Granata729e99e2012-12-11 22:42:19 +0000103 if (m_validator)
104 {
105 error = m_validator(value_cstr,m_validator_baton);
106 if (error.Fail())
107 return error;
108 }
Greg Clayton73844aa2012-08-22 17:17:09 +0000109 m_value_was_set = true;
Greg Clayton3b1afc62012-09-01 00:38:36 +0000110 if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
111 {
112 Args::EncodeEscapeSequences (value_cstr, m_current_value);
113 }
114 else
115 {
116 SetCurrentValue (value_cstr);
117 }
Greg Clayton73844aa2012-08-22 17:17:09 +0000118 break;
119 }
120 return error;
121}
122
123
124lldb::OptionValueSP
125OptionValueString::DeepCopy () const
126{
127 return OptionValueSP(new OptionValueString(*this));
128}
Enrico Granata729e99e2012-12-11 22:42:19 +0000129
130Error
131OptionValueString::SetCurrentValue (const char *value)
132{
133 if (m_validator)
134 {
135 Error error(m_validator(value,m_validator_baton));
136 if (error.Fail())
137 return error;
138 }
139 if (value && value[0])
140 m_current_value.assign (value);
141 else
142 m_current_value.clear();
143 return Error();
144}
145
146Error
147OptionValueString::AppendToCurrentValue (const char *value)
148{
149 if (value && value[0])
150 {
151 if (m_validator)
152 {
153 std::string new_value(m_current_value);
154 new_value.append(value);
155 Error error(m_validator(value,m_validator_baton));
156 if (error.Fail())
157 return error;
158 m_current_value.assign(new_value);
159 }
160 else
161 m_current_value.append (value);
162 }
163 return Error();
164}