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

ruby-changes:21736

From: nobu <ko1@a...>
Date: Fri, 18 Nov 2011 16:13:10 +0900 (JST)
Subject: [ruby-changes:21736] nobu:r33785 (trunk): * ext/io/console/console.c (console_cooked, console_set_cooked):

nobu	2011-11-18 16:12:14 +0900 (Fri, 18 Nov 2011)

  New Revision: 33785

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33785

  Log:
    * ext/io/console/console.c (console_cooked, console_set_cooked):
      new methods to reset cooked mode.  [EXPERIMENTAL]

  Modified files:
    trunk/ChangeLog
    trunk/ext/io/console/console.c
    trunk/test/io/console/test_io_console.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33784)
+++ ChangeLog	(revision 33785)
@@ -1,3 +1,8 @@
+Fri Nov 18 16:12:11 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/io/console/console.c (console_cooked, console_set_cooked):
+	  new methods to reset cooked mode.  [EXPERIMENTAL]
+
 Fri Nov 18 13:20:26 2011  NAKAMURA Usaku  <usa@r...>
 
 	* test/unit/assertions.rb (MINI_DIR): quick dirty hack to get rid of
Index: ext/io/console/console.c
===================================================================
--- ext/io/console/console.c	(revision 33784)
+++ ext/io/console/console.c	(revision 33785)
@@ -96,8 +96,7 @@
 {
 #ifdef HAVE_CFMAKERAW
     cfmakeraw(t);
-#else
-#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
+#elif defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
     t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
     t->c_oflag &= ~OPOST;
     t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
@@ -109,6 +108,20 @@
 #elif defined _WIN32
     *t = 0;
 #endif
+}
+
+static void
+set_cookedmode(conmode *t)
+{
+#if defined HAVE_TERMIOS_H || defined HAVE_TERMIO_H
+    t->c_iflag |= (BRKINT|ISTRIP|ICRNL|IXON);
+    t->c_oflag |= OPOST;
+    t->c_lflag |= (ECHO|ECHOE|ECHOK|ECHONL|ICANON|ISIG|IEXTEN);
+#elif defined HAVE_SGTTY_H
+    t->sg_flags |= ECHO;
+    t->sg_flags &= ~RAW;
+#elif defined _WIN32
+    *t |= ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT|ENABLE_PROCESSED_INPUT;
 #endif
 }
 
@@ -277,7 +290,46 @@
     return io;
 }
 
+/*
+ * call-seq:
+ *   io.cooked {|io| }
+ *
+ * Yields +self+ within cooked mode.
+ *
+ *   STDIN.cooked(&:gets)
+ *
+ * will read and return a line with echo back and line editing.
+ */
 static VALUE
+console_cooked(VALUE io)
+{
+    return ttymode(io, rb_yield, set_cookedmode);
+}
+
+/*
+ * call-seq:
+ *   io.cooked!
+ *
+ * Enables cooked mode.
+ *
+ * If the terminal mode needs to be back, use io.cooked { ... }.
+ */
+static VALUE
+console_set_cooked(VALUE io)
+{
+    conmode t;
+    rb_io_t *fptr;
+    int fd;
+
+    GetOpenFile(io, fptr);
+    fd = GetReadFD(fptr);
+    if (!getattr(fd, &t)) rb_sys_fail(0);
+    set_cookedmode(&t);
+    if (!setattr(fd, &t)) rb_sys_fail(0);
+    return io;
+}
+
+static VALUE
 getc_call(VALUE io)
 {
     return rb_funcall2(io, id_getc, 0, 0);
@@ -615,6 +667,8 @@
 {
     rb_define_method(rb_cIO, "raw", console_raw, 0);
     rb_define_method(rb_cIO, "raw!", console_set_raw, 0);
+    rb_define_method(rb_cIO, "cooked", console_cooked, 0);
+    rb_define_method(rb_cIO, "cooked!", console_set_cooked, 0);
     rb_define_method(rb_cIO, "getch", console_getch, 0);
     rb_define_method(rb_cIO, "echo=", console_set_echo, 1);
     rb_define_method(rb_cIO, "echo?", console_echo_p, 0);
Index: test/io/console/test_io_console.rb
===================================================================
--- test/io/console/test_io_console.rb	(revision 33784)
+++ test/io/console/test_io_console.rb	(revision 33785)
@@ -19,6 +19,21 @@
     }
   end
 
+  def test_cooked
+    helper {|m, s|
+      s.raw {
+        s.print "abc\n"
+        assert_equal("abc\n", m.gets)
+        s.cooked {
+          s.print "def\n"
+          assert_equal("def\r\n", m.gets)
+        }
+      }
+      s.print "ghi\n"
+      assert_equal("ghi\r\n", m.gets)
+    }
+  end
+
   def test_echo
     helper {|m, s|
       assert(s.echo?)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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