forked from bytemaster/fc
-
Notifications
You must be signed in to change notification settings - Fork 53
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add readline support to fc::rpc::cli
- Loading branch information
1 parent
35d4893
commit 80de098
Showing
4 changed files
with
154 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# - Try to find readline include dirs and libraries | ||
# | ||
# Usage of this module as follows: | ||
# | ||
# find_package(Readline) | ||
# | ||
# Variables used by this module, they can change the default behaviour and need | ||
# to be set before calling find_package: | ||
# | ||
# Readline_ROOT_DIR Set this variable to the root installation of | ||
# readline if the module has problems finding the | ||
# proper installation path. | ||
# | ||
# Variables defined by this module: | ||
# | ||
# READLINE_FOUND System has readline, include and lib dirs found | ||
# Readline_INCLUDE_DIR The readline include directories. | ||
# Readline_LIBRARY The readline library. | ||
|
||
find_path(Readline_ROOT_DIR | ||
NAMES include/readline/readline.h | ||
) | ||
|
||
find_path(Readline_INCLUDE_DIR | ||
NAMES readline/readline.h | ||
HINTS ${Readline_ROOT_DIR}/include | ||
) | ||
|
||
find_library(Readline_LIBRARY | ||
NAMES readline | ||
HINTS ${Readline_ROOT_DIR}/lib | ||
) | ||
|
||
if(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY) | ||
set(READLINE_FOUND TRUE) | ||
else(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY) | ||
FIND_LIBRARY(Readline_LIBRARY NAMES readline) | ||
include(FindPackageHandleStandardArgs) | ||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG Readline_INCLUDE_DIR Readline_LIBRARY ) | ||
MARK_AS_ADVANCED(Readline_INCLUDE_DIR Readline_LIBRARY) | ||
endif(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY) | ||
|
||
mark_as_advanced( | ||
Readline_ROOT_DIR | ||
Readline_INCLUDE_DIR | ||
Readline_LIBRARY | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
|
||
#include <fc/rpc/cli.hpp> | ||
|
||
#include <iostream> | ||
|
||
#ifndef WIN32 | ||
#include <unistd.h> | ||
#endif | ||
|
||
#ifdef HAVE_READLINE | ||
# include <readline/readline.h> | ||
# include <readline/history.h> | ||
// I don't know exactly what version of readline we need. I know the 4.2 version that ships on some macs is | ||
// missing some functions we require. We're developing against 6.3, but probably anything in the 6.x | ||
// series is fine | ||
# if RL_VERSION_MAJOR < 6 | ||
# ifdef _MSC_VER | ||
# pragma message("You have an old version of readline installed that might not support some of the features we need") | ||
# pragma message("Readline support will not be compiled in") | ||
# else | ||
# warning "You have an old version of readline installed that might not support some of the features we need" | ||
# warning "Readline support will not be compiled in" | ||
# endif | ||
# undef HAVE_READLINE | ||
# endif | ||
#endif | ||
|
||
namespace fc { namespace rpc { | ||
|
||
void cli::getline( | ||
const fc::string& prompt, | ||
fc::string& line | ||
) | ||
{ | ||
// getting file descriptor for C++ streams is near impossible | ||
// so we just assume it's the same as the C stream... | ||
#ifdef HAVE_READLINE | ||
#ifndef WIN32 | ||
if( isatty( fileno( stdin ) ) ) | ||
#else | ||
// it's implied by | ||
// https://msdn.microsoft.com/en-us/library/f4s0ddew.aspx | ||
// that this is the proper way to do this on Windows, but I have | ||
// no access to a Windows compiler and thus, | ||
// no idea if this actually works | ||
if( _isatty( _fileno( stdin ) ) ) | ||
#endif | ||
{ | ||
char* line_read = nullptr; | ||
std::cout.flush(); //readline doesn't use cin, so we must manually flush _out | ||
line_read = readline(prompt.c_str()); | ||
if( line_read == nullptr ) | ||
FC_THROW_EXCEPTION( fc::eof_exception, "" ); | ||
if( *line_read ) | ||
add_history(line_read); | ||
line = line_read; | ||
free(line_read); | ||
} | ||
else | ||
#endif | ||
{ | ||
std::cout << prompt; | ||
// sync_call( cin_thread, [&](){ std::getline( *input_stream, line ); }, "getline"); | ||
fc::getline( fc::cin, line ); | ||
return; | ||
} | ||
} | ||
|
||
} } |