OptionValueString.cpp revision 254721
1//===-- 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"
17#include "lldb/Interpreter/Args.h"
18
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        {
33            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            }
42            else
43            {
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            }
49        }
50    }
51}
52
53Error
54OptionValueString::SetValueFromCString (const char *value_cstr,
55                                        VarSetOperationType op)
56{
57    Error error;
58
59    std::string value_str_no_quotes;
60    if (value_cstr)
61    {
62        switch (value_cstr[0])
63        {
64        case '"':
65        case '\'':
66            {
67                size_t len = strlen(value_cstr);
68                if (len <= 1 || value_cstr[len-1] != value_cstr[0])
69                {
70                    error.SetErrorString("mismatched quotes");
71                    return error;
72                }
73                value_str_no_quotes.assign (value_cstr + 1, len - 2);
74                value_cstr = value_str_no_quotes.c_str();
75            }
76            break;
77        }
78    }
79
80    switch (op)
81    {
82    case eVarSetOperationInvalid:
83    case eVarSetOperationInsertBefore:
84    case eVarSetOperationInsertAfter:
85    case eVarSetOperationRemove:
86        if (m_validator)
87        {
88            error = m_validator(value_cstr,m_validator_baton);
89            if (error.Fail())
90                return error;
91        }
92        error = OptionValue::SetValueFromCString (value_cstr, op);
93        break;
94
95    case eVarSetOperationAppend:
96        {
97        std::string new_value(m_current_value);
98        if (value_cstr && value_cstr[0])
99        {
100            if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
101            {
102                std::string str;
103                Args::EncodeEscapeSequences (value_cstr, str);
104                new_value.append(str);
105            }
106            else
107                new_value.append(value_cstr);
108        }
109        if (m_validator)
110        {
111            error = m_validator(new_value.c_str(),m_validator_baton);
112            if (error.Fail())
113                return error;
114        }
115        m_current_value.assign(new_value);
116        }
117        break;
118
119    case eVarSetOperationClear:
120        Clear ();
121        break;
122
123    case eVarSetOperationReplace:
124    case eVarSetOperationAssign:
125        if (m_validator)
126        {
127            error = m_validator(value_cstr,m_validator_baton);
128            if (error.Fail())
129                return error;
130        }
131        m_value_was_set = true;
132        if (m_options.Test (eOptionEncodeCharacterEscapeSequences))
133        {
134            Args::EncodeEscapeSequences (value_cstr, m_current_value);
135        }
136        else
137        {
138            SetCurrentValue (value_cstr);
139        }
140        break;
141    }
142    return error;
143}
144
145
146lldb::OptionValueSP
147OptionValueString::DeepCopy () const
148{
149    return OptionValueSP(new OptionValueString(*this));
150}
151
152Error
153OptionValueString::SetCurrentValue (const char *value)
154{
155    if (m_validator)
156    {
157        Error error(m_validator(value,m_validator_baton));
158        if (error.Fail())
159            return error;
160    }
161    if (value && value[0])
162        m_current_value.assign (value);
163    else
164        m_current_value.clear();
165    return Error();
166}
167
168Error
169OptionValueString::AppendToCurrentValue (const char *value)
170{
171    if (value && value[0])
172    {
173        if (m_validator)
174        {
175            std::string new_value(m_current_value);
176            new_value.append(value);
177            Error error(m_validator(value,m_validator_baton));
178            if (error.Fail())
179                return error;
180            m_current_value.assign(new_value);
181        }
182        else
183            m_current_value.append (value);
184    }
185    return Error();
186}
187