From 2b08fc19478c616a79a27efc792aaf6f7190ba1a Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 26 Apr 2009 16:25:15 +0000 Subject: * ext/readline/readline.c (readline_getc): use rl_getc_function if possible, to get rid of hang up at EOF without a newline. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/readline/extconf.rb | 1 + ext/readline/readline.c | 39 ++++++++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) (limited to 'ext') diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb index 6eb145f130..faf539fffc 100644 --- a/ext/readline/extconf.rb +++ b/ext/readline/extconf.rb @@ -46,6 +46,7 @@ else end end +have_readline_func("rl_getc_function") have_readline_func("rl_filename_completion_function") have_readline_func("rl_username_completion_function") have_readline_func("rl_completion_matches") diff --git a/ext/readline/readline.c b/ext/readline/readline.c index 5f920113d7..dee42f006c 100644 --- a/ext/readline/readline.c +++ b/ext/readline/readline.c @@ -68,8 +68,6 @@ static char **readline_attempted_completion_function(const char *text, str = rb_str_conv_enc(str, rb_enc_get(str), rb_locale_encoding());\ } while (0)\ -#ifdef HAVE_RL_EVENT_HOOK -#define BUSY_WAIT 0 /* * Document-class: Readline @@ -106,6 +104,26 @@ static char **readline_attempted_completion_function(const char *text, * Documented by TAKAO Kouji . */ +#if defined HAVE_RL_GETC_FUNCTION +static VALUE readline_instream; +static ID id_getc; + +static int readline_getc(FILE *); +static int +readline_getc(FILE *input) +{ + rb_io_t *ifp = 0; + VALUE c; + if (!readline_instream) return rl_getc(input); + GetOpenFile(readline_instream, ifp); + if (rl_instream != ifp->stdio_file) return rl_getc(input); + c = rb_funcall(readline_instream, id_getc, 0, 0); + if (NIL_P(c)) return EOF; + return NUM2CHR(c); +} +#elif defined HAVE_RL_EVENT_HOOK +#define BUSY_WAIT 0 + static int readline_event(void); static int readline_event(void) @@ -123,6 +141,12 @@ readline_event(void) } #endif +static VALUE +readline_get(VALUE prompt) +{ + return (VALUE)readline((char *)prompt); +} + /* * call-seq: * Readline.readline(prompt = "", add_hist = false) -> string or nil @@ -225,8 +249,7 @@ readline_readline(int argc, VALUE *argv, VALUE self) if (!isatty(0) && errno == EBADF) rb_raise(rb_eIOError, "closed stdin"); - buff = (char*)rb_protect((VALUE(*)_((VALUE)))readline, (VALUE)prompt, - &status); + buff = (char*)rb_protect(readline_get, (VALUE)prompt, &status); if (status) { #if defined HAVE_RL_CLEANUP_AFTER_SIGNAL /* restore terminal mode and signal handler*/ @@ -272,6 +295,9 @@ readline_s_set_input(VALUE self, VALUE input) Check_Type(input, T_FILE); GetOpenFile(input, ifp); rl_instream = rb_io_stdio_file(ifp); +#ifdef HAVE_RL_GETC_FUNCTION + readline_instream = input; +#endif return input; } @@ -1344,7 +1370,10 @@ Init_readline() rb_define_const(mReadline, "VERSION", version); rl_attempted_completion_function = readline_attempted_completion_function; -#ifdef HAVE_RL_EVENT_HOOK +#if defined HAVE_RL_GETC_FUNCTION + rl_getc_function = readline_getc; + id_getc = rb_intern_const("getc"); +#elif defined HAVE_RL_EVENT_HOOK rl_event_hook = readline_event; #endif #ifdef HAVE_RL_CLEAR_SIGNALS -- cgit v1.2.3