ruby-changes:5134
From: knu <ko1@a...>
Date: Tue, 27 May 2008 15:40:03 +0900 (JST)
Subject: [ruby-changes:5134] Ruby:r16629 (ruby_1_8): * io.c (rb_io_each_char, argf_each_char, Init_IO):
knu 2008-05-27 15:39:47 +0900 (Tue, 27 May 2008)
New Revision: 16629
Modified files:
branches/ruby_1_8/ChangeLog
branches/ruby_1_8/NEWS
branches/ruby_1_8/io.c
Log:
* io.c (rb_io_each_char, argf_each_char, Init_IO):
Add {IO#,ARGF.}{each_char,chars}.
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16629&r2=16628&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/io.c?r1=16629&r2=16628&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/NEWS?r1=16629&r2=16628&diff_format=u
Index: ruby_1_8/NEWS
===================================================================
--- ruby_1_8/NEWS (revision 16628)
+++ ruby_1_8/NEWS (revision 16629)
@@ -179,10 +179,14 @@
Return an enumerator if no block is given.
* IO#bytes
+ * IO#chars
+ * IO#each_char
* IO#getbyte
* IO#lines
* IO#readbyte
* ARGF.bytes
+ * ARGF.chars
+ * ARGF.each_char
* ARGF.getbyte
* ARGF.lines
* ARGF.readbyte
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog (revision 16628)
+++ ruby_1_8/ChangeLog (revision 16629)
@@ -1,3 +1,8 @@
+Tue May 27 15:36:37 2008 Akinori MUSHA <knu@i...>
+
+ * io.c (rb_io_each_char, argf_each_char, Init_IO):
+ Add {IO#,ARGF.}{each_char,chars}.
+
Tue May 27 13:46:52 2008 Akinori MUSHA <knu@i...>
* ext/stringio/stringio.c (Init_stringio): Define
@@ -5,7 +10,7 @@
Tue May 27 13:38:51 2008 Akinori MUSHA <knu@i...>
- * io.c (Init_IO): Define {IO,ARGF}#{getbyte,readbyte}.
+ * io.c (Init_IO): Define {IO#,ARGF.}{getbyte,readbyte}.
Tue May 27 13:26:15 2008 Akinori MUSHA <knu@i...>
Index: ruby_1_8/io.c
===================================================================
--- ruby_1_8/io.c (revision 16628)
+++ ruby_1_8/io.c (revision 16629)
@@ -21,6 +21,7 @@
#include "rubyio.h"
#include "rubysig.h"
#include "env.h"
+#include "re.h"
#include <ctype.h>
#include <errno.h>
@@ -2026,8 +2027,53 @@
return io;
}
+VALUE rb_io_getc _((VALUE));
+
/*
* call-seq:
+ * ios.each_char {|c| block } => ios
+ *
+ * Calls the given block once for each character in <em>ios</em>,
+ * passing the character as an argument. The stream must be opened for
+ * reading or an <code>IOError</code> will be raised. Multibyte
+ * characters are dealt with according to $KCODE.
+ *
+ * f = File.new("testfile")
+ * f.each_char {|c| print c, ' ' } #=> #<File:testfile>
+ */
+
+static VALUE
+rb_io_each_char(io)
+ VALUE io;
+{
+ VALUE ch;
+
+ RETURN_ENUMERATOR(io, 0, 0);
+
+ while (!NIL_P(ch = rb_io_getc(io))) {
+ unsigned char c;
+ int n;
+ VALUE str;
+
+ c= FIX2INT(ch);
+ n = mbclen(c);
+ str = rb_tainted_str_new((const char *)&c, 1);
+
+ while (--n > 0) {
+ if (NIL_P(ch = rb_io_getc(io))) {
+ rb_yield(str);
+ return io;
+ }
+ c = FIX2INT(ch);
+ rb_str_cat(str, (const char *)&c, 1);
+ }
+ rb_yield(str);
+ }
+ return io;
+}
+
+/*
+ * call-seq:
* ios.lines(sep=$/) => anEnumerator
* ios.lines(limit) => anEnumerator
* ios.lines(sep, limit) => anEnumerator
@@ -5613,6 +5659,42 @@
}
static VALUE
+argf_each_char(argf)
+ VALUE argf;
+{
+ VALUE ch;
+
+ RETURN_ENUMERATOR(argf, 0, 0);
+
+ while (!NIL_P(ch = argf_getc())) {
+ unsigned char c;
+ int n;
+ VALUE str, file;
+
+ first_char:
+ c = FIX2INT(ch);
+ n = mbclen(c);
+ str = rb_tainted_str_new((const char *)&c, 1);
+ file = current_file;
+
+ while (--n > 0) {
+ if (NIL_P(ch = argf_getc())) {
+ rb_yield(str);
+ return argf;
+ }
+ if (current_file != file) {
+ rb_yield(str);
+ goto first_char;
+ }
+ c = FIX2INT(ch);
+ rb_str_cat(str, (const char *)&c, 1);
+ }
+ rb_yield(str);
+ }
+ return argf;
+}
+
+static VALUE
argf_filename()
{
next_argv();
@@ -5854,8 +5936,10 @@
rb_define_method(rb_cIO, "each", rb_io_each_line, -1);
rb_define_method(rb_cIO, "each_line", rb_io_each_line, -1);
rb_define_method(rb_cIO, "each_byte", rb_io_each_byte, 0);
+ rb_define_method(rb_cIO, "each_char", rb_io_each_char, 0);
rb_define_method(rb_cIO, "lines", rb_io_lines, -1);
rb_define_method(rb_cIO, "bytes", rb_io_bytes, 0);
+ rb_define_method(rb_cIO, "chars", rb_io_each_char, 0);
rb_define_method(rb_cIO, "syswrite", rb_io_syswrite, 1);
rb_define_method(rb_cIO, "sysread", rb_io_sysread, -1);
@@ -5945,8 +6029,10 @@
rb_define_singleton_method(argf, "each", argf_each_line, -1);
rb_define_singleton_method(argf, "each_line", argf_each_line, -1);
rb_define_singleton_method(argf, "each_byte", argf_each_byte, 0);
+ rb_define_singleton_method(argf, "each_char", argf_each_char, 0);
rb_define_singleton_method(argf, "lines", argf_each_line, -1);
rb_define_singleton_method(argf, "bytes", argf_each_byte, 0);
+ rb_define_singleton_method(argf, "chars", argf_each_char, 0);
rb_define_singleton_method(argf, "read", argf_read, -1);
rb_define_singleton_method(argf, "readlines", rb_f_readlines, -1);
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/