なかだです。

At Thu, 30 May 2002 10:00:13 +0900,
Tanaka Akira wrote:
> > そこで気が付いたのですが、String を IO のように使いたい、というのとは
> > 逆に、IO のかわりに String を使いたい、という場合には、StringIO#size
> > ではなく、StringIO#stat.size が欲しいように思います。
(snip)
> というような IO#size を加える方がよいと思います。

それは賛成ですが、とりあえずこんなのも作ってみました。

# うーん、size以外はどうすればいいんだろう。


Index: stringio.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/stringio/stringio.c,v retrieving revision 1.6 diff -u -2 -p -r1.6 stringio.c --- ext/stringio/stringio.c 2002/04/23 16:22:06 1.6 +++ ext/stringio/stringio.c 2002/05/30 01:38:30 @@ -15,4 +15,5 @@ #include "ruby.h" #include "rubyio.h" +#include <sys/stat.h> #define STRIO_APPEND 4 @@ -865,4 +866,47 @@ strio_truncate(self, len) } +static VALUE cStrioStat; + +static struct stat * +strio_get_stat(ptr) + struct StringIO *ptr; +{ + /* never fail except for fatal memory error */ + struct stat *st = ALLOC(struct stat); + memset(st, 0, sizeof(*st)); + if (!CLOSED(ptr)) { + st->st_size = RSTRING(ptr->string)->len; +#ifdef HAVE_ST_BLKSIZE + st->st_blksize = 1; +#endif +#ifdef HAVE_ST_BLOCKS + st->st_blocks = st->st_size; +#endif + } + return st; +} + +static VALUE +strio_stat(self) + VALUE self; +{ +#if 1 + struct StringIO *ptr = StringIO(self); + VALUE stat = Data_Wrap_Struct(cStrioStat, NULL, free, 0); + DATA_PTR(stat) = strio_get_stat(ptr); + return stat; +#else + return rb_class_new_instance(1, &self, cStrioStat); +#endif +} + +static VALUE +strio_stat_initialize(self, strio) + VALUE self, strio; +{ + DATA_PTR(self) = strio_get_stat(StringIO(strio)); + return self; +} + void Init_stringio() @@ -930,3 +974,8 @@ Init_stringio() rb_define_method(StringIO, "length", strio_size, 0); rb_define_method(StringIO, "truncate", strio_truncate, 1); + + rb_define_method(StringIO, "stat", strio_stat, 0); + cStrioStat = rb_const_get_at(rb_cFile, rb_intern("Stat")); + cStrioStat = rb_define_class_under(StringIO, "Stat", cStrioStat); + rb_define_method(cStrioStat, "initialize", strio_stat_initialize, 1); }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