1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

ext/readline/readline.c: [Bug #6601]

* ext/readline/readline.c (readline_getc): deal with ESC just followed
  by ASCII as meta prefix in incremental search mode.  based on the
  patch from rctay (Tay Ray Chuan) at [ruby-core:45682].  [Bug #6601]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36123 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2012-06-18 01:43:00 +00:00
parent 90e812e81b
commit e2ad92a075
3 changed files with 33 additions and 4 deletions

View file

@ -1,3 +1,9 @@
Mon Jun 18 10:42:57 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/readline/readline.c (readline_getc): deal with ESC just followed
by ASCII as meta prefix in incremental search mode. based on the
patch from rctay (Tay Ray Chuan) at [ruby-core:45682]. [Bug #6601]
Sun Jun 17 22:23:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> Sun Jun 17 22:23:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* dir.c (rb_file_directory_p): move documentation for Dir.exist? from * dir.c (rb_file_directory_p): move documentation for Dir.exist? from

View file

@ -130,7 +130,6 @@ static char **readline_attempted_completion_function(const char *text,
#if defined HAVE_RL_GETC_FUNCTION #if defined HAVE_RL_GETC_FUNCTION
static VALUE readline_instream; static VALUE readline_instream;
static ID id_getbyte;
#ifndef HAVE_RL_GETC #ifndef HAVE_RL_GETC
#define rl_getc(f) EOF #define rl_getc(f) EOF
@ -173,9 +172,19 @@ readline_getc(FILE *input)
} }
} }
#endif #endif
c = rb_funcall(readline_instream, id_getbyte, 0, 0); c = rb_io_getbyte(readline_instream);
if (NIL_P(c)) return EOF; if (NIL_P(c)) return EOF;
return NUM2CHR(c); if (c == INT2FIX(ESC) &&
RL_ISSTATE(RL_STATE_ISEARCH) && /* isn't needed in other states? */
rb_io_read_pending(ifp)) {
int meta = 0;
c = rb_io_getbyte(readline_instream);
if (FIXNUM_P(c) && isascii(FIX2INT(c))) meta = 1;
rb_io_ungetbyte(readline_instream, c);
if (meta) rl_execute_next(ESC);
return ESC;
}
return FIX2INT(c);
} }
#elif defined HAVE_RL_EVENT_HOOK #elif defined HAVE_RL_EVENT_HOOK
#define BUSY_WAIT 0 #define BUSY_WAIT 0
@ -1703,7 +1712,6 @@ Init_readline()
/* and using_history() call rl_initialize(). */ /* and using_history() call rl_initialize(). */
/* This assignment should be placed before using_history() */ /* This assignment should be placed before using_history() */
rl_getc_function = readline_getc; rl_getc_function = readline_getc;
id_getbyte = rb_intern_const("getbyte");
#elif defined HAVE_RL_EVENT_HOOK #elif defined HAVE_RL_EVENT_HOOK
rl_event_hook = readline_event; rl_event_hook = readline_event;
#endif #endif

View file

@ -399,6 +399,21 @@ class TestReadline < Test::Unit::TestCase
end end
end if !/EditLine/n.match(Readline::VERSION) end if !/EditLine/n.match(Readline::VERSION)
def test_input_metachar
bug6601 = '[ruby-core:45682]'
Readline::HISTORY << "hello"
wo = nil
line = with_pipe do |r, w|
wo = w.dup
wo.write("\C-re\ef\n")
end
assert_equal("hello", line, bug6601)
ensure
wo.close
with_pipe {|r, w| w.write("\C-a\C-k\n")} # clear line_buffer
Readline::HISTORY.clear
end
private private
def replace_stdio(stdin_path, stdout_path) def replace_stdio(stdin_path, stdout_path)