From: nobu.nakada@... Date: 2002-05-30T11:04:01+09:00 Subject: [ruby-dev:17225] Re: StringIO なかだです。 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 #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はできる。 中田 伸悦