[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]