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