diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ff9b9e..4eea276 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,6 @@ set(CMAKE_CXX_STANDARD 11) add_subdirectory(external/libabacus) add_executable(cmdAbacus src/main.cpp) -target_link_libraries(cmdAbacus abacus ${MPFR_LIBRARIES}) +target_link_libraries(cmdAbacus abacus ${MPFR_LIBRARIES} readline) target_include_directories(cmdAbacus PUBLIC include ${MPFR_INCLUDE_DIRS}) target_compile_options(cmdAbacus PUBLIC ${MPFR_CFLAGS_OTHER}) diff --git a/src/main.cpp b/src/main.cpp index 7d6b3bd..3161a33 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include extern "C" { #include "libabacus.h" #include "value.h" @@ -299,7 +301,7 @@ abacus::~abacus() { } int main() { abacus ab; - std::string buffer; + rl_bind_key('\t', rl_insert); ab.add_function("quit", function_quit, "()->unit"); ab.add_function("request_precision", function_request_precision, "(num)->unit"); @@ -322,8 +324,11 @@ int main() { ab.add_operator_prefix("-", "negate"); while(!close_requested) { - std::cout << "> "; - std::getline(std::cin, buffer); + char* data = readline(" > "); + std::string buffer(data); + add_history(data); + free(data); + abacus_ref value = ab.run(buffer); if(value == nullptr) { std::cout << "Invalid expression." << std::endl;