1 /***********************************************************
3 * $Header: /usr/src/local/lwall/perl5/RCS/pp.c, v 4.1 92/08/07 18:26:21 lwall Exp Locker: lwall $
11 * Mon Jun 15 16:45:59 1992
14 * Larry Wall <lwall@netlabs.com>
17 * Revision 4.1 92/08/07 18:26:21 lwall
20 **********************************************************/
26 #include <sys/socket.h>
29 #include <net/errno.h>
36 #include <sys/select.h>
69 static I32 dopoptosub P((I32 startingblock));
81 if (GIMME != G_ARRAY) {
96 if (++markstack_ptr == markstack_max) {
97 I32 oldmax = markstack_max - markstack;
98 I32 newmax = oldmax * 3 / 2;
100 Renew(markstack, newmax, I32);
101 markstack_ptr = markstack + oldmax;
102 markstack_max = markstack + newmax;
104 *markstack_ptr = stack_sp - stack_base;
114 cxix = dopoptosub(cxstack_ix);
118 if (cxstack[cxix].blk_gimme == G_ARRAY)
127 XPUSHs(cSVOP->op_sv);
157 DIE("panic: pp_interp");
164 if (op->op_flags & OPf_INTRO)
165 PUSHs(save_scalar(cGVOP->op_gv));
167 PUSHs(GvSV(cGVOP->op_gv));
174 XPUSHs((SV*)cGVOP->op_gv);
182 if (op->op_flags & OPf_INTRO)
183 SAVECLEARSV(curpad[op->op_targ]);
191 if (op->op_flags & OPf_INTRO)
192 SAVECLEARSV(curpad[op->op_targ]);
193 if (op->op_flags & OPf_LVAL)
203 if (op->op_flags & OPf_INTRO)
204 SAVECLEARSV(curpad[op->op_targ]);
205 if (op->op_flags & OPf_LVAL)
213 DIE("NOT IMPL LINE %d",__LINE__);
230 if (SvTYPE(sv) != SVt_PVGV)
231 DIE("Not a glob reference");
234 if (SvTYPE(sv) != SVt_PVGV) {
236 DIE(no_usym, "a glob");
237 sv = (SV*)gv_fetchpv(SvPV(sv, na), TRUE);
240 if (op->op_flags & OPf_INTRO) {
248 if (op->op_flags & OPf_SPECIAL)
249 GvGP(sv)->gp_refcnt++; /* will soon be assigned */
255 GvSV(sv) = NEWSV(72,0);
256 GvLINE(sv) = curcop->cop_line;
278 switch (SvTYPE(sv)) {
282 DIE("Not a scalar reference");
287 if (SvTYPE(gv) != SVt_PVGV) {
289 DIE(no_usym, "a scalar");
290 gv = (SV*)gv_fetchpv(SvPV(sv, na), TRUE);
293 if (op->op_private == OP_RV2HV &&
294 (!SvROK(sv) || SvTYPE(SvRV(sv)) != SVt_PVHV)) {
297 sv_upgrade(sv, SVt_RV);
298 SvRV(sv) = SvREFCNT_inc(newHV());
303 else if (op->op_private == OP_RV2AV &&
304 (!SvROK(sv) || SvTYPE(SvRV(sv)) != SVt_PVAV)) {
307 sv_upgrade(sv, SVt_RV);
308 SvRV(sv) = SvREFCNT_inc(newAV());
314 if (op->op_flags & OPf_INTRO)
315 SETs(save_scalar((GV*)TOPs));
325 SV *sv = AvARYLEN(av);
327 AvARYLEN(av) = sv = NEWSV(0,0);
328 sv_upgrade(sv, SVt_IV);
329 sv_magic(sv, (SV*)av, '#', Nullch, 0);
342 /* We always try to add a non-existent subroutine in case of AUTOLOAD. */
343 CV *cv = sv_2cv(TOPs, &stash, &gv, TRUE);
356 sv_upgrade(rv, SVt_RV);
357 SvRV(rv) = SvREFCNT_inc(sv);
381 pv = HvNAME(SvSTASH(sv));
383 switch (SvTYPE(sv)) {
398 case SVt_PVLV: pv = "LVALUE"; break;
399 case SVt_PVAV: pv = "ARRAY"; break;
400 case SVt_PVHV: pv = "HASH"; break;
401 case SVt_PVCV: pv = "CODE"; break;
402 case SVt_PVGV: pv = "GLOB"; break;
403 case SVt_PVFM: pv = "FORMLINE"; break;
404 default: pv = "UNKNOWN"; break;
407 PUSHp(pv, strlen(pv));
419 stash = curcop->cop_stash;
421 stash = fetch_stash(POPs, TRUE);
425 DIE("Can't bless non-reference value");
428 SvUPGRADE(ref, SVt_PVMG);
429 SvSTASH(ref) = (HV*)SvREFCNT_inc(stash);
441 fp = my_popen(tmps, "r");
443 sv_setpv(TARG, ""); /* note that this preserves previous buffer */
444 if (GIMME == G_SCALAR) {
445 while (sv_gets(TARG, fp, SvCUR(TARG)) != Nullch)
455 if (sv_gets(sv, fp, 0) == Nullch) {
459 XPUSHs(sv_2mortal(sv));
460 if (SvLEN(sv) - SvCUR(sv) > 20) {
461 SvLEN_set(sv, SvCUR(sv)+1);
462 Renew(SvPVX(sv), SvLEN(sv), char);
466 statusvalue = my_pclose(fp);
470 if (GIMME == G_SCALAR)
485 register IO *io = GvIO(last_in_gv);
486 register I32 type = op->op_type;
492 if (IoFLAGS(io) & IOf_ARGV) {
493 if (IoFLAGS(io) & IOf_START) {
494 IoFLAGS(io) &= ~IOf_START;
496 if (av_len(GvAVn(last_in_gv)) < 0) {
497 SV *tmpstr = newSVpv("-", 1); /* assume stdin */
498 (void)av_push(GvAVn(last_in_gv), tmpstr);
501 fp = nextargv(last_in_gv);
502 if (!fp) { /* Note: fp != IoIFP(io) */
503 (void)do_close(last_in_gv, FALSE); /* now it does*/
504 IoFLAGS(io) |= IOf_START;
507 else if (type == OP_GLOB) {
508 SV *tmpcmd = NEWSV(55, 0);
513 sv_setpv(tmpcmd, "perlglob ");
514 sv_catsv(tmpcmd, tmpglob);
515 sv_catpv(tmpcmd, " |");
518 sv_setpvn(tmpcmd, cshname, cshlen);
519 sv_catpv(tmpcmd, " -cf 'set nonomatch; glob ");
520 sv_catsv(tmpcmd, tmpglob);
521 sv_catpv(tmpcmd, "'|");
523 sv_setpv(tmpcmd, "echo ");
524 sv_catsv(tmpcmd, tmpglob);
525 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\012\\012\\012\\012'|");
528 (void)do_open(last_in_gv, SvPVX(tmpcmd), SvCUR(tmpcmd));
533 else if (type == OP_GLOB)
538 warn("Read on closed filehandle <%s>", GvENAME(last_in_gv));
539 if (GIMME == G_SCALAR)
543 if (GIMME == G_ARRAY) {
544 sv = sv_2mortal(NEWSV(57, 80));
549 SvUPGRADE(sv, SVt_PV);
550 tmplen = SvLEN(sv); /* remember if already alloced */
552 Sv_Grow(sv, 80); /* try short-buffering it */
553 if (type == OP_RCATLINE)
559 if (!sv_gets(sv, fp, offset)) {
561 if (IoFLAGS(io) & IOf_ARGV) {
562 fp = nextargv(last_in_gv);
565 (void)do_close(last_in_gv, FALSE);
566 IoFLAGS(io) |= IOf_START;
568 else if (type == OP_GLOB) {
569 (void)do_close(last_in_gv, FALSE);
571 if (GIMME == G_SCALAR)
579 SvTAINT(sv); /* Anything from the outside world...*/
581 if (type == OP_GLOB) {
586 if (*SvEND(sv) == rschar)
590 for (tmps = SvPVX(sv); *tmps; tmps++)
591 if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
592 strchr("$&*(){}[]'\";\\|?<>~`", *tmps))
594 if (*tmps && stat(SvPVX(sv), &statbuf) < 0) {
595 POPs; /* Unmatched wildcard? Chuck it... */
599 if (GIMME == G_ARRAY) {
600 if (SvLEN(sv) - SvCUR(sv) > 20) {
601 SvLEN_set(sv, SvCUR(sv)+1);
602 Renew(SvPVX(sv), SvLEN(sv), char);
604 sv = sv_2mortal(NEWSV(58, 80));
607 else if (!tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
608 /* try to reclaim a bit of scalar space (only on 1st alloc) */
612 SvLEN_set(sv, SvCUR(sv)+40); /* allow some slop */
613 Renew(SvPVX(sv), SvLEN(sv), char);
626 SAVESPTR(last_in_gv); /* We don't want this to be permanent. */
627 last_in_gv = (GV*)*stack_sp--;
639 result = do_readline();
646 last_in_gv = (GV*)(*stack_sp--);
647 return do_readline();
652 last_in_gv = gv_fetchpv(SvPVx(GvSV((GV*)(*stack_sp--)), na), TRUE);
653 return do_readline();
658 last_in_gv = cGVOP->op_gv;
659 return do_readline();
669 register PMOP *pm = (PMOP*)cLOGOP->op_other;
673 register REGEXP *rx = pm->op_pmregexp;
676 global = pm->op_pmflags & PMf_GLOBAL;
678 t = SvPV(tmpstr, len);
681 pm->op_pmregexp = Null(REGEXP*); /* crucial if regcomp aborts */
682 pm->op_pmregexp = regcomp(t, t + len,
683 pm->op_pmflags & PMf_FOLD);
684 if (!pm->op_pmregexp->prelen && curpm)
686 if (pm->op_pmflags & PMf_KEEP) {
687 if (!(pm->op_pmflags & PMf_FOLD))
688 scan_prefix(pm, pm->op_pmregexp->precomp,
689 pm->op_pmregexp->prelen);
690 pm->op_pmflags &= ~PMf_RUNTIME; /* no point compiling again */
692 cLOGOP->op_first->op_next = op->op_next;
693 /* XXX delete push code */
701 register PMOP *pm = cPMOP;
709 register REGEXP *rx = pm->op_pmregexp;
713 if (op->op_flags & OPf_STACKED)
722 DIE("panic: do_match");
724 if (pm->op_pmflags & PMf_USED) {
725 if (gimme == G_ARRAY)
730 if (!rx->prelen && curpm) {
732 rx = pm->op_pmregexp;
735 if (global = pm->op_pmflags & PMf_GLOBAL) {
737 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
738 MAGIC* mg = mg_find(TARG, 'g');
739 if (mg && mg->mg_ptr) {
740 rx->startp[0] = mg->mg_ptr;
741 rx->endp[0] = mg->mg_ptr + mg->mg_len;
745 safebase = (gimme == G_ARRAY) || global;
748 if (global && rx->startp[0]) {
750 if (s == rx->startp[0])
755 if (pm->op_pmshort) {
756 if (pm->op_pmflags & PMf_SCANFIRST) {
757 if (SvSCREAM(TARG)) {
758 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
760 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
762 else if (pm->op_pmflags & PMf_ALL)
765 else if (!(s = fbm_instr((unsigned char*)s,
766 (unsigned char*)strend, pm->op_pmshort)))
768 else if (pm->op_pmflags & PMf_ALL)
770 if (s && rx->regback >= 0) {
771 ++BmUSEFUL(pm->op_pmshort);
779 else if (!multiline) {
780 if (*SvPVX(pm->op_pmshort) != *s ||
781 bcmp(SvPVX(pm->op_pmshort), s, pm->op_pmslen) ) {
782 if (pm->op_pmflags & PMf_FOLD) {
783 if (ibcmp(SvPVX(pm->op_pmshort), s, pm->op_pmslen) )
790 if (--BmUSEFUL(pm->op_pmshort) < 0) {
791 SvREFCNT_dec(pm->op_pmshort);
792 pm->op_pmshort = Nullsv; /* opt is being useless */
795 if (!rx->nparens && !global) {
796 gimme = G_SCALAR; /* accidental array context? */
799 if (regexec(rx, s, strend, truebase, 0,
800 SvSCREAM(TARG) ? TARG : Nullsv,
803 if (pm->op_pmflags & PMf_ONCE)
804 pm->op_pmflags |= PMf_USED;
812 if (gimme == G_ARRAY) {
816 if (global && !iters)
820 EXTEND(SP, iters + i);
821 for (i = !i; i <= iters; i++) {
822 PUSHs(sv_newmortal());
824 if (s = rx->startp[i]) {
825 len = rx->endp[i] - s;
827 sv_setpvn(*SP, s, len);
831 truebase = rx->subbeg;
839 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG))
840 mg = mg_find(TARG, 'g');
842 sv_magic(TARG, (SV*)0, 'g', Nullch, 0);
843 mg = mg_find(TARG, 'g');
845 mg->mg_ptr = rx->startp[0];
846 mg->mg_len = rx->endp[0] - rx->startp[0];
852 ++BmUSEFUL(pm->op_pmshort);
854 if (pm->op_pmflags & PMf_ONCE)
855 pm->op_pmflags |= PMf_USED;
857 rx->subbeg = truebase;
860 rx->endp[0] = s + SvCUR(pm->op_pmshort);
867 Safefree(rx->subbase);
868 tmps = rx->subbase = nsavestr(t, strend-t);
870 rx->subend = tmps + (strend-t);
871 tmps = rx->startp[0] = tmps + (s - t);
872 rx->endp[0] = tmps + SvCUR(pm->op_pmshort);
878 ++BmUSEFUL(pm->op_pmshort);
882 if (SvTYPE(TARG) >= SVt_PVMG && SvMAGIC(TARG)) {
883 MAGIC* mg = mg_find(TARG, 'g');
890 if (gimme == G_ARRAY)
898 register PMOP *pm = cPMOP;
913 register REGEXP *rx = pm->op_pmregexp;
916 if (pm->op_pmflags & PMf_CONST) /* known replacement string? */
918 if (op->op_flags & OPf_STACKED)
926 DIE("panic: do_subst");
929 maxiters = (strend - s) + 10;
931 if (!rx->prelen && curpm) {
933 rx = pm->op_pmregexp;
935 safebase = ((!rx || !rx->nparens) && !sawampersand);
937 if (pm->op_pmshort) {
938 if (pm->op_pmflags & PMf_SCANFIRST) {
939 if (SvSCREAM(TARG)) {
940 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
942 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
945 else if (!(s = fbm_instr((unsigned char*)s, (unsigned char*)strend,
948 if (s && rx->regback >= 0) {
949 ++BmUSEFUL(pm->op_pmshort);
957 else if (!multiline) {
958 if (*SvPVX(pm->op_pmshort) != *s ||
959 bcmp(SvPVX(pm->op_pmshort), s, pm->op_pmslen) ) {
960 if (pm->op_pmflags & PMf_FOLD) {
961 if (ibcmp(SvPVX(pm->op_pmshort), s, pm->op_pmslen) )
968 if (--BmUSEFUL(pm->op_pmshort) < 0) {
969 SvREFCNT_dec(pm->op_pmshort);
970 pm->op_pmshort = Nullsv; /* opt is being useless */
973 once = !(rpm->op_pmflags & PMf_GLOBAL);
974 if (rpm->op_pmflags & PMf_CONST) { /* known replacement string? */
975 c = SvPV(dstr, clen);
976 if (clen <= rx->minlen) {
977 /* can do inplace substitution */
978 if (regexec(rx, s, strend, orig, 0,
979 SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
980 if (rx->subbase) /* oops, no we can't */
984 SvSCREAM_off(TARG); /* disable possible screamer */
989 if (m - s > strend - d) { /* faster to shorten from end */
991 Copy(c, m, clen, char);
1000 SvCUR_set(TARG, m - s);
1007 else if (i = m - s) { /* faster from front */
1015 Copy(c, m, clen, char);
1024 Copy(c, d, clen, char);
1040 if (iters++ > maxiters)
1041 DIE("Substitution loop");
1046 Move(s, d, i, char);
1050 Copy(c, d, clen, char);
1054 } while (regexec(rx, s, strend, orig, s == m,
1055 Nullsv, TRUE)); /* (don't match same null twice) */
1058 SvCUR_set(TARG, d - SvPVX(TARG) + i);
1059 Move(s, d, i+1, char); /* include the Null */
1063 PUSHs(sv_2mortal(newSViv((I32)iters)));
1072 if (regexec(rx, s, strend, orig, 0,
1073 SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
1075 dstr = NEWSV(25, sv_len(TARG));
1076 sv_setpvn(dstr, m, s-m);
1079 register CONTEXT *cx;
1081 RETURNOP(cPMOP->op_pmreplroot);
1084 if (iters++ > maxiters)
1085 DIE("Substitution loop");
1086 if (rx->subbase && rx->subbase != orig) {
1091 strend = s + (strend - m);
1094 sv_catpvn(dstr, s, m-s);
1097 sv_catpvn(dstr, c, clen);
1100 } while (regexec(rx, s, strend, orig, s == m, Nullsv,
1102 sv_catpvn(dstr, s, strend - s);
1103 sv_replace(TARG, dstr);
1106 PUSHs(sv_2mortal(newSViv((I32)iters)));
1113 ++BmUSEFUL(pm->op_pmshort);
1121 register PMOP *pm = (PMOP*) cLOGOP->op_other;
1122 register CONTEXT *cx = &cxstack[cxstack_ix];
1123 register SV *dstr = cx->sb_dstr;
1124 register char *s = cx->sb_s;
1125 register char *m = cx->sb_m;
1126 char *orig = cx->sb_orig;
1127 register REGEXP *rx = pm->op_pmregexp;
1129 if (cx->sb_iters++) {
1130 if (cx->sb_iters > cx->sb_maxiters)
1131 DIE("Substitution loop");
1133 sv_catsv(dstr, POPs);
1135 Safefree(rx->subbase);
1136 rx->subbase = cx->sb_subbase;
1139 if (cx->sb_once || !regexec(rx, s, cx->sb_strend, orig,
1140 s == m, Nullsv, cx->sb_safebase))
1142 SV *targ = cx->sb_targ;
1143 sv_catpvn(dstr, s, cx->sb_strend - s);
1144 sv_replace(targ, dstr);
1147 PUSHs(sv_2mortal(newSViv((I32)cx->sb_iters - 1)));
1149 RETURNOP(pm->op_next);
1152 if (rx->subbase && rx->subbase != orig) {
1155 cx->sb_orig = orig = rx->subbase;
1157 cx->sb_strend = s + (cx->sb_strend - m);
1159 cx->sb_m = m = rx->startp[0];
1160 sv_catpvn(dstr, s, m-s);
1161 cx->sb_s = rx->endp[0];
1162 cx->sb_subbase = rx->subbase;
1164 rx->subbase = Nullch; /* so recursion works */
1165 RETURNOP(pm->op_pmreplstart);
1173 if (op->op_flags & OPf_STACKED)
1180 PUSHi(do_trans(sv, op));
1184 /* Lvalue operators. */
1189 if (tainting && tainted && (!SvRMAGICAL(lstr) || !mg_find(lstr, 't'))) {
1192 SvSetSV(rstr, lstr);
1201 SV **lastlelem = stack_sp;
1202 SV **lastrelem = stack_base + POPMARK;
1203 SV **firstrelem = stack_base + POPMARK + 1;
1204 SV **firstlelem = lastrelem + 1;
1206 register SV **relem;
1207 register SV **lelem;
1216 delaymagic = DM_DELAY; /* catch simultaneous items */
1218 /* If there's a common identifier on both sides we have to take
1219 * special care that assigning the identifier on the left doesn't
1220 * clobber a value on the right that's used later in the list.
1222 if (op->op_private & OPpASSIGN_COMMON) {
1223 for (relem = firstrelem; relem <= lastrelem; relem++) {
1226 *relem = sv_mortalcopy(sv);
1234 while (lelem <= lastlelem) {
1236 switch (SvTYPE(sv)) {
1239 magic = SvSMAGICAL(ary) != 0;
1243 while (relem <= lastrelem) { /* gobble up all the rest */
1246 sv_setsv(sv,*relem);
1248 (void)av_store(ary,i++,sv);
1258 magic = SvSMAGICAL(hash) != 0;
1261 while (relem < lastrelem) { /* gobble up all the rest */
1266 sv = &sv_no, relem++;
1267 tmps = SvPV(sv, len);
1268 tmpstr = NEWSV(29,0);
1270 sv_setsv(tmpstr,*relem); /* value */
1271 *(relem++) = tmpstr;
1272 (void)hv_store(hash,tmps,len,tmpstr,0);
1279 if (SvTHINKFIRST(sv)) {
1280 if (SvREADONLY(sv) && curcop != &compiling) {
1281 if (sv != &sv_undef && sv != &sv_yes && sv != &sv_no)
1283 if (relem <= lastrelem)
1290 if (relem <= lastrelem) {
1291 sv_setsv(sv, *relem);
1295 sv_setsv(sv, &sv_undef);
1300 if (delaymagic & ~DM_DELAY) {
1301 if (delaymagic & DM_UID) {
1303 (void)setreuid(uid,euid);
1304 #else /* not HAS_SETREUID */
1306 if ((delaymagic & DM_UID) == DM_RUID) {
1308 delaymagic =~ DM_RUID;
1310 #endif /* HAS_SETRUID */
1312 if ((delaymagic & DM_UID) == DM_EUID) {
1314 delaymagic =~ DM_EUID;
1316 #endif /* HAS_SETEUID */
1317 if (delaymagic & DM_UID) {
1319 DIE("No setreuid available");
1322 #endif /* not HAS_SETREUID */
1323 uid = (int)getuid();
1324 euid = (int)geteuid();
1326 if (delaymagic & DM_GID) {
1328 (void)setregid(gid,egid);
1329 #else /* not HAS_SETREGID */
1331 if ((delaymagic & DM_GID) == DM_RGID) {
1333 delaymagic =~ DM_RGID;
1335 #endif /* HAS_SETRGID */
1337 if ((delaymagic & DM_GID) == DM_EGID) {
1339 delaymagic =~ DM_EGID;
1341 #endif /* HAS_SETEGID */
1342 if (delaymagic & DM_GID) {
1344 DIE("No setregid available");
1347 #endif /* not HAS_SETREGID */
1348 gid = (int)getgid();
1349 egid = (int)getegid();
1351 tainting |= (euid != uid || egid != gid);
1354 if (GIMME == G_ARRAY) {
1358 SP = firstrelem + (lastlelem - firstlelem);
1364 SETi(lastrelem - firstrelem + 1);
1385 dSP; dMARK; dTARGET;
1387 do_chop(TARG, POPs);
1403 if (!sv || !SvANY(sv))
1405 switch (SvTYPE(sv)) {
1430 if (!op->op_private)
1437 if (SvTHINKFIRST(sv)) {
1444 switch (SvTYPE(sv)) {
1458 if (sv != GvSV(defgv)) {
1459 if (SvPOK(sv) && SvLEN(sv)) {
1461 Safefree(SvPVX(sv));
1462 SvPV_set(sv, Nullch);
1476 register unsigned char *s;
1479 register I32 *sfirst;
1480 register I32 *snext;
1484 s = (unsigned char*)(SvPV(TARG, len));
1487 SvSCREAM_off(lastscream);
1493 if (pos > maxscream) {
1494 if (maxscream < 0) {
1495 maxscream = pos + 80;
1496 New(301, screamfirst, 256, I32);
1497 New(302, screamnext, maxscream, I32);
1500 maxscream = pos + pos / 4;
1501 Renew(screamnext, maxscream, I32);
1505 sfirst = screamfirst;
1508 if (!sfirst || !snext)
1509 DIE("do_study: out of memory");
1511 for (ch = 256; ch; --ch)
1515 while (--pos >= 0) {
1517 if (sfirst[ch] >= 0)
1518 snext[pos] = sfirst[ch] - pos;
1523 /* If there were any case insensitive searches, we must assume they
1524 * all are. This speeds up insensitive searches much more than
1525 * it slows down sensitive ones.
1528 sfirst[fold[ch]] = pos;
1534 XPUSHs(sv_2mortal(newSViv((I32)retval)));
1557 sv_setsv(TARG, TOPs);
1569 sv_setsv(TARG, TOPs);
1576 /* Ordinary operators. */
1580 dSP; dATARGET; dPOPTOPnnrl;
1581 SETn( pow( left, right) );
1587 dSP; dATARGET; dPOPTOPnnrl;
1588 SETn( left * right );
1594 dSP; dATARGET; dPOPnv;
1596 DIE("Illegal division by zero");
1598 /* insure that 20./5. == 4. */
1603 if ((double)(I32)x == x &&
1604 (double)(I32)value == value &&
1605 (k = (I32)x/(I32)value)*(I32)value == (I32)x) {
1612 value = POPn / value;
1621 register unsigned long tmpulong;
1622 register long tmplong;
1625 tmpulong = (unsigned long) POPn;
1627 DIE("Illegal modulus zero");
1630 value = (I32)(((unsigned long)value) % tmpulong);
1632 tmplong = (long)value;
1633 value = (I32)(tmpulong - ((-tmplong - 1) % tmpulong)) - 1;
1642 register I32 count = POPi;
1643 if (GIMME == G_ARRAY && op->op_private & OPpREPEAT_DOLIST) {
1645 I32 items = SP - MARK;
1648 max = items * count;
1657 repeatcpy((char*)(MARK + items), (char*)MARK,
1658 items * sizeof(SV*), count - 1);
1662 else { /* Note: mark already snarfed by pp_list */
1667 if (TARG == tmpstr && SvTHINKFIRST(tmpstr)) {
1668 if (SvREADONLY(tmpstr) && curcop != &compiling)
1669 DIE("Can't x= to readonly value");
1673 SvSetSV(TARG, tmpstr);
1677 tmpstr = NEWSV(50, 0);
1678 tmps = SvPV(TARG, len);
1679 sv_setpvn(tmpstr, tmps, len);
1680 tmps = SvPV(tmpstr, tlen); /* force to be string */
1681 SvGROW(TARG, (count * len) + 1);
1682 repeatcpy((char*)SvPVX(TARG), tmps, tlen, count);
1683 SvCUR(TARG) *= count;
1684 *SvEND(TARG) = '\0';
1686 SvREFCNT_dec(tmpstr);
1689 sv_setsv(TARG, &sv_no);
1697 dSP; dATARGET; dPOPTOPnnrl;
1698 SETn( left + right );
1704 dSP; dATARGET; dPOPTOPiirl;
1705 SETi( left + right );
1711 dSP; dATARGET; dPOPTOPnnrl;
1712 SETn( left - right );
1718 dSP; dATARGET; dPOPTOPssrl;
1719 SvSetSV(TARG, lstr);
1720 sv_catsv(TARG, rstr);
1729 double value = TOPn;
1730 SETi( U_L(value) << anum );
1738 double value = TOPn;
1739 SETi( U_L(value) >> anum );
1746 SETs((TOPn < value) ? &sv_yes : &sv_no);
1753 SETs((TOPn > value) ? &sv_yes : &sv_no);
1760 SETs((TOPn <= value) ? &sv_yes : &sv_no);
1767 SETs((TOPn >= value) ? &sv_yes : &sv_no);
1774 SETs((TOPn == value) ? &sv_yes : &sv_no);
1781 SETs((TOPn != value) ? &sv_yes : &sv_no);
1787 dSP; dTARGET; dPOPTOPnnrl;
1792 else if (left < right)
1803 SETs( sv_cmp(lstr, rstr) < 0 ? &sv_yes : &sv_no );
1810 SETs( sv_cmp(lstr, rstr) > 0 ? &sv_yes : &sv_no );
1817 SETs( sv_cmp(lstr, rstr) <= 0 ? &sv_yes : &sv_no );
1824 SETs( sv_cmp(lstr, rstr) >= 0 ? &sv_yes : &sv_no );
1831 SETs( sv_eq(lstr, rstr) ? &sv_yes : &sv_no );
1838 SETs( !sv_eq(lstr, rstr) ? &sv_yes : &sv_no );
1846 SETi( sv_cmp(lstr, rstr) );
1852 dSP; dATARGET; dPOPTOPssrl;
1853 if (SvNIOK(lstr) || SvNIOK(rstr)) {
1854 I32 value = SvIV(lstr);
1855 value = value & SvIV(rstr);
1859 do_vop(op->op_type, TARG, lstr, rstr);
1867 dSP; dATARGET; dPOPTOPssrl;
1868 if (SvNIOK(lstr) || SvNIOK(rstr)) {
1869 I32 value = SvIV(lstr);
1870 value = value ^ SvIV(rstr);
1874 do_vop(op->op_type, TARG, lstr, rstr);
1882 dSP; dATARGET; dPOPTOPssrl;
1883 if (SvNIOK(lstr) || SvNIOK(rstr)) {
1884 I32 value = SvIV(lstr);
1885 value = value | SvIV(rstr);
1889 do_vop(op->op_type, TARG, lstr, rstr);
1904 *stack_sp = SvTRUE(*stack_sp) ? &sv_no : &sv_yes;
1910 dSP; dTARGET; dTOPss;
1917 register char *tmps;
1918 register long *tmpl;
1922 tmps = SvPV(TARG, len);
1925 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1928 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1932 for ( ; anum > 0; anum--, tmps++)
1940 /* High falutin' math. */
1944 dSP; dTARGET; dPOPTOPnnrl;
1945 SETn(atan2(left, right));
1954 value = SvNVx(GvSV(defgv));
1967 value = SvNVx(GvSV(defgv));
1986 value = rand() * value / 2147483648.0;
1989 value = rand() * value / 65536.0;
1992 value = rand() * value / 32768.0;
1994 value = rand() * value / (double)(((unsigned long)1) << RANDBITS);
2024 value = SvNVx(GvSV(defgv));
2037 value = SvNVx(GvSV(defgv));
2041 DIE("Can't take log of %g\n", value);
2052 value = SvNVx(GvSV(defgv));
2056 DIE("Can't take sqrt of %g\n", value);
2057 value = sqrt(value);
2067 value = SvNVx(GvSV(defgv));
2071 (void)modf(value, &value);
2073 (void)modf(-value, &value);
2085 value = SvNVx(GvSV(defgv));
2103 tmps = SvPVx(GvSV(defgv), na);
2106 XPUSHi( scan_hex(tmps, 99, &argtype) );
2118 tmps = SvPVx(GvSV(defgv), na);
2121 while (*tmps && (isSPACE(*tmps) || *tmps == '0'))
2124 value = (I32)scan_hex(++tmps, 99, &argtype);
2126 value = (I32)scan_oct(tmps, 99, &argtype);
2137 XPUSHi( sv_len(GvSV(defgv)) );
2140 SETi( sv_len(TOPs) );
2152 I32 lvalue = op->op_flags & OPf_LVAL;
2157 pos = POPi - arybase;
2159 tmps = SvPV(sv, curlen); /* force conversion to string */
2161 pos += curlen + arybase;
2162 if (pos < 0 || pos > curlen)
2163 sv_setpvn(TARG, "", 0);
2170 rem = curlen - pos; /* rem=how many bytes left*/
2173 sv_setpvn(TARG, tmps, rem);
2174 if (lvalue) { /* it's an lvalue! */
2175 if (SvTHINKFIRST(sv)) {
2176 if (SvREADONLY(sv) && curcop != &compiling)
2183 LvTARGOFF(TARG) = tmps - SvPV(sv, na);
2184 LvTARGLEN(TARG) = rem;
2187 PUSHs(TARG); /* avoid SvSETMAGIC here */
2194 register I32 size = POPi;
2195 register I32 offset = POPi;
2196 register SV *src = POPs;
2197 I32 lvalue = op->op_flags & OPf_LVAL;
2199 unsigned char *s = (unsigned char*)SvPV(src, srclen);
2200 unsigned long retnum;
2203 offset *= size; /* turn into bit offset */
2204 len = (offset + size + 7) / 8;
2205 if (offset < 0 || size < 1)
2207 else if (!lvalue && len > srclen)
2212 (void)memzero(SvPVX(src) + srclen, len - srclen);
2213 SvCUR_set(src, len);
2215 s = (unsigned char*)SvPV(src, na);
2217 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
2222 else if (size == 16)
2223 retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
2224 else if (size == 32)
2225 retnum = ((unsigned long) s[offset] << 24) +
2226 ((unsigned long) s[offset + 1] << 16) +
2227 (s[offset + 2] << 8) + s[offset+3];
2230 if (lvalue) { /* it's an lvalue! */
2231 if (SvTHINKFIRST(src)) {
2232 if (SvREADONLY(src) && curcop != &compiling)
2239 LvTARGOFF(TARG) = offset;
2240 LvTARGLEN(TARG) = size;
2244 sv_setiv(TARG, (I32)retnum);
2263 offset = POPi - arybase;
2266 tmps = SvPV(big, biglen);
2269 else if (offset > biglen)
2271 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2272 (unsigned char*)tmps + biglen, little)))
2273 retval = -1 + arybase;
2275 retval = tmps2 - tmps + arybase;
2297 tmps2 = SvPV(little, llen);
2298 tmps = SvPV(big, blen);
2302 offset = SvIV(offstr) - arybase + llen;
2305 else if (offset > blen)
2307 if (!(tmps2 = rninstr(tmps, tmps + offset,
2308 tmps2, tmps2 + llen)))
2309 retval = -1 + arybase;
2311 retval = tmps2 - tmps + arybase;
2318 dSP; dMARK; dORIGMARK; dTARGET;
2319 do_sprintf(TARG, SP-MARK, MARK+1);
2330 register char *s = SvPV(sv, len);
2331 register char *send = s + len;
2332 register char *base;
2333 register I32 skipspaces = 0;
2336 bool postspace = FALSE;
2343 New(804, fops, send - s, U16); /* Almost certainly too long... */
2348 *fpc++ = FF_LINEMARK;
2349 noblank = repeat = FALSE;
2367 case ' ': case '\t':
2380 *fpc++ = FF_LITERAL;
2387 *fpc++ = skipspaces;
2391 *fpc++ = FF_NEWLINE;
2395 arg = fpc - linepc + 1;
2402 *fpc++ = FF_LINEMARK;
2403 noblank = repeat = FALSE;
2412 ischop = s[-1] == '^';
2418 arg = (s - base) - 1;
2420 *fpc++ = FF_LITERAL;
2429 *fpc++ = FF_LINEGLOB;
2431 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
2432 arg = ischop ? 512 : 0;
2442 arg |= 256 + (s - f);
2444 *fpc++ = s - base; /* fieldsize for FETCH */
2445 *fpc++ = FF_DECIMAL;
2450 bool ismore = FALSE;
2453 while (*++s == '>') ;
2454 prespace = FF_SPACE;
2456 else if (*s == '|') {
2457 while (*++s == '|') ;
2458 prespace = FF_HALFSPACE;
2463 while (*++s == '<') ;
2466 if (*s == '.' && s[1] == '.' && s[2] == '.') {
2470 *fpc++ = s - base; /* fieldsize for FETCH */
2472 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
2490 SvGROW(sv, SvCUR(sv) + arg * sizeof(U16) + 4);
2492 s = SvPVX(sv) + SvCUR(sv);
2493 s += 2 + (SvCUR(sv) & 1);
2495 Copy(fops, s, arg, U16);
2501 dSP; dMARK; dORIGMARK;
2502 register SV *form = *++MARK;
2507 register char *send;
2513 bool chopspace = (strchr(chopset, ' ') != Nullch);
2522 if (!SvCOMPILED(form)) {
2523 SvREADONLY_off(form);
2527 SvUPGRADE(formtarget, SVt_PV);
2528 SvGROW(formtarget, SvCUR(formtarget) + SvCUR(form) + 1);
2529 t = SvPV(formtarget, len);
2531 f = SvPV(form, len);
2543 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
2544 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
2545 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
2546 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
2547 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
2549 case FF_CHECKNL: name = "CHECKNL"; break;
2550 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
2551 case FF_SPACE: name = "SPACE"; break;
2552 case FF_HALFSPACE: name = "HALFSPACE"; break;
2553 case FF_ITEM: name = "ITEM"; break;
2554 case FF_CHOP: name = "CHOP"; break;
2555 case FF_LINEGLOB: name = "LINEGLOB"; break;
2556 case FF_NEWLINE: name = "NEWLINE"; break;
2557 case FF_MORE: name = "MORE"; break;
2558 case FF_LINEMARK: name = "LINEMARK"; break;
2559 case FF_END: name = "END"; break;
2562 fprintf(stderr, "%-16s%d\n", name, arg);
2564 fprintf(stderr, "%-16s\n", name);
2595 warn("Not enough format arguments");
2602 if (itemsize > fieldsize)
2603 itemsize = fieldsize;
2604 send = chophere = s + itemsize;
2608 else if (*s == '\n')
2612 itemsize = s - SvPVX(sv);
2618 if (itemsize <= fieldsize) {
2619 send = chophere = s + itemsize;
2622 itemsize = s - SvPVX(sv);
2630 itemsize = fieldsize;
2631 send = chophere = s + itemsize;
2632 while (s < send || (s == send && isSPACE(*s))) {
2642 if (strchr(chopset, *s))
2647 itemsize = chophere - SvPVX(sv);
2652 arg = fieldsize - itemsize;
2661 arg = fieldsize - itemsize;
2674 if ((*t++ = *s++) < ' ')
2682 while (*s && isSPACE(*s))
2693 send = s + itemsize;
2702 SvCUR_set(formtarget, t - SvPVX(formtarget));
2703 sv_catpvn(formtarget, SvPVX(sv), itemsize);
2704 SvGROW(formtarget, SvCUR(formtarget) + SvCUR(form) + 1);
2705 t = SvPVX(formtarget) + SvCUR(formtarget);
2710 /* If the field is marked with ^ and the value is undefined,
2713 if ((arg & 512) && !SvOK(sv)) {
2722 sprintf(t, "%#*.*f", fieldsize, arg & 255, value);
2724 sprintf(t, "%*.0f", fieldsize, value);
2731 while (t-- > linemark && *t == ' ') ;
2739 if (arg) { /* repeat until fields exhausted? */
2745 if (strnEQ(linemark, linemark - t, arg))
2746 DIE("Runaway format");
2748 arg = t - SvPVX(formtarget);
2750 (t - SvPVX(formtarget)) + (f - formmark) + 1);
2751 t = SvPVX(formtarget) + arg;
2762 arg = fieldsize - itemsize;
2769 if (strnEQ(s," ",3)) {
2770 while (s > SvPVX(formtarget) && isSPACE(s[-1]))
2781 SvCUR_set(formtarget, t - SvPVX(formtarget));
2782 FmLINES(formtarget) += lines;
2797 tmps = SvPVx(GvSV(defgv), na);
2801 value = (I32) (*tmps & 255);
2804 value = (I32) (anum & 255);
2815 if (SvTYPE(TARG) == SVt_NULL) {
2816 sv_upgrade(TARG,SVt_PV);
2822 *tmps = SvIVx(GvSV(defgv));
2832 dSP; dTARGET; dPOPTOPssrl;
2834 char *tmps = SvPV(lstr, na);
2836 sv_setpv(TARG, fcrypt(tmps, SvPV(rstr, na)));
2838 sv_setpv(TARG, crypt(tmps, SvPV(rstr, na)));
2842 "The crypt() function is unimplemented due to excessive paranoia.");
2854 if (!SvPADTMP(sv)) {
2861 if (isascii(*s) && islower(*s))
2873 if (!SvPADTMP(sv)) {
2880 if (isascii(*s) && isupper(*s))
2892 register char *send;
2895 if (!SvPADTMP(sv)) {
2904 if (isascii(*s) && islower(*s))
2916 register char *send;
2919 if (!SvPADTMP(sv)) {
2928 if (isascii(*s) && isupper(*s))
2945 if (SvTYPE(av) != SVt_PVAV)
2946 DIE("Not an array reference");
2947 if (op->op_flags & OPf_LVAL) {
2948 if (op->op_flags & OPf_INTRO)
2949 av = (AV*)save_svref((SV**)sv);
2955 if (SvTYPE(sv) == SVt_PVAV) {
2957 if (op->op_flags & OPf_LVAL) {
2963 if (SvTYPE(sv) != SVt_PVGV) {
2965 DIE(no_usym, "an array");
2966 sv = (SV*)gv_fetchpv(SvPV(sv, na), TRUE);
2969 if (op->op_flags & OPf_LVAL) {
2970 if (op->op_flags & OPf_INTRO)
2978 if (GIMME == G_ARRAY) {
2979 I32 maxarg = AvFILL(av) + 1;
2981 Copy(AvARRAY(av), SP+1, maxarg, SV*);
2986 I32 maxarg = AvFILL(av) + 1;
2995 AV *av = GvAV((GV*)cSVOP->op_sv);
2996 SV** svp = av_fetch(av, op->op_private - arybase, op->op_flags & OPf_LVAL);
2997 PUSHs(svp ? *svp : &sv_undef);
3005 I32 elem = POPi - arybase;
3008 if (op->op_flags & OPf_LVAL) {
3009 svp = av_fetch(av, elem, TRUE);
3010 if (!svp || *svp == &sv_undef)
3011 DIE(no_aelem, elem);
3012 if (op->op_flags & OPf_INTRO)
3014 else if (!SvOK(*svp)) {
3015 if (op->op_private == OP_RV2HV) {
3018 sv_upgrade(*svp, SVt_RV);
3019 SvRV(*svp) = SvREFCNT_inc(newHV());
3023 else if (op->op_private == OP_RV2AV) {
3026 sv_upgrade(*svp, SVt_RV);
3027 SvRV(*svp) = SvREFCNT_inc(newAV());
3034 svp = av_fetch(av, elem, FALSE);
3035 PUSHs(svp ? *svp : &sv_undef);
3041 dSP; dMARK; dORIGMARK;
3043 register AV* av = (AV*)POPs;
3044 register I32 lval = op->op_flags & OPf_LVAL;
3045 I32 is_something_there = lval;
3047 while (++MARK <= SP) {
3048 I32 elem = SvIVx(*MARK);
3051 svp = av_fetch(av, elem, TRUE);
3052 if (!svp || *svp == &sv_undef)
3053 DIE(no_aelem, elem);
3054 if (op->op_flags & OPf_INTRO)
3058 svp = av_fetch(av, elem, FALSE);
3059 if (!is_something_there && svp && SvOK(*svp))
3060 is_something_there = TRUE;
3062 *MARK = svp ? *svp : &sv_undef;
3064 if (!is_something_there)
3069 /* Associative arrays. */
3074 HV *hash = (HV*)POPs;
3075 HE *entry = hv_iternext(hash);
3081 tmps = hv_iterkey(entry, &i);
3084 PUSHs(sv_2mortal(newSVpv(tmps, i)));
3085 if (GIMME == G_ARRAY) {
3086 sv_setsv(TARG, hv_iterval(hash, entry));
3090 else if (GIMME == G_SCALAR)
3115 DIE("Not an associative array reference");
3117 tmps = SvPV(tmpsv, len);
3118 sv = hv_delete(hv, tmps, len);
3132 if (SvTYPE(sv) == SVt_RV) {
3134 if (SvTYPE(hv) != SVt_PVHV)
3135 DIE("Not an associative array reference");
3136 if (op->op_flags & OPf_LVAL) {
3137 if (op->op_flags & OPf_INTRO)
3138 hv = (HV*)save_svref((SV**)sv);
3144 if (SvTYPE(sv) == SVt_PVHV) {
3146 if (op->op_flags & OPf_LVAL) {
3152 if (SvTYPE(sv) != SVt_PVGV) {
3154 DIE(no_usym, "a hash");
3155 sv = (SV*)gv_fetchpv(SvPV(sv, na), TRUE);
3158 if (op->op_flags & OPf_LVAL) {
3159 if (op->op_flags & OPf_INTRO)
3167 if (GIMME == G_ARRAY) { /* array wanted */
3168 *stack_sp = (SV*)hv;
3174 sprintf(buf, "%d/%d", HvFILL(hv), HvMAX(hv)+1);
3175 sv_setpv(TARG, buf);
3190 char *key = SvPV(keysv, keylen);
3193 if (op->op_flags & OPf_LVAL) {
3194 svp = hv_fetch(hv, key, keylen, TRUE);
3195 if (!svp || *svp == &sv_undef)
3197 if (op->op_flags & OPf_INTRO)
3199 else if (!SvOK(*svp)) {
3200 if (op->op_private == OP_RV2HV) {
3203 sv_upgrade(*svp, SVt_RV);
3204 SvRV(*svp) = SvREFCNT_inc(newHV());
3208 else if (op->op_private == OP_RV2AV) {
3211 sv_upgrade(*svp, SVt_RV);
3212 SvRV(*svp) = SvREFCNT_inc(newAV());
3219 svp = hv_fetch(hv, key, keylen, FALSE);
3220 PUSHs(svp ? *svp : &sv_undef);
3226 dSP; dMARK; dORIGMARK;
3228 register HV *hv = (HV*)POPs;
3229 register I32 lval = op->op_flags & OPf_LVAL;
3230 I32 is_something_there = lval;
3232 while (++MARK <= SP) {
3234 char *key = SvPV(*MARK, keylen);
3237 svp = hv_fetch(hv, key, keylen, TRUE);
3238 if (!svp || *svp == &sv_undef)
3240 if (op->op_flags & OPf_INTRO)
3244 svp = hv_fetch(hv, key, keylen, FALSE);
3245 if (!is_something_there && svp && SvOK(*svp))
3246 is_something_there = TRUE;
3248 *MARK = svp ? *svp : &sv_undef;
3250 if (!is_something_there)
3255 /* Explosives and implosives. */
3264 register char *pat = SvPV(lstr, llen);
3265 register char *s = SvPV(rstr, rlen);
3266 char *strend = s + rlen;
3268 register char *patend = pat + llen;
3273 /* These must not be in registers: */
3284 unsigned quad auquad;
3290 register U32 culong;
3292 static char* bitcount = 0;
3294 if (GIMME != G_ARRAY) { /* arrange to do first one only */
3296 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3297 if (strchr("aAbBhH", *patend) || *pat == '%') {
3299 while (isDIGIT(*patend) || *patend == '*')
3305 while (pat < patend) {
3310 else if (*pat == '*') {
3311 len = strend - strbeg; /* long enough */
3314 else if (isDIGIT(*pat)) {
3316 while (isDIGIT(*pat))
3317 len = (len * 10) + (*pat++ - '0');
3320 len = (datumtype != '@');
3325 if (len == 1 && pat[-1] != '1')
3334 if (len > strend - strbeg)
3335 DIE("@ outside of string");
3339 if (len > s - strbeg)
3340 DIE("X outside of string");
3344 if (len > strend - s)
3345 DIE("x outside of string");
3350 if (len > strend - s)
3353 goto uchar_checksum;
3354 sv = NEWSV(35, len);
3355 sv_setpvn(sv, s, len);
3357 if (datumtype == 'A') {
3358 aptr = s; /* borrow register */
3359 s = SvPVX(sv) + len - 1;
3360 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3363 SvCUR_set(sv, s - SvPVX(sv));
3364 s = aptr; /* unborrow register */
3366 XPUSHs(sv_2mortal(sv));
3370 if (pat[-1] == '*' || len > (strend - s) * 8)
3371 len = (strend - s) * 8;
3374 Newz(601, bitcount, 256, char);
3375 for (bits = 1; bits < 256; bits++) {
3376 if (bits & 1) bitcount[bits]++;
3377 if (bits & 2) bitcount[bits]++;
3378 if (bits & 4) bitcount[bits]++;
3379 if (bits & 8) bitcount[bits]++;
3380 if (bits & 16) bitcount[bits]++;
3381 if (bits & 32) bitcount[bits]++;
3382 if (bits & 64) bitcount[bits]++;
3383 if (bits & 128) bitcount[bits]++;
3387 culong += bitcount[*(unsigned char*)s++];
3392 if (datumtype == 'b') {
3394 if (bits & 1) culong++;
3400 if (bits & 128) culong++;
3407 sv = NEWSV(35, len + 1);
3410 aptr = pat; /* borrow register */
3412 if (datumtype == 'b') {
3414 for (len = 0; len < aint; len++) {
3415 if (len & 7) /*SUPPRESS 595*/
3419 *pat++ = '0' + (bits & 1);
3424 for (len = 0; len < aint; len++) {
3429 *pat++ = '0' + ((bits & 128) != 0);
3433 pat = aptr; /* unborrow register */
3434 XPUSHs(sv_2mortal(sv));
3438 if (pat[-1] == '*' || len > (strend - s) * 2)
3439 len = (strend - s) * 2;
3440 sv = NEWSV(35, len + 1);
3443 aptr = pat; /* borrow register */
3445 if (datumtype == 'h') {
3447 for (len = 0; len < aint; len++) {
3452 *pat++ = hexdigit[bits & 15];
3457 for (len = 0; len < aint; len++) {
3462 *pat++ = hexdigit[(bits >> 4) & 15];
3466 pat = aptr; /* unborrow register */
3467 XPUSHs(sv_2mortal(sv));
3470 if (len > strend - s)
3475 if (aint >= 128) /* fake up signed chars */
3484 if (aint >= 128) /* fake up signed chars */
3487 sv_setiv(sv, (I32)aint);
3488 PUSHs(sv_2mortal(sv));
3493 if (len > strend - s)
3507 sv_setiv(sv, (I32)auint);
3508 PUSHs(sv_2mortal(sv));
3513 along = (strend - s) / sizeof(I16);
3518 Copy(s, &ashort, 1, I16);
3526 Copy(s, &ashort, 1, I16);
3529 sv_setiv(sv, (I32)ashort);
3530 PUSHs(sv_2mortal(sv));
3537 along = (strend - s) / sizeof(U16);
3542 Copy(s, &aushort, 1, U16);
3545 if (datumtype == 'n')
3546 aushort = ntohs(aushort);
3549 if (datumtype == 'v')
3550 aushort = vtohs(aushort);
3558 Copy(s, &aushort, 1, U16);
3562 if (datumtype == 'n')
3563 aushort = ntohs(aushort);
3566 if (datumtype == 'v')
3567 aushort = vtohs(aushort);
3569 sv_setiv(sv, (I32)aushort);
3570 PUSHs(sv_2mortal(sv));
3575 along = (strend - s) / sizeof(int);
3580 Copy(s, &aint, 1, int);
3583 cdouble += (double)aint;
3591 Copy(s, &aint, 1, int);
3594 sv_setiv(sv, (I32)aint);
3595 PUSHs(sv_2mortal(sv));
3600 along = (strend - s) / sizeof(unsigned int);
3605 Copy(s, &auint, 1, unsigned int);
3606 s += sizeof(unsigned int);
3608 cdouble += (double)auint;
3616 Copy(s, &auint, 1, unsigned int);
3617 s += sizeof(unsigned int);
3619 sv_setiv(sv, (I32)auint);
3620 PUSHs(sv_2mortal(sv));
3625 along = (strend - s) / sizeof(I32);
3630 Copy(s, &along, 1, I32);
3633 cdouble += (double)along;
3641 Copy(s, &along, 1, I32);
3644 sv_setiv(sv, (I32)along);
3645 PUSHs(sv_2mortal(sv));
3652 along = (strend - s) / sizeof(U32);
3657 Copy(s, &aulong, 1, U32);
3660 if (datumtype == 'N')
3661 aulong = ntohl(aulong);
3664 if (datumtype == 'V')
3665 aulong = vtohl(aulong);
3668 cdouble += (double)aulong;
3676 Copy(s, &aulong, 1, U32);
3680 if (datumtype == 'N')
3681 aulong = ntohl(aulong);
3684 if (datumtype == 'V')
3685 aulong = vtohl(aulong);
3687 sv_setnv(sv, (double)aulong);
3688 PUSHs(sv_2mortal(sv));
3693 along = (strend - s) / sizeof(char*);
3698 if (sizeof(char*) > strend - s)
3701 Copy(s, &aptr, 1, char*);
3707 PUSHs(sv_2mortal(sv));
3712 if (sizeof(char*) > strend - s)
3715 Copy(s, &aptr, 1, char*);
3720 sv_setpvn(sv, aptr, len);
3721 PUSHs(sv_2mortal(sv));
3727 if (s + sizeof(quad) > strend)
3730 Copy(s, &aquad, 1, quad);
3734 sv_setnv(sv, (double)aquad);
3735 PUSHs(sv_2mortal(sv));
3741 if (s + sizeof(unsigned quad) > strend)
3744 Copy(s, &auquad, 1, unsigned quad);
3745 s += sizeof(unsigned quad);
3748 sv_setnv(sv, (double)auquad);
3749 PUSHs(sv_2mortal(sv));
3753 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
3756 along = (strend - s) / sizeof(float);
3761 Copy(s, &afloat, 1, float);
3769 Copy(s, &afloat, 1, float);
3772 sv_setnv(sv, (double)afloat);
3773 PUSHs(sv_2mortal(sv));
3779 along = (strend - s) / sizeof(double);
3784 Copy(s, &adouble, 1, double);
3785 s += sizeof(double);
3792 Copy(s, &adouble, 1, double);
3793 s += sizeof(double);
3795 sv_setnv(sv, (double)adouble);
3796 PUSHs(sv_2mortal(sv));
3801 along = (strend - s) * 3 / 4;
3802 sv = NEWSV(42, along);
3803 while (s < strend && *s > ' ' && *s < 'a') {
3808 len = (*s++ - ' ') & 077;
3810 if (s < strend && *s >= ' ')
3811 a = (*s++ - ' ') & 077;
3814 if (s < strend && *s >= ' ')
3815 b = (*s++ - ' ') & 077;
3818 if (s < strend && *s >= ' ')
3819 c = (*s++ - ' ') & 077;
3822 if (s < strend && *s >= ' ')
3823 d = (*s++ - ' ') & 077;
3826 hunk[0] = a << 2 | b >> 4;
3827 hunk[1] = b << 4 | c >> 2;
3828 hunk[2] = c << 6 | d;
3829 sv_catpvn(sv, hunk, len > 3 ? 3 : len);
3834 else if (s[1] == '\n') /* possible checksum byte */
3837 XPUSHs(sv_2mortal(sv));
3842 if (strchr("fFdD", datumtype) ||
3843 (checksum > 32 && strchr("iIlLN", datumtype)) ) {
3848 while (checksum >= 16) {
3852 while (checksum >= 4) {
3858 along = (1 << checksum) - 1;
3859 while (cdouble < 0.0)
3861 cdouble = modf(cdouble / adouble, &trouble) * adouble;
3862 sv_setnv(sv, cdouble);
3865 if (checksum < 32) {
3866 along = (1 << checksum) - 1;
3867 culong &= (U32)along;
3869 sv_setnv(sv, (double)culong);
3871 XPUSHs(sv_2mortal(sv));
3879 doencodes(sv, s, len)
3887 sv_catpvn(sv, hunk, 1);
3890 hunk[0] = ' ' + (077 & (*s >> 2));
3891 hunk[1] = ' ' + (077 & ((*s << 4) & 060 | (s[1] >> 4) & 017));
3892 hunk[2] = ' ' + (077 & ((s[1] << 2) & 074 | (s[2] >> 6) & 03));
3893 hunk[3] = ' ' + (077 & (s[2] & 077));
3894 sv_catpvn(sv, hunk, 4);
3898 for (s = SvPVX(sv); *s; s++) {
3902 sv_catpvn(sv, "\n", 1);
3907 dSP; dMARK; dORIGMARK; dTARGET;
3908 register SV *cat = TARG;
3911 register char *pat = SvPVx(*++MARK, fromlen);
3912 register char *patend = pat + fromlen;
3917 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
3918 static char *space10 = " ";
3920 /* These must not be in registers: */
3929 unsigned quad auquad;
3937 sv_setpvn(cat, "", 0);
3938 while (pat < patend) {
3939 #define NEXTFROM (items-- > 0 ? *MARK++ : &sv_no)
3942 len = strchr("@Xxu", datumtype) ? 0 : items;
3945 else if (isDIGIT(*pat)) {
3947 while (isDIGIT(*pat))
3948 len = (len * 10) + (*pat++ - '0');
3956 DIE("% may only be used in unpack");
3967 if (SvCUR(cat) < len)
3968 DIE("X outside of string");
3975 sv_catpvn(cat, null10, 10);
3978 sv_catpvn(cat, null10, len);
3983 aptr = SvPV(fromstr, fromlen);
3987 sv_catpvn(cat, aptr, len);
3989 sv_catpvn(cat, aptr, fromlen);
3991 if (datumtype == 'A') {
3993 sv_catpvn(cat, space10, 10);
3996 sv_catpvn(cat, space10, len);
4000 sv_catpvn(cat, null10, 10);
4003 sv_catpvn(cat, null10, len);
4010 char *savepat = pat;
4015 aptr = SvPV(fromstr, fromlen);
4020 SvCUR(cat) += (len+7)/8;
4021 SvGROW(cat, SvCUR(cat) + 1);
4022 aptr = SvPVX(cat) + aint;
4027 if (datumtype == 'B') {
4028 for (len = 0; len++ < aint;) {
4029 items |= *pat++ & 1;
4033 *aptr++ = items & 0xff;
4039 for (len = 0; len++ < aint;) {
4045 *aptr++ = items & 0xff;
4051 if (datumtype == 'B')
4052 items <<= 7 - (aint & 7);
4054 items >>= 7 - (aint & 7);
4055 *aptr++ = items & 0xff;
4057 pat = SvPVX(cat) + SvCUR(cat);
4068 char *savepat = pat;
4073 aptr = SvPV(fromstr, fromlen);
4078 SvCUR(cat) += (len+1)/2;
4079 SvGROW(cat, SvCUR(cat) + 1);
4080 aptr = SvPVX(cat) + aint;
4085 if (datumtype == 'H') {
4086 for (len = 0; len++ < aint;) {
4088 items |= ((*pat++ & 15) + 9) & 15;
4090 items |= *pat++ & 15;
4094 *aptr++ = items & 0xff;
4100 for (len = 0; len++ < aint;) {
4102 items |= (((*pat++ & 15) + 9) & 15) << 4;
4104 items |= (*pat++ & 15) << 4;
4108 *aptr++ = items & 0xff;
4114 *aptr++ = items & 0xff;
4115 pat = SvPVX(cat) + SvCUR(cat);
4127 aint = SvIV(fromstr);
4129 sv_catpvn(cat, &achar, sizeof(char));
4132 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4137 afloat = (float)SvNV(fromstr);
4138 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4145 adouble = (double)SvNV(fromstr);
4146 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4152 ashort = (I16)SvIV(fromstr);
4154 ashort = htons(ashort);
4156 sv_catpvn(cat, (char*)&ashort, sizeof(I16));
4162 ashort = (I16)SvIV(fromstr);
4164 ashort = htovs(ashort);
4166 sv_catpvn(cat, (char*)&ashort, sizeof(I16));
4173 ashort = (I16)SvIV(fromstr);
4174 sv_catpvn(cat, (char*)&ashort, sizeof(I16));
4180 auint = U_I(SvNV(fromstr));
4181 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4187 aint = SvIV(fromstr);
4188 sv_catpvn(cat, (char*)&aint, sizeof(int));
4194 aulong = U_L(SvNV(fromstr));
4196 aulong = htonl(aulong);
4198 sv_catpvn(cat, (char*)&aulong, sizeof(U32));
4204 aulong = U_L(SvNV(fromstr));
4206 aulong = htovl(aulong);
4208 sv_catpvn(cat, (char*)&aulong, sizeof(U32));
4214 aulong = U_L(SvNV(fromstr));
4215 sv_catpvn(cat, (char*)&aulong, sizeof(U32));
4221 along = SvIV(fromstr);
4222 sv_catpvn(cat, (char*)&along, sizeof(I32));
4229 auquad = (unsigned quad)SvNV(fromstr);
4230 sv_catpvn(cat, (char*)&auquad, sizeof(unsigned quad));
4236 aquad = (quad)SvNV(fromstr);
4237 sv_catpvn(cat, (char*)&aquad, sizeof(quad));
4242 len = 1; /* assume SV is correct length */
4247 aptr = SvPV(fromstr, na);
4248 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4253 aptr = SvPV(fromstr, fromlen);
4254 SvGROW(cat, fromlen * 4 / 3);
4259 while (fromlen > 0) {
4266 doencodes(cat, aptr, todo);
4284 register I32 limit = POPi; /* note, negative is forever */
4287 register char *s = SvPV(sv, len);
4288 char *strend = s + len;
4289 register PMOP *pm = (PMOP*)POPs;
4293 I32 maxiters = (strend - s) + 10;
4296 I32 origlimit = limit;
4300 register REGEXP *rx = pm->op_pmregexp;
4304 DIE("panic: do_split");
4305 if (pm->op_pmreplroot)
4306 ary = GvAVn((GV*)pm->op_pmreplroot);
4307 else if (gimme != G_ARRAY)
4311 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4315 for (i = AvFILL(ary); i >= 0; i--)
4316 AvARRAY(ary)[i] = Nullsv; /* don't free mere refs */
4318 av_fill(ary,0); /* force allocation */
4320 /* temporarily switch stacks */
4322 SWITCHSTACK(stack, ary);
4324 base = SP - stack_base + 1;
4326 if (pm->op_pmflags & PMf_SKIPWHITE) {
4331 limit = maxiters + 2;
4332 if (strEQ("\\s+", rx->precomp)) {
4335 for (m = s; m < strend && !isSPACE(*m); m++) ;
4338 dstr = NEWSV(30, m-s);
4339 sv_setpvn(dstr, s, m-s);
4344 for (s = m + 1; s < strend && isSPACE(*s); s++) ;
4347 else if (strEQ("^", rx->precomp)) {
4350 for (m = s; m < strend && *m != '\n'; m++) ;
4354 dstr = NEWSV(30, m-s);
4355 sv_setpvn(dstr, s, m-s);
4362 else if (pm->op_pmshort) {
4363 i = SvCUR(pm->op_pmshort);
4365 I32 fold = (pm->op_pmflags & PMf_FOLD);
4366 i = *SvPVX(pm->op_pmshort);
4367 if (fold && isUPPER(i))
4372 m < strend && *m != i &&
4373 (!isUPPER(*m) || tolower(*m) != i);
4374 m++) /*SUPPRESS 530*/
4377 else /*SUPPRESS 530*/
4378 for (m = s; m < strend && *m != i; m++) ;
4381 dstr = NEWSV(30, m-s);
4382 sv_setpvn(dstr, s, m-s);
4391 while (s < strend && --limit &&
4392 (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
4396 dstr = NEWSV(31, m-s);
4397 sv_setpvn(dstr, s, m-s);
4406 maxiters += (strend - s) * rx->nparens;
4407 while (s < strend && --limit &&
4408 regexec(rx, s, strend, orig, 1, Nullsv, TRUE) ) {
4410 && rx->subbase != orig) {
4415 strend = s + (strend - m);
4418 dstr = NEWSV(32, m-s);
4419 sv_setpvn(dstr, s, m-s);
4424 for (i = 1; i <= rx->nparens; i++) {
4427 dstr = NEWSV(33, m-s);
4428 sv_setpvn(dstr, s, m-s);
4437 iters = (SP - stack_base) - base;
4438 if (iters > maxiters)
4440 if (s < strend || origlimit) { /* keep field after final delim? */
4441 dstr = NEWSV(34, strend-s);
4442 sv_setpvn(dstr, s, strend-s);
4449 while (iters > 0 && SvCUR(TOPs) == 0)
4453 SWITCHSTACK(ary, oldstack);
4454 if (gimme == G_ARRAY) {
4456 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4462 if (gimme == G_ARRAY)
4465 SP = stack_base + base;
4473 dSP; dMARK; dTARGET;
4475 do_join(TARG, *MARK, MARK, SP);
4481 /* List operators. */
4486 if (GIMME != G_ARRAY) {
4488 *MARK = *SP; /* unwanted list, return last item */
4499 SV **lastrelem = stack_sp;
4500 SV **lastlelem = stack_base + POPMARK;
4501 SV **firstlelem = stack_base + POPMARK + 1;
4502 register SV **firstrelem = lastlelem + 1;
4503 I32 lval = op->op_flags & OPf_LVAL;
4504 I32 is_something_there = lval;
4506 register I32 max = lastrelem - lastlelem;
4507 register SV **lelem;
4510 if (GIMME != G_ARRAY) {
4511 ix = SvIVx(*lastlelem) - arybase;
4512 if (ix < 0 || ix >= max)
4513 *firstlelem = &sv_undef;
4515 *firstlelem = firstrelem[ix];
4521 SP = firstlelem - 1;
4525 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4526 ix = SvIVx(*lelem) - arybase;
4531 else if (!(*lelem = firstrelem[ix]))
4534 else if (ix >= max || !(*lelem = firstrelem[ix]))
4536 if (!is_something_there && SvOK(*lelem))
4537 is_something_there = TRUE;
4539 if (is_something_there)
4542 SP = firstlelem - 1;
4549 I32 items = SP - MARK;
4551 XPUSHs((SV*)av_make(items, MARK+1));
4557 dSP; dMARK; dORIGMARK;
4563 SV *val = NEWSV(46, 0);
4565 sv_setsv(val, *++MARK);
4567 (void)hv_store(hv,tmps,SvCUROK(key),val,0);
4577 dSP; dMARK; dORIGMARK;
4578 register AV *ary = (AV*)*++MARK;
4582 register I32 offset;
4583 register I32 length;
4592 offset = SvIVx(*MARK);
4594 offset += AvFILL(ary) + 1;
4598 length = SvIVx(*MARK++);
4603 length = AvMAX(ary) + 1; /* close enough to infinity */
4607 length = AvMAX(ary) + 1;
4615 if (offset > AvFILL(ary) + 1)
4616 offset = AvFILL(ary) + 1;
4617 after = AvFILL(ary) + 1 - (offset + length);
4618 if (after < 0) { /* not that much array */
4619 length += after; /* offset+length now in array */
4621 if (!AvALLOC(ary)) {
4627 /* At this point, MARK .. SP-1 is our new LIST */
4630 diff = newlen - length;
4632 if (diff < 0) { /* shrinking the area */
4634 New(451, tmparyval, newlen, SV*); /* so remember insertion */
4635 Copy(MARK, tmparyval, newlen, SV*);
4638 MARK = ORIGMARK + 1;
4639 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4640 MEXTEND(MARK, length);
4641 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4643 for (i = length, dst = MARK; i; i--)
4644 sv_2mortal(*dst++); /* free them eventualy */
4649 *MARK = AvARRAY(ary)[offset+length-1];
4652 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4653 SvREFCNT_dec(*dst++); /* free them now */
4656 AvFILL(ary) += diff;
4658 /* pull up or down? */
4660 if (offset < after) { /* easier to pull up */
4661 if (offset) { /* esp. if nothing to pull */
4662 src = &AvARRAY(ary)[offset-1];
4663 dst = src - diff; /* diff is negative */
4664 for (i = offset; i > 0; i--) /* can't trust Copy */
4667 Zero(AvARRAY(ary), -diff, SV*);
4668 AvARRAY(ary) -= diff; /* diff is negative */
4672 if (after) { /* anything to pull down? */
4673 src = AvARRAY(ary) + offset + length;
4674 dst = src + diff; /* diff is negative */
4675 Move(src, dst, after, SV*);
4677 Zero(&AvARRAY(ary)[AvFILL(ary)+1], -diff, SV*);
4678 /* avoid later double free */
4681 for (src = tmparyval, dst = AvARRAY(ary) + offset;
4683 *dst = NEWSV(46, 0);
4684 sv_setsv(*dst++, *src++);
4686 Safefree(tmparyval);
4689 else { /* no, expanding (or same) */
4691 New(452, tmparyval, length, SV*); /* so remember deletion */
4692 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4695 if (diff > 0) { /* expanding */
4697 /* push up or down? */
4699 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4703 Move(src, dst, offset, SV*);
4705 AvARRAY(ary) -= diff; /* diff is positive */
4707 AvFILL(ary) += diff;
4710 if (AvFILL(ary) + diff >= AvMAX(ary)) /* oh, well */
4711 av_store(ary, AvFILL(ary) + diff, Nullsv);
4713 AvFILL(ary) += diff;
4714 dst = AvARRAY(ary) + AvFILL(ary);
4715 for (i = diff; i > 0; i--) {
4716 if (*dst) /* stuff was hanging around */
4717 SvREFCNT_dec(*dst); /* after $#foo */
4721 dst = AvARRAY(ary) + AvFILL(ary);
4723 for (i = after; i; i--) {
4730 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
4731 *dst = NEWSV(46, 0);
4732 sv_setsv(*dst++, *src++);
4734 MARK = ORIGMARK + 1;
4735 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4737 Copy(tmparyval, MARK, length, SV*);
4739 for (i = length, dst = MARK; i; i--)
4740 sv_2mortal(*dst++); /* free them eventualy */
4742 Safefree(tmparyval);
4746 else if (length--) {
4747 *MARK = tmparyval[length];
4750 while (length-- > 0)
4751 SvREFCNT_dec(tmparyval[length]);
4753 Safefree(tmparyval);
4764 dSP; dMARK; dORIGMARK; dTARGET;
4765 register AV *ary = (AV*)*++MARK;
4766 register SV *sv = &sv_undef;
4768 for (++MARK; MARK <= SP; MARK++) {
4771 sv_setsv(sv, *MARK);
4772 (void)av_push(ary, sv);
4775 PUSHi( AvFILL(ary) + 1 );
4783 SV *sv = av_pop(av);
4787 (void)sv_2mortal(sv);
4796 SV *sv = av_shift(av);
4801 (void)sv_2mortal(sv);
4808 dSP; dMARK; dORIGMARK; dTARGET;
4809 register AV *ary = (AV*)*++MARK;
4813 av_unshift(ary, SP - MARK);
4816 sv_setsv(sv, *++MARK);
4817 (void)av_store(ary, i++, sv);
4821 PUSHi( AvFILL(ary) + 1 );
4830 if (stack_base + *markstack_ptr == sp) {
4832 RETURNOP(op->op_next->op_next);
4834 stack_sp = stack_base + *markstack_ptr + 1;
4835 pp_pushmark(); /* push dst */
4836 pp_pushmark(); /* push src */
4837 ENTER; /* enter outer scope */
4840 SAVESPTR(GvSV(defgv));
4842 ENTER; /* enter inner scope */
4845 if (src = stack_base[*markstack_ptr]) {
4850 GvSV(defgv) = sv_newmortal();
4852 RETURNOP(((LOGOP*)op->op_next)->op_other);
4860 stack_base[markstack_ptr[-1]++] = stack_base[*markstack_ptr];
4862 LEAVE; /* exit inner scope */
4865 if (stack_base + *markstack_ptr > sp) {
4868 LEAVE; /* exit outer scope */
4869 POPMARK; /* pop src */
4870 items = --*markstack_ptr - markstack_ptr[-1];
4871 POPMARK; /* pop dst */
4872 SP = stack_base + POPMARK; /* pop original mark */
4873 if (GIMME != G_ARRAY) {
4884 ENTER; /* enter inner scope */
4887 if (src = stack_base[*markstack_ptr]) {
4892 GvSV(defgv) = sv_newmortal();
4894 RETURNOP(cLOGOP->op_other);
4898 static int sortcmp();
4899 static int sortcv();
4903 dSP; dMARK; dORIGMARK;
4905 SV **myorigmark = ORIGMARK;
4913 if (GIMME != G_ARRAY) {
4918 if (op->op_flags & OPf_STACKED) {
4919 if (op->op_flags & OPf_SPECIAL) {
4920 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
4921 kid = kUNOP->op_first; /* pass rv2gv */
4922 kid = kUNOP->op_first; /* pass leave */
4923 sortcop = kid->op_next;
4924 stash = curcop->cop_stash;
4927 cv = sv_2cv(*++MARK, &stash, &gv, 0);
4928 if (!(cv && CvROOT(cv))) {
4930 SV *tmpstr = sv_newmortal();
4931 gv_efullname(tmpstr, gv);
4933 DIE("Usersub \"%s\" called in sort", SvPVX(tmpstr));
4934 DIE("Undefined sort subroutine \"%s\" called",
4939 DIE("Usersub called in sort");
4940 DIE("Undefined subroutine in sort");
4942 DIE("Not a subroutine reference in sort");
4944 sortcop = CvSTART(cv);
4945 SAVESPTR(CvROOT(cv)->op_ppaddr);
4946 CvROOT(cv)->op_ppaddr = ppaddr[OP_NULL];
4951 stash = curcop->cop_stash;
4954 up = myorigmark + 1;
4955 while (MARK < SP) { /* This may or may not shift down one here. */
4957 if (*up = *++MARK) { /* Weed out nulls. */
4959 (void)sv_2pv(*up, &na);
4965 max = --up - myorigmark;
4976 sortstack = newAV();
4977 av_store(sortstack, 32, Nullsv);
4978 av_clear(sortstack);
4979 AvREAL_off(sortstack);
4981 SWITCHSTACK(stack, sortstack);
4982 if (sortstash != stash) {
4983 firstgv = gv_fetchpv("a", TRUE);
4984 secondgv = gv_fetchpv("b", TRUE);
4988 SAVESPTR(GvSV(firstgv));
4989 SAVESPTR(GvSV(secondgv));
4991 qsort((char*)(myorigmark+1), max, sizeof(SV*), sortcv);
4993 SWITCHSTACK(sortstack, oldstack);
4998 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
4999 qsort((char*)(ORIGMARK+1), max, sizeof(SV*), sortcmp);
5002 SP = ORIGMARK + max;
5012 if (GIMME == G_ARRAY) {
5023 register char *down;
5029 do_join(TARG, &sv_no, MARK, SP);
5031 sv_setsv(TARG, *SP);
5032 up = SvPV(TARG, len);
5034 down = SvPVX(TARG) + len - 1;
5052 if (GIMME == G_ARRAY)
5053 return cCONDOP->op_true;
5054 return SvTRUEx(PAD_SV(op->op_targ)) ? cCONDOP->op_false : cCONDOP->op_true;
5061 if (GIMME == G_ARRAY) {
5062 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
5066 SV *targ = PAD_SV(op->op_targ);
5068 if ((op->op_private & OPpFLIP_LINENUM)
5069 ? last_in_gv && SvIV(sv) == IoLINES(GvIO(last_in_gv))
5071 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
5072 if (op->op_flags & OPf_SPECIAL) {
5079 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
5092 if (GIMME == G_ARRAY) {
5098 if (SvNIOK(lstr) || !SvPOK(lstr) ||
5099 (looks_like_number(lstr) && *SvPVX(lstr) != '0') ) {
5103 EXTEND(SP, max - i + 1);
5105 sv = sv_mortalcopy(&sv_no);
5111 SV *final = sv_mortalcopy(rstr);
5113 char *tmps = SvPV(final, len);
5115 sv = sv_mortalcopy(lstr);
5116 while (!SvNIOK(sv) && SvCUR(sv) <= len &&
5117 strNE(SvPVX(sv),tmps) ) {
5119 sv = sv_2mortal(newSVsv(sv));
5122 if (strEQ(SvPVX(sv),tmps))
5128 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
5130 if ((op->op_private & OPpFLIP_LINENUM)
5131 ? last_in_gv && SvIV(sv) == IoLINES(GvIO(last_in_gv))
5133 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
5134 sv_catpv(targ, "E0");
5149 register CONTEXT *cx;
5151 for (i = cxstack_ix; i >= 0; i--) {
5153 switch (cx->cx_type) {
5156 warn("Exiting substitution via %s", op_name[op->op_type]);
5160 warn("Exiting subroutine via %s", op_name[op->op_type]);
5164 warn("Exiting eval via %s", op_name[op->op_type]);
5167 if (!cx->blk_loop.label ||
5168 strNE(label, cx->blk_loop.label) ) {
5169 DEBUG_l(deb("(Skipping label #%d %s)\n",
5170 i, cx->blk_loop.label));
5173 DEBUG_l( deb("(Found label #%d %s)\n", i, label));
5180 dopoptosub(startingblock)
5184 register CONTEXT *cx;
5185 for (i = startingblock; i >= 0; i--) {
5187 switch (cx->cx_type) {
5192 DEBUG_l( deb("(Found sub #%d)\n", i));
5200 dopoptoeval(startingblock)
5204 register CONTEXT *cx;
5205 for (i = startingblock; i >= 0; i--) {
5207 switch (cx->cx_type) {
5211 DEBUG_l( deb("(Found eval #%d)\n", i));
5219 dopoptoloop(startingblock)
5223 register CONTEXT *cx;
5224 for (i = startingblock; i >= 0; i--) {
5226 switch (cx->cx_type) {
5229 warn("Exiting substitition via %s", op_name[op->op_type]);
5233 warn("Exiting subroutine via %s", op_name[op->op_type]);
5237 warn("Exiting eval via %s", op_name[op->op_type]);
5240 DEBUG_l( deb("(Found loop #%d)\n", i));
5251 register CONTEXT *cx;
5255 while (cxstack_ix > cxix) {
5256 cx = &cxstack[cxstack_ix--];
5257 DEBUG_l(fprintf(stderr, "Unwinding block %d, type %s\n", cxstack_ix+1,
5258 block_type[cx->cx_type]));
5259 /* Note: we don't need to restore the base context info till the end. */
5260 switch (cx->cx_type) {
5293 va_start(args, pat);
5297 message = mess(pat, args);
5299 restartop = die_where(message);
5300 if (stack != mainstack)
5301 longjmp(top_env, 3);
5311 register CONTEXT *cx;
5315 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),message);
5316 cxix = dopoptoeval(cxstack_ix);
5320 if (cxix < cxstack_ix)
5324 if (cx->cx_type != CXt_EVAL) {
5325 fprintf(stderr, "panic: die %s", message);
5330 if (gimme == G_SCALAR)
5331 *++newsp = &sv_undef;
5335 if (optype == OP_REQUIRE)
5336 DIE("%s", SvPVx(GvSV(gv_fetchpv("@",TRUE)), na));
5337 return pop_return();
5340 fputs(message, stderr);
5341 (void)fflush(stderr);
5343 (void)UNLINK(e_tmpname);
5345 my_exit((I32)((errno&255)?errno:((statusvalue&255)?statusvalue:255)));
5356 RETURNOP(cLOGOP->op_other);
5367 RETURNOP(cLOGOP->op_other);
5375 RETURNOP(cCONDOP->op_true);
5377 RETURNOP(cCONDOP->op_false);
5386 RETURNOP(cLOGOP->op_other);
5395 RETURNOP(cLOGOP->op_other);
5414 !(iogv = gv_fetchpv(SvPVX(sv), FALSE)) ||
5415 !(ob=(SV*)GvIO(iogv)))
5417 char *name = SvPVX(((SVOP*)cLOGOP->op_other)->op_sv);
5419 char* packname = SvPV(sv, na);
5421 if (!isALPHA(*packname))
5422 DIE("Can't call method \"%s\" without a package or object reference", name);
5423 if (!(stash = fetch_stash(sv, FALSE)))
5424 DIE("Can't call method \"%s\" in empty package \"%s\"",
5426 gv = gv_fetchmethod(stash,name);
5428 DIE("Can't locate object method \"%s\" via package \"%s\"",
5436 if (!ob || !SvOBJECT(ob)) {
5437 char *name = SvPVX(((SVOP*)cLOGOP->op_other)->op_sv);
5438 DIE("Can't call method \"%s\" on unblessed reference", name);
5441 if (!gv) { /* nothing cached */
5442 char *name = SvPVX(((SVOP*)cLOGOP->op_other)->op_sv);
5443 gv = gv_fetchmethod(SvSTASH(ob),name);
5445 DIE("Can't locate object method \"%s\" via package \"%s\"",
5446 name, HvNAME(SvSTASH(ob)));
5461 register I32 items = SP - MARK;
5462 I32 hasargs = (op->op_flags & OPf_STACKED) != 0;
5463 register CONTEXT *cx;
5466 DIE("Not a subroutine reference");
5467 switch (SvTYPE(sv)) {
5471 DIE(no_usym, "a subroutine");
5472 gv = gv_fetchpv(SvPV(sv, na), FALSE);
5482 if (SvTYPE(cv) == SVt_PVCV)
5487 DIE("Not a subroutine reference");
5492 if (!(cv = GvCV((GV*)sv)))
5493 cv = sv_2cv(sv, &stash, &gv, TRUE);
5502 DIE("Not a subroutine reference");
5504 if (!CvROOT(cv) && !CvUSERSUB(cv)) {
5505 if (gv = CvGV(cv)) {
5506 SV *tmpstr = sv_newmortal();
5508 gv_efullname(tmpstr, gv);
5509 ngv = gv_fetchmethod(GvESTASH(gv), "AUTOLOAD");
5510 if (ngv && ngv != gv && (cv = GvCV(ngv))) { /* One more chance... */
5512 sv_setsv(GvSV(gv), tmpstr);
5516 DIE("Undefined subroutine &%s called",SvPVX(tmpstr));
5518 DIE("Undefined subroutine called");
5521 if ((op->op_private & OPpSUBR_DB) && !CvUSERSUB(cv)) {
5525 gv_efullname(sv,gv);
5528 DIE("No DBsub routine");
5531 if (CvUSERSUB(cv)) {
5532 items = (*CvUSERSUB(cv))(CvUSERINDEX(cv), MARK - stack_base, items);
5533 sp = stack_base + items;
5539 AV* padlist = CvPADLIST(cv);
5540 SV** svp = AvARRAY(padlist);
5541 push_return(op->op_next);
5542 PUSHBLOCK(cx, CXt_SUB, MARK - 1);
5545 if (CvDEPTH(cv) >= 2) { /* save temporaries on recursion? */
5546 if (CvDEPTH(cv) == 100 && dowarn)
5547 warn("Deep recursion on subroutine \"%s\"",GvENAME(CvGV(cv)));
5548 if (CvDEPTH(cv) > AvFILL(padlist)) {
5549 AV *newpad = newAV();
5550 I32 ix = AvFILL((AV*)svp[1]);
5551 svp = AvARRAY(svp[0]);
5554 char *name = SvPVX(svp[ix]); /* XXX */
5556 av_store(newpad, ix--, (SV*)newAV());
5557 else if (*name == '%')
5558 av_store(newpad, ix--, (SV*)newHV());
5560 av_store(newpad, ix--, NEWSV(0,0));
5563 av_store(newpad, ix--, NEWSV(0,0));
5567 av_store(av, 0, Nullsv);
5568 av_store(newpad, 0, (SV*)av);
5572 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
5573 AvFILL(padlist) = CvDEPTH(cv);
5574 svp = AvARRAY(padlist);
5578 curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
5580 AV* av = (AV*)curpad[0];
5583 cx->blk_sub.savearray = GvAV(defgv);
5584 cx->blk_sub.argarray = av;
5585 GvAV(defgv) = cx->blk_sub.argarray;
5588 if (items >= AvMAX(av)) {
5590 if (AvARRAY(av) != ary) {
5591 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
5592 SvPVX(av) = (char*)ary;
5594 if (items >= AvMAX(av)) {
5595 AvMAX(av) = items - 1;
5596 Renew(ary,items+1,SV*);
5598 SvPVX(av) = (char*)ary;
5601 Copy(MARK,AvARRAY(av),items,SV*);
5602 AvFILL(av) = items - 1;
5609 RETURNOP(CvSTART(cv));
5619 register CONTEXT *cx;
5624 if (gimme == G_SCALAR) {
5627 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
5630 *MARK = sv_mortalcopy(TOPs);
5638 for (mark = newsp + 1; mark <= SP; mark++)
5639 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP)))
5640 *mark = sv_mortalcopy(*mark);
5641 /* in case LEAVE wipes old return values */
5646 return pop_return();
5651 return pop_return();
5657 register I32 cxix = dopoptosub(cxstack_ix);
5659 register CONTEXT *cx;
5668 if (GIMME != G_ARRAY)
5672 nextcxix = dopoptosub(cxix - 1);
5673 if (DBsub && nextcxix >= 0 &&
5674 cxstack[nextcxix].blk_sub.cv == GvCV(DBsub))
5680 cx = &cxstack[cxix];
5681 if (GIMME != G_ARRAY) {
5684 sv_setpv(TARG, HvNAME(cx->blk_oldcop->cop_stash));
5689 PUSHs(sv_2mortal(newSVpv(HvNAME(cx->blk_oldcop->cop_stash), 0)));
5690 PUSHs(sv_2mortal(newSVpv(SvPVX(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
5691 PUSHs(sv_2mortal(newSViv((I32)cx->blk_oldcop->cop_line)));
5694 if (cx->cx_type == CXt_SUB) {
5696 gv_efullname(sv, CvGV(cx->blk_sub.cv));
5697 PUSHs(sv_2mortal(sv));
5698 PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
5701 PUSHs(sv_2mortal(newSVpv("(eval)",0)));
5702 PUSHs(sv_2mortal(newSViv(0)));
5704 PUSHs(sv_2mortal(newSViv((I32)cx->blk_gimme)));
5705 if (cx->blk_sub.hasargs && curstash == debstash) {
5706 AV *ary = cx->blk_sub.argarray;
5710 dbargs = GvAV(gv_AVadd(tmpgv = gv_fetchpv("DB::args", TRUE)));
5714 if (AvMAX(dbargs) < AvFILL(ary))
5715 av_store(dbargs, AvFILL(ary), Nullsv);
5716 Copy(AvARRAY(ary), AvARRAY(dbargs), AvFILL(ary)+1, SV*);
5717 AvFILL(dbargs) = AvFILL(ary);
5727 I32 oldscopeix = scopestack_ix;
5729 GvSV(firstgv) = *str1;
5730 GvSV(secondgv) = *str2;
5731 stack_sp = stack_base;
5734 result = SvIVx(AvARRAY(stack)[1]);
5735 while (scopestack_ix > oldscopeix) {
5742 sortcmp(strp1, strp2)
5746 register SV *str1 = *strp1;
5747 register SV *str2 = *strp2;
5750 if (SvCUR(str1) < SvCUR(str2)) {
5752 if (retval = memcmp(SvPVX(str1), SvPVX(str2), SvCUR(str1)))
5758 else if (retval = memcmp(SvPVX(str1), SvPVX(str2), SvCUR(str2)))
5760 else if (SvCUR(str1) == SvCUR(str2))
5770 if (SP - MARK != 1) {
5772 do_join(TARG, &sv_no, MARK, SP);
5773 tmps = SvPV(TARG, na);
5777 tmps = SvPV(TOPs, na);
5779 if (!tmps || !*tmps) {
5780 SV *error = GvSV(gv_fetchpv("@", TRUE));
5781 SvUPGRADE(error, SVt_PV);
5782 if (SvPOK(error) && SvCUR(error))
5783 sv_catpv(error, "\t...caught");
5784 tmps = SvPV(error, na);
5786 if (!tmps || !*tmps)
5787 tmps = "Warning: something's wrong";
5796 if (SP - MARK != 1) {
5798 do_join(TARG, &sv_no, MARK, SP);
5799 tmps = SvPV(TARG, na);
5803 tmps = SvPV(TOPs, na);
5805 if (!tmps || !*tmps) {
5806 SV *error = GvSV(gv_fetchpv("@", TRUE));
5807 SvUPGRADE(error, SVt_PV);
5808 if (SvPOK(error) && SvCUR(error))
5809 sv_catpv(error, "\t...propagated");
5810 tmps = SvPV(error, na);
5812 if (!tmps || !*tmps)
5827 sv_reset(tmps, curcop->cop_stash);
5840 TAINT_NOT; /* Each statement is presumed innocent */
5841 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
5849 TAINT_NOT; /* Each statement is presumed innocent */
5850 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
5853 if (op->op_private || SvIV(DBsingle) || SvIV(DBsignal) || SvIV(DBtrace))
5857 register CONTEXT *cx;
5874 DIE("No DB::DB routine defined");
5876 if (CvDEPTH(cv) >= 1) /* don't do recursive DB::DB call */
5878 push_return(op->op_next);
5879 PUSHBLOCK(cx, CXt_SUB, sp - 1);
5883 curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),1,FALSE));
5884 RETURNOP(CvSTART(cv));
5893 TAINT_NOT; /* Each statement is presumed innocent */
5894 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
5896 oldsave = scopestack[scopestack_ix - 1];
5897 LEAVE_SCOPE(oldsave);
5904 register CONTEXT *cx;
5909 PUSHBLOCK(cx, CXt_BLOCK, sp);
5917 register CONTEXT *cx;
5924 if (GIMME == G_SCALAR) {
5927 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
5930 *MARK = sv_mortalcopy(TOPs);
5938 for (mark = newsp + 1; mark <= SP; mark++)
5939 if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP)))
5940 *mark = sv_mortalcopy(*mark);
5941 /* in case LEAVE wipes old return values */
5957 register CONTEXT *cx;
5958 SV **svp = &GvSV((GV*)POPs);
5965 PUSHBLOCK(cx, CXt_LOOP, SP);
5966 PUSHLOOP(cx, svp, MARK);
5967 cx->blk_loop.iterary = stack;
5968 cx->blk_loop.iterix = MARK - stack_base;
5976 register CONTEXT *cx;
5980 cx = &cxstack[cxstack_ix];
5981 if (cx->cx_type != CXt_LOOP)
5982 DIE("panic: pp_iter");
5984 if (cx->blk_loop.iterix >= cx->blk_oldsp)
5987 if (sv = AvARRAY(cx->blk_loop.iterary)[++cx->blk_loop.iterix]) {
5989 *cx->blk_loop.itervar = sv;
5992 *cx->blk_loop.itervar = &sv_undef;
6000 register CONTEXT *cx;
6007 PUSHBLOCK(cx, CXt_LOOP, SP);
6008 PUSHLOOP(cx, 0, SP);
6016 register CONTEXT *cx;
6024 if (gimme == G_SCALAR) {
6026 *++newsp = sv_mortalcopy(*SP);
6028 *++newsp = &sv_undef;
6032 *++newsp = sv_mortalcopy(*++mark);
6045 register CONTEXT *cx;
6050 if (stack == sortstack) {
6051 AvARRAY(stack)[1] = *SP;
6055 cxix = dopoptosub(cxstack_ix);
6057 DIE("Can't return outside a subroutine");
6058 if (cxix < cxstack_ix)
6062 switch (cx->cx_type) {
6070 DIE("panic: return");
6074 if (gimme == G_SCALAR) {
6076 *++newsp = sv_mortalcopy(*SP);
6078 *++newsp = &sv_undef;
6079 if (optype == OP_REQUIRE && !SvTRUE(*newsp))
6080 DIE("%s", SvPVx(GvSV(gv_fetchpv("@",TRUE)), na));
6083 if (optype == OP_REQUIRE && MARK == SP)
6084 DIE("%s", SvPVx(GvSV(gv_fetchpv("@",TRUE)), na));
6086 *++newsp = sv_mortalcopy(*++MARK);
6091 return pop_return();
6098 register CONTEXT *cx;
6103 SV **mark = stack_base + cxstack[cxstack_ix].blk_oldsp;
6104 /* XXX The sp is probably not right yet... */
6106 if (op->op_flags & OPf_SPECIAL) {
6107 cxix = dopoptoloop(cxstack_ix);
6109 DIE("Can't \"last\" outside a block");
6112 cxix = dopoptolabel(cPVOP->op_pv);
6114 DIE("Label not found for \"last %s\"", cPVOP->op_pv);
6116 if (cxix < cxstack_ix)
6120 switch (cx->cx_type) {
6123 nextop = cx->blk_loop.last_op->op_next;
6128 nextop = pop_return();
6132 nextop = pop_return();
6139 if (gimme == G_SCALAR) {
6141 *++newsp = sv_mortalcopy(*SP);
6143 *++newsp = &sv_undef;
6147 *++newsp = sv_mortalcopy(*++mark);
6159 register CONTEXT *cx;
6162 if (op->op_flags & OPf_SPECIAL) {
6163 cxix = dopoptoloop(cxstack_ix);
6165 DIE("Can't \"next\" outside a block");
6168 cxix = dopoptolabel(cPVOP->op_pv);
6170 DIE("Label not found for \"next %s\"", cPVOP->op_pv);
6172 if (cxix < cxstack_ix)
6176 oldsave = scopestack[scopestack_ix - 1];
6177 LEAVE_SCOPE(oldsave);
6178 return cx->blk_loop.next_op;
6185 register CONTEXT *cx;
6188 if (op->op_flags & OPf_SPECIAL) {
6189 cxix = dopoptoloop(cxstack_ix);
6191 DIE("Can't \"redo\" outside a block");
6194 cxix = dopoptolabel(cPVOP->op_pv);
6196 DIE("Label not found for \"redo %s\"", cPVOP->op_pv);
6198 if (cxix < cxstack_ix)
6202 oldsave = scopestack[scopestack_ix - 1];
6203 LEAVE_SCOPE(oldsave);
6204 return cx->blk_loop.redo_op;
6207 static OP* lastgotoprobe;
6210 dofindlabel(op,label,opstack)
6218 if (op->op_type == OP_LEAVE ||
6219 op->op_type == OP_SCOPE ||
6220 op->op_type == OP_LEAVELOOP ||
6221 op->op_type == OP_LEAVETRY)
6222 *ops++ = cUNOP->op_first;
6224 if (op->op_flags & OPf_KIDS) {
6225 /* First try all the kids at this level, since that's likeliest. */
6226 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling) {
6227 if ((kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) &&
6228 kCOP->cop_label && strEQ(kCOP->cop_label, label))
6231 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling) {
6232 if (kid == lastgotoprobe)
6234 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
6235 if (ops > opstack &&
6236 (ops[-1]->op_type == OP_NEXTSTATE ||
6237 ops[-1]->op_type == OP_DBSTATE))
6242 if (op = dofindlabel(kid,label,ops))
6252 return pp_goto(ARGS);
6261 register CONTEXT *cx;
6267 if (op->op_flags & OPf_STACKED) {
6270 /* This egregious kludge implements goto &subroutine */
6271 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) {
6273 register CONTEXT *cx;
6274 CV* cv = (CV*)SvRV(sv);
6279 /* First do some returnish stuff. */
6280 cxix = dopoptosub(cxstack_ix);
6282 DIE("Can't goto subroutine outside a subroutine");
6283 if (cxix < cxstack_ix)
6287 *stack_sp = (SV*)cv;
6288 if (cx->blk_sub.hasargs) { /* put @_ back onto stack */
6289 items = AvFILL(cx->blk_sub.argarray) + 1;
6290 Copy(AvARRAY(cx->blk_sub.argarray), ++stack_sp, items, SV*);
6292 GvAV(defgv) = cx->blk_sub.savearray;
6294 if (!(CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth)) {
6295 if (CvDELETED(cx->blk_sub.cv))
6296 SvREFCNT_dec(cx->blk_sub.cv);
6298 oldsave = scopestack[scopestack_ix - 1];
6299 LEAVE_SCOPE(oldsave);
6301 /* Now do some callish stuff. */
6302 if (CvUSERSUB(cv)) {
6303 items = (*CvUSERSUB(cv))(CvUSERINDEX(cv),
6304 mark - stack_base, items);
6305 sp = stack_base + items;
6307 return pop_return();
6310 AV* padlist = CvPADLIST(cv);
6311 SV** svp = AvARRAY(padlist);
6312 cx->blk_sub.cv = cv;
6313 cx->blk_sub.olddepth = CvDEPTH(cv);
6315 if (CvDEPTH(cv) >= 2) { /* save temporaries on recursion? */
6316 if (CvDEPTH(cv) == 100 && dowarn)
6317 warn("Deep recursion on subroutine \"%s\"",
6319 if (CvDEPTH(cv) > AvFILL(padlist)) {
6320 AV *newpad = newAV();
6321 I32 ix = AvFILL((AV*)svp[1]);
6322 svp = AvARRAY(svp[0]);
6325 char *name = SvPVX(svp[ix]); /* XXX */
6327 av_store(newpad, ix--, (SV*)newAV());
6328 else if (*name == '%')
6329 av_store(newpad, ix--, (SV*)newHV());
6331 av_store(newpad, ix--, NEWSV(0,0));
6334 av_store(newpad, ix--, NEWSV(0,0));
6336 if (cx->blk_sub.hasargs) {
6338 av_store(av, 0, Nullsv);
6339 av_store(newpad, 0, (SV*)av);
6343 av_store(padlist, CvDEPTH(cv), (SV*)newpad);
6344 AvFILL(padlist) = CvDEPTH(cv);
6345 svp = AvARRAY(padlist);
6349 curpad = AvARRAY((AV*)svp[CvDEPTH(cv)]);
6350 if (cx->blk_sub.hasargs) {
6351 AV* av = (AV*)curpad[0];
6354 cx->blk_sub.savearray = GvAV(defgv);
6355 cx->blk_sub.argarray = av;
6356 GvAV(defgv) = cx->blk_sub.argarray;
6359 if (items >= AvMAX(av)) {
6361 if (AvARRAY(av) != ary) {
6362 AvMAX(av) += AvARRAY(av) - AvALLOC(av);
6363 SvPVX(av) = (char*)ary;
6365 if (items >= AvMAX(av)) {
6366 AvMAX(av) = items - 1;
6367 Renew(ary,items+1,SV*);
6369 SvPVX(av) = (char*)ary;
6372 Copy(mark,AvARRAY(av),items,SV*);
6373 AvFILL(av) = items - 1;
6380 RETURNOP(CvSTART(cv));
6384 label = SvPV(sv,na);
6386 else if (op->op_flags & OPf_SPECIAL) {
6387 if (op->op_type != OP_DUMP)
6388 DIE("goto must have label");
6391 label = cPVOP->op_pv;
6393 if (label && *label) {
6400 for (ix = cxstack_ix; ix >= 0; ix--) {
6402 switch (cx->cx_type) {
6404 gotoprobe = CvROOT(cx->blk_sub.cv);
6407 gotoprobe = eval_root; /* XXX not good for nested eval */
6410 gotoprobe = cx->blk_oldcop->op_sibling;
6416 gotoprobe = cx->blk_oldcop->op_sibling;
6418 gotoprobe = main_root;
6424 gotoprobe = main_root;
6427 retop = dofindlabel(gotoprobe, label, enterops);
6430 lastgotoprobe = gotoprobe;
6433 DIE("Can't find label %s", label);
6435 /* pop unwanted frames */
6437 if (ix < cxstack_ix) {
6444 oldsave = scopestack[scopestack_ix - 1];
6445 LEAVE_SCOPE(oldsave);
6448 /* push wanted frames */
6452 for (ix = 0 + (gotoprobe == main_root); enterops[ix]; ix++) {
6460 if (op->op_type == OP_DUMP) {
6466 restartop = 0; /* hmm, must be GNU unexec().. */
6490 double value = SvNVx(GvSV(cCOP->cop_gv));
6491 register I32 match = (I32)value;
6494 if (((double)match) > value)
6495 --match; /* was fractional--truncate other way */
6497 match -= cCOP->uop.scop.scop_offset;
6500 else if (match > cCOP->uop.scop.scop_max)
6501 match = cCOP->uop.scop.scop_max;
6502 op = cCOP->uop.scop.scop_next[match];
6512 op = op->op_next; /* can't assume anything */
6514 match = *(SvPVx(GvSV(cCOP->cop_gv), na)) & 255;
6515 match -= cCOP->uop.scop.scop_offset;
6518 else if (match > cCOP->uop.scop.scop_max)
6519 match = cCOP->uop.scop.scop_max;
6520 op = cCOP->uop.scop.scop_next[match];
6540 tmps = SvPV(sv, len);
6541 if (do_open(gv, tmps, len)) {
6542 IoLINES(GvIO(gv)) = 0;
6543 PUSHi( (I32)forkprocess );
6545 else if (forkprocess == 0) /* we are a new child */
6562 PUSHs( do_close(gv, TRUE) ? &sv_yes : &sv_no );
6586 do_close(rgv, FALSE);
6588 do_close(wgv, FALSE);
6593 IoIFP(rstio) = fdopen(fd[0], "r");
6594 IoOFP(wstio) = fdopen(fd[1], "w");
6595 IoIFP(wstio) = IoOFP(wstio);
6596 IoTYPE(rstio) = '<';
6597 IoTYPE(wstio) = '>';
6599 if (!IoIFP(rstio) || !IoOFP(wstio)) {
6600 if (IoIFP(rstio)) fclose(IoIFP(rstio));
6602 if (IoOFP(wstio)) fclose(IoOFP(wstio));
6612 DIE(no_func, "pipe");
6625 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io)))
6643 TAINT_PROPER("umask");
6646 DIE(no_func, "Unsupported function umask");
6664 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io)))
6669 if (!fflush(fp) && (fp->_flag |= _IOBIN))
6674 if (setmode(fileno(fp), OP_BINARY) != -1)
6692 SV **mark = stack_base + *markstack_ptr + 1; /* reuse in entersubr */
6696 stash = fetch_stash(mark[1], FALSE);
6697 if (!stash || !(gv = gv_fetchmethod(stash, "new")) || !GvCV(gv))
6698 DIE("Can't tie to package %s", SvPV(mark[1],na));
6700 Zero(&myop, 1, BINOP);
6701 myop.op_last = (OP *) &myop;
6702 myop.op_next = Nullop;
6703 myop.op_flags = OPf_STACKED;
6712 if (op = pp_entersubr())
6717 if (SvTYPE(varsv) == SVt_PVHV || SvTYPE(varsv) == SVt_PVAV)
6718 sv_magic(varsv, sv, 'P', 0, 0);
6720 sv_magic(varsv, sv, 'p', 0, -1);
6729 if (SvTYPE(TOPs) == SVt_PVHV || SvTYPE(TOPs) == SVt_PVAV)
6730 sv_unmagic(TOPs, 'P');
6732 sv_unmagic(TOPs, 'p');
6748 sv = sv_mortalcopy(&sv_no);
6749 sv_setpv(sv, "Any_DBM_File");
6750 stash = fetch_stash(sv, FALSE);
6751 if (!stash || !(gv = gv_fetchmethod(stash, "new")) || !GvCV(gv))
6752 DIE("No dbm on this machine");
6754 Zero(&myop, 1, BINOP);
6755 myop.op_last = (OP *) &myop;
6756 myop.op_next = Nullop;
6757 myop.op_flags = OPf_STACKED;
6770 PUSHs(sv_2mortal(newSViv(O_RDWR|O_CREAT)));
6772 PUSHs(sv_2mortal(newSViv(O_RDWR)));
6776 if (op = pp_entersubr())
6782 sv_magic((SV*)hv, sv, 'P', 0, 0);
6788 return pp_untie(ARGS);
6802 struct timeval timebuf;
6803 struct timeval *tbuf = &timebuf;
6806 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
6811 # if BYTEORDER & 0xf0000
6812 # define ORDERBYTE (0x88888888 - BYTEORDER)
6814 # define ORDERBYTE (0x4444 - BYTEORDER)
6820 for (i = 1; i <= 3; i++) {
6828 #if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678
6829 growsize = maxlen; /* little endians can use vecs directly */
6837 masksize = NFDBITS / NBBY;
6839 masksize = sizeof(long); /* documented int, everyone seems to use long */
6841 growsize = maxlen + (masksize - (maxlen % masksize));
6842 Zero(&fd_sets[0], 4, char*);
6850 timebuf.tv_sec = (long)value;
6851 value -= (double)timebuf.tv_sec;
6852 timebuf.tv_usec = (long)(value * 1000000.0);
6855 tbuf = Null(struct timeval*);
6857 for (i = 1; i <= 3; i++) {
6865 Sv_Grow(sv, growsize);
6866 s = SvPV(sv, na) + j;
6867 while (++j <= growsize) {
6871 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
6873 New(403, fd_sets[i], growsize, char);
6874 for (offset = 0; offset < growsize; offset += masksize) {
6875 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
6876 fd_sets[i][j+offset] = s[(k % masksize) + offset];
6879 fd_sets[i] = SvPVX(sv);
6889 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
6890 for (i = 1; i <= 3; i++) {
6894 for (offset = 0; offset < growsize; offset += masksize) {
6895 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
6896 s[(k % masksize) + offset] = fd_sets[i][j+offset];
6898 Safefree(fd_sets[i]);
6904 if (GIMME == G_ARRAY && tbuf) {
6905 value = (double)(timebuf.tv_sec) +
6906 (double)(timebuf.tv_usec) / 1000000.0;
6907 PUSHs(sv = sv_mortalcopy(&sv_no));
6908 sv_setnv(sv, value);
6912 DIE("select not implemented");
6919 GV *oldgv = defoutgv;
6920 if (op->op_private > 0) {
6921 defoutgv = (GV*)POPs;
6922 if (!GvIO(defoutgv))
6923 GvIO(defoutgv) = newIO();
6924 curoutgv = defoutgv;
6926 gv_efullname(TARG, oldgv);
6942 if (!gv || do_eof(gv)) /* make sure we have fp with something */
6945 sv_setpv(TARG, " ");
6946 *SvPVX(TARG) = getc(IoIFP(GvIO(gv))); /* should never be EOF */
6953 return pp_sysread(ARGS);
6962 register CONTEXT *cx;
6968 PUSHBLOCK(cx, CXt_SUB, stack_sp);
6970 defoutgv = gv; /* locally select filehandle so $% et al work */
7005 SV *tmpstr = sv_newmortal();
7006 gv_efullname(tmpstr, gv);
7007 DIE("Undefined format \"%s\" called",SvPVX(tmpstr));
7009 DIE("Not a format reference");
7012 return doform(cv,gv,op->op_next);
7018 GV *gv = cxstack[cxstack_ix].blk_sub.gv;
7019 register IO *io = GvIO(gv);
7020 FILE *ofp = IoOFP(io);
7025 register CONTEXT *cx;
7027 DEBUG_f(fprintf(stderr,"left=%ld, todo=%ld\n",
7028 (long)IoLINES_LEFT(io), (long)FmLINES(formtarget)));
7029 if (IoLINES_LEFT(io) < FmLINES(formtarget) &&
7030 formtarget != toptarget)
7032 if (!IoTOP_GV(io)) {
7036 if (!IoTOP_NAME(io)) {
7037 if (!IoFMT_NAME(io))
7038 IoFMT_NAME(io) = savestr(GvNAME(gv));
7039 sprintf(tmpbuf, "%s_TOP", IoFMT_NAME(io));
7040 topgv = gv_fetchpv(tmpbuf,FALSE);
7041 if (topgv && GvFORM(topgv))
7042 IoTOP_NAME(io) = savestr(tmpbuf);
7044 IoTOP_NAME(io) = savestr("top");
7046 topgv = gv_fetchpv(IoTOP_NAME(io),FALSE);
7047 if (!topgv || !GvFORM(topgv)) {
7048 IoLINES_LEFT(io) = 100000000;
7051 IoTOP_GV(io) = topgv;
7053 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
7054 fwrite(SvPVX(formfeed), SvCUR(formfeed), 1, ofp);
7055 IoLINES_LEFT(io) = IoPAGE_LEN(io);
7057 formtarget = toptarget;
7058 return doform(GvFORM(IoTOP_GV(io)),gv,op);
7070 warn("Filehandle only opened for input");
7072 warn("Write on closed filehandle");
7077 if ((IoLINES_LEFT(io) -= FmLINES(formtarget)) < 0) {
7079 warn("page overflow");
7081 if (!fwrite(SvPVX(formtarget), 1, SvCUR(formtarget), ofp) ||
7085 FmLINES(formtarget) = 0;
7086 SvCUR_set(formtarget, 0);
7087 if (IoFLAGS(io) & IOf_FLUSH)
7092 formtarget = bodytarget;
7094 return pop_return();
7099 dSP; dMARK; dORIGMARK;
7103 SV *sv = NEWSV(0,0);
7105 if (op->op_flags & OPf_STACKED)
7109 if (!(io = GvIO(gv))) {
7111 warn("Filehandle never opened");
7115 else if (!(fp = IoOFP(io))) {
7118 warn("Filehandle opened only for input");
7120 warn("printf on closed filehandle");
7126 do_sprintf(sv, SP - MARK, MARK + 1);
7127 if (!do_print(sv, fp))
7130 if (IoFLAGS(io) & IOf_FLUSH)
7131 if (fflush(fp) == EOF)
7148 dSP; dMARK; dORIGMARK;
7153 if (op->op_flags & OPf_STACKED)
7157 if (!(io = GvIO(gv))) {
7159 warn("Filehandle never opened");
7163 else if (!(fp = IoOFP(io))) {
7166 warn("Filehandle opened only for input");
7168 warn("print on closed filehandle");
7176 while (MARK <= SP) {
7177 if (!do_print(*MARK, fp))
7181 if (fwrite(ofs, 1, ofslen, fp) == 0 || ferror(fp)) {
7189 while (MARK <= SP) {
7190 if (!do_print(*MARK, fp))
7199 if (fwrite(ors, 1, orslen, fp) == 0 || ferror(fp))
7202 if (IoFLAGS(io) & IOf_FLUSH)
7203 if (fflush(fp) == EOF)
7219 dSP; dMARK; dORIGMARK; dTARGET;
7233 buffer = SvPV(bufstr, blen);
7234 length = SvIVx(*++MARK);
7235 if (SvTHINKFIRST(bufstr)) {
7236 if (SvREADONLY(bufstr) && curcop != &compiling)
7243 offset = SvIVx(*++MARK);
7247 warn("Too many args on read");
7249 if (!io || !IoIFP(io))
7252 if (op->op_type == OP_RECV) {
7253 bufsize = sizeof buf;
7254 SvGROW(bufstr, length+1), (buffer = SvPV(bufstr, blen)); /* sneaky */
7255 length = recvfrom(fileno(IoIFP(io)), buffer, length, offset,
7259 SvCUR_set(bufstr, length);
7260 *SvEND(bufstr) = '\0';
7263 sv_setpvn(TARG, buf, bufsize);
7268 if (op->op_type == OP_RECV)
7269 DIE(no_sock_func, "recv");
7271 SvGROW(bufstr, length+offset+1), (buffer = SvPV(bufstr, blen)); /* sneaky */
7272 if (op->op_type == OP_SYSREAD) {
7273 length = read(fileno(IoIFP(io)), buffer+offset, length);
7277 if (IoTYPE(io) == 's') {
7278 bufsize = sizeof buf;
7279 length = recvfrom(fileno(IoIFP(io)), buffer+offset, length, 0,
7284 length = fread(buffer+offset, 1, length, IoIFP(io));
7287 SvCUR_set(bufstr, length+offset);
7288 *SvEND(bufstr) = '\0';
7301 return pp_send(ARGS);
7306 dSP; dMARK; dORIGMARK; dTARGET;
7319 buffer = SvPV(bufstr, blen);
7320 length = SvIVx(*++MARK);
7323 if (!io || !IoIFP(io)) {
7326 if (op->op_type == OP_SYSWRITE)
7327 warn("Syswrite on closed filehandle");
7329 warn("Send on closed socket");
7332 else if (op->op_type == OP_SYSWRITE) {
7334 offset = SvIVx(*++MARK);
7338 warn("Too many args on syswrite");
7339 length = write(fileno(IoIFP(io)), buffer+offset, length);
7342 else if (SP >= MARK) {
7345 warn("Too many args on send");
7346 buffer = SvPVx(*++MARK, mlen);
7347 length = sendto(fileno(IoIFP(io)), buffer, blen, length, buffer, mlen);
7350 length = send(fileno(IoIFP(io)), buffer, blen, length);
7353 DIE(no_sock_func, "send");
7368 return pp_sysread(ARGS);
7380 PUSHs(!gv || do_eof(gv) ? &sv_yes : &sv_no);
7393 PUSHi( do_tell(gv) );
7405 PUSHs( do_seek(gv, offset, whence) ? &sv_yes : &sv_no );
7412 off_t len = (off_t)POPn;
7417 #if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE)
7419 if (op->op_flags & OPf_SPECIAL) {
7420 tmpgv = gv_fetchpv(POPp,FALSE);
7421 if (!tmpgv || !GvIO(tmpgv) || !IoIFP(GvIO(tmpgv)) ||
7422 ftruncate(fileno(IoIFP(GvIO(tmpgv))), len) < 0)
7425 else if (truncate(POPp, len) < 0)
7428 if (op->op_flags & OPf_SPECIAL) {
7429 tmpgv = gv_fetchpv(POPp,FALSE);
7430 if (!tmpgv || !GvIO(tmpgv) || !IoIFP(GvIO(tmpgv)) ||
7431 chsize(fileno(IoIFP(GvIO(tmpgv))), len) < 0)
7437 if ((tmpfd = open(POPp, 0)) < 0)
7440 if (chsize(tmpfd, len) < 0)
7453 DIE("truncate not implemented");
7459 return pp_ioctl(ARGS);
7466 unsigned int func = U_I(POPn);
7467 int optype = op->op_type;
7473 if (!io || !argstr || !IoIFP(io)) {
7474 errno = EBADF; /* well, sort of... */
7478 if (SvPOK(argstr) || !SvNIOK(argstr)) {
7481 s = SvPV(argstr, len);
7482 retval = IOCPARM_LEN(func);
7484 Sv_Grow(argstr, retval+1);
7485 SvCUR_set(argstr, retval);
7489 s[SvCUR(argstr)] = 17; /* a little sanity check here */
7492 retval = SvIV(argstr);
7494 s = (char*)(long)retval; /* ouch */
7496 s = (char*)retval; /* ouch */
7500 TAINT_PROPER(optype == OP_IOCTL ? "ioctl" : "fcntl");
7502 if (optype == OP_IOCTL)
7503 retval = ioctl(fileno(IoIFP(io)), func, s);
7506 DIE("fcntl is not implemented");
7509 retval = fcntl(fileno(IoIFP(io)), func, s);
7511 DIE("fcntl is not implemented");
7515 if (SvPOK(argstr)) {
7516 if (s[SvCUR(argstr)] != 17)
7517 DIE("Possible memory corruption: %s overflowed 3rd argument",
7519 s[SvCUR(argstr)] = 0; /* put our null back */
7528 PUSHp("0 but true", 10);
7547 fp = IoIFP(GvIO(gv));
7551 value = (I32)(flock(fileno(fp), argtype) >= 0);
7558 DIE(no_func, "flock()");
7570 int protocol = POPi;
7584 do_close(gv, FALSE);
7586 TAINT_PROPER("socket");
7587 fd = socket(domain, type, protocol);
7590 IoIFP(io) = fdopen(fd, "r"); /* stdio gets confused about sockets */
7591 IoOFP(io) = fdopen(fd, "w");
7593 if (!IoIFP(io) || !IoOFP(io)) {
7594 if (IoIFP(io)) fclose(IoIFP(io));
7595 if (IoOFP(io)) fclose(IoOFP(io));
7596 if (!IoIFP(io) && !IoOFP(io)) close(fd);
7602 DIE(no_sock_func, "socket");
7609 #ifdef HAS_SOCKETPAIR
7614 int protocol = POPi;
7627 do_close(gv1, FALSE);
7629 do_close(gv2, FALSE);
7631 TAINT_PROPER("socketpair");
7632 if (socketpair(domain, type, protocol, fd) < 0)
7634 IoIFP(io1) = fdopen(fd[0], "r");
7635 IoOFP(io1) = fdopen(fd[0], "w");
7637 IoIFP(io2) = fdopen(fd[1], "r");
7638 IoOFP(io2) = fdopen(fd[1], "w");
7640 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
7641 if (IoIFP(io1)) fclose(IoIFP(io1));
7642 if (IoOFP(io1)) fclose(IoOFP(io1));
7643 if (!IoIFP(io1) && !IoOFP(io1)) close(fd[0]);
7644 if (IoIFP(io2)) fclose(IoIFP(io2));
7645 if (IoOFP(io2)) fclose(IoOFP(io2));
7646 if (!IoIFP(io2) && !IoOFP(io2)) close(fd[1]);
7652 DIE(no_sock_func, "socketpair");
7663 register IO *io = GvIOn(gv);
7666 if (!io || !IoIFP(io))
7669 addr = SvPV(addrstr, len);
7670 TAINT_PROPER("bind");
7671 if (bind(fileno(IoIFP(io)), addr, len) >= 0)
7678 warn("bind() on closed fd");
7682 DIE(no_sock_func, "bind");
7693 register IO *io = GvIOn(gv);
7696 if (!io || !IoIFP(io))
7699 addr = SvPV(addrstr, len);
7700 TAINT_PROPER("connect");
7701 if (connect(fileno(IoIFP(io)), addr, len) >= 0)
7708 warn("connect() on closed fd");
7712 DIE(no_sock_func, "connect");
7722 register IO *io = GvIOn(gv);
7724 if (!io || !IoIFP(io))
7727 if (listen(fileno(IoIFP(io)), backlog) >= 0)
7734 warn("listen() on closed fd");
7738 DIE(no_sock_func, "listen");
7750 int len = sizeof buf;
7762 if (!gstio || !IoIFP(gstio))
7767 do_close(ngv, FALSE);
7769 fd = accept(fileno(IoIFP(gstio)), (struct sockaddr *)buf, &len);
7772 IoIFP(nstio) = fdopen(fd, "r");
7773 IoOFP(nstio) = fdopen(fd, "w");
7774 IoTYPE(nstio) = 's';
7775 if (!IoIFP(nstio) || !IoOFP(nstio)) {
7776 if (IoIFP(nstio)) fclose(IoIFP(nstio));
7777 if (IoOFP(nstio)) fclose(IoOFP(nstio));
7778 if (!IoIFP(nstio) && !IoOFP(nstio)) close(fd);
7787 warn("accept() on closed fd");
7794 DIE(no_sock_func, "accept");
7804 register IO *io = GvIOn(gv);
7806 if (!io || !IoIFP(io))
7809 PUSHi( shutdown(fileno(IoIFP(io)), how) >= 0 );
7814 warn("shutdown() on closed fd");
7818 DIE(no_sock_func, "shutdown");
7825 return pp_ssockopt(ARGS);
7827 DIE(no_sock_func, "getsockopt");
7835 int optype = op->op_type;
7838 unsigned int optname;
7843 if (optype == OP_GSOCKOPT)
7844 sv = sv_2mortal(NEWSV(22, 257));
7847 optname = (unsigned int) POPi;
7848 lvl = (unsigned int) POPi;
7852 if (!io || !IoIFP(io))
7855 fd = fileno(IoIFP(io));
7860 if (getsockopt(fd, lvl, optname, SvPVX(sv), (int*)&SvCUR(sv)) < 0)
7865 if (setsockopt(fd, lvl, optname, SvPVX(sv), SvCUR(sv)) < 0)
7874 warn("[gs]etsockopt() on closed fd");
7880 DIE(no_sock_func, "setsockopt");
7887 return pp_getpeername(ARGS);
7889 DIE(no_sock_func, "getsockname");
7897 int optype = op->op_type;
7901 register IO *io = GvIOn(gv);
7903 if (!io || !IoIFP(io))
7906 sv = sv_2mortal(NEWSV(22, 257));
7909 fd = fileno(IoIFP(io));
7911 case OP_GETSOCKNAME:
7912 if (getsockname(fd, SvPVX(sv), (int*)&SvCUR(sv)) < 0)
7915 case OP_GETPEERNAME:
7916 if (getpeername(fd, SvPVX(sv), (int*)&SvCUR(sv)) < 0)
7925 warn("get{sock, peer}name() on closed fd");
7931 DIE(no_sock_func, "getpeername");
7939 return pp_stat(ARGS);
7948 if (op->op_flags & OPf_SPECIAL) {
7949 tmpgv = cGVOP->op_gv;
7950 if (tmpgv != defgv) {
7951 laststype = OP_STAT;
7953 sv_setpv(statname, "");
7954 if (!GvIO(tmpgv) || !IoIFP(GvIO(tmpgv)) ||
7955 fstat(fileno(IoIFP(GvIO(tmpgv))), &statcache) < 0) {
7960 else if (laststatval < 0)
7964 sv_setpv(statname, POPp);
7967 laststype = op->op_type;
7968 if (op->op_type == OP_LSTAT)
7969 laststatval = lstat(SvPV(statname, na), &statcache);
7972 laststatval = stat(SvPV(statname, na), &statcache);
7973 if (laststatval < 0) {
7974 if (dowarn && strchr(SvPV(statname, na), '\n'))
7975 warn(warn_nl, "stat");
7981 if (GIMME != G_ARRAY) {
7988 PUSHs(sv_2mortal(newSViv((I32)statcache.st_dev)));
7989 PUSHs(sv_2mortal(newSViv((I32)statcache.st_ino)));
7990 PUSHs(sv_2mortal(newSViv((I32)statcache.st_mode)));
7991 PUSHs(sv_2mortal(newSViv((I32)statcache.st_nlink)));
7992 PUSHs(sv_2mortal(newSViv((I32)statcache.st_uid)));
7993 PUSHs(sv_2mortal(newSViv((I32)statcache.st_gid)));
7994 PUSHs(sv_2mortal(newSViv((I32)statcache.st_rdev)));
7995 PUSHs(sv_2mortal(newSViv((I32)statcache.st_size)));
7996 PUSHs(sv_2mortal(newSViv((I32)statcache.st_atime)));
7997 PUSHs(sv_2mortal(newSViv((I32)statcache.st_mtime)));
7998 PUSHs(sv_2mortal(newSViv((I32)statcache.st_ctime)));
8000 PUSHs(sv_2mortal(newSViv((I32)statcache.st_blksize)));
8001 PUSHs(sv_2mortal(newSViv((I32)statcache.st_blocks)));
8003 PUSHs(sv_2mortal(newSVpv("", 0)));
8004 PUSHs(sv_2mortal(newSVpv("", 0)));
8012 I32 result = my_stat(ARGS);
8016 if (cando(S_IRUSR, 0, &statcache))
8023 I32 result = my_stat(ARGS);
8027 if (cando(S_IWUSR, 0, &statcache))
8034 I32 result = my_stat(ARGS);
8038 if (cando(S_IXUSR, 0, &statcache))
8045 I32 result = my_stat(ARGS);
8049 if (cando(S_IRUSR, 1, &statcache))
8056 I32 result = my_stat(ARGS);
8060 if (cando(S_IWUSR, 1, &statcache))
8067 I32 result = my_stat(ARGS);
8071 if (cando(S_IXUSR, 1, &statcache))
8078 I32 result = my_stat(ARGS);
8087 return pp_ftrowned(ARGS);
8092 I32 result = my_stat(ARGS);
8096 if (statcache.st_uid == (op->op_type == OP_FTEOWNED ? euid : uid) )
8103 I32 result = my_stat(ARGS);
8107 if (!statcache.st_size)
8114 I32 result = my_stat(ARGS);
8118 PUSHi(statcache.st_size);
8124 I32 result = my_stat(ARGS);
8128 PUSHn( (basetime - statcache.st_mtime) / 86400.0 );
8134 I32 result = my_stat(ARGS);
8138 PUSHn( (basetime - statcache.st_atime) / 86400.0 );
8144 I32 result = my_stat(ARGS);
8148 PUSHn( (basetime - statcache.st_ctime) / 86400.0 );
8154 I32 result = my_stat(ARGS);
8158 if (S_ISSOCK(statcache.st_mode))
8165 I32 result = my_stat(ARGS);
8169 if (S_ISCHR(statcache.st_mode))
8176 I32 result = my_stat(ARGS);
8180 if (S_ISBLK(statcache.st_mode))
8187 I32 result = my_stat(ARGS);
8191 if (S_ISREG(statcache.st_mode))
8198 I32 result = my_stat(ARGS);
8202 if (S_ISDIR(statcache.st_mode))
8209 I32 result = my_stat(ARGS);
8213 if (S_ISFIFO(statcache.st_mode))
8220 I32 result = my_lstat(ARGS);
8224 if (S_ISLNK(statcache.st_mode))
8233 I32 result = my_stat(ARGS);
8237 if (statcache.st_mode & S_ISUID)
8247 I32 result = my_stat(ARGS);
8251 if (statcache.st_mode & S_ISGID)
8261 I32 result = my_stat(ARGS);
8265 if (statcache.st_mode & S_ISVTX)
8277 if (op->op_flags & OPf_SPECIAL) {
8282 gv = gv_fetchpv(tmps = POPp, FALSE);
8283 if (gv && GvIO(gv) && IoIFP(GvIO(gv)))
8284 fd = fileno(IoIFP(GvIO(gv)));
8285 else if (isDIGIT(*tmps))
8301 register STDCHAR *s;
8305 if (op->op_flags & OPf_SPECIAL) {
8307 if (cGVOP->op_gv == defgv) {
8312 goto really_filename;
8316 statgv = cGVOP->op_gv;
8317 sv_setpv(statname, "");
8320 if (io && IoIFP(io)) {
8321 #if defined(STDSTDIO) || defined(atarist) /* this will work with atariST */
8322 fstat(fileno(IoIFP(io)), &statcache);
8323 if (S_ISDIR(statcache.st_mode)) /* handle NFS glitch */
8324 if (op->op_type == OP_FTTEXT)
8328 if (IoIFP(io)->_cnt <= 0) {
8329 i = getc(IoIFP(io));
8331 (void)ungetc(i, IoIFP(io));
8333 if (IoIFP(io)->_cnt <= 0) /* null file is anything */
8335 len = IoIFP(io)->_cnt + (IoIFP(io)->_ptr - IoIFP(io)->_base);
8336 s = IoIFP(io)->_base;
8338 DIE("-T and -B not implemented on filehandles");
8343 warn("Test on unopened file <%s>",
8344 GvENAME(cGVOP->op_gv));
8352 sv_setpv(statname, SvPV(sv, na));
8354 i = open(SvPV(sv, na), 0);
8356 if (dowarn && strchr(SvPV(sv, na), '\n'))
8357 warn(warn_nl, "open");
8360 fstat(i, &statcache);
8361 len = read(i, tbuf, 512);
8364 if (S_ISDIR(statcache.st_mode) && op->op_type == OP_FTTEXT)
8365 RETPUSHNO; /* special case NFS directories */
8366 RETPUSHYES; /* null file is anything */
8371 /* now scan s to look for textiness */
8373 for (i = 0; i < len; i++, s++) {
8374 if (!*s) { /* null never allowed in text */
8381 *s != '\n' && *s != '\r' && *s != '\b' &&
8382 *s != '\t' && *s != '\f' && *s != 27)
8386 if ((odd * 10 > len) == (op->op_type == OP_FTTEXT)) /* allow 10% odd */
8394 return pp_fttext(ARGS);
8410 if (!tmps || !*tmps) {
8411 svp = hv_fetch(GvHVn(envgv), "HOME", 4, FALSE);
8413 tmps = SvPV(*svp, na);
8415 if (!tmps || !*tmps) {
8416 svp = hv_fetch(GvHVn(envgv), "LOGDIR", 6, FALSE);
8418 tmps = SvPV(*svp, na);
8420 TAINT_PROPER("chdir");
8421 PUSHi( chdir(tmps) >= 0 );
8427 dSP; dMARK; dTARGET;
8430 value = (I32)apply(op->op_type, MARK, SP);
8435 DIE(no_func, "Unsupported function chown");
8445 tmps = SvPVx(GvSV(defgv), na);
8448 TAINT_PROPER("chroot");
8449 PUSHi( chroot(tmps) >= 0 );
8452 DIE(no_func, "chroot");
8458 dSP; dMARK; dTARGET;
8460 value = (I32)apply(op->op_type, MARK, SP);
8468 dSP; dMARK; dTARGET;
8470 value = (I32)apply(op->op_type, MARK, SP);
8478 dSP; dMARK; dTARGET;
8480 value = (I32)apply(op->op_type, MARK, SP);
8492 char *tmps = SvPV(TOPs, na);
8493 TAINT_PROPER("rename");
8495 anum = rename(tmps, tmps2);
8497 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
8500 if (euid || stat(tmps2, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
8501 (void)UNLINK(tmps2);
8502 if (!(anum = link(tmps, tmps2)))
8503 anum = UNLINK(tmps);
8515 char *tmps = SvPV(TOPs, na);
8516 TAINT_PROPER("link");
8517 SETi( link(tmps, tmps2) >= 0 );
8519 DIE(no_func, "Unsupported function link");
8529 char *tmps = SvPV(TOPs, na);
8530 TAINT_PROPER("symlink");
8531 SETi( symlink(tmps, tmps2) >= 0 );
8534 DIE(no_func, "symlink");
8545 tmps = SvPVx(GvSV(defgv), na);
8548 len = readlink(tmps, buf, sizeof buf);
8556 RETSETUNDEF; /* just pretend it's a normal file */
8560 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
8562 dooneliner(cmd, filename)
8573 for (s = mybuf+strlen(mybuf); *filename; ) {
8578 myfp = my_popen(mybuf, "r");
8581 s = fgets(mybuf, sizeof mybuf, myfp);
8582 (void)my_pclose(myfp);
8584 for (errno = 1; errno < sys_nerr; errno++) {
8585 if (instr(mybuf, sys_errlist[errno])) /* you don't see this */
8590 #define EACCES EPERM
8592 if (instr(mybuf, "cannot make"))
8594 else if (instr(mybuf, "existing file"))
8596 else if (instr(mybuf, "ile exists"))
8598 else if (instr(mybuf, "non-exist"))
8600 else if (instr(mybuf, "does not exist"))
8602 else if (instr(mybuf, "not empty"))
8604 else if (instr(mybuf, "cannot access"))
8610 else { /* some mkdirs return no failure indication */
8611 tmps = SvPVx(st[1], na);
8612 anum = (stat(tmps, &statbuf) >= 0);
8613 if (op->op_type == OP_RMDIR)
8618 errno = EACCES; /* a guess */
8632 char *tmps = SvPV(TOPs, na);
8634 TAINT_PROPER("mkdir");
8636 SETi( mkdir(tmps, mode) >= 0 );
8638 SETi( dooneliner("mkdir", tmps) );
8641 chmod(tmps, (mode & ~oldumask) & 0777);
8652 tmps = SvPVx(GvSV(defgv), na);
8655 TAINT_PROPER("rmdir");
8657 XPUSHi( rmdir(tmps) >= 0 );
8659 XPUSHi( dooneliner("rmdir", tmps) );
8664 /* Directory calls. */
8669 #if defined(DIRENT) && defined(HAS_READDIR)
8670 char *dirname = POPp;
8672 register IO *io = GvIOn(gv);
8678 closedir(IoDIRP(io));
8679 if (!(IoDIRP(io) = opendir(dirname)))
8688 DIE(no_dir_func, "opendir");
8695 #if defined(DIRENT) && defined(HAS_READDIR)
8697 struct DIRENT *readdir();
8699 register struct DIRENT *dp;
8701 register IO *io = GvIOn(gv);
8703 if (!io || !IoDIRP(io))
8706 if (GIMME == G_ARRAY) {
8708 while (dp = readdir(IoDIRP(io))) {
8710 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
8712 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
8717 if (!(dp = readdir(IoDIRP(io))))
8720 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
8722 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
8730 if (GIMME == G_ARRAY)
8735 DIE(no_dir_func, "readdir");
8742 #if defined(HAS_TELLDIR) || defined(telldir)
8747 register IO *io = GvIOn(gv);
8749 if (!io || !IoDIRP(io))
8752 PUSHi( telldir(IoDIRP(io)) );
8759 DIE(no_dir_func, "telldir");
8766 #if defined(HAS_SEEKDIR) || defined(seekdir)
8769 register IO *io = GvIOn(gv);
8771 if (!io || !IoDIRP(io))
8774 (void)seekdir(IoDIRP(io), along);
8782 DIE(no_dir_func, "seekdir");
8789 #if defined(HAS_REWINDDIR) || defined(rewinddir)
8791 register IO *io = GvIOn(gv);
8793 if (!io || !IoDIRP(io))
8796 (void)rewinddir(IoDIRP(io));
8803 DIE(no_dir_func, "rewinddir");
8810 #if defined(DIRENT) && defined(HAS_READDIR)
8812 register IO *io = GvIOn(gv);
8814 if (!io || !IoDIRP(io))
8817 if (closedir(IoDIRP(io)) < 0)
8827 DIE(no_dir_func, "closedir");
8831 /* Process control. */
8846 if (tmpgv = gv_fetchpv("$", TRUE))
8847 sv_setiv(GvSV(tmpgv), (I32)getpid());
8848 hv_clear(pidstatus); /* no kids, so don't wait for 'em */
8853 DIE(no_func, "Unsupported function fork");
8866 childpid = wait(&argflags);
8868 pidgone(childpid, argflags);
8869 value = (I32)childpid;
8870 statusvalue = (U16)argflags;
8874 DIE(no_func, "Unsupported function wait");
8889 childpid = wait4pid(childpid, &argflags, optype);
8890 value = (I32)childpid;
8891 statusvalue = (U16)argflags;
8895 DIE(no_func, "Unsupported function wait");
8901 dSP; dMARK; dORIGMARK; dTARGET;
8906 VOIDRET (*ihand)(); /* place to save signal during system() */
8907 VOIDRET (*qhand)(); /* place to save signal during system() */
8910 if (SP - MARK == 1) {
8912 char *junk = SvPV(TOPs, na);
8914 TAINT_PROPER("system");
8917 while ((childpid = vfork()) == -1) {
8918 if (errno != EAGAIN) {
8927 ihand = signal(SIGINT, SIG_IGN);
8928 qhand = signal(SIGQUIT, SIG_IGN);
8929 result = wait4pid(childpid, &status, 0);
8930 (void)signal(SIGINT, ihand);
8931 (void)signal(SIGQUIT, qhand);
8932 statusvalue = (U16)status;
8936 value = (I32)((unsigned int)status & 0xffff);
8938 do_execfree(); /* free any memory child malloced on vfork */
8943 if (op->op_flags & OPf_STACKED) {
8944 SV *really = *++MARK;
8945 value = (I32)do_aexec(really, MARK, SP);
8947 else if (SP - MARK != 1)
8948 value = (I32)do_aexec(Nullsv, MARK, SP);
8950 value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
8954 if ((op[1].op_type & A_MASK) == A_GV)
8955 value = (I32)do_aspawn(st[1], arglast);
8956 else if (arglast[2] - arglast[1] != 1)
8957 value = (I32)do_aspawn(Nullsv, arglast);
8959 value = (I32)do_spawn(SvPVx(sv_mortalcopy(st[2]), na));
8968 dSP; dMARK; dORIGMARK; dTARGET;
8971 if (op->op_flags & OPf_STACKED) {
8972 SV *really = *++MARK;
8973 value = (I32)do_aexec(really, MARK, SP);
8975 else if (SP - MARK != 1)
8976 value = (I32)do_aexec(Nullsv, MARK, SP);
8979 char *junk = SvPV(*SP, na);
8981 TAINT_PROPER("exec");
8983 value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
8992 dSP; dMARK; dTARGET;
8995 value = (I32)apply(op->op_type, MARK, SP);
9000 DIE(no_func, "Unsupported function kill");
9008 XPUSHi( getppid() );
9011 DIE(no_func, "getppid");
9026 #ifdef _POSIX_SOURCE
9028 DIE("POSIX getpgrp can't take an argument");
9029 value = (I32)getpgrp();
9031 value = (I32)getpgrp(pid);
9036 DIE(no_func, "getpgrp()");
9047 TAINT_PROPER("setpgrp");
9048 SETi( setpgrp(pid, pgrp) >= 0 );
9051 DIE(no_func, "setpgrp()");
9060 #ifdef HAS_GETPRIORITY
9063 SETi( getpriority(which, who) );
9066 DIE(no_func, "getpriority()");
9076 #ifdef HAS_SETPRIORITY
9080 TAINT_PROPER("setpriority");
9081 SETi( setpriority(which, who, niceval) >= 0 );
9084 DIE(no_func, "setpriority()");
9093 XPUSHi( time(Null(long*)) );
9106 DIE("times not implemented");
9110 (void)times(×buf);
9112 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_utime)/HZ)));
9113 if (GIMME == G_ARRAY) {
9114 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_stime)/HZ)));
9115 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cutime)/HZ)));
9116 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cstime)/HZ)));
9124 return pp_gmtime(ARGS);
9132 static char *dayname[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
9133 static char *monname[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
9134 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
9139 when = (time_t)SvIVx(POPs);
9141 if (op->op_type == OP_LOCALTIME)
9142 tmbuf = localtime(&when);
9144 tmbuf = gmtime(&when);
9147 if (GIMME != G_ARRAY) {
9152 sprintf(mybuf, "%s %s %2d %02d:%02d:%02d %d",
9153 dayname[tmbuf->tm_wday],
9154 monname[tmbuf->tm_mon],
9159 tmbuf->tm_year + 1900);
9160 PUSHp(mybuf, strlen(mybuf));
9163 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_sec)));
9164 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_min)));
9165 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_hour)));
9166 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mday)));
9167 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mon)));
9168 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_year)));
9169 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_wday)));
9170 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_yday)));
9171 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_isdst)));
9182 anum = SvIVx(GvSV(defgv));
9185 anum = alarm((unsigned int)anum);
9192 DIE(no_func, "Unsupported function alarm");
9205 (void)time(&lasttime);
9210 sleep((unsigned int)duration);
9213 XPUSHi(when - lasttime);
9217 /* Shared memory. */
9221 return pp_semget(ARGS);
9226 return pp_semctl(ARGS);
9231 return pp_shmwrite(ARGS);
9236 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
9237 dSP; dMARK; dTARGET;
9238 I32 value = (I32)(do_shmio(op->op_type, MARK, SP) >= 0);
9247 /* Message passing. */
9251 return pp_semget(ARGS);
9256 return pp_semctl(ARGS);
9261 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
9262 dSP; dMARK; dTARGET;
9263 I32 value = (I32)(do_msgsnd(MARK, SP) >= 0);
9274 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
9275 dSP; dMARK; dTARGET;
9276 I32 value = (I32)(do_msgrcv(MARK, SP) >= 0);
9289 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
9290 dSP; dMARK; dTARGET;
9291 int anum = do_ipcget(op->op_type, MARK, SP);
9298 DIE("System V IPC is not implemented on this machine");
9304 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
9305 dSP; dMARK; dTARGET;
9306 int anum = do_ipcctl(op->op_type, MARK, SP);
9314 PUSHp("0 but true",10);
9324 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
9325 dSP; dMARK; dTARGET;
9326 I32 value = (I32)(do_semop(MARK, SP) >= 0);
9338 save_lines(array, sv)
9342 register char *s = SvPVX(sv);
9343 register char *send = SvPVX(sv) + SvCUR(sv);
9345 register I32 line = 1;
9347 while (s && s < send) {
9348 SV *tmpstr = NEWSV(85,0);
9350 sv_upgrade(tmpstr, SVt_PVMG);
9351 t = strchr(s, '\n');
9357 sv_setpvn(tmpstr, s, t - s);
9358 av_store(array, line++, tmpstr);
9372 /* set up a scratch pad */
9377 SAVESPTR(comppad_name);
9378 SAVEINT(comppad_name_fill);
9379 SAVEINT(min_intro_pending);
9380 SAVEINT(max_intro_pending);
9382 comppad_name = newAV();
9383 comppad_name_fill = 0;
9384 min_intro_pending = 0;
9385 av_push(comppad, Nullsv);
9386 curpad = AvARRAY(comppad);
9389 /* make sure we compile in the right package */
9391 newstash = curcop->cop_stash;
9392 if (curstash != newstash) {
9394 curstash = newstash;
9399 /* try to compile it */
9403 curcop = &compiling;
9408 if (yyparse() || error_count || !eval_root) {
9424 if (optype == OP_REQUIRE)
9425 DIE("%s", SvPVx(GvSV(gv_fetchpv("@",TRUE)), na));
9429 rspara = (nrslen == 2);
9435 rspara = (nrslen == 2);
9436 compiling.cop_line = 0;
9437 SAVEFREESV(comppad_name);
9438 SAVEFREESV(comppad);
9439 SAVEFREEOP(eval_root);
9441 DEBUG_x(dump_eval());
9443 /* compiled okay, so do it */
9445 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
9446 RETURNOP(eval_start);
9452 register CONTEXT *cx;
9457 I32 gimme = G_SCALAR;
9466 if (SvNIOK(sv) && !SvPOKp(sv)) {
9467 if (SvNV(sv) > atof(patchlevel) + 0.000999)
9468 DIE("Perl %3.3f required--this is only version %s, stopped",
9469 SvNV(sv),patchlevel);
9472 name = SvPV(sv, na);
9473 if (op->op_type == OP_REQUIRE &&
9474 (svp = hv_fetch(GvHVn(incgv), name, SvCUR(sv), 0)) &&
9478 /* prepare to compile file */
9480 tmpname = savestr(name);
9481 if (*tmpname == '/' ||
9483 (tmpname[1] == '/' ||
9484 (tmpname[1] == '.' && tmpname[2] == '/'))))
9486 tryrsfp = fopen(tmpname,"r");
9489 AV *ar = GvAVn(incgv);
9492 for (i = 0; i <= AvFILL(ar); i++) {
9493 (void)sprintf(buf, "%s/%s",
9494 SvPVx(*av_fetch(ar, i, TRUE), na), name);
9495 tryrsfp = fopen(buf, "r");
9499 if (*s == '.' && s[1] == '/')
9502 tmpname = savestr(s);
9507 compiling.cop_filegv = gv_fetchfile(tmpname);
9511 if (op->op_type == OP_REQUIRE) {
9512 sprintf(tokenbuf,"Can't locate %s in @INC", name);
9513 if (instr(tokenbuf,".h "))
9514 strcat(tokenbuf," (change .h to .ph maybe?)");
9515 if (instr(tokenbuf,".ph "))
9516 strcat(tokenbuf," (did you run h2ph?)");
9525 lex_start(sv_2mortal(newSVpv("",0)));
9527 name = savestr(name);
9530 /* switch to eval mode */
9532 push_return(op->op_next);
9533 PUSHBLOCK(cx, CXt_EVAL, SP);
9534 PUSHEVAL(cx, name, compiling.cop_filegv);
9536 compiling.cop_line = 0;
9544 return pp_require(ARGS);
9550 register CONTEXT *cx;
9559 /* switch to eval mode */
9561 sprintf(tmpbuf, "_<(eval %d)", ++evalseq);
9562 compiling.cop_filegv = gv_fetchfile(tmpbuf+2);
9563 compiling.cop_line = 1;
9564 SAVEDELETE(defstash, savestr(tmpbuf), strlen(tmpbuf));
9566 push_return(op->op_next);
9567 PUSHBLOCK(cx, CXt_EVAL, SP);
9568 PUSHEVAL(cx, 0, compiling.cop_filegv);
9570 /* prepare to compile string */
9572 if (perldb && curstash != debstash)
9573 save_lines(GvAV(compiling.cop_filegv), linestr);
9584 register CONTEXT *cx;
9587 OP *eroot = eval_root;
9591 retop = pop_return();
9593 if (gimme == G_SCALAR) {
9596 if (SvFLAGS(TOPs) & SVs_TEMP)
9599 *MARK = sv_mortalcopy(TOPs);
9608 for (mark = newsp + 1; mark <= SP; mark++)
9609 if (!(SvFLAGS(TOPs) & SVs_TEMP))
9610 *mark = sv_mortalcopy(*mark);
9611 /* in case LEAVE wipes old return values */
9614 if (optype != OP_ENTEREVAL) {
9615 char *name = cx->blk_eval.old_name;
9617 if (gimme == G_SCALAR ? SvTRUE(*sp) : sp > newsp) {
9618 (void)hv_store(GvHVn(incgv), name,
9619 strlen(name), newSVsv(GvSV(curcop->cop_filegv)), 0 );
9621 else if (optype == OP_REQUIRE)
9622 retop = die("%s did not return a true value", name);
9627 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
9636 SP = do_eval(st[1], OP_EVAL, curcop->cop_stash, TRUE,
9639 SvREFCNT_dec(cSVOP->op_sv);
9640 op[1].arg_ptr.arg_cmd = eval_root;
9641 op[1].op_type = (A_CMD|A_DONT);
9642 op[0].op_type = OP_TRY;
9653 register CONTEXT *cx;
9659 push_return(cLOGOP->op_other->op_next);
9660 PUSHBLOCK(cx, CXt_EVAL, SP);
9662 eval_root = op; /* Only needed so that goto works right. */
9665 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
9675 register CONTEXT *cx;
9682 if (gimme == G_SCALAR) {
9685 if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
9688 *MARK = sv_mortalcopy(TOPs);
9697 for (mark = newsp + 1; mark <= SP; mark++)
9698 if (!(SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP)))
9699 *mark = sv_mortalcopy(*mark);
9700 /* in case LEAVE wipes old return values */
9704 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
9708 /* Get system info. */
9713 return pp_ghostent(ARGS);
9715 DIE(no_sock_func, "gethostbyname");
9722 return pp_ghostent(ARGS);
9724 DIE(no_sock_func, "gethostbyaddr");
9732 I32 which = op->op_type;
9733 register char **elem;
9735 struct hostent *gethostbyname();
9736 struct hostent *gethostbyaddr();
9737 #ifdef HAS_GETHOSTENT
9738 struct hostent *gethostent();
9740 struct hostent *hent;
9744 if (which == OP_GHBYNAME) {
9745 hent = gethostbyname(POPp);
9747 else if (which == OP_GHBYADDR) {
9748 int addrtype = POPi;
9750 char *addr = SvPV(addrstr, na);
9752 hent = gethostbyaddr(addr, SvCUR(addrstr), addrtype);
9755 #ifdef HAS_GETHOSTENT
9756 hent = gethostent();
9758 DIE("gethostent not implemented");
9761 #ifdef HOST_NOT_FOUND
9763 statusvalue = (U16)h_errno & 0xffff;
9766 if (GIMME != G_ARRAY) {
9767 PUSHs(sv = sv_newmortal());
9769 if (which == OP_GHBYNAME) {
9770 sv_setpvn(sv, hent->h_addr, hent->h_length);
9773 sv_setpv(sv, hent->h_name);
9779 PUSHs(sv = sv_mortalcopy(&sv_no));
9780 sv_setpv(sv, hent->h_name);
9781 PUSHs(sv = sv_mortalcopy(&sv_no));
9782 for (elem = hent->h_aliases; *elem; elem++) {
9783 sv_catpv(sv, *elem);
9785 sv_catpvn(sv, " ", 1);
9787 PUSHs(sv = sv_mortalcopy(&sv_no));
9788 sv_setiv(sv, (I32)hent->h_addrtype);
9789 PUSHs(sv = sv_mortalcopy(&sv_no));
9790 len = hent->h_length;
9791 sv_setiv(sv, (I32)len);
9793 for (elem = hent->h_addr_list; *elem; elem++) {
9794 XPUSHs(sv = sv_mortalcopy(&sv_no));
9795 sv_setpvn(sv, *elem, len);
9798 PUSHs(sv = sv_mortalcopy(&sv_no));
9799 sv_setpvn(sv, hent->h_addr, len);
9804 DIE(no_sock_func, "gethostent");
9811 return pp_gnetent(ARGS);
9813 DIE(no_sock_func, "getnetbyname");
9820 return pp_gnetent(ARGS);
9822 DIE(no_sock_func, "getnetbyaddr");
9830 I32 which = op->op_type;
9831 register char **elem;
9833 struct netent *getnetbyname();
9834 struct netent *getnetbyaddr();
9835 struct netent *getnetent();
9836 struct netent *nent;
9838 if (which == OP_GNBYNAME)
9839 nent = getnetbyname(POPp);
9840 else if (which == OP_GNBYADDR) {
9841 int addrtype = POPi;
9842 unsigned long addr = U_L(POPn);
9843 nent = getnetbyaddr((long)addr, addrtype);
9849 if (GIMME != G_ARRAY) {
9850 PUSHs(sv = sv_newmortal());
9852 if (which == OP_GNBYNAME)
9853 sv_setiv(sv, (I32)nent->n_net);
9855 sv_setpv(sv, nent->n_name);
9861 PUSHs(sv = sv_mortalcopy(&sv_no));
9862 sv_setpv(sv, nent->n_name);
9863 PUSHs(sv = sv_mortalcopy(&sv_no));
9864 for (elem = nent->n_aliases; *elem; elem++) {
9865 sv_catpv(sv, *elem);
9867 sv_catpvn(sv, " ", 1);
9869 PUSHs(sv = sv_mortalcopy(&sv_no));
9870 sv_setiv(sv, (I32)nent->n_addrtype);
9871 PUSHs(sv = sv_mortalcopy(&sv_no));
9872 sv_setiv(sv, (I32)nent->n_net);
9877 DIE(no_sock_func, "getnetent");
9884 return pp_gprotoent(ARGS);
9886 DIE(no_sock_func, "getprotobyname");
9893 return pp_gprotoent(ARGS);
9895 DIE(no_sock_func, "getprotobynumber");
9903 I32 which = op->op_type;
9904 register char **elem;
9906 struct protoent *getprotobyname();
9907 struct protoent *getprotobynumber();
9908 struct protoent *getprotoent();
9909 struct protoent *pent;
9911 if (which == OP_GPBYNAME)
9912 pent = getprotobyname(POPp);
9913 else if (which == OP_GPBYNUMBER)
9914 pent = getprotobynumber(POPi);
9916 pent = getprotoent();
9919 if (GIMME != G_ARRAY) {
9920 PUSHs(sv = sv_newmortal());
9922 if (which == OP_GPBYNAME)
9923 sv_setiv(sv, (I32)pent->p_proto);
9925 sv_setpv(sv, pent->p_name);
9931 PUSHs(sv = sv_mortalcopy(&sv_no));
9932 sv_setpv(sv, pent->p_name);
9933 PUSHs(sv = sv_mortalcopy(&sv_no));
9934 for (elem = pent->p_aliases; *elem; elem++) {
9935 sv_catpv(sv, *elem);
9937 sv_catpvn(sv, " ", 1);
9939 PUSHs(sv = sv_mortalcopy(&sv_no));
9940 sv_setiv(sv, (I32)pent->p_proto);
9945 DIE(no_sock_func, "getprotoent");
9952 return pp_gservent(ARGS);
9954 DIE(no_sock_func, "getservbyname");
9961 return pp_gservent(ARGS);
9963 DIE(no_sock_func, "getservbyport");
9971 I32 which = op->op_type;
9972 register char **elem;
9974 struct servent *getservbyname();
9975 struct servent *getservbynumber();
9976 struct servent *getservent();
9977 struct servent *sent;
9979 if (which == OP_GSBYNAME) {
9983 if (proto && !*proto)
9986 sent = getservbyname(name, proto);
9988 else if (which == OP_GSBYPORT) {
9992 sent = getservbyport(port, proto);
9995 sent = getservent();
9998 if (GIMME != G_ARRAY) {
9999 PUSHs(sv = sv_newmortal());
10001 if (which == OP_GSBYNAME) {
10003 sv_setiv(sv, (I32)ntohs(sent->s_port));
10005 sv_setiv(sv, (I32)(sent->s_port));
10009 sv_setpv(sv, sent->s_name);
10015 PUSHs(sv = sv_mortalcopy(&sv_no));
10016 sv_setpv(sv, sent->s_name);
10017 PUSHs(sv = sv_mortalcopy(&sv_no));
10018 for (elem = sent->s_aliases; *elem; elem++) {
10019 sv_catpv(sv, *elem);
10021 sv_catpvn(sv, " ", 1);
10023 PUSHs(sv = sv_mortalcopy(&sv_no));
10025 sv_setiv(sv, (I32)ntohs(sent->s_port));
10027 sv_setiv(sv, (I32)(sent->s_port));
10029 PUSHs(sv = sv_mortalcopy(&sv_no));
10030 sv_setpv(sv, sent->s_proto);
10035 DIE(no_sock_func, "getservent");
10046 DIE(no_sock_func, "sethostent");
10057 DIE(no_sock_func, "setnetent");
10068 DIE(no_sock_func, "setprotoent");
10079 DIE(no_sock_func, "setservent");
10091 DIE(no_sock_func, "endhostent");
10103 DIE(no_sock_func, "endnetent");
10115 DIE(no_sock_func, "endprotoent");
10127 DIE(no_sock_func, "endservent");
10134 return pp_gpwent(ARGS);
10136 DIE(no_func, "getpwnam");
10143 return pp_gpwent(ARGS);
10145 DIE(no_func, "getpwuid");
10153 I32 which = op->op_type;
10154 register AV *ary = stack;
10156 struct passwd *getpwnam();
10157 struct passwd *getpwuid();
10158 struct passwd *getpwent();
10159 struct passwd *pwent;
10161 if (which == OP_GPWNAM)
10162 pwent = getpwnam(POPp);
10163 else if (which == OP_GPWUID)
10164 pwent = getpwuid(POPi);
10166 pwent = getpwent();
10169 if (GIMME != G_ARRAY) {
10170 PUSHs(sv = sv_newmortal());
10172 if (which == OP_GPWNAM)
10173 sv_setiv(sv, (I32)pwent->pw_uid);
10175 sv_setpv(sv, pwent->pw_name);
10181 PUSHs(sv = sv_mortalcopy(&sv_no));
10182 sv_setpv(sv, pwent->pw_name);
10183 PUSHs(sv = sv_mortalcopy(&sv_no));
10184 sv_setpv(sv, pwent->pw_passwd);
10185 PUSHs(sv = sv_mortalcopy(&sv_no));
10186 sv_setiv(sv, (I32)pwent->pw_uid);
10187 PUSHs(sv = sv_mortalcopy(&sv_no));
10188 sv_setiv(sv, (I32)pwent->pw_gid);
10189 PUSHs(sv = sv_mortalcopy(&sv_no));
10191 sv_setiv(sv, (I32)pwent->pw_change);
10194 sv_setiv(sv, (I32)pwent->pw_quota);
10197 sv_setpv(sv, pwent->pw_age);
10201 PUSHs(sv = sv_mortalcopy(&sv_no));
10203 sv_setpv(sv, pwent->pw_class);
10206 sv_setpv(sv, pwent->pw_comment);
10209 PUSHs(sv = sv_mortalcopy(&sv_no));
10210 sv_setpv(sv, pwent->pw_gecos);
10211 PUSHs(sv = sv_mortalcopy(&sv_no));
10212 sv_setpv(sv, pwent->pw_dir);
10213 PUSHs(sv = sv_mortalcopy(&sv_no));
10214 sv_setpv(sv, pwent->pw_shell);
10216 PUSHs(sv = sv_mortalcopy(&sv_no));
10217 sv_setiv(sv, (I32)pwent->pw_expire);
10222 DIE(no_func, "getpwent");
10233 DIE(no_func, "setpwent");
10244 DIE(no_func, "endpwent");
10251 return pp_ggrent(ARGS);
10253 DIE(no_func, "getgrnam");
10260 return pp_ggrent(ARGS);
10262 DIE(no_func, "getgrgid");
10270 I32 which = op->op_type;
10271 register char **elem;
10273 struct group *getgrnam();
10274 struct group *getgrgid();
10275 struct group *getgrent();
10276 struct group *grent;
10278 if (which == OP_GGRNAM)
10279 grent = getgrnam(POPp);
10280 else if (which == OP_GGRGID)
10281 grent = getgrgid(POPi);
10283 grent = getgrent();
10286 if (GIMME != G_ARRAY) {
10287 PUSHs(sv = sv_newmortal());
10289 if (which == OP_GGRNAM)
10290 sv_setiv(sv, (I32)grent->gr_gid);
10292 sv_setpv(sv, grent->gr_name);
10298 PUSHs(sv = sv_mortalcopy(&sv_no));
10299 sv_setpv(sv, grent->gr_name);
10300 PUSHs(sv = sv_mortalcopy(&sv_no));
10301 sv_setpv(sv, grent->gr_passwd);
10302 PUSHs(sv = sv_mortalcopy(&sv_no));
10303 sv_setiv(sv, (I32)grent->gr_gid);
10304 PUSHs(sv = sv_mortalcopy(&sv_no));
10305 for (elem = grent->gr_mem; *elem; elem++) {
10306 sv_catpv(sv, *elem);
10308 sv_catpvn(sv, " ", 1);
10314 DIE(no_func, "getgrent");
10325 DIE(no_func, "setgrent");
10336 DIE(no_func, "endgrent");
10343 #ifdef HAS_GETLOGIN
10346 if (!(tmps = getlogin()))
10348 PUSHp(tmps, strlen(tmps));
10351 DIE(no_func, "getlogin");
10355 /* Miscellaneous. */
10360 dSP; dMARK; dORIGMARK; dTARGET;
10361 register I32 items = SP - MARK;
10362 unsigned long a[20];
10363 register I32 i = 0;
10367 while (++MARK <= SP) {
10368 if (SvRMAGICAL(*MARK) && mg_find(*MARK, 't'))
10372 TAINT_PROPER("syscall");
10375 /* This probably won't work on machines where sizeof(long) != sizeof(int)
10376 * or where sizeof(long) != sizeof(char*). But such machines will
10377 * not likely have syscall implemented either, so who cares?
10379 while (++MARK <= SP) {
10380 if (SvNIOK(*MARK) || !i)
10381 a[i++] = SvIV(*MARK);
10383 a[i++] = (unsigned long)SvPVX(*MARK);
10389 DIE("Too many args to syscall");
10391 DIE("Too few args to syscall");
10393 retval = syscall(a[0]);
10396 retval = syscall(a[0],a[1]);
10399 retval = syscall(a[0],a[1],a[2]);
10402 retval = syscall(a[0],a[1],a[2],a[3]);
10405 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
10408 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
10411 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
10414 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
10418 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
10421 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
10424 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
10428 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
10432 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
10433 a[10],a[11],a[12]);
10436 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
10437 a[10],a[11],a[12],a[13]);
10439 #endif /* atarist */
10445 DIE(no_func, "syscall");