mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* io.c (io_extract_encoding_option): enc2 is external encoding if
external encoding and internal encoding is given.
  (pipe_open): add flags and convconfig argument to initialize
  fptr->{mode,enc,enc2}.
  (pipe_open_v): pass flags and convconfig from caller to pipe_open.
  (pipe_open_s): ditto.
  (pop_last_hash): new function.
  (rb_io_s_popen): use last hash as option to specify code conversion.
  (rb_io_open): specify flags and convconfig arguments for
  pipe_open_s.
  (rb_f_backquote): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
			
			
This commit is contained in:
		
							parent
							
								
									e6c300e08a
								
							
						
					
					
						commit
						caf34a9305
					
				
					 2 changed files with 60 additions and 31 deletions
				
			
		
							
								
								
									
										14
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								ChangeLog
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,17 @@
 | 
			
		|||
Thu Aug 21 03:09:34 2008  Tanaka Akira  <akr@fsij.org>
 | 
			
		||||
 | 
			
		||||
	* io.c (io_extract_encoding_option): enc2 is external encoding if
 | 
			
		||||
	  external encoding and internal encoding is given.
 | 
			
		||||
	  (pipe_open): add flags and convconfig argument to initialize
 | 
			
		||||
	  fptr->{mode,enc,enc2}.
 | 
			
		||||
	  (pipe_open_v): pass flags and convconfig from caller to pipe_open.
 | 
			
		||||
	  (pipe_open_s): ditto.
 | 
			
		||||
	  (pop_last_hash): new function.
 | 
			
		||||
	  (rb_io_s_popen): use last hash as option to specify code conversion.
 | 
			
		||||
	  (rb_io_open): specify flags and convconfig arguments for
 | 
			
		||||
	  pipe_open_s.
 | 
			
		||||
	  (rb_f_backquote): ditto.
 | 
			
		||||
 | 
			
		||||
Thu Aug 21 02:27:03 2008  Tanaka Akira  <akr@fsij.org>
 | 
			
		||||
 | 
			
		||||
	* io.c (prep_io): local variable renamed.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										77
									
								
								io.c
									
										
									
									
									
								
							
							
						
						
									
										77
									
								
								io.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -3781,10 +3781,10 @@ io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p)
 | 
			
		|||
			RSTRING_PTR(rb_inspect(extenc)));
 | 
			
		||||
	    }
 | 
			
		||||
	    else {
 | 
			
		||||
		*enc2_p = intencoding;
 | 
			
		||||
		*enc_p = intencoding;
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	*enc_p = extencoding;
 | 
			
		||||
	*enc2_p = extencoding;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	if (!NIL_P(intenc)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -4165,9 +4165,8 @@ popen_exec(void *pp)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *mode)
 | 
			
		||||
pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *mode, int flags, convconfig_t *convconfig)
 | 
			
		||||
{
 | 
			
		||||
    int modef = rb_io_mode_flags(mode);
 | 
			
		||||
    int pid = 0;
 | 
			
		||||
    rb_io_t *fptr;
 | 
			
		||||
    VALUE port;
 | 
			
		||||
| 
						 | 
				
			
			@ -4210,10 +4209,10 @@ pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *mode)
 | 
			
		|||
 | 
			
		||||
