167cc0636SGreg Clayton //===-- OptionValueFileSpec.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 
10*93a64300SDaniel Malea #include "lldb/lldb-python.h"
11*93a64300SDaniel Malea 
1267cc0636SGreg Clayton #include "lldb/Interpreter/OptionValueFileSpec.h"
1367cc0636SGreg Clayton 
1467cc0636SGreg Clayton // C Includes
1567cc0636SGreg Clayton // C++ Includes
1667cc0636SGreg Clayton // Other libraries and framework includes
1767cc0636SGreg Clayton // Project includes
1867cc0636SGreg Clayton #include "lldb/Core/FormatManager.h"
1967cc0636SGreg Clayton #include "lldb/Core/State.h"
2067cc0636SGreg Clayton #include "lldb/Interpreter/Args.h"
2167cc0636SGreg Clayton #include "lldb/Interpreter/CommandCompletions.h"
2267cc0636SGreg Clayton 
2367cc0636SGreg Clayton using namespace lldb;
2467cc0636SGreg Clayton using namespace lldb_private;
2567cc0636SGreg Clayton 
26b5f0feabSGreg Clayton 
27b5f0feabSGreg Clayton OptionValueFileSpec::OptionValueFileSpec () :
28b5f0feabSGreg Clayton     OptionValue(),
29b5f0feabSGreg Clayton     m_current_value (),
30b5f0feabSGreg Clayton     m_default_value (),
31b5f0feabSGreg Clayton     m_data_sp(),
32b5f0feabSGreg Clayton     m_completion_mask (CommandCompletions::eDiskFileCompletion)
33b5f0feabSGreg Clayton {
34b5f0feabSGreg Clayton }
35b5f0feabSGreg Clayton 
36b5f0feabSGreg Clayton OptionValueFileSpec::OptionValueFileSpec (const FileSpec &value) :
37b5f0feabSGreg Clayton     OptionValue(),
38b5f0feabSGreg Clayton     m_current_value (value),
39b5f0feabSGreg Clayton     m_default_value (value),
40b5f0feabSGreg Clayton     m_data_sp(),
41b5f0feabSGreg Clayton     m_completion_mask (CommandCompletions::eDiskFileCompletion)
42b5f0feabSGreg Clayton {
43b5f0feabSGreg Clayton }
44b5f0feabSGreg Clayton 
45b5f0feabSGreg Clayton OptionValueFileSpec::OptionValueFileSpec (const FileSpec &current_value,
46b5f0feabSGreg Clayton                                           const FileSpec &default_value) :
47b5f0feabSGreg Clayton     OptionValue(),
48b5f0feabSGreg Clayton     m_current_value (current_value),
49b5f0feabSGreg Clayton     m_default_value (default_value),
50b5f0feabSGreg Clayton     m_data_sp(),
51b5f0feabSGreg Clayton     m_completion_mask (CommandCompletions::eDiskFileCompletion)
52b5f0feabSGreg Clayton {
53b5f0feabSGreg Clayton }
54b5f0feabSGreg Clayton 
5567cc0636SGreg Clayton void
5667cc0636SGreg Clayton OptionValueFileSpec::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
5767cc0636SGreg Clayton {
5867cc0636SGreg Clayton     if (dump_mask & eDumpOptionType)
5967cc0636SGreg Clayton         strm.Printf ("(%s)", GetTypeAsCString ());
6067cc0636SGreg Clayton     if (dump_mask & eDumpOptionValue)
6167cc0636SGreg Clayton     {
6267cc0636SGreg Clayton         if (dump_mask & eDumpOptionType)
6367cc0636SGreg Clayton             strm.PutCString (" = ");
6467cc0636SGreg Clayton 
6567cc0636SGreg Clayton         if (m_current_value)
6667cc0636SGreg Clayton         {
6767cc0636SGreg Clayton             if (m_current_value.GetDirectory())
6867cc0636SGreg Clayton             {
6967cc0636SGreg Clayton                 strm << '"' << m_current_value.GetDirectory();
7067cc0636SGreg Clayton                 if (m_current_value.GetFilename())
7167cc0636SGreg Clayton                     strm << '/' << m_current_value.GetFilename();
7267cc0636SGreg Clayton                 strm << '"';
7367cc0636SGreg Clayton             }
7467cc0636SGreg Clayton             else
7567cc0636SGreg Clayton             {
7667cc0636SGreg Clayton                 strm << '"' << m_current_value.GetFilename() << '"';
7767cc0636SGreg Clayton             }
7867cc0636SGreg Clayton         }
7967cc0636SGreg Clayton     }
8067cc0636SGreg Clayton }
8167cc0636SGreg Clayton 
8267cc0636SGreg Clayton Error
8367cc0636SGreg Clayton OptionValueFileSpec::SetValueFromCString (const char *value_cstr,
8467cc0636SGreg Clayton                                           VarSetOperationType op)
8567cc0636SGreg Clayton {
8667cc0636SGreg Clayton     Error error;
8767cc0636SGreg Clayton     switch (op)
8867cc0636SGreg Clayton     {
8967cc0636SGreg Clayton     case eVarSetOperationClear:
9067cc0636SGreg Clayton         Clear ();
9167cc0636SGreg Clayton         break;
9267cc0636SGreg Clayton 
9367cc0636SGreg Clayton     case eVarSetOperationReplace:
9467cc0636SGreg Clayton     case eVarSetOperationAssign:
9567cc0636SGreg Clayton         if (value_cstr && value_cstr[0])
9667cc0636SGreg Clayton         {
9767cc0636SGreg Clayton             m_value_was_set = true;
983f9fa52cSJason Molenda             m_current_value.SetFile(value_cstr, value_cstr[0] == '~');
9967cc0636SGreg Clayton         }
10067cc0636SGreg Clayton         else
10167cc0636SGreg Clayton         {
10267cc0636SGreg Clayton             error.SetErrorString("invalid value string");
10367cc0636SGreg Clayton         }
10467cc0636SGreg Clayton         break;
10567cc0636SGreg Clayton 
10667cc0636SGreg Clayton     case eVarSetOperationInsertBefore:
10767cc0636SGreg Clayton     case eVarSetOperationInsertAfter:
10867cc0636SGreg Clayton     case eVarSetOperationRemove:
10967cc0636SGreg Clayton     case eVarSetOperationAppend:
11067cc0636SGreg Clayton     case eVarSetOperationInvalid:
11167cc0636SGreg Clayton         error = OptionValue::SetValueFromCString (value_cstr, op);
11267cc0636SGreg Clayton         break;
11367cc0636SGreg Clayton     }
11467cc0636SGreg Clayton     return error;
11567cc0636SGreg Clayton }
11667cc0636SGreg Clayton 
11767cc0636SGreg Clayton lldb::OptionValueSP
11867cc0636SGreg Clayton OptionValueFileSpec::DeepCopy () const
11967cc0636SGreg Clayton {
12067cc0636SGreg Clayton     return OptionValueSP(new OptionValueFileSpec(*this));
12167cc0636SGreg Clayton }
12267cc0636SGreg Clayton 
12367cc0636SGreg Clayton 
12467cc0636SGreg Clayton size_t
12567cc0636SGreg Clayton OptionValueFileSpec::AutoComplete (CommandInterpreter &interpreter,
12667cc0636SGreg Clayton                                    const char *s,
12767cc0636SGreg Clayton                                    int match_start_point,
12867cc0636SGreg Clayton                                    int max_return_elements,
12967cc0636SGreg Clayton                                    bool &word_complete,
13067cc0636SGreg Clayton                                    StringList &matches)
13167cc0636SGreg Clayton {
13267cc0636SGreg Clayton     word_complete = false;
13367cc0636SGreg Clayton     matches.Clear();
13467cc0636SGreg Clayton     CommandCompletions::InvokeCommonCompletionCallbacks (interpreter,
135b5f0feabSGreg Clayton                                                          m_completion_mask,
13667cc0636SGreg Clayton                                                          s,
13767cc0636SGreg Clayton                                                          match_start_point,
13867cc0636SGreg Clayton                                                          max_return_elements,
13967cc0636SGreg Clayton                                                          NULL,
14067cc0636SGreg Clayton                                                          word_complete,
14167cc0636SGreg Clayton                                                          matches);
14267cc0636SGreg Clayton     return matches.GetSize();
14367cc0636SGreg Clayton }
14467cc0636SGreg Clayton 
14567cc0636SGreg Clayton 
14667cc0636SGreg Clayton 
1476920b52bSGreg Clayton const lldb::DataBufferSP &
1480b0b512fSGreg Clayton OptionValueFileSpec::GetFileContents(bool null_terminate)
1496920b52bSGreg Clayton {
1506920b52bSGreg Clayton     if (!m_data_sp && m_current_value)
1510b0b512fSGreg Clayton     {
1520b0b512fSGreg Clayton         if (null_terminate)
1530b0b512fSGreg Clayton             m_data_sp = m_current_value.ReadFileContentsAsCString();
1540b0b512fSGreg Clayton         else
1556920b52bSGreg Clayton             m_data_sp = m_current_value.ReadFileContents();
1560b0b512fSGreg Clayton     }
1576920b52bSGreg Clayton     return m_data_sp;
1586920b52bSGreg Clayton }
1596920b52bSGreg Clayton 
16067cc0636SGreg Clayton 
161