ruby-changes:5138
From: knu <ko1@a...>
Date: Tue, 27 May 2008 18:55:30 +0900 (JST)
Subject: [ruby-changes:5138] Ruby:r16633 (ruby_1_8): * ext/stringio/stringio.c (strio_each_char, Init_stringio): Add
knu 2008-05-27 18:55:14 +0900 (Tue, 27 May 2008)
New Revision: 16633
Modified files:
branches/ruby_1_8/ChangeLog
branches/ruby_1_8/NEWS
branches/ruby_1_8/ext/stringio/stringio.c
Log:
* ext/stringio/stringio.c (strio_each_char, Init_stringio): Add
StringIO#{each_char,chars}.
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16633&r2=16632&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ext/stringio/stringio.c?r1=16633&r2=16632&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/NEWS?r1=16633&r2=16632&diff_format=u
Index: ruby_1_8/ext/stringio/stringio.c
===================================================================
--- ruby_1_8/ext/stringio/stringio.c (revision 16632)
+++ ruby_1_8/ext/stringio/stringio.c (revision 16633)
@@ -14,6 +14,7 @@
#include "ruby.h"
#include "rubyio.h"
+#include "re.h"
#if defined(HAVE_FCNTL_H) || defined(_WIN32)
#include <fcntl.h>
#elif defined(HAVE_SYS_FCNTL_H)
@@ -162,6 +163,7 @@
static VALUE strio_seek _((int, VALUE *, VALUE));
static VALUE strio_get_sync _((VALUE));
static VALUE strio_each_byte _((VALUE));
+static VALUE strio_each_char _((VALUE));
static VALUE strio_getc _((VALUE));
static VALUE strio_ungetc _((VALUE, VALUE));
static VALUE strio_readchar _((VALUE));
@@ -806,6 +808,41 @@
return c;
}
+/*
+ * call-seq:
+ * strio.each_char {|char| block } -> strio
+ *
+ * See IO#each_char.
+ */
+static VALUE
+strio_each_char(self)
+ VALUE self;
+{
+ struct StringIO *sio;
+ VALUE str;
+ const char *ptr;
+ size_t len;
+
+ RETURN_ENUMERATOR(self, 0, 0);
+
+ sio = readable(StringIO(self));
+ str = sio->string;
+ ptr = RSTRING_PTR(str);
+ len = RSTRING_LEN(str);
+
+ while (sio->pos < len) {
+ int pos = sio->pos;
+ char c = ptr[pos];
+ int n = mbclen(c);
+
+ if (len < pos + n) n = len - pos;
+
+ sio->pos += n;
+ rb_yield(rb_str_substr(str, pos, n));
+ }
+ return self;
+}
+
static void
bm_init_skip(skip, pat, m)
long *skip;
@@ -1301,6 +1338,8 @@
rb_define_method(StringIO, "each", strio_each, -1);
rb_define_method(StringIO, "each_byte", strio_each_byte, 0);
rb_define_method(StringIO, "bytes", strio_each_byte, 0);
+ rb_define_method(StringIO, "each_char", strio_each_char, 0);
+ rb_define_method(StringIO, "chars", strio_each_char, 0);
rb_define_method(StringIO, "each_line", strio_each, -1);
rb_define_method(StringIO, "lines", strio_each, -1);
rb_define_method(StringIO, "getc", strio_getc, 0);
Index: ruby_1_8/NEWS
===================================================================
--- ruby_1_8/NEWS (revision 16632)
+++ ruby_1_8/NEWS (revision 16633)
@@ -331,8 +331,13 @@
* StringIO#getbyte
* StringIO#readbyte
- Add new methods. (aliases for compatibility with 1.9)
+ New methods. (aliases for compatibility with 1.9)
+ * StringIO#each_char
+ * StringIO#chars
+
+ New methods.
+
* StringIO#each
* StringIO#each_line
* StringIO#each_byte
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog (revision 16632)
+++ ruby_1_8/ChangeLog (revision 16633)
@@ -1,3 +1,8 @@
+Tue May 27 18:54:02 2008 Akinori MUSHA <knu@i...>
+
+ * ext/stringio/stringio.c (strio_each_char, Init_stringio): Add
+ StringIO#{each_char,chars}.
+
Tue May 27 17:59:34 2008 Akinori MUSHA <knu@i...>
* ext/stringio/stringio.c (strio_each): Return an enumerator if no
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/