From f3ac3e8774a09fe7b4e689b37afe2e453d957690 Mon Sep 17 00:00:00 2001 From: usa Date: Tue, 28 Oct 2008 12:00:42 +0000 Subject: [PATCH] * io.c (extract_binmode): new function to extract binmode/textmode options from hash. * io.c (rb_io_extract_modeenc): use above function. * io.c (rb_io_s_pipe): recognize binmode/textmode options. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19996 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ io.c | 39 +++++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 78a3f0eda3..c043d563ff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Tue Oct 28 20:59:12 2008 NAKAMURA Usaku + + * io.c (extract_binmode): new function to extract binmode/textmode + options from hash. + + * io.c (rb_io_extract_modeenc): use above function. + + * io.c (rb_io_s_pipe): recognize binmode/textmode options. + Tue Oct 28 20:15:49 2008 NAKAMURA Usaku * io.c (make_readconv): now can specify the size of cbuf. diff --git a/io.c b/io.c index ea2bd49c25..772d9e4d71 100644 --- a/io.c +++ b/io.c @@ -3922,6 +3922,23 @@ validate_enc_binmode(int fmode, rb_encoding *enc, rb_encoding *enc2) rb_raise(rb_eArgError, "ASCII incompatible encoding needs binmode"); } +static void +extract_binmode(VALUE opthash, int *fmode) +{ + if (!NIL_P(opthash)) { + VALUE v; + v = rb_hash_aref(opthash, sym_textmode); + if (!NIL_P(v) && RTEST(v)) + *fmode |= FMODE_TEXTMODE; + v = rb_hash_aref(opthash, sym_binmode); + if (!NIL_P(v) && RTEST(v)) + *fmode |= FMODE_BINMODE; + + if ((*fmode & FMODE_BINMODE) && (*fmode & FMODE_TEXTMODE)) + rb_raise(rb_eArgError, "both textmode and binmode specified"); + } +} + static void rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, int *oflags_p, int *fmode_p, convconfig_t *convconfig_p) @@ -3975,16 +3992,11 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, } else { VALUE v; - v = rb_hash_aref(opthash, sym_textmode); - if (!NIL_P(v) && RTEST(v)) - fmode |= FMODE_TEXTMODE; - v = rb_hash_aref(opthash, sym_binmode); - if (!NIL_P(v) && RTEST(v)) { - fmode |= FMODE_BINMODE; + extract_binmode(opthash, &fmode); #ifdef O_BINARY + if (fmode & FMODE_BINMODE) oflags |= O_BINARY; #endif - } if (!has_vmode) { v = rb_hash_aref(opthash, sym_mode); if (!NIL_P(v)) { @@ -4017,9 +4029,6 @@ rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, } } - if ((fmode & FMODE_BINMODE) && (fmode & FMODE_TEXTMODE)) - rb_raise(rb_eArgError, "both textmode and binmode specified"); - validate_enc_binmode(fmode, enc, enc2); *vmode_p = vmode; @@ -6825,7 +6834,8 @@ rb_io_s_pipe(int argc, VALUE *argv, VALUE klass) int pipes[2], state; VALUE r, w, args[3], v1, v2; VALUE opt; - rb_io_t *fptr; + rb_io_t *fptr, *fptr2; + int fmode = 0; opt = pop_last_hash(&argc, argv); rb_scan_args(argc, argv, "02", &v1, &v2); @@ -6851,7 +6861,12 @@ rb_io_s_pipe(int argc, VALUE *argv, VALUE klass) if (!NIL_P(r)) rb_io_close(r); rb_jump_tag(state); } - rb_io_synchronized(RFILE(w)->fptr); + GetOpenFile(w, fptr2); + rb_io_synchronized(fptr2); + + extract_binmode(opt, &fmode); + fptr->mode |= fmode; + fptr2->mode |= fmode; return rb_assoc_new(r, w); }