#if defined(HAVE_FORK)
 | 
			
		||||
    arg.execp = eargp;
 | 
			
		||||
    arg.modef = modef;
 | 
			
		||||
    arg.modef = flags;
 | 
			
		||||
    arg.pair[0] = arg.pair[1] = -1;
 | 
			
		||||
    arg.write_pair[0] = arg.write_pair[1] = -1;
 | 
			
		||||
    switch (modef & (FMODE_READABLE|FMODE_WRITABLE)) {
 | 
			
		||||
    switch (flags & (FMODE_READABLE|FMODE_WRITABLE)) {
 | 
			
		||||
      case FMODE_READABLE|FMODE_WRITABLE:
 | 
			
		||||
        if (rb_pipe(arg.write_pair) < 0)
 | 
			
		||||
            rb_sys_fail(cmd);
 | 
			
		||||
| 
						 | 
				
			
			@ -4266,20 +4265,20 @@ pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *mode)
 | 
			
		|||
	int e = errno;
 | 
			
		||||
	close(arg.pair[0]);
 | 
			
		||||
	close(arg.pair[1]);
 | 
			
		||||
        if ((modef & (FMODE_READABLE|FMODE_WRITABLE)) == (FMODE_READABLE|FMODE_WRITABLE)) {
 | 
			
		||||
        if ((flags & (FMODE_READABLE|FMODE_WRITABLE)) == (FMODE_READABLE|FMODE_WRITABLE)) {
 | 
			
		||||
            close(arg.write_pair[0]);
 | 
			
		||||
            close(arg.write_pair[1]);
 | 
			
		||||
        }
 | 
			
		||||
	errno = e;
 | 
			
		||||
	rb_sys_fail(cmd);
 | 
			
		||||
    }
 | 
			
		||||
    if ((modef & FMODE_READABLE) && (modef & FMODE_WRITABLE)) {
 | 
			
		||||
    if ((flags & FMODE_READABLE) && (flags & FMODE_WRITABLE)) {
 | 
			
		||||
        close(arg.pair[1]);
 | 
			
		||||
        fd = arg.pair[0];
 | 
			
		||||
        close(arg.write_pair[0]);
 | 
			
		||||
        write_fd = arg.write_pair[1];
 | 
			
		||||
    }
 | 
			
		||||
    else if (modef & FMODE_READABLE) {
 | 
			
		||||
    else if (flags & FMODE_READABLE) {
 | 
			
		||||
        close(arg.pair[1]);
 | 
			
		||||
        fd = arg.pair[0];
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -4349,15 +4348,18 @@ pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *mode)
 | 
			
		|||
    MakeOpenFile(port, fptr);
 | 
			
		||||
    fptr->fd = fd;
 | 
			
		||||
    fptr->stdio_file = fp;
 | 
			
		||||
    fptr->mode = modef | FMODE_SYNC|FMODE_DUPLEX;
 | 
			
		||||
    rb_io_mode_enc(fptr, mode);
 | 
			
		||||
    fptr->mode = flags | FMODE_SYNC|FMODE_DUPLEX;
 | 
			
		||||
    if (convconfig) {
 | 
			
		||||
        fptr->enc = convconfig->enc;
 | 
			
		||||
        fptr->enc2 = convconfig->enc2;
 | 
			
		||||
    }
 | 
			
		||||
    fptr->pid = pid;
 | 
			
		||||
 | 
			
		||||
    if (0 <= write_fd) {
 | 
			
		||||
        write_port = io_alloc(rb_cIO);
 | 
			
		||||
        MakeOpenFile(write_port, write_fptr);
 | 
			
		||||
        write_fptr->fd = write_fd;
 | 
			
		||||
        write_fptr->mode = (modef & ~FMODE_READABLE)| FMODE_SYNC|FMODE_DUPLEX;
 | 
			
		||||
        write_fptr->mode = (flags & ~FMODE_READABLE)| FMODE_SYNC|FMODE_DUPLEX;
 | 
			
		||||
        fptr->mode &= ~FMODE_WRITABLE;
 | 
			
		||||
        fptr->tied_io_for_writing = write_port;
 | 
			
		||||
        rb_ivar_set(port, rb_intern("@tied_io_for_writing"), write_port);
 | 
			
		||||
| 
						 | 
				
			
			@ -4371,16 +4373,16 @@ pipe_open(struct rb_exec_arg *eargp, VALUE prog, const char *mode)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
pipe_open_v(int argc, VALUE *argv, const char *mode)
 | 
			
		||||
pipe_open_v(int argc, VALUE *argv, const char *mode, int flags, convconfig_t *convconfig)
 | 
			
		||||
{
 | 
			
		||||
    VALUE prog;
 | 
			
		||||
    struct rb_exec_arg earg;
 | 
			
		||||
    prog = rb_exec_arg_init(argc, argv, Qfalse, &earg);
 | 
			
		||||
    return pipe_open(&earg, prog, mode);
 | 
			
		||||
    return pipe_open(&earg, prog, mode, flags, convconfig);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
pipe_open_s(VALUE prog, const char *mode)
 | 
			
		||||
pipe_open_s(VALUE prog, const char *mode, int flags, convconfig_t *convconfig)
 | 
			
		||||
{
 | 
			
		||||
    const char *cmd = RSTRING_PTR(prog);
 | 
			
		||||
    int argc = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -4392,11 +4394,25 @@ pipe_open_s(VALUE prog, const char *mode)
 | 
			
		|||
	rb_raise(rb_eNotImpError,
 | 
			
		||||
		 "fork() function is unimplemented on this machine");
 | 
			
		||||
#endif
 | 
			
		||||
        return pipe_open(0, 0, mode);
 | 
			
		||||
        return pipe_open(0, 0, mode, flags, convconfig);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rb_exec_arg_init(argc, argv, Qtrue, &earg);
 | 
			
		||||
    return pipe_open(&earg, prog, mode);
 | 
			
		||||
    return pipe_open(&earg, prog, mode, flags, convconfig);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static VALUE
 | 
			
		||||
pop_last_hash(int *argc_p, VALUE **argv_p)
 | 
			
		||||
{
 | 
			
		||||
    VALUE last, tmp;
 | 
			
		||||
    if (*argc_p == 0)
 | 
			
		||||
        return Qnil;
 | 
			
		||||
    last = (*argv_p)[*argc_p-1];
 | 
			
		||||
    tmp = rb_check_convert_type(last, T_HASH, "Hash", "to_hash");
 | 
			
		||||
    if (NIL_P(tmp))
 | 
			
		||||
        return Qnil;
 | 
			
		||||
    (*argc_p)--;
 | 
			
		||||
    return tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -4458,27 +4474,26 @@ static VALUE
 | 
			
		|||
rb_io_s_popen(int argc, VALUE *argv, VALUE klass)
 | 
			
		||||
{
 | 
			
		||||
    const char *mode;
 | 
			
		||||
    VALUE pname, pmode, port, tmp;
 | 
			
		||||
    VALUE pname, pmode, port, tmp, opt;
 | 
			
		||||
    int modenum, flags;
 | 
			
		||||
    convconfig_t convconfig;
 | 
			
		||||
 | 
			
		||||
    opt = pop_last_hash(&argc, &argv);
 | 
			
		||||
    rb_scan_args(argc, argv, "11", &pname, &pmode);
 | 
			
		||||
 | 
			
		||||
    rb_io_extract_modeenc(pmode, opt, &modenum, &flags, &convconfig);
 | 
			
		||||
    mode = rb_io_modenum_mode(modenum);
 | 
			
		||||
 | 
			
		||||
    if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) {
 | 
			
		||||
	mode = "r";
 | 
			
		||||
    }
 | 
			
		||||
    else if (FIXNUM_P(pmode)) {
 | 
			
		||||
	mode = rb_io_modenum_mode(FIX2INT(pmode));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	mode = StringValueCStr(pmode);
 | 
			
		||||
    }
 | 
			
		||||
    tmp = rb_check_array_type(pname);
 | 
			
		||||
    if (!NIL_P(tmp)) {
 | 
			
		||||
	tmp = rb_ary_dup(tmp);
 | 
			
		||||
	RBASIC(tmp)->klass = 0;
 | 
			
		||||
	port = pipe_open_v(RARRAY_LEN(tmp), RARRAY_PTR(tmp), mode);
 | 
			
		||||
	port = pipe_open_v(RARRAY_LEN(tmp), RARRAY_PTR(tmp), mode, flags, &convconfig);
 | 
			
		||||
	rb_ary_clear(tmp);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
	SafeStringValue(pname);
 | 
			
		||||
	port = pipe_open_s(pname, mode);
 | 
			
		||||
	port = pipe_open_s(pname, mode, flags, &convconfig);
 | 
			
		||||
    }
 | 
			
		||||
    if (NIL_P(port)) {
 | 
			
		||||
	/* child */
 | 
			
		||||
| 
						 | 
				
			
			@ -4775,7 +4790,7 @@ rb_io_open(const char *fname, VALUE mode, VALUE opt)
 | 
			
		|||
 | 
			
		||||
    if (fname[0] == '|') {
 | 
			
		||||
	VALUE cmd = rb_str_new2(fname+1);
 | 
			
		||||
	return pipe_open_s(cmd, rb_io_modenum_mode(modenum)); /* xxx: convconfig ignored */
 | 
			
		||||
	return pipe_open_s(cmd, rb_io_modenum_mode(modenum), flags, &convconfig);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return rb_file_open_generic(io_alloc(rb_cFile), fname,
 | 
			
		||||
| 
						 | 
				
			
			@ -6051,7 +6066,7 @@ rb_f_backquote(VALUE obj, VALUE str)
 | 
			
		|||
    rb_io_t *fptr;
 | 
			
		||||
 | 
			
		||||
    SafeStringValue(str);
 | 
			
		||||
    port = pipe_open_s(str, "r");
 | 
			
		||||
    port = pipe_open_s(str, "r", FMODE_READABLE, NULL);
 | 
			
		||||
    if (NIL_P(port)) return rb_str_new(0,0);
 | 
			
		||||
 | 
			
		||||
    GetOpenFile(port, fptr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue