Skip to content

Commit

Permalink
Add readline support for the "repl" command
Browse files Browse the repository at this point in the history
fixes #8091
  • Loading branch information
gunnarbeutner committed Dec 16, 2014
1 parent afe4919 commit d82defe
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 4 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ check_function_exists(pipe2 HAVE_PIPE2)
check_function_exists(nice HAVE_NICE)
check_library_exists(dl dladdr "dlfcn.h" HAVE_DLADDR)
check_library_exists(execinfo backtrace_symbols "" HAVE_LIBEXECINFO)
check_library_exists(readline readline "" HAVE_LIBREADLINE)
check_include_file_cxx(cxxabi.h HAVE_CXXABI_H)

if(HAVE_LIBEXECINFO)
Expand Down
1 change: 1 addition & 0 deletions config.h.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#cmakedefine HAVE_LIBEXECINFO
#cmakedefine HAVE_CXXABI_H
#cmakedefine HAVE_NICE
#cmakedefine HAVE_LIBREADLINE

#cmakedefine ICINGA2_UNITY_BUILD

Expand Down
1 change: 1 addition & 0 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Build-Depends: bison,
libpq-dev,
libssl-dev,
libyajl-dev,
libreadline-dev,
make (>= 3.81),
po-debconf
Standards-Version: 3.9.5
Expand Down
6 changes: 6 additions & 0 deletions icinga2.spec
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@ BuildRequires: flex >= 2.5.35
BuildRequires: bison
BuildRequires: make

%if "%{_vendor}" == "suse"
BuildRequires: libreadline-devel
%else
BuildRequires: readline-devel
%endif

%if "%{_vendor}" == "redhat" && (0%{?el5} || 0%{?rhel} == 5 || "%{?dist}" == ".el5")
# el5 requires packages.icinga.org
BuildRequires: boost153-devel
Expand Down
8 changes: 6 additions & 2 deletions lib/base/console.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,17 @@ INITIALIZE_ONCE(&Console::DetectType);
static ConsoleType l_ConsoleType = Console_Dumb;

ConsoleColorTag::ConsoleColorTag(int color)
: m_Color(color)
: m_Color(color), m_ConsoleType(-1)
{ }

ConsoleColorTag::ConsoleColorTag(int color, ConsoleType consoleType)
: m_Color(color), m_ConsoleType(consoleType)
{ }

std::ostream& icinga::operator<<(std::ostream& fp, const ConsoleColorTag& cct)
{
#ifndef _WIN32
if (Console::GetType(fp) == Console_VT100)
if (cct.m_ConsoleType == Console_VT100 || Console::GetType(fp) == Console_VT100)
Console::PrintVT100ColorCode(fp, cct.m_Color);
#else /* _WIN32 */
if (Console::GetType(fp) == Console_Windows) {
Expand Down
2 changes: 2 additions & 0 deletions lib/base/console.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,13 @@ class I2_BASE_API ConsoleColorTag
{
public:
ConsoleColorTag(int color);
ConsoleColorTag(int color, ConsoleType consoleType);

friend I2_BASE_API std::ostream& operator<<(std::ostream& fp, const ConsoleColorTag& cct);

private:
int m_Color;
int m_ConsoleType;
};

I2_BASE_API std::ostream& operator<<(std::ostream& fp, const ConsoleColorTag& cct);
Expand Down
2 changes: 1 addition & 1 deletion lib/cli/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ endif()

add_library(cli SHARED ${cli_SOURCES})

target_link_libraries(cli ${Boost_LIBRARIES} base config remote)
target_link_libraries(cli ${Boost_LIBRARIES} readline base config remote)

set_target_properties (
cli PROPERTIES
Expand Down
38 changes: 37 additions & 1 deletion lib/cli/replcommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@
#include "base/application.hpp"
#include <iostream>

#ifdef HAVE_LIBREADLINE
extern "C" {
#include <readline/readline.h>
#include <readline/history.h>
}
#endif /* HAVE_LIBREADLINE */

using namespace icinga;
namespace po = boost::program_options;

Expand Down Expand Up @@ -72,12 +79,41 @@ int ReplCommand::Run(const po::variables_map& vm, const std::vector<std::string>
String fileName = "<" + Convert::ToString(next_line) + ">";
next_line++;

#ifdef HAVE_LIBREADLINE
ConsoleType type = Console::GetType(std::cout);

std::stringstream prompt_sbuf;

prompt_sbuf << RL_PROMPT_START_IGNORE << ConsoleColorTag(Console_ForegroundCyan, type)
<< RL_PROMPT_END_IGNORE << fileName
<< RL_PROMPT_START_IGNORE << ConsoleColorTag(Console_ForegroundRed, type)
<< RL_PROMPT_END_IGNORE << " => "
<< RL_PROMPT_START_IGNORE << ConsoleColorTag(Console_Normal, type);
#else /* HAVE_LIBREADLINE */
std::cout << ConsoleColorTag(Console_ForegroundCyan)
<< fileName << ConsoleColorTag(Console_ForegroundRed) << " => "
<< fileName
<< ConsoleColorTag(Console_ForegroundRed)
<< " => "
<< ConsoleColorTag(Console_Normal);
#endif /* HAVE_LIBREADLINE */

#ifdef HAVE_LIBREADLINE
String prompt = prompt_sbuf.str();

char *rline = readline(prompt.CStr());

if (!rline)
break;

if (*rline)
add_history(rline);

String line = rline;
free(rline);
#else /* HAVE_LIBREADLINE */
std::string line;
std::getline(std::cin, line);
#endif /* HAVE_LIBREADLINE */

Expression *expr;

Expand Down

0 comments on commit d82defe

Please sign in to comment.