Bug #8782

Don't set rl_getc_function on editline

Added by Yui NARUSE 8 months ago. Updated 3 months ago.

[ruby-dev:47617]
Status:Assigned
Priority:Normal
Assignee:Kouji Takao
Category:ext
Target version:current: 2.2.0
ruby -v:ruby 2.1.0dev (2013-08-12 trunk 42528) [x86_64-darwin12.4.0] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

r42402 以来 OS X 等の editline 環境では #define rlgetc(f) EOF が使われるようになってしまって残念なことになっていたわけですが、
そもそも editline の readline wrapper は non ASCII に対応していません。
(editline 自体には UTF-8 のみの対応が入ったが、readline wrapper は src/readline.c の _getc
function を経由するので non ASCII は化ける)

ので、いっそ rlgetcfunction を使わないようにしてはどうでしょう。
以下のようなパッチを当てると、readline なしの OS X の irb で日本語が使えるようになります。

diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index 0b121c1..bc0ee77 100644
--- a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -94,4 +94,5 @@ readline.havefunc("clearhistory")
readline.havefunc("rlredisplay")
readline.havefunc("rlinserttext")
readline.have
func("rldeletetext")
+readline.havefunc("elinit")
createmakefile("readline")
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 0f76d1a..85109f0 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -130,12 +130,7 @@ static VALUE readline
instream;
static VALUE readline_outstream;

#if defined HAVERLGETC_FUNCTION

-#ifndef HAVERLGETC
-#define rl_getc(f) EOF

-#endif

-static int readlinegetc(FILE *);
+# ifndef HAVE
ELINIT
static int
readline
getc(FILE *input)
{
@@ -187,6 +182,7 @@ readlinegetc(FILE *input)
#endif
return FIX2INT(c);
}
+# endif
#elif defined HAVE
RLEVENTHOOK
#define BUSY_WAIT 0

@@ -1771,7 +1767,9 @@ Initreadline()
/* libedit check rl
getcfunction only when rlinitialize() is called, /
/
and usinghistory() call rlinitialize(). /
/
This assignment should be placed before usinghistory() */
+# ifndef HAVE
ELINIT
rl
getcfunction = readlinegetc;
+# endif
#elif defined HAVERLEVENTHOOK
rl
eventhook = readlineevent;
#endif

History

#1 Updated by Akira Tanaka 5 months ago

rlgetcfunction を設定しないと、readline() 内でブロックした時に他のスレッドがすべて止まってしまうのではないかと思います。

これは、現在、rlgetcfunction 内で read システムコールを呼び出すところだけを blocking region にして、他のスレッドが動けるようにしているからです。

readline() 関数全体を blocking region 内で実行するという手はあるかもしれません。

#2 Updated by Hiroshi SHIBATA 3 months ago

  • Target version changed from 2.1.0 to current: 2.2.0

Also available in: Atom PDF