putsの改行コード

吉兵衛

putsの改行コードは、環境に応じてLFとかCRLFとか使い分けているのでしょうか。気になったので調べてみました。

$ ruby -e 'puts "hello"' | od -c                       
0000000    h   e   l   l   o  \n                                        
0000006

んー、NetBSDで実行するとLFみたいです。ソースコードを追ってみると、

io.c
3590 VALUE
3591 rb_io_puts(argc, argv, out)
3592     int argc;
3593     VALUE *argv;
3594     VALUE out;
3595 {
...
3616         rb_io_write(out, line);
3617         if (RSTRING(line)->len == 0 ||
3618             RSTRING(line)->ptr[RSTRING(line)->len-1] != '\n') {
3619             rb_io_write(out, rb_default_rs);
3620         }
...
5311 void
5312 Init_IO()
5313 {
...
5373     rb_rs = rb_default_rs = rb_str_new2("\n");
5374     rb_output_rs = Qnil;
5375     rb_global_variable(&rb_default_rs);
5376     OBJ_FREEZE(rb_default_rs);  /* avoid modifying RS_default */

変数rb_default_rsに改行コードが入っています。IO関連の初期化時にLFに初期化されてそれっきりみたいです。ということは特に環境に応じて使い分けていないのね。