diff options
author | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-12-08 10:20:06 +0000 |
---|---|---|
committer | Nick Ing-Simmons <nik@tiuk.ti.com> | 2001-12-08 10:20:06 +0000 |
commit | 7cf31bebccd8b4045fd1d586b26bef41a901c2d0 (patch) | |
tree | 01311d1300389cbe150490d4b1a500bafcf061dd | |
parent | 915df47c6a00eb5a6b8d6051eb019773fc41d707 (diff) | |
download | perl-7cf31bebccd8b4045fd1d586b26bef41a901c2d0.tar.gz |
Allow multi-arg open() if opening layer declares this legal.
p4raw-id: //depot/perlio@13530
-rw-r--r-- | doio.c | 12 | ||||
-rw-r--r-- | perlio.c | 8 | ||||
-rw-r--r-- | perliol.h | 1 |
3 files changed, 14 insertions, 7 deletions
@@ -359,9 +359,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } } /* & */ else { - if (num_svs > 1) { - Perl_croak(aTHX_ "More than one argument to '>' open"); - } /*SUPPRESS 530*/ for (; isSPACE(*type); type++) ; if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) { @@ -369,6 +366,9 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, type++; fp = PerlIO_stdout(); IoTYPE(io) = IoTYPE_STD; + if (num_svs > 1) { + Perl_croak(aTHX_ "More than one argument to '>%c' open",IoTYPE_STD); + } } else { if (!num_svs) { @@ -382,9 +382,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } /* !& */ } else if (*type == IoTYPE_RDONLY) { - if (num_svs > 1) { - Perl_croak(aTHX_ "More than one argument to '<' open"); - } /*SUPPRESS 530*/ for (type++; isSPACE(*type); type++) ; mode[0] = 'r'; @@ -401,6 +398,9 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, type++; fp = PerlIO_stdin(); IoTYPE(io) = IoTYPE_STD; + if (num_svs > 1) { + Perl_croak(aTHX_ "More than one argument to '<%c' open",IoTYPE_STD); + } } else { if (!num_svs) { @@ -208,7 +208,10 @@ PerlIO * PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args) { - if (narg == 1) { + if (narg) { + if (narg > 1) { + Perl_croak(aTHX_ "More than one argument to '%s' open",mode); + } if (*args == &PL_sv_undef) return PerlIO_tmpfile(); else { @@ -1283,6 +1286,9 @@ PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd, /* * Found that layer 'n' can do opens - call it */ + if (narg > 1 && !(tab->kind & PERLIO_K_MULTIARG)) { + Perl_croak(aTHX_ "More than one argument to '%s' open",mode); + } PerlIO_debug("openn(%s,'%s','%s',%d,%x,%o,%p,%d,%p)\n", tab->name, layers, mode, fd, imode, perm, f, narg, args); @@ -58,6 +58,7 @@ struct _PerlIO_funcs { #define PERLIO_K_DUMMY 0x00000010 #define PERLIO_K_UTF8 0x00008000 #define PERLIO_K_DESTRUCT 0x00010000 +#define PERLIO_K_MULTIARG 0x00020000 /*--------------------------------------------------------------------------------------*/ struct _PerlIO { |