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

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/

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