Example #1
0
size_t
Driver::EditLineInputReaderCallback 
(
    void *baton, 
    SBInputReader *reader, 
    InputReaderAction notification,
    const char *bytes, 
    size_t bytes_len
)
{
    Driver *driver = (Driver *)baton;

    switch (notification)
    {
    case eInputReaderActivate:
        break;

    case eInputReaderReactivate:
        driver->ReadyForCommand();
        break;

    case eInputReaderDeactivate:
        break;
        
    case eInputReaderAsynchronousOutputWritten:
        if (driver->m_io_channel_ap.get() != NULL)
            driver->m_io_channel_ap->RefreshPrompt();
        break;

    case eInputReaderInterrupt:
        if (driver->m_io_channel_ap.get() != NULL)
        {
            SBProcess process = driver->GetDebugger().GetSelectedTarget().GetProcess();
            if (!driver->m_io_channel_ap->EditLineHasCharacters()
                &&  process.IsValid() && process.GetState() == lldb::eStateRunning)
            {
                process.Stop();
            }
            else
            {
                driver->m_io_channel_ap->OutWrite ("^C\n", 3, NO_ASYNC);
                // I wish I could erase the entire input line, but there's no public API for that.
                driver->m_io_channel_ap->EraseCharsBeforeCursor();
                driver->m_io_channel_ap->RefreshPrompt();
            }
        }
        break;
        
    case eInputReaderEndOfFile:
        if (driver->m_io_channel_ap.get() != NULL)
        {
            driver->m_io_channel_ap->OutWrite ("^D\n", 3, NO_ASYNC);
            driver->m_io_channel_ap->RefreshPrompt ();
        }
#ifdef __unix__
        write (driver->m_editline_pty.GetMasterFileDescriptor(), "quit\n", 5);
#endif
        break;

    case eInputReaderGotToken:
#ifdef __unix__
        write (driver->m_editline_pty.GetMasterFileDescriptor(), bytes, bytes_len);
#endif
        break;
        
    case eInputReaderDone:
        break;
    }
    return bytes_len;
}