diff options
author | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-03-22 14:35:46 +0000 |
---|---|---|
committer | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-03-22 14:35:46 +0000 |
commit | e620cd7232b242c1500abd8a6a5b86efdf1c5c2b (patch) | |
tree | 62b27a249ce39c519adcc3c671e456ae3c92178a /doio.c | |
parent | 1f852d0d1f9745d51afb4cb836d527bbbac0c64e (diff) | |
download | perl-e620cd7232b242c1500abd8a6a5b86efdf1c5c2b.tar.gz |
Give a meaning to '&' in n-arg open case:
open($fh,"<&",$scalar);
$scalar can be:
- an integer which does "fdopen"
open($fh,"<&",2); # like open($fh,"<&2")
- something that will yield a file handle via sv_2io()
useful for dup'ing anonymous handles.
e.g.:
open(my $fh,"<&",\*STDIN);
open(my $dup,"<&",$fh);
p4raw-id: //depot/perlio@9298
Diffstat (limited to 'doio.c')
-rw-r--r-- | doio.c | 42 |
1 files changed, 25 insertions, 17 deletions
@@ -283,29 +283,39 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, strcat(mode, "t"); if (*type == '&') { - name = type; duplicity: dodup = 1; - name++; - if (*name == '=') { + type++; + if (*type == '=') { dodup = 0; - name++; - } - if (num_svs) { - goto unknown_desr; + type++; } - if (!*name && supplied_fp) + if (!num_svs && !*type && supplied_fp) /* "<+&" etc. is used by typemaps */ fp = supplied_fp; else { - /*SUPPRESS 530*/ - for (; isSPACE(*name); name++) ; - if (isDIGIT(*name)) - fd = atoi(name); + if (num_svs > 1) { + Perl_croak(aTHX_ "More than one argument to '%c&' open",IoTYPE(io)); + } + if (num_svs && SvIOK(*svp)) + fd = SvUV(*svp); + else if (isDIGIT(*type)) { + /*SUPPRESS 530*/ + for (; isSPACE(*type); type++) ; + fd = atoi(type); + } else { IO* thatio; - gv = gv_fetchpv(name,FALSE,SVt_PVIO); - thatio = GvIO(gv); + if (num_svs) { + thatio = sv_2io(*svp); + } + else { + GV *thatgv; + /*SUPPRESS 530*/ + for (; isSPACE(*type); type++) ; + thatgv = gv_fetchpv(type,FALSE,SVt_PVIO); + thatio = GvIO(thatgv); + } if (!thatio) { #ifdef EINVAL SETERRNO(EINVAL,SS$_IVCHAN); @@ -387,7 +397,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, strcat(mode, "t"); if (*type == '&') { - name = type; goto duplicity; } if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) { @@ -431,8 +440,7 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, if (num_svs > 1) { fp = PerlProc_popen_list(mode,num_svs,svp); } - else - { + else { fp = PerlProc_popen(name,mode); } IoTYPE(io) = IoTYPE_PIPE; |