mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 21:15:40 -04:00

a Stream, and then added GetOutputData & GetErrorData to get the accumulated data. - Added a StreamTee that will tee output to two provided lldb::StreamSP's. - Made the CommandObjectReturn use this so you can Tee the results immediately to the debuggers output file, as well as saving up the results to return when the command is done executing. - HandleCommands now uses this so that if you have a set of commands that continue the target you will see the commands come out as they are processed. - The Driver now uses this to output the command results as you go, which makes the interface more reactive seeming. llvm-svn: 126015
251 lines
5.4 KiB
C++
251 lines
5.4 KiB
C++
//===-- SBCommandReturnObject.cpp -------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/API/SBCommandReturnObject.h"
|
|
#include "lldb/API/SBStream.h"
|
|
|
|
#include "lldb/Core/Log.h"
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
SBCommandReturnObject::SBCommandReturnObject () :
|
|
m_opaque_ap (new CommandReturnObject ())
|
|
{
|
|
}
|
|
|
|
SBCommandReturnObject::SBCommandReturnObject (const SBCommandReturnObject &rhs):
|
|
m_opaque_ap ()
|
|
{
|
|
if (rhs.m_opaque_ap.get())
|
|
m_opaque_ap.reset (new CommandReturnObject (*rhs.m_opaque_ap));
|
|
}
|
|
|
|
const SBCommandReturnObject &
|
|
SBCommandReturnObject::operator = (const SBCommandReturnObject &rhs)
|
|
{
|
|
if (this != &rhs)
|
|
{
|
|
if (rhs.m_opaque_ap.get())
|
|
m_opaque_ap.reset (new CommandReturnObject (*rhs.m_opaque_ap));
|
|
else
|
|
m_opaque_ap.reset();
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
|
|
SBCommandReturnObject::~SBCommandReturnObject ()
|
|
{
|
|
// m_opaque_ap will automatically delete any pointer it owns
|
|
}
|
|
|
|
bool
|
|
SBCommandReturnObject::IsValid() const
|
|
{
|
|
return m_opaque_ap.get() != NULL;
|
|
}
|
|
|
|
|
|
const char *
|
|
SBCommandReturnObject::GetOutput ()
|
|
{
|
|
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
|
|
|
if (m_opaque_ap.get())
|
|
{
|
|
if (log)
|
|
log->Printf ("SBCommandReturnObject(%p)::GetOutput () => \"%s\"", m_opaque_ap.get(),
|
|
m_opaque_ap->GetOutputData());
|
|
|
|
return m_opaque_ap->GetOutputData();
|
|
}
|
|
|
|
if (log)
|
|
log->Printf ("SBCommandReturnObject(%p)::GetOutput () => NULL", m_opaque_ap.get());
|
|
|
|
return NULL;
|
|
}
|
|
|
|
const char *
|
|
SBCommandReturnObject::GetError ()
|
|
{
|
|
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
|
|
|
if (m_opaque_ap.get())
|
|
{
|
|
if (log)
|
|
log->Printf ("SBCommandReturnObject(%p)::GetError () => \"%s\"", m_opaque_ap.get(),
|
|
m_opaque_ap->GetErrorData());
|
|
|
|
return m_opaque_ap->GetErrorData();
|
|
}
|
|
|
|
if (log)
|
|
log->Printf ("SBCommandReturnObject(%p)::GetError () => NULL", m_opaque_ap.get());
|
|
|
|
return NULL;
|
|
}
|
|
|
|
size_t
|
|
SBCommandReturnObject::GetOutputSize ()
|
|
{
|
|
if (m_opaque_ap.get())
|
|
return strlen (m_opaque_ap->GetOutputData());
|
|
return 0;
|
|
}
|
|
|
|
size_t
|
|
SBCommandReturnObject::GetErrorSize ()
|
|
{
|
|
if (m_opaque_ap.get())
|
|
return strlen(m_opaque_ap->GetErrorData());
|
|
return 0;
|
|
}
|
|
|
|
size_t
|
|
SBCommandReturnObject::PutOutput (FILE *fh)
|
|
{
|
|
if (fh)
|
|
{
|
|
size_t num_bytes = GetOutputSize ();
|
|
if (num_bytes)
|
|
return ::fprintf (fh, "%s", GetOutput());
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
size_t
|
|
SBCommandReturnObject::PutError (FILE *fh)
|
|
{
|
|
if (fh)
|
|
{
|
|
size_t num_bytes = GetErrorSize ();
|
|
if (num_bytes)
|
|
return ::fprintf (fh, "%s", GetError());
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
SBCommandReturnObject::Clear()
|
|
{
|
|
if (m_opaque_ap.get())
|
|
m_opaque_ap->Clear();
|
|
}
|
|
|
|
lldb::ReturnStatus
|
|
SBCommandReturnObject::GetStatus()
|
|
{
|
|
if (m_opaque_ap.get())
|
|
return m_opaque_ap->GetStatus();
|
|
return lldb::eReturnStatusInvalid;
|
|
}
|
|
|
|
bool
|
|
SBCommandReturnObject::Succeeded ()
|
|
{
|
|
if (m_opaque_ap.get())
|
|
return m_opaque_ap->Succeeded();
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
SBCommandReturnObject::HasResult ()
|
|
{
|
|
if (m_opaque_ap.get())
|
|
return m_opaque_ap->HasResult();
|
|
return false;
|
|
}
|
|
|
|
void
|
|
SBCommandReturnObject::AppendMessage (const char *message)
|
|
{
|
|
if (m_opaque_ap.get())
|
|
m_opaque_ap->AppendMessage (message);
|
|
}
|
|
|
|
CommandReturnObject *
|
|
SBCommandReturnObject::operator ->() const
|
|
{
|
|
return m_opaque_ap.get();
|
|
}
|
|
|
|
CommandReturnObject *
|
|
SBCommandReturnObject::get() const
|
|
{
|
|
return m_opaque_ap.get();
|
|
}
|
|
|
|
CommandReturnObject &
|
|
SBCommandReturnObject::operator *() const
|
|
{
|
|
assert(m_opaque_ap.get());
|
|
return *(m_opaque_ap.get());
|
|
}
|
|
|
|
|
|
CommandReturnObject &
|
|
SBCommandReturnObject::ref() const
|
|
{
|
|
assert(m_opaque_ap.get());
|
|
return *(m_opaque_ap.get());
|
|
}
|
|
|
|
|
|
void
|
|
SBCommandReturnObject::SetLLDBObjectPtr (CommandReturnObject *ptr)
|
|
{
|
|
if (m_opaque_ap.get())
|
|
m_opaque_ap.reset (ptr);
|
|
}
|
|
|
|
bool
|
|
SBCommandReturnObject::GetDescription (SBStream &description)
|
|
{
|
|
if (m_opaque_ap.get())
|
|
{
|
|
description.Printf ("Status: ");
|
|
lldb::ReturnStatus status = m_opaque_ap->GetStatus();
|
|
if (status == lldb::eReturnStatusStarted)
|
|
description.Printf ("Started");
|
|
else if (status == lldb::eReturnStatusInvalid)
|
|
description.Printf ("Invalid");
|
|
else if (m_opaque_ap->Succeeded())
|
|
description.Printf ("Success");
|
|
else
|
|
description.Printf ("Fail");
|
|
|
|
if (GetOutputSize() > 0)
|
|
description.Printf ("\nOutput Message:\n%s", GetOutput());
|
|
|
|
if (GetErrorSize() > 0)
|
|
description.Printf ("\nError Message:\n%s", GetError());
|
|
}
|
|
else
|
|
description.Printf ("No value");
|
|
|
|
return true;
|
|
}
|
|
|
|
void
|
|
SBCommandReturnObject::SetImmediateOutputFile (FILE *fh)
|
|
{
|
|
if (m_opaque_ap.get())
|
|
m_opaque_ap->SetImmediateOutputFile (fh);
|
|
}
|
|
|
|
void
|
|
SBCommandReturnObject::SetImmediateErrorFile (FILE *fh)
|
|
{
|
|
if (m_opaque_ap.get())
|
|
m_opaque_ap->SetImmediateErrorFile (fh);
|
|
}
|