124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBInputReader.cpp ---------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-enumerations.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1363094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/API/SBDebugger.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBError.h"
1563094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/API/SBInputReader.h"
167826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/API/SBStream.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/API/SBStringList.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h"
197826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::SBInputReader ()  :
2663094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_sp (),
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_callback_function (NULL),
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_callback_baton (NULL)
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::SBInputReader (const lldb::InputReaderSP &reader_sp) :
3463094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_sp (reader_sp)
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
377826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
387826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
39a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf ("SBInputReader::SBInputReader (reader_sp=%p) => SBInputReader(%p)", reader_sp.get(),
4061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     m_opaque_sp.get());
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::SBInputReader (const SBInputReader &rhs) :
4463094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_sp (rhs.m_opaque_sp)
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
477826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
487826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
49a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf("SBInputReader::SBInputReader (rhs.sp=%p) => SBInputReader(%p)",
5061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                    rhs.m_opaque_sp.get(), m_opaque_sp.get());
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::~SBInputReader ()
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::PrivateCallback
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *baton,
6163094e0bb161580564954dee512955c1c79d3476Greg Clayton    InputReader &reader,
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::InputReaderAction notification,
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *bytes,
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_len
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBInputReader *sb_reader = (SBInputReader *)baton;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_reader->m_callback_function (sb_reader->m_callback_baton,
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           sb_reader,
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           notification,
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           bytes,
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           bytes_len);
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::Initialize
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
7863094e0bb161580564954dee512955c1c79d3476Greg Clayton    SBDebugger &debugger,
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Callback callback_function,
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *callback_baton,
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::InputReaderGranularity granularity,
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *end_token,
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *prompt,
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool echo
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
887826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
897826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
90a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf("SBInputReader(%p)::Initialize (SBDebugger(%p), callback_function=%p, callback_baton=%p, "
9149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                    "granularity=%s, end_token=\"%s\", prompt=\"%s\", echo=%i)",
92a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                    m_opaque_sp.get(),
93a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                    debugger.get(),
94a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                    callback_function,
95a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                    callback_baton,
96a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                    InputReader::GranularityAsCString (granularity), end_token, prompt,
97a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                    echo);
987826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBError sb_error;
10063094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_sp.reset (new InputReader (debugger.ref()));
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_callback_function = callback_function;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_callback_baton = callback_baton;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10563094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_sp)
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10763094e0bb161580564954dee512955c1c79d3476Greg Clayton        sb_error.SetError (m_opaque_sp->Initialize (SBInputReader::PrivateCallback,
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    this,
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    granularity,
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    end_token,
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    prompt,
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    echo));
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (sb_error.Fail())
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11763094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_sp.reset ();
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_callback_function = NULL;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_callback_baton = NULL;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1227826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
1237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
1247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        SBStream sstr;
1257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        sb_error.GetDescription (sstr);
126a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf ("SBInputReader(%p)::Initialize (...) => SBError(%p): %s", m_opaque_sp.get(),
12761ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     sb_error.get(), sstr.GetData());
1287826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
1297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_error;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::IsValid () const
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13663094e0bb161580564954dee512955c1c79d3476Greg Clayton    return (m_opaque_sp.get() != NULL);
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst SBInputReader &
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::operator = (const SBInputReader &rhs)
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (this != &rhs)
14363094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_sp = rhs.m_opaque_sp;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return *this;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14763094e0bb161580564954dee512955c1c79d3476Greg ClaytonInputReader *
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::operator->() const
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15063094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_sp.get();
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::InputReaderSP &
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::operator *()
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15663094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_sp;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb::InputReaderSP &
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::operator *() const
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16263094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_sp;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16563094e0bb161580564954dee512955c1c79d3476Greg ClaytonInputReader *
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::get() const
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16863094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_sp.get();
16963094e0bb161580564954dee512955c1c79d3476Greg Clayton}
17063094e0bb161580564954dee512955c1c79d3476Greg Clayton
17163094e0bb161580564954dee512955c1c79d3476Greg ClaytonInputReader &
17263094e0bb161580564954dee512955c1c79d3476Greg ClaytonSBInputReader::ref() const
17363094e0bb161580564954dee512955c1c79d3476Greg Clayton{
17463094e0bb161580564954dee512955c1c79d3476Greg Clayton    assert (m_opaque_sp.get());
17563094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_sp;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::IsDone () const
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_sp)
18263094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_opaque_sp->IsDone();
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::SetIsDone (bool value)
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_sp)
19163094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_sp->SetIsDone (value);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::IsActive () const
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
197952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1987826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
1997826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    bool ret_value = false;
20063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_sp)
2017826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        ret_value = m_opaque_sp->IsActive();
2027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2037826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
204a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf ("SBInputReader(%p)::IsActive () => %i", m_opaque_sp.get(), ret_value);
2057826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return ret_value;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerInputReaderGranularity
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBInputReader::GetGranularity ()
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21263094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_sp)
21363094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_opaque_sp->GetGranularity();
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return eInputReaderGranularityInvalid;
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
217