ruby-changes:11660
From: nobu <ko1@a...>
Date: Mon, 27 Apr 2009 01:25:32 +0900 (JST)
Subject: [ruby-changes:11660] Ruby:r23299 (trunk): * ext/readline/readline.c (readline_getc): use rl_getc_function if
nobu 2009-04-27 01:25:15 +0900 (Mon, 27 Apr 2009) New Revision: 23299 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23299 Log: * ext/readline/readline.c (readline_getc): use rl_getc_function if possible, to get rid of hang up at EOF without a newline. Modified files: trunk/ChangeLog trunk/ext/readline/extconf.rb trunk/ext/readline/readline.c Index: ChangeLog =================================================================== --- ChangeLog (revision 23298) +++ ChangeLog (revision 23299) @@ -1,3 +1,8 @@ +Mon Apr 27 01:25:11 2009 Nobuyoshi Nakada <nobu@r...> + + * ext/readline/readline.c (readline_getc): use rl_getc_function if + possible, to get rid of hang up at EOF without a newline. + Sun Apr 26 23:19:32 2009 NARUSE, Yui <naruse@r...> * enc/trans/utf8_mac.trans: Add converter for UTF8-MAC. Index: ext/readline/readline.c =================================================================== --- ext/readline/readline.c (revision 23298) +++ ext/readline/readline.c (revision 23299) @@ -68,8 +68,6 @@ 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 @@ * Documented by TAKAO Kouji <kouji at takao7 dot net>. */ +#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 @@ } #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 @@ 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 @@ 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 @@ 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 Index: ext/readline/extconf.rb =================================================================== --- ext/readline/extconf.rb (revision 23298) +++ ext/readline/extconf.rb (revision 23299) @@ -46,6 +46,7 @@ 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") -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/