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/