From: Jos Backus Date: 2004-12-07T04:22:22+09:00 Subject: [patch] Obtaining mode information on an IO object --M9NhX3UHpAaciwkO Content-Type: text/plain; charset=us-ascii Content-Disposition: inline The attached patch implements IO#mode. This method returns the mode the IO object was opened with as a String. Example: f = File.new("testfile") f.mode #=> "r" Please consider incorporating this into Ruby. Thank you. -- Jos Backus _/ _/_/_/ Sunnyvale, CA _/ _/ _/ _/ _/_/_/ _/ _/ _/ _/ jos at catnook.com _/_/ _/_/_/ require 'std/disclaimer' --M9NhX3UHpAaciwkO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="io.c.mode.diff" Index: io.c =================================================================== RCS file: /src/ruby/io.c,v retrieving revision 1.347 diff -u -r1.347 io.c --- io.c 6 Dec 2004 15:31:26 -0000 1.347 +++ io.c 6 Dec 2004 19:12:07 -0000 @@ -2503,6 +2503,35 @@ return NULL; /* not reached */ } +/* + * call-seq: + * ios.mode => String + * + * Returns the open mode associated with ios as a String. + * + * f = File.new("testfile") + * f.mode #=> "r" + */ + +VALUE +rb_io_mode(io) + VALUE io; +{ + OpenFile *fptr; + const char *mode; + VALUE str = Qnil; + int len; + + GetOpenFile(io, fptr); + mode = rb_io_flags_mode(fptr->mode); + len = strlen(mode); + str = rb_str_buf_new(len); + memcpy(RSTRING(str)->ptr, mode, len); + RSTRING(str)->len = len; + RSTRING(str)->ptr[len] = '\0'; + return str; +} + static int rb_sysopen(fname, flags, mode) char *fname; @@ -5549,6 +5578,7 @@ rb_define_method(rb_cIO, "pos=", rb_io_set_pos, 1); rb_define_method(rb_cIO, "eof", rb_io_eof, 0); rb_define_method(rb_cIO, "eof?", rb_io_eof, 0); + rb_define_method(rb_cIO, "mode", rb_io_mode, 0); rb_define_method(rb_cIO, "close", rb_io_close_m, 0); rb_define_method(rb_cIO, "closed?", rb_io_closed, 0); --M9NhX3UHpAaciwkO--