diff options
Diffstat (limited to 'pp_ctl.c')
-rw-r--r-- | pp_ctl.c | 81 |
1 files changed, 42 insertions, 39 deletions
@@ -822,7 +822,7 @@ block_gimme() cxix = dopoptosub(cxstack_ix); if (cxix < 0) - return G_SCALAR; + return G_VOID; switch (cxstack[cxix].blk_gimme) { case G_VOID: @@ -2130,7 +2130,8 @@ PP(pp_require) register CONTEXT *cx; SV *sv; char *name; - char *tmpname; + char *tryname; + SV *namesv = Nullsv; SV** svp; I32 gimme = G_SCALAR; PerlIO *tryrsfp = 0; @@ -2154,61 +2155,63 @@ PP(pp_require) /* prepare to compile file */ - tmpname = savepv(name); - if (*tmpname == '/' || - (*tmpname == '.' && - (tmpname[1] == '/' || - (tmpname[1] == '.' && tmpname[2] == '/'))) + if (*name == '/' || + (*name == '.' && + (name[1] == '/' || + (name[1] == '.' && name[2] == '/'))) #ifdef DOSISH - || (tmpname[0] && tmpname[1] == ':') + || (name[0] && name[1] == ':') #endif #ifdef VMS - || (strchr(tmpname,':') || ((*tmpname == '[' || *tmpname == '<') && - (isALNUM(tmpname[1]) || strchr("$-_]>",tmpname[1])))) + || (strchr(name,':') || ((*name == '[' || *name == '<') && + (isALNUM(name[1]) || strchr("$-_]>",name[1])))) #endif ) { - tryrsfp = PerlIO_open(tmpname,"r"); + tryname = name; + tryrsfp = PerlIO_open(name,"r"); } else { AV *ar = GvAVn(incgv); I32 i; #ifdef VMS - char unixified[256]; - if (tounixspec_ts(tmpname,unixified) != NULL) - for (i = 0; i <= AvFILL(ar); i++) { - if (tounixpath_ts(SvPVx(*av_fetch(ar, i, TRUE), na),buf) == NULL) - continue; - strcat(buf,unixified); + char *unixname; + if ((unixname = tounixspec(name, Nullch)) != Nullch) +#endif + { + namesv = NEWSV(806, 0); + for (i = 0; i <= AvFILL(ar); i++) { + char *dir = SvPVx(*av_fetch(ar, i, TRUE), na); +#ifdef VMS + char *unixdir; + if ((unixdir = tounixpath(dir, Nullch)) == Nullch) + continue; + sv_setpv(namesv, unixdir); + sv_catpv(namesv, unixname); #else - for (i = 0; i <= AvFILL(ar); i++) { - (void)sprintf(buf, "%s/%s", - SvPVx(*av_fetch(ar, i, TRUE), na), name); + sv_setpvf(namesv, "%s/%s", dir, name); #endif - tryrsfp = PerlIO_open(buf, "r"); - if (tryrsfp) { - char *s = buf; - - if (*s == '.' && s[1] == '/') - s += 2; - Safefree(tmpname); - tmpname = savepv(s); - break; + tryname = SvPVX(namesv); + tryrsfp = PerlIO_open(tryname, "r"); + if (tryrsfp) { + if (tryname[0] == '.' && tryname[1] == '/') + tryname += 2; + break; + } } } } SAVESPTR(compiling.cop_filegv); - compiling.cop_filegv = gv_fetchfile(tmpname); - Safefree(tmpname); - tmpname = Nullch; + compiling.cop_filegv = gv_fetchfile(tryrsfp ? tryname : name); + SvREFCNT_dec(namesv); if (!tryrsfp) { if (op->op_type == OP_REQUIRE) { - sprintf(tokenbuf,"Can't locate %s in @INC", name); - if (instr(tokenbuf,".h ")) - strcat(tokenbuf," (change .h to .ph maybe?)"); - if (instr(tokenbuf,".ph ")) - strcat(tokenbuf," (did you run h2ph?)"); - DIE("%s",tokenbuf); + SV *msg = sv_2mortal(newSVpvf("Can't locate %s in @INC", name)); + if (instr(SvPVX(msg), ".h ")) + sv_catpv(msg, " (change .h to .ph maybe?)"); + if (instr(SvPVX(msg), ".ph ")) + sv_catpv(msg, " (did you run h2ph?)"); + DIE("%S", msg); } RETPUSHUNDEF; @@ -2255,7 +2258,7 @@ PP(pp_entereval) register CONTEXT *cx; dPOPss; I32 gimme = GIMME_V, was = sub_generation; - char tmpbuf[32], *safestr; + char tmpbuf[sizeof(unsigned long) * 3 + 12], *safestr; STRLEN len; OP *ret; |