前田です。

putcがないのがちょっと不便に感じる時があるので、追加してみた
のですが、採用していただけないでしょうか。

IO#putcはCのfputc相当で、Kernel#putc/Kernel#putcharは両方とも
putcharに相当します。

# if (BUILTIN_TYPE(io) != T_FILE) の行は必要なのでしょうか?

-- 
前田 修吾

--- io.c.orig Tue Mar 3 12:31:53 1998 +++ io.c Tue Mar 3 13:03:35 1998 @@ -1314,6 +1314,38 @@ } static VALUE +io_putc(io, ch) + VALUE io, ch; +{ + OpenFile *fptr; + FILE *f; + int c = NUM2INT(ch); + + if (BUILTIN_TYPE(io) != T_FILE) + TypeError("%s is not file", rb_class2name(CLASS_OF(io))); + + rb_secure(4); + GetOpenFile(io, fptr); + io_writable(fptr); + + f = GetWriteFile(fptr); + + if (fputc(c, f) == EOF || ferror(f)) + rb_sys_fail(fptr->path); + if (fptr->mode & FMODE_SYNC) + fflush(f); + + return ch; +} + +static VALUE +f_putc(recv, ch) + VALUE recv, ch; +{ + return io_putc(rb_defout, ch); +} + +static VALUE io_puts(argc, argv, out) int argc; VALUE *argv; @@ -2275,6 +2307,7 @@ void Init_IO() { + extern VALUE mKernel; extern VALUE mEnumerable; extern VALUE eException; @@ -2287,6 +2320,8 @@ rb_define_global_function("open", f_open, -1); rb_define_global_function("printf", f_printf, -1); rb_define_global_function("print", f_print, -1); + rb_define_global_function("putc", f_putc, 1); + rb_define_alias(mKernel, "putchar", "putc"); rb_define_global_function("puts", f_puts, -1); rb_define_global_function("gets", f_gets_method, -1); rb_define_global_function("readline", f_readline, -1); @@ -2331,6 +2366,7 @@ rb_define_method(cIO, "reopen", io_reopen, 1); rb_define_method(cIO, "print", io_print, -1); + rb_define_method(cIO, "putc", io_putc, 1); rb_define_method(cIO, "puts", io_puts, -1); rb_define_method(cIO, "printf", io_printf, -1);