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>
81 if (++markstack_ptr == markstack_max) {
82 I32 oldmax = markstack_max - markstack;
83 I32 newmax = oldmax * 3 / 2;
85 Renew(markstack, newmax, I32);
86 markstack_ptr = markstack + oldmax;
87 markstack_max = markstack + newmax;
89 *markstack_ptr = stack_sp - stack_base;
99 cxix = dopoptosub(cxstack_ix);
103 if (cxstack[cxix].blk_gimme == G_ARRAY)
117 XPUSHs(cSVOP->op_sv);
147 DIE("panic: pp_interp");
154 if (op->op_flags & OPf_LOCAL)
155 PUSHs(save_scalar(cGVOP->op_gv));
157 PUSHs(GvSV(cGVOP->op_gv));
164 XPUSHs((SV*)cGVOP->op_gv);
180 if (SvTYPE(sv) == SVt_REF) {
182 if (SvTYPE(sv) != SVt_PVGV)
183 DIE("Not a glob reference");
186 if (SvTYPE(sv) != SVt_PVGV)
187 sv = (SV*)gv_fetchpv(SvPVn(sv), TRUE);
189 if (op->op_flags & OPf_LOCAL) {
197 if (op->op_flags & OPf_SPECIAL)
198 GvGP(sv)->gp_refcnt++; /* will soon be assigned */
204 GvSV(sv) = NEWSV(72,0);
205 GvLINE(sv) = curcop->cop_line;
225 if (SvTYPE(sv) == SVt_REF) {
227 switch (SvTYPE(sv)) {
231 DIE("Not a scalar reference");
235 if (SvTYPE(sv) != SVt_PVGV)
236 sv = (SV*)gv_fetchpv(SvPVn(sv), TRUE);
239 if (op->op_flags & OPf_LOCAL)
240 SETs(save_scalar((GV*)TOPs));
250 SV *sv = AvARYLEN(av);
252 AvARYLEN(av) = sv = NEWSV(0,0);
253 sv_upgrade(sv, SVt_IV);
254 sv_magic(sv, (SV*)av, '#', Nullch, 0);
266 CV *cv = sv_2cv(TOPs, &stash, &gv, 0);
278 rv = sv_mortalcopy(&sv_undef);
279 sv_upgrade(rv, SVt_REF);
280 SvANY(rv) = (void*)sv_ref(sv);
287 dSP; dTARGET; dTOPss;
290 if (SvTYPE(sv) != SVt_REF)
294 if (SvSTORAGE(sv) == 'O')
295 pv = HvNAME(SvSTASH(sv));
297 switch (SvTYPE(sv)) {
298 case SVt_REF: pv = "REF"; break;
306 case SVt_PVBM: pv = "SCALAR"; break;
307 case SVt_PVLV: pv = "LVALUE"; break;
308 case SVt_PVAV: pv = "ARRAY"; break;
309 case SVt_PVHV: pv = "HASH"; break;
310 case SVt_PVCV: pv = "CODE"; break;
311 case SVt_PVGV: pv = "GLOB"; break;
312 case SVt_PVFM: pv = "FORMLINE"; break;
313 default: pv = "UNKNOWN"; break;
316 SETp(pv, strlen(pv));
325 if (SvTYPE(sv) != SVt_REF)
328 ref = (SV*)SvANY(sv);
329 if (SvSTORAGE(ref) && SvSTORAGE(ref) != 'O')
330 DIE("Can't bless temporary scalar");
331 SvSTORAGE(ref) = 'O';
332 SvUPGRADE(ref, SVt_PVMG);
333 SvSTASH(ref) = curcop->cop_stash;
347 fp = my_popen(tmps, "r");
349 sv_setpv(TARG, ""); /* note that this preserves previous buffer */
350 if (GIMME == G_SCALAR) {
351 while (sv_gets(TARG, fp, SvCUR(TARG)) != Nullch)
361 if (sv_gets(sv, fp, 0) == Nullch) {
365 XPUSHs(sv_2mortal(sv));
366 if (SvLEN(sv) - SvCUR(sv) > 20) {
367 SvLEN_set(sv, SvCUR(sv)+1);
368 Renew(SvPV(sv), SvLEN(sv), char);
372 statusvalue = my_pclose(fp);
376 if (GIMME == G_SCALAR)
391 register IO *io = GvIO(last_in_gv);
392 register I32 type = op->op_type;
398 if (io->flags & IOf_ARGV) {
399 if (io->flags & IOf_START) {
400 io->flags &= ~IOf_START;
402 if (av_len(GvAVn(last_in_gv)) < 0) {
403 SV *tmpstr = newSVpv("-", 1); /* assume stdin */
404 (void)av_push(GvAVn(last_in_gv), tmpstr);
407 fp = nextargv(last_in_gv);
408 if (!fp) { /* Note: fp != io->ifp */
409 (void)do_close(last_in_gv, FALSE); /* now it does*/
410 io->flags |= IOf_START;
413 else if (type == OP_GLOB) {
414 SV *tmpcmd = NEWSV(55, 0);
417 sv_setpv(tmpcmd, "perlglob ");
418 sv_catsv(tmpcmd, tmpglob);
419 sv_catpv(tmpcmd, " |");
422 sv_setpvn(tmpcmd, cshname, cshlen);
423 sv_catpv(tmpcmd, " -cf 'set nonomatch; glob ");
424 sv_catsv(tmpcmd, tmpglob);
425 sv_catpv(tmpcmd, "'|");
427 sv_setpv(tmpcmd, "echo ");
428 sv_catsv(tmpcmd, tmpglob);
429 sv_catpv(tmpcmd, "|tr -s ' \t\f\r' '\\012\\012\\012\\012'|");
432 (void)do_open(last_in_gv, SvPV(tmpcmd), SvCUR(tmpcmd));
437 else if (type == OP_GLOB)
442 warn("Read on closed filehandle <%s>", GvENAME(last_in_gv));
443 if (GIMME == G_SCALAR)
447 if (GIMME == G_ARRAY) {
448 sv = sv_2mortal(NEWSV(57, 80));
453 SvUPGRADE(sv, SVt_PV);
454 tmplen = SvLEN(sv); /* remember if already alloced */
456 Sv_Grow(sv, 80); /* try short-buffering it */
457 if (type == OP_RCATLINE)
463 if (!sv_gets(sv, fp, offset)) {
465 if (io->flags & IOf_ARGV) {
466 fp = nextargv(last_in_gv);
469 (void)do_close(last_in_gv, FALSE);
470 io->flags |= IOf_START;
472 else if (type == OP_GLOB) {
473 (void)do_close(last_in_gv, FALSE);
475 if (GIMME == G_SCALAR)
482 sv->sv_tainted = 1; /* Anything from the outside world...*/
484 if (type == OP_GLOB) {
489 if (*SvEND(sv) == rschar)
493 for (tmps = SvPV(sv); *tmps; tmps++)
494 if (!isALPHA(*tmps) && !isDIGIT(*tmps) &&
495 index("$&*(){}[]'\";\\|?<>~`", *tmps))
497 if (*tmps && stat(SvPV(sv), &statbuf) < 0) {
498 POPs; /* Unmatched wildcard? Chuck it... */
502 if (GIMME == G_ARRAY) {
503 if (SvLEN(sv) - SvCUR(sv) > 20) {
504 SvLEN_set(sv, SvCUR(sv)+1);
505 Renew(SvPV(sv), SvLEN(sv), char);
507 sv = sv_2mortal(NEWSV(58, 80));
510 else if (!tmplen && SvLEN(sv) - SvCUR(sv) > 80) {
511 /* try to reclaim a bit of scalar space (only on 1st alloc) */
515 SvLEN_set(sv, SvCUR(sv)+40); /* allow some slop */
516 Renew(SvPV(sv), SvLEN(sv), char);
529 SAVESPTR(last_in_gv); /* We don't want this to be permanent. */
530 last_in_gv = (GV*)*stack_sp--;
542 result = do_readline();
549 last_in_gv = (GV*)(*stack_sp--);
550 return do_readline();
555 last_in_gv = gv_fetchpv(SvPVnx(GvSV((GV*)(*stack_sp--))), TRUE);
556 return do_readline();
561 last_in_gv = cGVOP->op_gv;
562 return do_readline();
567 register PMOP *pm = (PMOP*)cLOGOP->op_other;
571 register REGEXP *rx = pm->op_pmregexp;
573 global = pm->op_pmflags & PMf_GLOBAL;
578 pm->op_pmregexp = Null(REGEXP*); /* crucial if regcomp aborts */
579 pm->op_pmregexp = regcomp(t, t+SvCUR(tmpstr),
580 pm->op_pmflags & PMf_FOLD);
581 if (!pm->op_pmregexp->prelen && curpm)
583 if (pm->op_pmflags & PMf_KEEP) {
584 if (!(pm->op_pmflags & PMf_FOLD))
585 scan_prefix(pm, pm->op_pmregexp->precomp,
586 pm->op_pmregexp->prelen);
587 pm->op_pmflags &= ~PMf_RUNTIME; /* no point compiling again */
589 op->op_type = OP_NULL;
590 op->op_ppaddr = ppaddr[OP_NULL];
591 /* XXX delete push code */
599 register PMOP *pm = cPMOP;
608 register REGEXP *rx = pm->op_pmregexp;
612 global = pm->op_pmflags & PMf_GLOBAL;
613 safebase = (gimme == G_ARRAY) || global;
615 if (op->op_flags & OPf_STACKED)
622 strend = s + SvCUR(TARG);
624 DIE("panic: do_match");
626 if (pm->op_pmflags & PMf_USED) {
627 if (gimme == G_ARRAY)
632 if (!rx->prelen && curpm) {
634 rx = pm->op_pmregexp;
638 if (global && rx->startp[0]) {
640 if (s == rx->startp[0])
646 if (myhint < s || myhint > strend)
647 DIE("panic: hint in do_match");
649 if (rx->regback >= 0) {
657 else if (pm->op_pmshort) {
658 if (pm->op_pmflags & PMf_SCANFIRST) {
659 if (SvSCREAM(TARG)) {
660 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
662 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
664 else if (pm->op_pmflags & PMf_ALL)
667 else if (!(s = fbm_instr((unsigned char*)s,
668 (unsigned char*)strend, pm->op_pmshort)))
670 else if (pm->op_pmflags & PMf_ALL)
672 if (s && rx->regback >= 0) {
673 ++BmUSEFUL(pm->op_pmshort);
681 else if (!multiline) {
682 if (*SvPV(pm->op_pmshort) != *s ||
683 bcmp(SvPV(pm->op_pmshort), s, pm->op_pmslen) ) {
684 if (pm->op_pmflags & PMf_FOLD) {
685 if (ibcmp(SvPV(pm->op_pmshort), s, pm->op_pmslen) )
692 if (--BmUSEFUL(pm->op_pmshort) < 0) {
693 sv_free(pm->op_pmshort);
694 pm->op_pmshort = Nullsv; /* opt is being useless */
697 if (!rx->nparens && !global) {
698 gimme = G_SCALAR; /* accidental array context? */
701 if (regexec(rx, s, strend, truebase, 0,
702 SvSCREAM(TARG) ? TARG : Nullsv,
705 if (pm->op_pmflags & PMf_ONCE)
706 pm->op_pmflags |= PMf_USED;
711 rx->startp[0] = Nullch;
712 if (gimme == G_ARRAY)
719 if (gimme == G_ARRAY) {
723 if (global && !iters)
727 EXTEND(SP, iters + i);
728 for (i = !i; i <= iters; i++) {
729 PUSHs(sv_mortalcopy(&sv_no));
731 if (s = rx->startp[i]) {
732 len = rx->endp[i] - s;
734 sv_setpvn(*SP, s, len);
738 truebase = rx->subbeg;
748 ++BmUSEFUL(pm->op_pmshort);
750 if (pm->op_pmflags & PMf_ONCE)
751 pm->op_pmflags |= PMf_USED;
756 rx->endp[0] = s + SvCUR(pm->op_pmshort);
763 Safefree(rx->subbase);
764 tmps = rx->subbase = nsavestr(t, strend-t);
766 rx->subend = tmps + (strend-t);
767 tmps = rx->startp[0] = tmps + (s - t);
768 rx->endp[0] = tmps + SvCUR(pm->op_pmshort);
773 rx->startp[0] = Nullch;
775 ++BmUSEFUL(pm->op_pmshort);
776 if (gimme == G_ARRAY)
784 register PMOP *pm = cPMOP;
799 register REGEXP *rx = pm->op_pmregexp;
801 if (pm->op_pmflags & PMf_CONST) /* known replacement string? */
803 if (op->op_flags & OPf_STACKED)
811 DIE("panic: do_subst");
813 strend = s + SvCUR(TARG);
814 maxiters = (strend - s) + 10;
816 if (!rx->prelen && curpm) {
818 rx = pm->op_pmregexp;
820 safebase = ((!rx || !rx->nparens) && !sawampersand);
823 if (hint < s || hint > strend)
824 DIE("panic: hint in do_match");
827 if (rx->regback >= 0) {
835 else if (pm->op_pmshort) {
836 if (pm->op_pmflags & PMf_SCANFIRST) {
837 if (SvSCREAM(TARG)) {
838 if (screamfirst[BmRARE(pm->op_pmshort)] < 0)
840 else if (!(s = screaminstr(TARG, pm->op_pmshort)))
843 else if (!(s = fbm_instr((unsigned char*)s, (unsigned char*)strend,
846 if (s && rx->regback >= 0) {
847 ++BmUSEFUL(pm->op_pmshort);
855 else if (!multiline) {
856 if (*SvPV(pm->op_pmshort) != *s ||
857 bcmp(SvPV(pm->op_pmshort), s, pm->op_pmslen) ) {
858 if (pm->op_pmflags & PMf_FOLD) {
859 if (ibcmp(SvPV(pm->op_pmshort), s, pm->op_pmslen) )
866 if (--BmUSEFUL(pm->op_pmshort) < 0) {
867 sv_free(pm->op_pmshort);
868 pm->op_pmshort = Nullsv; /* opt is being useless */
871 once = !(rpm->op_pmflags & PMf_GLOBAL);
872 if (rpm->op_pmflags & PMf_CONST) { /* known replacement string? */
875 if (clen <= rx->minlen) {
876 /* can do inplace substitution */
877 if (regexec(rx, s, strend, orig, 0,
878 SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
879 if (rx->subbase) /* oops, no we can't */
883 SvSCREAM_off(TARG); /* disable possible screamer */
888 if (m - s > strend - d) { /* faster to shorten from end */
890 Copy(c, m, clen, char);
899 SvCUR_set(TARG, m - s);
906 else if (i = m - s) { /* faster from front */
914 Copy(c, m, clen, char);
923 Copy(c, d, clen, char);
939 if (iters++ > maxiters)
940 DIE("Substitution loop");
949 Copy(c, d, clen, char);
953 } while (regexec(rx, s, strend, orig, s == m,
954 Nullsv, TRUE)); /* (don't match same null twice) */
957 SvCUR_set(TARG, d - SvPV(TARG) + i);
958 Move(s, d, i+1, char); /* include the Null */
962 PUSHs(sv_2mortal(newSVnv((double)iters)));
971 if (regexec(rx, s, strend, orig, 0,
972 SvSCREAM(TARG) ? TARG : Nullsv, safebase)) {
974 dstr = NEWSV(25, sv_len(TARG));
975 sv_setpvn(dstr, m, s-m);
978 register CONTEXT *cx;
980 RETURNOP(cPMOP->op_pmreplroot);
983 if (iters++ > maxiters)
984 DIE("Substitution loop");
985 if (rx->subbase && rx->subbase != orig) {
990 strend = s + (strend - m);
993 sv_catpvn(dstr, s, m-s);
996 sv_catpvn(dstr, c, clen);
999 } while (regexec(rx, s, strend, orig, s == m, Nullsv,
1001 sv_catpvn(dstr, s, strend - s);
1002 sv_replace(TARG, dstr);
1005 PUSHs(sv_2mortal(newSVnv((double)iters)));
1012 ++BmUSEFUL(pm->op_pmshort);
1020 register PMOP *pm = (PMOP*) cLOGOP->op_other;
1021 register CONTEXT *cx = &cxstack[cxstack_ix];
1022 register SV *dstr = cx->sb_dstr;
1023 register char *s = cx->sb_s;
1024 register char *m = cx->sb_m;
1025 char *orig = cx->sb_orig;
1026 register REGEXP *rx = pm->op_pmregexp;
1028 if (cx->sb_iters++) {
1029 if (cx->sb_iters > cx->sb_maxiters)
1030 DIE("Substitution loop");
1032 sv_catsv(dstr, POPs);
1034 Safefree(rx->subbase);
1035 rx->subbase = cx->sb_subbase;
1038 if (cx->sb_once || !regexec(rx, s, cx->sb_strend, orig,
1039 s == m, Nullsv, cx->sb_safebase))
1041 SV *targ = cx->sb_targ;
1042 sv_catpvn(dstr, s, cx->sb_strend - s);
1043 sv_replace(targ, dstr);
1046 PUSHs(sv_2mortal(newSVnv((double)(cx->sb_iters - 1))));
1048 RETURNOP(pm->op_next);
1051 if (rx->subbase && rx->subbase != orig) {
1054 cx->sb_orig = orig = rx->subbase;
1056 cx->sb_strend = s + (cx->sb_strend - m);
1058 cx->sb_m = m = rx->startp[0];
1059 sv_catpvn(dstr, s, m-s);
1060 cx->sb_s = rx->endp[0];
1061 cx->sb_subbase = rx->subbase;
1063 rx->subbase = Nullch; /* so recursion works */
1064 RETURNOP(pm->op_pmreplstart);
1072 if (op->op_flags & OPf_STACKED)
1079 PUSHi(do_trans(sv, op));
1083 /* Lvalue operators. */
1089 if (tainted && !lstr->sv_tainted)
1092 SvSetSV(rstr, lstr);
1101 SV **lastlelem = stack_sp;
1102 SV **lastrelem = stack_base + POPMARK;
1103 SV **firstrelem = stack_base + POPMARK + 1;
1104 SV **firstlelem = lastrelem + 1;
1106 register SV **relem;
1107 register SV **lelem;
1115 delaymagic = DM_DELAY; /* catch simultaneous items */
1117 /* If there's a common identifier on both sides we have to take
1118 * special care that assigning the identifier on the left doesn't
1119 * clobber a value on the right that's used later in the list.
1121 if (op->op_private & OPpASSIGN_COMMON) {
1122 for (relem = firstrelem; relem <= lastrelem; relem++) {
1125 *relem = sv_mortalcopy(sv);
1133 while (lelem <= lastlelem) {
1135 switch (SvTYPE(sv)) {
1141 while (relem <= lastrelem) { /* gobble up all the rest */
1144 sv_setsv(sv,*relem);
1146 (void)av_store(ary,i++,sv);
1156 hv_clear(hash, TRUE); /* wipe any dbm file too */
1158 while (relem < lastrelem) { /* gobble up all the rest */
1162 sv = &sv_no, relem++;
1164 tmpstr = NEWSV(29,0);
1166 sv_setsv(tmpstr,*relem); /* value */
1167 *(relem++) = tmpstr;
1168 (void)hv_store(hash,tmps,SvCUR(sv),tmpstr,0);
1173 if (SvREADONLY(sv)) {
1174 if (sv != &sv_undef && sv != &sv_yes && sv != &sv_no)
1176 if (relem <= lastrelem)
1180 if (relem <= lastrelem) {
1181 sv_setsv(sv, *relem);
1185 sv_setsv(sv, &sv_undef);
1190 if (delaymagic & ~DM_DELAY) {
1191 if (delaymagic & DM_UID) {
1193 (void)setreuid(uid,euid);
1194 #else /* not HAS_SETREUID */
1196 if ((delaymagic & DM_UID) == DM_RUID) {
1198 delaymagic =~ DM_RUID;
1200 #endif /* HAS_SETRUID */
1202 if ((delaymagic & DM_UID) == DM_EUID) {
1204 delaymagic =~ DM_EUID;
1206 #endif /* HAS_SETEUID */
1207 if (delaymagic & DM_UID) {
1209 DIE("No setreuid available");
1212 #endif /* not HAS_SETREUID */
1213 uid = (int)getuid();
1214 euid = (int)geteuid();
1216 if (delaymagic & DM_GID) {
1218 (void)setregid(gid,egid);
1219 #else /* not HAS_SETREGID */
1221 if ((delaymagic & DM_GID) == DM_RGID) {
1223 delaymagic =~ DM_RGID;
1225 #endif /* HAS_SETRGID */
1227 if ((delaymagic & DM_GID) == DM_EGID) {
1229 delaymagic =~ DM_EGID;
1231 #endif /* HAS_SETEGID */
1232 if (delaymagic & DM_GID) {
1234 DIE("No setregid available");
1237 #endif /* not HAS_SETREGID */
1238 gid = (int)getgid();
1239 egid = (int)getegid();
1243 if (GIMME == G_ARRAY) {
1247 SP = firstrelem + (lastlelem - firstlelem);
1253 SETi(lastrelem - firstrelem + 1);
1274 dSP; dMARK; dTARGET;
1276 do_chop(TARG, POPs);
1292 if (!sv || !SvANY(sv))
1294 switch (SvTYPE(sv)) {
1319 if (!op->op_private)
1326 switch (SvTYPE(sv)) {
1337 op_free(CvROOT(cv));
1342 if (sv != GvSV(defgv)) {
1343 if (SvPOK(sv) && SvLEN(sv)) {
1346 SvPV_set(sv, Nullch);
1360 register unsigned char *s;
1363 register I32 *sfirst;
1364 register I32 *snext;
1367 s = (unsigned char*)(SvPVn(TARG));
1370 SvSCREAM_off(lastscream);
1376 if (pos > maxscream) {
1377 if (maxscream < 0) {
1378 maxscream = pos + 80;
1379 New(301, screamfirst, 256, I32);
1380 New(302, screamnext, maxscream, I32);
1383 maxscream = pos + pos / 4;
1384 Renew(screamnext, maxscream, I32);
1388 sfirst = screamfirst;
1391 if (!sfirst || !snext)
1392 DIE("do_study: out of memory");
1394 for (ch = 256; ch; --ch)
1398 while (--pos >= 0) {
1400 if (sfirst[ch] >= 0)
1401 snext[pos] = sfirst[ch] - pos;
1406 /* If there were any case insensitive searches, we must assume they
1407 * all are. This speeds up insensitive searches much more than
1408 * it slows down sensitive ones.
1411 sfirst[fold[ch]] = pos;
1417 XPUSHs(sv_2mortal(newSVnv((double)retval)));
1440 sv_setsv(TARG, TOPs);
1450 sv_setsv(TARG, TOPs);
1457 /* Ordinary operators. */
1461 dSP; dATARGET; dPOPTOPnnrl;
1462 SETn( pow( left, right) );
1468 dSP; dATARGET; dPOPTOPnnrl;
1469 SETn( left * right );
1475 dSP; dATARGET; dPOPnv;
1477 DIE("Illegal division by zero");
1479 /* insure that 20./5. == 4. */
1484 if ((double)(I32)x == x &&
1485 (double)(I32)value == value &&
1486 (k = (I32)x/(I32)value)*(I32)value == (I32)x) {
1493 value = POPn / value;
1502 register unsigned long tmpulong;
1503 register long tmplong;
1506 tmpulong = (unsigned long) POPn;
1508 DIE("Illegal modulus zero");
1511 value = (I32)(((unsigned long)value) % tmpulong);
1513 tmplong = (long)value;
1514 value = (I32)(tmpulong - ((-tmplong - 1) % tmpulong)) - 1;
1523 register I32 count = POPi;
1524 if (GIMME == G_ARRAY && op->op_private & OPpREPEAT_DOLIST) {
1526 I32 items = SP - MARK;
1529 max = items * count;
1538 repeatcpy(MARK + items, MARK, items * sizeof(SV*), count - 1);
1542 else { /* Note: mark already snarfed by pp_list */
1547 SvSetSV(TARG, tmpstr);
1549 tmpstr = NEWSV(50, 0);
1551 sv_setpvn(tmpstr, tmps, SvCUR(TARG));
1552 tmps = SvPVn(tmpstr); /* force to be string */
1553 SvGROW(TARG, (count * SvCUR(TARG)) + 1);
1554 repeatcpy(SvPV(TARG), tmps, SvCUR(tmpstr), count);
1555 SvCUR(TARG) *= count;
1556 *SvEND(TARG) = '\0';
1561 if (dowarn && SvPOK(SP[1]) && !looks_like_number(SP[1]))
1562 warn("Right operand of x is not numeric");
1563 sv_setsv(TARG, &sv_no);
1572 dSP; dATARGET; dPOPTOPnnrl;
1573 SETn( left + right );
1579 dSP; dATARGET; dPOPTOPiirl;
1580 SETi( left + right );
1586 dSP; dATARGET; dPOPTOPnnrl;
1587 SETn( left - right );
1593 dSP; dATARGET; dPOPTOPssrl;
1594 SvSetSV(TARG, lstr);
1595 sv_catsv(TARG, rstr);
1604 double value = TOPn;
1605 SETi( U_L(value) << anum );
1613 double value = TOPn;
1614 SETi( U_L(value) >> anum );
1621 SETs((TOPn < value) ? &sv_yes : &sv_no);
1628 SETs((TOPn > value) ? &sv_yes : &sv_no);
1635 SETs((TOPn <= value) ? &sv_yes : &sv_no);
1642 SETs((TOPn >= value) ? &sv_yes : &sv_no);
1651 if ((!SvNIOK(SP[ 0]) && !looks_like_number(SP[ 0])) ||
1652 (!SvNIOK(SP[-1]) && !looks_like_number(SP[-1])) )
1653 warn("Possible use of == on string value");
1657 SETs((TOPn == value) ? &sv_yes : &sv_no);
1664 SETs((TOPn != value) ? &sv_yes : &sv_no);
1670 dSP; dTARGET; dPOPTOPnnrl;
1675 else if (left < right)
1686 SETs( sv_cmp(lstr, rstr) < 0 ? &sv_yes : &sv_no );
1693 SETs( sv_cmp(lstr, rstr) > 0 ? &sv_yes : &sv_no );
1700 SETs( sv_cmp(lstr, rstr) <= 0 ? &sv_yes : &sv_no );
1707 SETs( sv_cmp(lstr, rstr) >= 0 ? &sv_yes : &sv_no );
1714 SETs( sv_eq(lstr, rstr) ? &sv_yes : &sv_no );
1721 SETs( !sv_eq(lstr, rstr) ? &sv_yes : &sv_no );
1729 SETi( sv_cmp(lstr, rstr) );
1735 dSP; dATARGET; dPOPTOPssrl;
1736 if (SvNIOK(lstr) || SvNIOK(rstr)) {
1737 I32 value = SvIVn(lstr);
1738 value = value & SvIVn(rstr);
1742 do_vop(op->op_type, TARG, lstr, rstr);
1750 dSP; dATARGET; dPOPTOPssrl;
1751 if (SvNIOK(lstr) || SvNIOK(rstr)) {
1752 I32 value = SvIVn(lstr);
1753 value = value ^ SvIVn(rstr);
1757 do_vop(op->op_type, TARG, lstr, rstr);
1765 dSP; dATARGET; dPOPTOPssrl;
1766 if (SvNIOK(lstr) || SvNIOK(rstr)) {
1767 I32 value = SvIVn(lstr);
1768 value = value | SvIVn(rstr);
1772 do_vop(op->op_type, TARG, lstr, rstr);
1787 *stack_sp = SvTRUE(*stack_sp) ? &sv_no : &sv_yes;
1793 dSP; dTARGET; dTOPss;
1800 register char *tmps;
1801 register long *tmpl;
1807 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1810 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1814 for ( ; anum > 0; anum--, tmps++)
1822 /* High falutin' math. */
1826 dSP; dTARGET; dPOPTOPnnrl;
1827 SETn(atan2(left, right));
1836 value = SvNVnx(GvSV(defgv));
1849 value = SvNVnx(GvSV(defgv));
1868 value = rand() * value / 2147483648.0;
1871 value = rand() * value / 65536.0;
1874 value = rand() * value / 32768.0;
1876 value = rand() * value / (double)(((unsigned long)1) << RANDBITS);
1906 value = SvNVnx(GvSV(defgv));
1919 value = SvNVnx(GvSV(defgv));
1923 DIE("Can't take log of %g\n", value);
1934 value = SvNVnx(GvSV(defgv));
1938 DIE("Can't take sqrt of %g\n", value);
1939 value = sqrt(value);
1949 value = SvNVnx(GvSV(defgv));
1953 (void)modf(value, &value);
1955 (void)modf(-value, &value);
1969 tmps = SvPVnx(GvSV(defgv));
1972 XPUSHi( scan_hex(tmps, 99, &argtype) );
1984 tmps = SvPVnx(GvSV(defgv));
1987 while (*tmps && (isSPACE(*tmps) || *tmps == '0'))
1990 value = (I32)scan_hex(++tmps, 99, &argtype);
1992 value = (I32)scan_oct(tmps, 99, &argtype);
2003 XPUSHi( sv_len(GvSV(defgv)) );
2006 SETi( sv_len(TOPs) );
2018 I32 lvalue = op->op_flags & OPf_LVAL;
2023 pos = POPi - arybase;
2025 tmps = SvPVn(sv); /* force conversion to string */
2028 pos += curlen + arybase;
2029 if (pos < 0 || pos > curlen)
2030 sv_setpvn(TARG, "", 0);
2037 rem = curlen - pos; /* rem=how many bytes left*/
2040 sv_setpvn(TARG, tmps, rem);
2041 if (lvalue) { /* it's an lvalue! */
2044 LvTARGOFF(TARG) = tmps - SvPVn(sv);
2045 LvTARGLEN(TARG) = rem;
2048 PUSHs(TARG); /* avoid SvSETMAGIC here */
2055 register I32 size = POPi;
2056 register I32 offset = POPi;
2057 register SV *src = POPs;
2058 I32 lvalue = op->op_flags & OPf_LVAL;
2059 unsigned char *s = (unsigned char*)SvPVn(src);
2060 unsigned long retnum;
2063 offset *= size; /* turn into bit offset */
2064 len = (offset + size + 7) / 8;
2065 if (offset < 0 || size < 1)
2067 else if (!lvalue && len > SvCUR(src))
2070 if (len > SvCUR(src)) {
2072 (void)memzero(SvPV(src) + SvCUR(src), len - SvCUR(src));
2073 SvCUR_set(src, len);
2075 s = (unsigned char*)SvPVn(src);
2077 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
2082 else if (size == 16)
2083 retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
2084 else if (size == 32)
2085 retnum = ((unsigned long) s[offset] << 24) +
2086 ((unsigned long) s[offset + 1] << 16) +
2087 (s[offset + 2] << 8) + s[offset+3];
2090 if (lvalue) { /* it's an lvalue! */
2093 LvTARGOFF(TARG) = offset;
2094 LvTARGLEN(TARG) = size;
2098 sv_setiv(TARG, (I32)retnum);
2116 offset = POPi - arybase;
2122 else if (offset > SvCUR(big))
2123 offset = SvCUR(big);
2124 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2125 (unsigned char*)tmps + SvCUR(big), little)))
2126 retval = -1 + arybase;
2128 retval = tmps2 - tmps + arybase;
2148 tmps2 = SvPVn(little);
2151 offset = SvCUR(big);
2153 offset = SvIVn(offstr) - arybase + SvCUR(little);
2156 else if (offset > SvCUR(big))
2157 offset = SvCUR(big);
2158 if (!(tmps2 = rninstr(tmps, tmps + offset,
2159 tmps2, tmps2 + SvCUR(little))))
2160 retval = -1 + arybase;
2162 retval = tmps2 - tmps + arybase;
2169 dSP; dMARK; dORIGMARK; dTARGET;
2170 do_sprintf(TARG, SP-MARK, MARK+1);
2180 register char *s = SvPVn(sv);
2181 register char *send = s + SvCUR(sv);
2182 register char *base;
2183 register I32 skipspaces = 0;
2186 bool postspace = FALSE;
2193 New(804, fops, send - s, U16); /* Almost certainly too long... */
2198 *fpc++ = FF_LINEMARK;
2199 noblank = repeat = FALSE;
2217 case ' ': case '\t':
2230 *fpc++ = FF_LITERAL;
2237 *fpc++ = skipspaces;
2241 *fpc++ = FF_NEWLINE;
2245 arg = fpc - linepc + 1;
2252 *fpc++ = FF_LINEMARK;
2253 noblank = repeat = FALSE;
2262 ischop = s[-1] == '^';
2268 arg = (s - base) - 1;
2270 *fpc++ = FF_LITERAL;
2279 *fpc++ = FF_LINEGLOB;
2281 else if (*s == '#' || (*s == '.' && s[1] == '#')) {
2282 arg = ischop ? 512 : 0;
2292 arg |= 256 + (s - f);
2294 *fpc++ = s - base; /* fieldsize for FETCH */
2295 *fpc++ = FF_DECIMAL;
2300 bool ismore = FALSE;
2303 while (*++s == '>') ;
2304 prespace = FF_SPACE;
2306 else if (*s == '|') {
2307 while (*++s == '|') ;
2308 prespace = FF_HALFSPACE;
2313 while (*++s == '<') ;
2316 if (*s == '.' && s[1] == '.' && s[2] == '.') {
2320 *fpc++ = s - base; /* fieldsize for FETCH */
2322 *fpc++ = ischop ? FF_CHECKCHOP : FF_CHECKNL;
2340 SvGROW(sv, SvCUR(sv) + arg * sizeof(U16) + 4);
2342 s = SvPV(sv) + SvCUR(sv);
2343 s += 2 + (SvCUR(sv) & 1);
2345 Copy(fops, s, arg, U16);
2351 dSP; dMARK; dORIGMARK;
2352 register SV *form = *++MARK;
2357 register char *send;
2363 bool chopspace = (index(chopset, ' ') != Nullch);
2371 if (!SvCOMPILED(form))
2374 SvGROW(formtarget, SvCUR(formtarget) + SvCUR(form) + 1);
2375 t = SvPVn(formtarget);
2376 t += SvCUR(formtarget);
2379 s = f + SvCUR(form);
2380 s += 2 + (SvCUR(form) & 1);
2389 case FF_LITERAL: arg = fpc[1]; name = "LITERAL"; break;
2390 case FF_BLANK: arg = fpc[1]; name = "BLANK"; break;
2391 case FF_SKIP: arg = fpc[1]; name = "SKIP"; break;
2392 case FF_FETCH: arg = fpc[1]; name = "FETCH"; break;
2393 case FF_DECIMAL: arg = fpc[1]; name = "DECIMAL"; break;
2395 case FF_CHECKNL: name = "CHECKNL"; break;
2396 case FF_CHECKCHOP: name = "CHECKCHOP"; break;
2397 case FF_SPACE: name = "SPACE"; break;
2398 case FF_HALFSPACE: name = "HALFSPACE"; break;
2399 case FF_ITEM: name = "ITEM"; break;
2400 case FF_CHOP: name = "CHOP"; break;
2401 case FF_LINEGLOB: name = "LINEGLOB"; break;
2402 case FF_NEWLINE: name = "NEWLINE"; break;
2403 case FF_MORE: name = "MORE"; break;
2404 case FF_LINEMARK: name = "LINEMARK"; break;
2405 case FF_END: name = "END"; break;
2408 fprintf(stderr, "%-16s%d\n", name, arg);
2410 fprintf(stderr, "%-16s\n", name);
2441 warn("Not enough format arguments");
2447 itemsize = SvCUR(sv);
2448 if (itemsize > fieldsize)
2449 itemsize = fieldsize;
2450 send = chophere = s + itemsize;
2454 else if (*s == '\n')
2458 itemsize = s - SvPV(sv);
2463 itemsize = SvCUR(sv);
2464 if (itemsize > fieldsize)
2465 itemsize = fieldsize;
2466 send = chophere = s + itemsize;
2467 while (s < send || (s == send && isSPACE(*s))) {
2477 if (index(chopset, *s))
2482 itemsize = chophere - SvPV(sv);
2486 arg = fieldsize - itemsize;
2495 arg = fieldsize - itemsize;
2508 if ((*t++ = *s++) < ' ')
2516 while (*s && isSPACE(*s))
2524 itemsize = SvCUR(sv);
2527 send = s + itemsize;
2536 SvCUR_set(formtarget, t - SvPV(formtarget));
2537 sv_catpvn(formtarget, SvPV(sv), itemsize);
2538 SvGROW(formtarget, SvCUR(formtarget) + SvCUR(form) + 1);
2539 t = SvPV(formtarget) + SvCUR(formtarget);
2544 /* If the field is marked with ^ and the value is undefined,
2547 if ((arg & 512) && !SvOK(sv)) {
2556 sprintf(t, "%#*.*f", fieldsize, arg & 255, value);
2558 sprintf(t, "%*.0f", fieldsize, value);
2565 while (t-- > linemark && *t == ' ') ;
2573 if (arg) { /* repeat until fields exhausted? */
2579 if (strnEQ(linemark, linemark - t, arg))
2580 DIE("Runaway format");
2582 arg = t - SvPV(formtarget);
2584 (t - SvPV(formtarget)) + (f - formmark) + 1);
2585 t = SvPV(formtarget) + arg;
2596 arg = fieldsize - itemsize;
2603 if (strnEQ(s," ",3)) {
2604 while (s > SvPV(formtarget) && isSPACE(s[-1]))
2615 SvCUR_set(formtarget, t - SvPV(formtarget));
2616 FmLINES(formtarget) += lines;
2631 tmps = SvPVnx(GvSV(defgv));
2635 value = (I32) (*tmps & 255);
2638 value = (I32) (anum & 255);
2646 dSP; dTARGET; dPOPTOPssrl;
2648 char *tmps = SvPVn(lstr);
2650 sv_setpv(TARG, fcrypt(tmps, SvPVn(rstr)));
2652 sv_setpv(TARG, crypt(tmps, SvPVn(rstr)));
2656 "The crypt() function is unimplemented due to excessive paranoia.");
2668 if (SvSTORAGE(sv) != 'T') {
2675 if (isascii(*s) && islower(*s))
2687 if (SvSTORAGE(sv) != 'T') {
2694 if (isascii(*s) && isupper(*s))
2706 register char *send;
2708 if (SvSTORAGE(sv) != 'T') {
2715 send = s + SvCUR(sv);
2717 if (isascii(*s) && islower(*s))
2729 register char *send;
2731 if (SvSTORAGE(sv) != 'T') {
2738 send = s + SvCUR(sv);
2740 if (isascii(*s) && isupper(*s))
2755 if (SvTYPE(sv) == SVt_REF) {
2756 av = (AV*)SvANY(sv);
2757 if (SvTYPE(av) != SVt_PVAV)
2758 DIE("Not an array reference");
2759 if (op->op_flags & OPf_LVAL) {
2760 if (op->op_flags & OPf_LOCAL)
2761 av = (AV*)save_svref(sv);
2767 if (SvTYPE(sv) != SVt_PVGV)
2768 sv = (SV*)gv_fetchpv(SvPVn(sv), TRUE);
2770 if (op->op_flags & OPf_LVAL) {
2771 if (op->op_flags & OPf_LOCAL)
2778 if (GIMME == G_ARRAY) {
2779 I32 maxarg = AvFILL(av) + 1;
2781 Copy(AvARRAY(av), SP+1, maxarg, SV*);
2786 I32 maxarg = AvFILL(av) + 1;
2795 AV *av = (AV*)cSVOP->op_sv;
2796 SV** svp = av_fetch(av, op->op_private - arybase, FALSE);
2797 PUSHs(svp ? *svp : &sv_undef);
2805 I32 elem = POPi - arybase;
2808 if (op->op_flags & OPf_LVAL) {
2809 svp = av_fetch(av, elem, TRUE);
2810 if (!svp || *svp == &sv_undef)
2811 DIE("Assignment to non-creatable value, subscript %d", elem);
2812 if (op->op_flags & OPf_LOCAL)
2814 else if (!SvOK(*svp)) {
2815 if (op->op_private == OP_RV2HV) {
2817 *svp = (SV*)newHV(COEFFSIZE);
2819 else if (op->op_private == OP_RV2AV) {
2821 *svp = (SV*)newAV();
2826 svp = av_fetch(av, elem, FALSE);
2827 PUSHs(svp ? *svp : &sv_undef);
2833 dSP; dMARK; dORIGMARK;
2835 register AV* av = (AV*)POPs;
2836 register I32 lval = op->op_flags & OPf_LVAL;
2837 I32 is_something_there = lval;
2839 while (++MARK <= SP) {
2840 I32 elem = SvIVnx(*MARK);
2843 svp = av_fetch(av, elem, TRUE);
2844 if (!svp || *svp == &sv_undef)
2845 DIE("Assignment to non-creatable value, subscript \"%d\"",elem);
2846 if (op->op_flags & OPf_LOCAL)
2850 svp = av_fetch(av, elem, FALSE);
2851 if (!is_something_there && svp && SvOK(*svp))
2852 is_something_there = TRUE;
2854 *MARK = svp ? *svp : &sv_undef;
2856 if (!is_something_there)
2861 /* Associative arrays. */
2866 HV *hash = (HV*)POPs;
2867 HE *entry = hv_iternext(hash);
2878 if (GIMME == G_ARRAY) {
2879 tmps = hv_iterkey(entry, &i);
2882 mystrk = newSVpv(tmps, i);
2885 sv_setsv(TARG, hv_iterval(hash, entry));
2888 else if (GIMME == G_SCALAR)
2912 DIE("Not an associative array reference");
2914 tmps = SvPVn(tmpsv);
2915 sv = hv_delete(hv, tmps, SvCUR(tmpsv));
2929 if (SvTYPE(sv) == SVt_REF) {
2930 hv = (HV*)SvANY(sv);
2931 if (SvTYPE(hv) != SVt_PVHV)
2932 DIE("Not an associative array reference");
2933 if (op->op_flags & OPf_LVAL) {
2934 if (op->op_flags & OPf_LOCAL)
2935 hv = (HV*)save_svref(sv);
2941 if (SvTYPE(sv) != SVt_PVGV)
2942 sv = (SV*)gv_fetchpv(SvPVn(sv), TRUE);
2944 if (op->op_flags & OPf_LVAL) {
2945 if (op->op_flags & OPf_LOCAL)
2952 if (GIMME == G_ARRAY) { /* array wanted */
2953 *stack_sp = (SV*)hv;
2961 sprintf(buf, "%d/%d", HvFILL(hv),
2963 sv_setpv(TARG, buf);
2975 char *key = SvPVn(keysv);
2976 I32 keylen = SvPOK(keysv) ? SvCUR(keysv) : 0;
2979 if (op->op_flags & OPf_LVAL) {
2980 svp = hv_fetch(hv, key, keylen, TRUE);
2981 if (!svp || *svp == &sv_undef)
2982 DIE("Assignment to non-creatable value, subscript \"%s\"", key);
2983 if (op->op_flags & OPf_LOCAL)
2985 else if (!SvOK(*svp)) {
2986 if (op->op_private == OP_RV2HV) {
2988 *svp = (SV*)newHV(COEFFSIZE);
2990 else if (op->op_private == OP_RV2AV) {
2992 *svp = (SV*)newAV();
2997 svp = hv_fetch(hv, key, keylen, FALSE);
2998 PUSHs(svp ? *svp : &sv_undef);
3004 dSP; dMARK; dORIGMARK;
3006 register HV *hv = (HV*)POPs;
3007 register I32 lval = op->op_flags & OPf_LVAL;
3008 I32 is_something_there = lval;
3010 while (++MARK <= SP) {
3011 char *key = SvPVnx(*MARK);
3012 I32 keylen = SvPOK(*MARK) ? SvCUR(*MARK) : 0;
3015 svp = hv_fetch(hv, key, keylen, TRUE);
3016 if (!svp || *svp == &sv_undef)
3017 DIE("Assignment to non-creatable value, subscript \"%s\"", key);
3018 if (op->op_flags & OPf_LOCAL)
3022 svp = hv_fetch(hv, key, keylen, FALSE);
3023 if (!is_something_there && svp && SvOK(*svp))
3024 is_something_there = TRUE;
3026 *MARK = svp ? *svp : &sv_undef;
3028 if (!is_something_there)
3033 /* Explosives and implosives. */
3040 register char *pat = SvPVn(lstr);
3041 register char *s = SvPVn(rstr);
3042 char *strend = s + SvCUR(rstr);
3044 register char *patend = pat + SvCUR(lstr);
3049 /* These must not be in registers: */
3060 unsigned quad auquad;
3066 register U32 culong;
3068 static char* bitcount = 0;
3070 if (GIMME != G_ARRAY) { /* arrange to do first one only */
3072 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3073 if (index("aAbBhH", *patend) || *pat == '%') {
3075 while (isDIGIT(*patend) || *patend == '*')
3081 while (pat < patend) {
3086 else if (*pat == '*') {
3087 len = strend - strbeg; /* long enough */
3090 else if (isDIGIT(*pat)) {
3092 while (isDIGIT(*pat))
3093 len = (len * 10) + (*pat++ - '0');
3096 len = (datumtype != '@');
3101 if (len == 1 && pat[-1] != '1')
3110 if (len > strend - strbeg)
3111 DIE("@ outside of string");
3115 if (len > s - strbeg)
3116 DIE("X outside of string");
3120 if (len > strend - s)
3121 DIE("x outside of string");
3126 if (len > strend - s)
3129 goto uchar_checksum;
3130 sv = NEWSV(35, len);
3131 sv_setpvn(sv, s, len);
3133 if (datumtype == 'A') {
3134 aptr = s; /* borrow register */
3135 s = SvPV(sv) + len - 1;
3136 while (s >= SvPV(sv) && (!*s || isSPACE(*s)))
3139 SvCUR_set(sv, s - SvPV(sv));
3140 s = aptr; /* unborrow register */
3142 XPUSHs(sv_2mortal(sv));
3146 if (pat[-1] == '*' || len > (strend - s) * 8)
3147 len = (strend - s) * 8;
3150 Newz(601, bitcount, 256, char);
3151 for (bits = 1; bits < 256; bits++) {
3152 if (bits & 1) bitcount[bits]++;
3153 if (bits & 2) bitcount[bits]++;
3154 if (bits & 4) bitcount[bits]++;
3155 if (bits & 8) bitcount[bits]++;
3156 if (bits & 16) bitcount[bits]++;
3157 if (bits & 32) bitcount[bits]++;
3158 if (bits & 64) bitcount[bits]++;
3159 if (bits & 128) bitcount[bits]++;
3163 culong += bitcount[*(unsigned char*)s++];
3168 if (datumtype == 'b') {
3170 if (bits & 1) culong++;
3176 if (bits & 128) culong++;
3183 sv = NEWSV(35, len + 1);
3186 aptr = pat; /* borrow register */
3188 if (datumtype == 'b') {
3190 for (len = 0; len < aint; len++) {
3191 if (len & 7) /*SUPPRESS 595*/
3195 *pat++ = '0' + (bits & 1);
3200 for (len = 0; len < aint; len++) {
3205 *pat++ = '0' + ((bits & 128) != 0);
3209 pat = aptr; /* unborrow register */
3210 XPUSHs(sv_2mortal(sv));
3214 if (pat[-1] == '*' || len > (strend - s) * 2)
3215 len = (strend - s) * 2;
3216 sv = NEWSV(35, len + 1);
3219 aptr = pat; /* borrow register */
3221 if (datumtype == 'h') {
3223 for (len = 0; len < aint; len++) {
3228 *pat++ = hexdigit[bits & 15];
3233 for (len = 0; len < aint; len++) {
3238 *pat++ = hexdigit[(bits >> 4) & 15];
3242 pat = aptr; /* unborrow register */
3243 XPUSHs(sv_2mortal(sv));
3246 if (len > strend - s)
3251 if (aint >= 128) /* fake up signed chars */
3260 if (aint >= 128) /* fake up signed chars */
3263 sv_setiv(sv, (I32)aint);
3264 PUSHs(sv_2mortal(sv));
3269 if (len > strend - s)
3283 sv_setiv(sv, (I32)auint);
3284 PUSHs(sv_2mortal(sv));
3289 along = (strend - s) / sizeof(I16);
3294 Copy(s, &ashort, 1, I16);
3302 Copy(s, &ashort, 1, I16);
3305 sv_setiv(sv, (I32)ashort);
3306 PUSHs(sv_2mortal(sv));
3313 along = (strend - s) / sizeof(U16);
3318 Copy(s, &aushort, 1, U16);
3321 if (datumtype == 'n')
3322 aushort = ntohs(aushort);
3325 if (datumtype == 'v')
3326 aushort = vtohs(aushort);
3334 Copy(s, &aushort, 1, U16);
3338 if (datumtype == 'n')
3339 aushort = ntohs(aushort);
3342 if (datumtype == 'v')
3343 aushort = vtohs(aushort);
3345 sv_setiv(sv, (I32)aushort);
3346 PUSHs(sv_2mortal(sv));
3351 along = (strend - s) / sizeof(int);
3356 Copy(s, &aint, 1, int);
3359 cdouble += (double)aint;
3367 Copy(s, &aint, 1, int);
3370 sv_setiv(sv, (I32)aint);
3371 PUSHs(sv_2mortal(sv));
3376 along = (strend - s) / sizeof(unsigned int);
3381 Copy(s, &auint, 1, unsigned int);
3382 s += sizeof(unsigned int);
3384 cdouble += (double)auint;
3392 Copy(s, &auint, 1, unsigned int);
3393 s += sizeof(unsigned int);
3395 sv_setiv(sv, (I32)auint);
3396 PUSHs(sv_2mortal(sv));
3401 along = (strend - s) / sizeof(I32);
3406 Copy(s, &along, 1, I32);
3409 cdouble += (double)along;
3417 Copy(s, &along, 1, I32);
3420 sv_setiv(sv, (I32)along);
3421 PUSHs(sv_2mortal(sv));
3428 along = (strend - s) / sizeof(U32);
3433 Copy(s, &aulong, 1, U32);
3436 if (datumtype == 'N')
3437 aulong = ntohl(aulong);
3440 if (datumtype == 'V')
3441 aulong = vtohl(aulong);
3444 cdouble += (double)aulong;
3452 Copy(s, &aulong, 1, U32);
3456 if (datumtype == 'N')
3457 aulong = ntohl(aulong);
3460 if (datumtype == 'V')
3461 aulong = vtohl(aulong);
3463 sv_setnv(sv, (double)aulong);
3464 PUSHs(sv_2mortal(sv));
3469 along = (strend - s) / sizeof(char*);
3474 if (sizeof(char*) > strend - s)
3477 Copy(s, &aptr, 1, char*);
3483 PUSHs(sv_2mortal(sv));
3490 if (s + sizeof(quad) > strend)
3493 Copy(s, &aquad, 1, quad);
3497 sv_setnv(sv, (double)aquad);
3498 PUSHs(sv_2mortal(sv));
3504 if (s + sizeof(unsigned quad) > strend)
3507 Copy(s, &auquad, 1, unsigned quad);
3508 s += sizeof(unsigned quad);
3511 sv_setnv(sv, (double)auquad);
3512 PUSHs(sv_2mortal(sv));
3516 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
3519 along = (strend - s) / sizeof(float);
3524 Copy(s, &afloat, 1, float);
3532 Copy(s, &afloat, 1, float);
3535 sv_setnv(sv, (double)afloat);
3536 PUSHs(sv_2mortal(sv));
3542 along = (strend - s) / sizeof(double);
3547 Copy(s, &adouble, 1, double);
3548 s += sizeof(double);
3555 Copy(s, &adouble, 1, double);
3556 s += sizeof(double);
3558 sv_setnv(sv, (double)adouble);
3559 PUSHs(sv_2mortal(sv));
3564 along = (strend - s) * 3 / 4;
3565 sv = NEWSV(42, along);
3566 while (s < strend && *s > ' ' && *s < 'a') {
3571 len = (*s++ - ' ') & 077;
3573 if (s < strend && *s >= ' ')
3574 a = (*s++ - ' ') & 077;
3577 if (s < strend && *s >= ' ')
3578 b = (*s++ - ' ') & 077;
3581 if (s < strend && *s >= ' ')
3582 c = (*s++ - ' ') & 077;
3585 if (s < strend && *s >= ' ')
3586 d = (*s++ - ' ') & 077;
3589 hunk[0] = a << 2 | b >> 4;
3590 hunk[1] = b << 4 | c >> 2;
3591 hunk[2] = c << 6 | d;
3592 sv_catpvn(sv, hunk, len > 3 ? 3 : len);
3597 else if (s[1] == '\n') /* possible checksum byte */
3600 XPUSHs(sv_2mortal(sv));
3605 if (index("fFdD", datumtype) ||
3606 (checksum > 32 && index("iIlLN", datumtype)) ) {
3611 while (checksum >= 16) {
3615 while (checksum >= 4) {
3621 along = (1 << checksum) - 1;
3622 while (cdouble < 0.0)
3624 cdouble = modf(cdouble / adouble, &trouble) * adouble;
3625 sv_setnv(sv, cdouble);
3628 if (checksum < 32) {
3629 along = (1 << checksum) - 1;
3630 culong &= (U32)along;
3632 sv_setnv(sv, (double)culong);
3634 XPUSHs(sv_2mortal(sv));
3642 doencodes(sv, s, len)
3650 sv_catpvn(sv, hunk, 1);
3653 hunk[0] = ' ' + (077 & (*s >> 2));
3654 hunk[1] = ' ' + (077 & ((*s << 4) & 060 | (s[1] >> 4) & 017));
3655 hunk[2] = ' ' + (077 & ((s[1] << 2) & 074 | (s[2] >> 6) & 03));
3656 hunk[3] = ' ' + (077 & (s[2] & 077));
3657 sv_catpvn(sv, hunk, 4);
3661 for (s = SvPV(sv); *s; s++) {
3665 sv_catpvn(sv, "\n", 1);
3670 dSP; dMARK; dORIGMARK; dTARGET;
3671 register SV *cat = TARG;
3673 register char *pat = SvPVnx(*++MARK);
3674 register char *patend = pat + SvCUR(*MARK);
3679 static char *null10 = "\0\0\0\0\0\0\0\0\0\0";
3680 static char *space10 = " ";
3682 /* These must not be in registers: */
3691 unsigned quad auquad;
3699 sv_setpvn(cat, "", 0);
3700 while (pat < patend) {
3701 #define NEXTFROM (items-- > 0 ? *MARK++ : &sv_no)
3704 len = index("@Xxu", datumtype) ? 0 : items;
3707 else if (isDIGIT(*pat)) {
3709 while (isDIGIT(*pat))
3710 len = (len * 10) + (*pat++ - '0');
3718 DIE("% may only be used in unpack");
3729 if (SvCUR(cat) < len)
3730 DIE("X outside of string");
3737 sv_catpvn(cat, null10, 10);
3740 sv_catpvn(cat, null10, len);
3745 aptr = SvPVn(fromstr);
3747 len = SvCUR(fromstr);
3748 if (SvCUR(fromstr) > len)
3749 sv_catpvn(cat, aptr, len);
3751 sv_catpvn(cat, aptr, SvCUR(fromstr));
3752 len -= SvCUR(fromstr);
3753 if (datumtype == 'A') {
3755 sv_catpvn(cat, space10, 10);
3758 sv_catpvn(cat, space10, len);
3762 sv_catpvn(cat, null10, 10);
3765 sv_catpvn(cat, null10, len);
3772 char *savepat = pat;
3777 aptr = SvPVn(fromstr);
3779 len = SvCUR(fromstr);
3782 SvCUR(cat) += (len+7)/8;
3783 SvGROW(cat, SvCUR(cat) + 1);
3784 aptr = SvPV(cat) + aint;
3785 if (len > SvCUR(fromstr))
3786 len = SvCUR(fromstr);
3789 if (datumtype == 'B') {
3790 for (len = 0; len++ < aint;) {
3791 items |= *pat++ & 1;
3795 *aptr++ = items & 0xff;
3801 for (len = 0; len++ < aint;) {
3807 *aptr++ = items & 0xff;
3813 if (datumtype == 'B')
3814 items <<= 7 - (aint & 7);
3816 items >>= 7 - (aint & 7);
3817 *aptr++ = items & 0xff;
3819 pat = SvPV(cat) + SvCUR(cat);
3830 char *savepat = pat;
3835 aptr = SvPVn(fromstr);
3837 len = SvCUR(fromstr);
3840 SvCUR(cat) += (len+1)/2;
3841 SvGROW(cat, SvCUR(cat) + 1);
3842 aptr = SvPV(cat) + aint;
3843 if (len > SvCUR(fromstr))
3844 len = SvCUR(fromstr);
3847 if (datumtype == 'H') {
3848 for (len = 0; len++ < aint;) {
3850 items |= ((*pat++ & 15) + 9) & 15;
3852 items |= *pat++ & 15;
3856 *aptr++ = items & 0xff;
3862 for (len = 0; len++ < aint;) {
3864 items |= (((*pat++ & 15) + 9) & 15) << 4;
3866 items |= (*pat++ & 15) << 4;
3870 *aptr++ = items & 0xff;
3876 *aptr++ = items & 0xff;
3877 pat = SvPV(cat) + SvCUR(cat);
3889 aint = SvIVn(fromstr);
3891 sv_catpvn(cat, &achar, sizeof(char));
3894 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
3899 afloat = (float)SvNVn(fromstr);
3900 sv_catpvn(cat, (char *)&afloat, sizeof (float));
3907 adouble = (double)SvNVn(fromstr);
3908 sv_catpvn(cat, (char *)&adouble, sizeof (double));
3914 ashort = (I16)SvIVn(fromstr);
3916 ashort = htons(ashort);
3918 sv_catpvn(cat, (char*)&ashort, sizeof(I16));
3924 ashort = (I16)SvIVn(fromstr);
3926 ashort = htovs(ashort);
3928 sv_catpvn(cat, (char*)&ashort, sizeof(I16));
3935 ashort = (I16)SvIVn(fromstr);
3936 sv_catpvn(cat, (char*)&ashort, sizeof(I16));
3942 auint = U_I(SvNVn(fromstr));
3943 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
3949 aint = SvIVn(fromstr);
3950 sv_catpvn(cat, (char*)&aint, sizeof(int));
3956 aulong = U_L(SvNVn(fromstr));
3958 aulong = htonl(aulong);
3960 sv_catpvn(cat, (char*)&aulong, sizeof(U32));
3966 aulong = U_L(SvNVn(fromstr));
3968 aulong = htovl(aulong);
3970 sv_catpvn(cat, (char*)&aulong, sizeof(U32));
3976 aulong = U_L(SvNVn(fromstr));
3977 sv_catpvn(cat, (char*)&aulong, sizeof(U32));
3983 along = SvIVn(fromstr);
3984 sv_catpvn(cat, (char*)&along, sizeof(I32));
3991 auquad = (unsigned quad)SvNVn(fromstr);
3992 sv_catpvn(cat, (char*)&auquad, sizeof(unsigned quad));
3998 aquad = (quad)SvNVn(fromstr);
3999 sv_catpvn(cat, (char*)&aquad, sizeof(quad));
4006 aptr = SvPVn(fromstr);
4007 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4012 aptr = SvPVn(fromstr);
4013 aint = SvCUR(fromstr);
4014 SvGROW(cat, aint * 4 / 3);
4026 doencodes(cat, aptr, todo);
4044 register I32 limit = POPi;
4045 register char *s = SvPVn(TOPs);
4046 char *strend = s + SvCURx(POPs);
4047 register PMOP *pm = (PMOP*)POPs;
4051 I32 maxiters = (strend - s) + 10;
4054 I32 origlimit = limit;
4058 register REGEXP *rx = pm->op_pmregexp;
4062 DIE("panic: do_split");
4063 if (pm->op_pmreplroot)
4064 ary = GvAVn((GV*)pm->op_pmreplroot);
4067 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4071 for (i = AvFILL(ary); i >= 0; i--)
4072 AvARRAY(ary)[i] = Nullsv; /* don't free mere refs */
4074 av_fill(ary,0); /* force allocation */
4076 /* temporarily switch stacks */
4078 SWITCHSTACK(stack, ary);
4080 base = SP - stack_base + 1;
4082 if (pm->op_pmflags & PMf_SKIPWHITE) {
4087 limit = maxiters + 2;
4088 if (strEQ("\\s+", rx->precomp)) {
4091 for (m = s; m < strend && !isSPACE(*m); m++) ;
4094 dstr = NEWSV(30, m-s);
4095 sv_setpvn(dstr, s, m-s);
4100 for (s = m + 1; s < strend && isSPACE(*s); s++) ;
4103 else if (strEQ("^", rx->precomp)) {
4106 for (m = s; m < strend && *m != '\n'; m++) ;
4110 dstr = NEWSV(30, m-s);
4111 sv_setpvn(dstr, s, m-s);
4118 else if (pm->op_pmshort) {
4119 i = SvCUR(pm->op_pmshort);
4121 I32 fold = (pm->op_pmflags & PMf_FOLD);
4122 i = *SvPV(pm->op_pmshort);
4123 if (fold && isUPPER(i))
4128 m < strend && *m != i &&
4129 (!isUPPER(*m) || tolower(*m) != i);
4130 m++) /*SUPPRESS 530*/
4133 else /*SUPPRESS 530*/
4134 for (m = s; m < strend && *m != i; m++) ;
4137 dstr = NEWSV(30, m-s);
4138 sv_setpvn(dstr, s, m-s);
4147 while (s < strend && --limit &&
4148 (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
4152 dstr = NEWSV(31, m-s);
4153 sv_setpvn(dstr, s, m-s);
4162 maxiters += (strend - s) * rx->nparens;
4163 while (s < strend && --limit &&
4164 regexec(rx, s, strend, orig, 1, Nullsv, TRUE) ) {
4166 && rx->subbase != orig) {
4171 strend = s + (strend - m);
4174 dstr = NEWSV(32, m-s);
4175 sv_setpvn(dstr, s, m-s);
4180 for (i = 1; i <= rx->nparens; i++) {
4183 dstr = NEWSV(33, m-s);
4184 sv_setpvn(dstr, s, m-s);
4193 iters = (SP - stack_base) - base;
4194 if (iters > maxiters)
4196 if (s < strend || origlimit) { /* keep field after final delim? */
4197 dstr = NEWSV(34, strend-s);
4198 sv_setpvn(dstr, s, strend-s);
4205 while (iters > 0 && SvCUR(TOPs) == 0)
4209 SWITCHSTACK(ary, oldstack);
4210 if (gimme == G_ARRAY) {
4212 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4218 if (gimme == G_ARRAY)
4221 SP = stack_base + base;
4229 dSP; dMARK; dTARGET;
4231 do_join(TARG, *MARK, MARK, SP);
4237 /* List operators. */
4242 if (GIMME != G_ARRAY) {
4245 *MARK = *SP; /* unwanted list, return last item */
4256 SV **lastrelem = stack_sp;
4257 SV **lastlelem = stack_base + POPMARK;
4258 SV **firstlelem = stack_base + POPMARK + 1;
4259 register SV **firstrelem = lastlelem + 1;
4260 I32 lval = op->op_flags & OPf_LVAL;
4261 I32 is_something_there = lval;
4263 register I32 max = lastrelem - lastlelem;
4264 register SV **lelem;
4267 if (GIMME != G_ARRAY) {
4268 ix = SvIVnx(*lastlelem) - arybase;
4269 if (ix < 0 || ix >= max)
4270 *firstlelem = &sv_undef;
4272 *firstlelem = firstrelem[ix];
4282 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
4283 ix = SvIVnx(*lelem) - arybase;
4284 if (ix < 0 || ix >= max || !(*lelem = firstrelem[ix]))
4286 if (!is_something_there && SvOK(*lelem))
4287 is_something_there = TRUE;
4289 if (is_something_there)
4299 I32 items = SP - MARK;
4301 XPUSHs((SV*)av_make(items, MARK+1));
4307 dSP; dMARK; dORIGMARK;
4308 HV* hv = newHV(COEFFSIZE);
4317 (void)hv_store(hv,tmps,SvCUR(key),val,0);
4326 dSP; dMARK; dORIGMARK;
4327 register AV *ary = (AV*)*++MARK;
4331 register I32 offset;
4332 register I32 length;
4341 offset = SvIVnx(*MARK);
4343 offset += AvFILL(ary) + 1;
4347 length = SvIVnx(*MARK++);
4352 length = AvMAX(ary) + 1; /* close enough to infinity */
4356 length = AvMAX(ary) + 1;
4364 if (offset > AvFILL(ary) + 1)
4365 offset = AvFILL(ary) + 1;
4366 after = AvFILL(ary) + 1 - (offset + length);
4367 if (after < 0) { /* not that much array */
4368 length += after; /* offset+length now in array */
4370 if (!AvALLOC(ary)) {
4376 /* At this point, MARK .. SP-1 is our new LIST */
4379 diff = newlen - length;
4381 if (diff < 0) { /* shrinking the area */
4383 New(451, tmparyval, newlen, SV*); /* so remember insertion */
4384 Copy(MARK, tmparyval, newlen, SV*);
4387 MARK = ORIGMARK + 1;
4388 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4389 MEXTEND(MARK, length);
4390 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
4392 for (i = length, dst = MARK; i; i--)
4393 sv_2mortal(*dst++); /* free them eventualy */
4398 *MARK = AvARRAY(ary)[offset+length-1];
4401 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
4402 sv_free(*dst++); /* free them now */
4405 AvFILL(ary) += diff;
4407 /* pull up or down? */
4409 if (offset < after) { /* easier to pull up */
4410 if (offset) { /* esp. if nothing to pull */
4411 src = &AvARRAY(ary)[offset-1];
4412 dst = src - diff; /* diff is negative */
4413 for (i = offset; i > 0; i--) /* can't trust Copy */
4416 Zero(AvARRAY(ary), -diff, SV*);
4417 AvARRAY(ary) -= diff; /* diff is negative */
4421 if (after) { /* anything to pull down? */
4422 src = AvARRAY(ary) + offset + length;
4423 dst = src + diff; /* diff is negative */
4424 Move(src, dst, after, SV*);
4426 Zero(&AvARRAY(ary)[AvFILL(ary)+1], -diff, SV*);
4427 /* avoid later double free */
4430 for (src = tmparyval, dst = AvARRAY(ary) + offset;
4432 *dst = NEWSV(46, 0);
4433 sv_setsv(*dst++, *src++);
4435 Safefree(tmparyval);
4438 else { /* no, expanding (or same) */
4440 New(452, tmparyval, length, SV*); /* so remember deletion */
4441 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
4444 if (diff > 0) { /* expanding */
4446 /* push up or down? */
4448 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
4452 Move(src, dst, offset, SV*);
4454 AvARRAY(ary) -= diff; /* diff is positive */
4456 AvFILL(ary) += diff;
4459 if (AvFILL(ary) + diff >= AvMAX(ary)) /* oh, well */
4460 av_store(ary, AvFILL(ary) + diff, Nullsv);
4462 AvFILL(ary) += diff;
4463 dst = AvARRAY(ary) + AvFILL(ary);
4464 for (i = diff; i > 0; i--) {
4465 if (*dst) /* stuff was hanging around */
4466 sv_free(*dst); /* after $#foo */
4470 dst = AvARRAY(ary) + AvFILL(ary);
4472 for (i = after; i; i--) {
4479 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
4480 *dst = NEWSV(46, 0);
4481 sv_setsv(*dst++, *src++);
4483 MARK = ORIGMARK + 1;
4484 if (GIMME == G_ARRAY) { /* copy return vals to stack */
4486 Copy(tmparyval, MARK, length, SV*);
4488 for (i = length, dst = MARK; i; i--)
4489 sv_2mortal(*dst++); /* free them eventualy */
4491 Safefree(tmparyval);
4495 else if (length--) {
4496 *MARK = tmparyval[length];
4499 while (length-- > 0)
4500 sv_free(tmparyval[length]);
4502 Safefree(tmparyval);
4513 dSP; dMARK; dORIGMARK; dTARGET;
4514 register AV *ary = (AV*)*++MARK;
4515 register SV *sv = &sv_undef;
4517 for (++MARK; MARK <= SP; MARK++) {
4520 sv_setsv(sv, *MARK);
4521 (void)av_push(ary, sv);
4524 PUSHi( AvFILL(ary) + 1 );
4532 SV *sv = av_pop(av);
4536 (void)sv_2mortal(sv);
4545 SV *sv = av_shift(av);
4550 (void)sv_2mortal(sv);
4557 dSP; dMARK; dORIGMARK; dTARGET;
4558 register AV *ary = (AV*)*++MARK;
4562 av_unshift(ary, SP - MARK);
4565 sv_setsv(sv, *++MARK);
4566 (void)av_store(ary, i++, sv);
4570 PUSHi( AvFILL(ary) + 1 );
4579 if (stack_base + *markstack_ptr == sp) {
4581 RETURNOP(op->op_next->op_next);
4583 stack_sp = stack_base + *markstack_ptr + 1;
4584 pp_pushmark(); /* push dst */
4585 pp_pushmark(); /* push src */
4586 ENTER; /* enter outer scope */
4589 SAVESPTR(GvSV(defgv));
4591 ENTER; /* enter inner scope */
4594 if (src = stack_base[*markstack_ptr]) {
4599 GvSV(defgv) = sv_mortalcopy(&sv_undef);
4601 RETURNOP(((LOGOP*)op->op_next)->op_other);
4609 stack_base[markstack_ptr[-1]++] = stack_base[*markstack_ptr];
4611 LEAVE; /* exit inner scope */
4614 if (stack_base + *markstack_ptr > sp) {
4617 LEAVE; /* exit outer scope */
4618 POPMARK; /* pop src */
4619 items = --*markstack_ptr - markstack_ptr[-1];
4620 POPMARK; /* pop dst */
4621 SP = stack_base + POPMARK; /* pop original mark */
4622 if (GIMME != G_ARRAY) {
4633 ENTER; /* enter inner scope */
4636 if (src = stack_base[*markstack_ptr]) {
4641 GvSV(defgv) = sv_mortalcopy(&sv_undef);
4643 RETURNOP(cLOGOP->op_other);
4649 dSP; dMARK; dORIGMARK;
4651 SV **myorigmark = ORIGMARK;
4661 if (GIMME != G_ARRAY) {
4666 if (op->op_flags & OPf_STACKED) {
4667 if (op->op_flags & OPf_SPECIAL) {
4668 OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */
4669 kid = kUNOP->op_first; /* pass rv2gv */
4670 kid = kUNOP->op_first; /* pass leave */
4671 sortcop = kid->op_next;
4672 stash = curcop->cop_stash;
4675 cv = sv_2cv(*++MARK, &stash, &gv, 0);
4678 SV *tmpstr = sv_mortalcopy(&sv_undef);
4679 gv_efullname(tmpstr, gv);
4680 DIE("Undefined sort subroutine \"%s\" called",
4683 DIE("Undefined subroutine in sort");
4685 sortcop = CvSTART(cv);
4686 SAVESPTR(CvROOT(cv)->op_ppaddr);
4687 CvROOT(cv)->op_ppaddr = ppaddr[OP_NULL];
4692 stash = curcop->cop_stash;
4695 up = myorigmark + 1;
4696 while (MARK < SP) { /* This may or may not shift down one here. */
4698 if (*up = *++MARK) { /* Weed out nulls. */
4706 max = --up - myorigmark;
4717 sortstack = newAV();
4718 av_store(sortstack, 32, Nullsv);
4719 av_clear(sortstack);
4720 AvREAL_off(sortstack);
4722 SWITCHSTACK(stack, sortstack);
4723 if (sortstash != stash) {
4724 firstgv = gv_fetchpv("a", TRUE);
4725 secondgv = gv_fetchpv("b", TRUE);
4729 SAVESPTR(GvSV(firstgv));
4730 SAVESPTR(GvSV(secondgv));
4732 qsort((char*)(myorigmark+1), max, sizeof(SV*), sortcv);
4734 SWITCHSTACK(sortstack, oldstack);
4739 MEXTEND(SP, 20); /* Can't afford stack realloc on signal. */
4740 qsort((char*)(ORIGMARK+1), max, sizeof(SV*), sortcmp);
4743 SP = ORIGMARK + max;
4753 if (GIMME == G_ARRAY) {
4764 register char *down;
4769 do_join(TARG, sv_no, MARK, SP);
4771 sv_setsv(TARG, *SP);
4773 if (SvCUR(TARG) > 1) {
4774 down = SvPV(TARG) + SvCUR(TARG) - 1;
4791 if (GIMME == G_ARRAY)
4792 return cCONDOP->op_true;
4793 return SvTRUEx(PAD_SV(op->op_targ)) ? cCONDOP->op_false : cCONDOP->op_true;
4800 if (GIMME == G_ARRAY) {
4801 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
4805 SV *targ = PAD_SV(op->op_targ);
4807 if ((op->op_private & OPpFLIP_LINENUM)
4808 ? last_in_gv && SvIVn(sv) == GvIO(last_in_gv)->lines
4810 sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
4811 if (op->op_flags & OPf_SPECIAL) {
4818 RETURNOP(((CONDOP*)cUNOP->op_first)->op_false);
4831 if (GIMME == G_ARRAY) {
4837 if (SvNIOK(lstr) || !SvPOK(lstr) ||
4838 (looks_like_number(lstr) && *SvPV(lstr) != '0') ) {
4842 EXTEND(SP, max - i + 1);
4844 sv = sv_mortalcopy(&sv_no);
4850 SV *final = sv_mortalcopy(rstr);
4851 char *tmps = SvPVn(final);
4853 sv = sv_mortalcopy(lstr);
4854 while (!SvNIOK(sv) && SvCUR(sv) <= SvCUR(final) &&
4855 strNE(SvPV(sv),tmps) ) {
4857 sv = sv_2mortal(newSVsv(sv));
4860 if (strEQ(SvPV(sv),tmps))
4866 SV *targ = PAD_SV(cUNOP->op_first->op_targ);
4868 if ((op->op_private & OPpFLIP_LINENUM)
4869 ? last_in_gv && SvIVn(sv) == GvIO(last_in_gv)->lines
4871 sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
4872 sv_catpv(targ, "E0");
4887 register CONTEXT *cx;
4889 for (i = cxstack_ix; i >= 0; i--) {
4891 switch (cx->cx_type) {
4894 warn("Exiting substitution via %s", op_name[op->op_type]);
4898 warn("Exiting subroutine via %s", op_name[op->op_type]);
4902 warn("Exiting eval via %s", op_name[op->op_type]);
4905 if (!cx->blk_loop.label ||
4906 strNE(label, cx->blk_loop.label) ) {
4907 DEBUG_l(deb("(Skipping label #%d %s)\n",
4908 i, cx->blk_loop.label));
4911 DEBUG_l( deb("(Found label #%d %s)\n", i, label));
4918 dopoptosub(startingblock)
4922 register CONTEXT *cx;
4923 for (i = startingblock; i >= 0; i--) {
4925 switch (cx->cx_type) {
4930 DEBUG_l( deb("(Found sub #%d)\n", i));
4938 dopoptoeval(startingblock)
4942 register CONTEXT *cx;
4943 for (i = startingblock; i >= 0; i--) {
4945 switch (cx->cx_type) {
4949 DEBUG_l( deb("(Found eval #%d)\n", i));
4957 dopoptoloop(startingblock)
4961 register CONTEXT *cx;
4962 for (i = startingblock; i >= 0; i--) {
4964 switch (cx->cx_type) {
4967 warn("Exiting substitition via %s", op_name[op->op_type]);
4971 warn("Exiting subroutine via %s", op_name[op->op_type]);
4975 warn("Exiting eval via %s", op_name[op->op_type]);
4978 DEBUG_l( deb("(Found loop #%d)\n", i));
4989 register CONTEXT *cx;
4993 while (cxstack_ix > cxix) {
4994 cx = &cxstack[cxstack_ix--];
4995 DEBUG_l(fprintf(stderr, "Unwinding block %d, type %d\n", cxstack_ix+1,
4997 /* Note: we don't need to restore the base context info till the end. */
4998 switch (cx->cx_type) {
5025 message = mess(args);
5027 restartop = die_where(message);
5028 if (stack != mainstack)
5029 longjmp(top_env, 3);
5039 register CONTEXT *cx;
5043 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),message);
5044 cxix = dopoptoeval(cxstack_ix);
5048 if (cxix < cxstack_ix)
5052 if (cx->cx_type != CXt_EVAL) {
5053 fprintf(stderr, "panic: die %s", message);
5058 if (gimme == G_SCALAR)
5059 *++newsp = &sv_undef;
5063 if (optype == OP_REQUIRE)
5064 DIE("%s", SvPVnx(GvSV(gv_fetchpv("@",TRUE))));
5065 return pop_return();
5068 fputs(message, stderr);
5069 (void)fflush(stderr);
5071 (void)UNLINK(e_tmpname);
5073 my_exit((I32)((errno&255)?errno:((statusvalue&255)?statusvalue:255)));
5084 RETURNOP(cLOGOP->op_other);
5095 RETURNOP(cLOGOP->op_other);
5103 RETURNOP(cCONDOP->op_true);
5105 RETURNOP(cCONDOP->op_false);
5114 RETURNOP(cLOGOP->op_other);
5123 RETURNOP(cLOGOP->op_other);
5128 dSP; dPOPss; dTARGET;
5132 if (SvTYPE(sv) != SVt_REF || !(ob = (SV*)SvANY(sv)) || SvSTORAGE(ob) != 'O')
5133 DIE("Not an object reference");
5135 if (TARG && SvTYPE(TARG) == SVt_REF) {
5142 if (!gv) { /* nothing cached */
5143 char *name = SvPV(((SVOP*)cLOGOP->op_other)->op_sv);
5144 if (index(name, '\''))
5145 gv = gv_fetchpv(name, FALSE);
5147 gv = gv_fetchmethod(SvSTASH(ob),name);
5149 DIE("Can't locate object method \"%s\" via package \"%s\"",
5150 name, HvNAME(SvSTASH(ob)));
5165 register CV *cv = sv_2cv(*++MARK, &stash, &gv, 0);
5166 register I32 items = SP - MARK;
5167 I32 hasargs = (op->op_flags & OPf_STACKED) != 0;
5168 register CONTEXT *cx;
5175 SV *tmpstr = sv_mortalcopy(&sv_undef);
5176 gv_efullname(tmpstr, gv);
5177 DIE("Undefined subroutine \"%s\" called",SvPV(tmpstr));
5179 DIE("Not a subroutine reference");
5181 if ((op->op_private & OPpSUBR_DB) && !CvUSERSUB(cv)) {
5184 gv_efullname(sv,gv);
5187 DIE("No DBsub routine");
5190 if (CvUSERSUB(cv)) {
5191 cx->blk_sub.hasargs = 0;
5192 cx->blk_sub.savearray = Null(AV*);;
5193 cx->blk_sub.argarray = Null(AV*);
5196 items = (*CvUSERSUB(cv))(CvUSERINDEX(cv), sp - stack_base, items);
5197 sp = stack_base + items;
5202 push_return(op->op_next);
5203 PUSHBLOCK(cx, CXt_SUB, MARK - 1);
5206 cx->blk_sub.savearray = GvAV(defgv);
5207 cx->blk_sub.argarray = av_fake(items, ++MARK);
5208 GvAV(defgv) = cx->blk_sub.argarray;
5211 if (CvDEPTH(cv) >= 2) { /* save temporaries on recursion? */
5212 if (CvDEPTH(cv) == 100 && dowarn)
5213 warn("Deep recursion on subroutine \"%s\"",GvENAME(gv));
5214 if (CvDEPTH(cv) > AvFILL(CvPADLIST(cv))) {
5215 AV *newpad = newAV();
5216 I32 ix = AvFILL((AV*)*av_fetch(CvPADLIST(cv), 1, FALSE));
5218 av_store(newpad, ix--, NEWSV(0,0));
5219 av_store(CvPADLIST(cv), CvDEPTH(cv), (SV*)newpad);
5220 AvFILL(CvPADLIST(cv)) = CvDEPTH(cv);
5224 curpad = AvARRAY((AV*)*av_fetch(CvPADLIST(cv),CvDEPTH(cv),FALSE));
5225 RETURNOP(CvSTART(cv));
5235 register CONTEXT *cx;
5240 if (gimme == G_SCALAR) {
5243 *MARK = sv_mortalcopy(TOPs);
5251 for (mark = newsp + 1; mark <= SP; mark++)
5252 *mark = sv_mortalcopy(*mark);
5253 /* in case LEAVE wipes old return values */
5258 return pop_return();
5263 return pop_return();
5269 register I32 cxix = dopoptosub(cxstack_ix);
5271 register CONTEXT *cx;
5276 DIE("There is no caller");
5282 nextcxix = dopoptosub(cxix - 1);
5283 if (DBsub && nextcxix >= 0 &&
5284 cxstack[nextcxix].blk_sub.cv == GvCV(DBsub))
5290 cx = &cxstack[cxix];
5292 if (GIMME != G_ARRAY) {
5295 sv_setpv(TARG, HvNAME(cx->blk_oldcop->cop_stash));
5300 PUSHs(sv_2mortal(newSVpv(HvNAME(cx->blk_oldcop->cop_stash), 0)));
5301 PUSHs(sv_2mortal(newSVpv(SvPV(GvSV(cx->blk_oldcop->cop_filegv)), 0)));
5302 PUSHs(sv_2mortal(newSVnv((double)cx->blk_oldcop->cop_line)));
5306 gv_efullname(sv, cx->blk_sub.gv);
5307 PUSHs(sv_2mortal(sv));
5308 PUSHs(sv_2mortal(newSVnv((double)cx->blk_sub.hasargs)));
5309 PUSHs(sv_2mortal(newSVnv((double)cx->blk_gimme)));
5310 if (cx->blk_sub.hasargs) {
5311 AV *ary = cx->blk_sub.argarray;
5314 dbargs = GvAV(gv_AVadd(gv_fetchpv("DB'args", TRUE)));
5315 if (AvMAX(dbargs) < AvFILL(ary))
5316 av_store(dbargs, AvFILL(ary), Nullsv);
5317 Copy(AvARRAY(ary), AvARRAY(dbargs), AvFILL(ary)+1, SV*);
5318 AvFILL(dbargs) = AvFILL(ary);
5328 GvSV(firstgv) = *str1;
5329 GvSV(secondgv) = *str2;
5330 stack_sp = stack_base;
5333 return SvIVnx(AvARRAY(stack)[1]);
5337 sortcmp(strp1, strp2)
5341 register SV *str1 = *strp1;
5342 register SV *str2 = *strp2;
5345 if (SvCUR(str1) < SvCUR(str2)) {
5347 if (retval = memcmp(SvPV(str1), SvPV(str2), SvCUR(str1)))
5353 else if (retval = memcmp(SvPV(str1), SvPV(str2), SvCUR(str2)))
5355 else if (SvCUR(str1) == SvCUR(str2))
5365 if (SP - MARK != 1) {
5367 do_join(TARG, sv_no, MARK, SP);
5374 if (!tmps || !*tmps) {
5375 SV *error = GvSV(gv_fetchpv("@", TRUE));
5377 sv_catpv(error, "\t...caught");
5378 tmps = SvPVn(error);
5380 if (!tmps || !*tmps)
5381 tmps = "Warning: something's wrong";
5390 if (SP - MARK != 1) {
5392 do_join(TARG, sv_no, MARK, SP);
5399 if (!tmps || !*tmps) {
5400 SV *error = GvSV(gv_fetchpv("@", TRUE));
5402 sv_catpv(error, "\t...propagated");
5403 tmps = SvPVn(error);
5405 if (!tmps || !*tmps)
5420 sv_reset(tmps, curcop->cop_stash);
5434 tainted = 0; /* Each statement is presumed innocent */
5436 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
5445 tainted = 0; /* Each statement is presumed innocent */
5447 stack_sp = stack_base + cxstack[cxstack_ix].blk_oldsp;
5448 /* XXX should tmps_floor live in cxstack? */
5449 while (tmps_ix > tmps_floor) { /* clean up after last eval */
5450 sv_free(tmps_stack[tmps_ix]);
5451 tmps_stack[tmps_ix--] = Nullsv;
5453 oldsave = scopestack[scopestack_ix - 1];
5454 if (savestack_ix > oldsave)
5455 leave_scope(oldsave);
5462 register CONTEXT *cx;
5467 PUSHBLOCK(cx,CXt_BLOCK,sp);
5475 register CONTEXT *cx;
5488 register CONTEXT *cx;
5489 SV **svp = &GvSV((GV*)POPs);
5496 PUSHBLOCK(cx,CXt_LOOP,SP);
5497 PUSHLOOP(cx, svp, MARK);
5498 cx->blk_loop.iterary = stack;
5499 cx->blk_loop.iterix = MARK - stack_base;
5507 register CONTEXT *cx;
5511 cx = &cxstack[cxstack_ix];
5512 if (cx->cx_type != CXt_LOOP)
5513 DIE("panic: pp_iter");
5515 if (cx->blk_loop.iterix >= cx->blk_oldsp)
5518 sv = AvARRAY(cx->blk_loop.iterary)[++cx->blk_loop.iterix];
5519 *cx->blk_loop.itervar = sv ? sv : &sv_undef;
5527 register CONTEXT *cx;
5534 PUSHBLOCK(cx, CXt_LOOP, SP);
5535 PUSHLOOP(cx, 0, SP);
5543 register CONTEXT *cx;
5551 if (gimme == G_SCALAR) {
5553 *++newsp = sv_mortalcopy(*SP);
5555 *++newsp = &sv_undef;
5559 *++newsp = sv_mortalcopy(*++mark);
5572 register CONTEXT *cx;
5577 cxix = dopoptosub(cxstack_ix);
5579 DIE("Can't return outside a subroutine");
5580 if (cxix < cxstack_ix)
5584 switch (cx->cx_type) {
5592 DIE("panic: return");
5596 if (gimme == G_SCALAR) {
5598 *++newsp = sv_mortalcopy(*SP);
5600 *++newsp = &sv_undef;
5601 if (optype == OP_REQUIRE && !SvTRUE(*newsp))
5602 DIE("%s", SvPVnx(GvSV(gv_fetchpv("@",TRUE))));
5605 if (optype == OP_REQUIRE && MARK == SP)
5606 DIE("%s", SvPVnx(GvSV(gv_fetchpv("@",TRUE))));
5608 *++newsp = sv_mortalcopy(*++MARK);
5613 return pop_return();
5620 register CONTEXT *cx;
5625 SV **mark = stack_base + cxstack[cxstack_ix].blk_oldsp;
5626 /* XXX The sp is probably not right yet... */
5628 if (op->op_flags & OPf_SPECIAL) {
5629 cxix = dopoptoloop(cxstack_ix);
5631 DIE("Can't \"last\" outside a block");
5634 cxix = dopoptolabel(cPVOP->op_pv);
5636 DIE("Label not found for \"last %s\"", cPVOP->op_pv);
5638 if (cxix < cxstack_ix)
5642 switch (cx->cx_type) {
5645 nextop = cx->blk_loop.last_op->op_next;
5650 nextop = pop_return();
5654 nextop = pop_return();
5661 if (gimme == G_SCALAR) {
5663 *++newsp = sv_mortalcopy(*SP);
5665 *++newsp = &sv_undef;
5669 *++newsp = sv_mortalcopy(*++mark);
5681 register CONTEXT *cx;
5684 if (op->op_flags & OPf_SPECIAL) {
5685 cxix = dopoptoloop(cxstack_ix);
5687 DIE("Can't \"next\" outside a block");
5690 cxix = dopoptolabel(cPVOP->op_pv);
5692 DIE("Label not found for \"next %s\"", cPVOP->op_pv);
5694 if (cxix < cxstack_ix)
5698 oldsave = scopestack[scopestack_ix - 1];
5699 if (savestack_ix > oldsave)
5700 leave_scope(oldsave);
5701 return cx->blk_loop.next_op;
5708 register CONTEXT *cx;
5711 if (op->op_flags & OPf_SPECIAL) {
5712 cxix = dopoptoloop(cxstack_ix);
5714 DIE("Can't \"redo\" outside a block");
5717 cxix = dopoptolabel(cPVOP->op_pv);
5719 DIE("Label not found for \"redo %s\"", cPVOP->op_pv);
5721 if (cxix < cxstack_ix)
5725 oldsave = scopestack[scopestack_ix - 1];
5726 if (savestack_ix > oldsave)
5727 leave_scope(oldsave);
5728 return cx->blk_loop.redo_op;
5731 static OP* lastgotoprobe;
5734 dofindlabel(op,label,opstack)
5742 if (op->op_type == OP_LEAVE ||
5743 op->op_type == OP_LEAVELOOP ||
5744 op->op_type == OP_LEAVETRY)
5745 *ops++ = cUNOP->op_first;
5747 if (op->op_flags & OPf_KIDS) {
5748 /* First try all the kids at this level, since that's likeliest. */
5749 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling) {
5750 if (kid->op_type == OP_CURCOP && kCOP->cop_label &&
5751 strEQ(kCOP->cop_label, label))
5754 for (kid = cUNOP->op_first; kid; kid = kid->op_sibling) {
5755 if (kid == lastgotoprobe)
5757 if (kid->op_type == OP_CURCOP) {
5758 if (ops > opstack && ops[-1]->op_type == OP_CURCOP)
5763 if (op = dofindlabel(kid,label,ops))
5773 return pp_goto(ARGS);
5782 register CONTEXT *cx;
5788 if (op->op_flags & OPf_SPECIAL) {
5789 if (op->op_type != OP_DUMP)
5790 DIE("goto must have label");
5793 label = cPVOP->op_pv;
5795 if (label && *label) {
5802 for (ix = cxstack_ix; ix >= 0; ix--) {
5804 switch (cx->cx_type) {
5806 gotoprobe = CvROOT(cx->blk_sub.cv);
5809 gotoprobe = eval_root; /* XXX not good for nested eval */
5812 gotoprobe = cx->blk_oldcop->op_sibling;
5818 gotoprobe = cx->blk_oldcop->op_sibling;
5820 gotoprobe = main_root;
5826 gotoprobe = main_root;
5829 retop = dofindlabel(gotoprobe, label, enterops);
5832 lastgotoprobe = gotoprobe;
5835 DIE("Can't find label %s", label);
5837 /* pop unwanted frames */
5839 if (ix < cxstack_ix) {
5846 oldsave = scopestack[scopestack_ix - 1];
5847 if (savestack_ix > oldsave)
5848 leave_scope(oldsave);
5851 /* push wanted frames */
5855 for (ix = 0 + (gotoprobe == main_root); enterops[ix]; ix++) {
5863 if (op->op_type == OP_DUMP) {
5869 restartop = 0; /* hmm, must be GNU unexec().. */
5884 anum = SvIVnx(POPs);
5893 double value = SvNVnx(GvSV(cCOP->cop_gv));
5894 register I32 match = (I32)value;
5897 if (((double)match) > value)
5898 --match; /* was fractional--truncate other way */
5900 match -= cCOP->uop.scop.scop_offset;
5903 else if (match > cCOP->uop.scop.scop_max)
5904 match = cCOP->uop.scop.scop_max;
5905 op = cCOP->uop.scop.scop_next[match];
5915 op = op->op_next; /* can't assume anything */
5917 match = *(SvPVnx(GvSV(cCOP->cop_gv))) & 255;
5918 match -= cCOP->uop.scop.scop_offset;
5921 else if (match > cCOP->uop.scop.scop_max)
5922 match = cCOP->uop.scop.scop_max;
5923 op = cCOP->uop.scop.scop_next[match];
5939 if (do_open(gv, tmps, SvCUR(sv))) {
5940 GvIO(gv)->lines = 0;
5941 PUSHi( (I32)forkprocess );
5943 else if (forkprocess == 0) /* we are a new child */
5960 PUSHs( do_close(gv, TRUE) ? &sv_yes : &sv_no );
5984 do_close(rgv, FALSE);
5986 do_close(wgv, FALSE);
5991 rstio->ifp = fdopen(fd[0], "r");
5992 wstio->ofp = fdopen(fd[1], "w");
5993 wstio->ifp = wstio->ofp;
5997 if (!rstio->ifp || !wstio->ofp) {
5998 if (rstio->ifp) fclose(rstio->ifp);
6000 if (wstio->ofp) fclose(wstio->ofp);
6010 DIE(no_func, "pipe");
6023 if (!gv || !(io = GvIO(gv)) || !(fp = io->ifp))
6041 TAINT_PROPER("umask");
6044 DIE(no_func, "Unsupported function umask");
6062 if (!gv || !(io = GvIO(gv)) || !(fp = io->ifp))
6067 if (!fflush(fp) && (fp->_flag |= _IOBIN))
6072 if (setmode(fileno(fp), OP_BINARY) != -1)
6095 PUSHi( (I32)hv_dbmopen(hv, SvPVn(lstr), anum) );
6097 DIE("No dbm or ndbm on this machine");
6113 DIE("No dbm or ndbm on this machine");
6128 struct timeval timebuf;
6129 struct timeval *tbuf = &timebuf;
6132 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
6137 # if BYTEORDER & 0xf0000
6138 # define ORDERBYTE (0x88888888 - BYTEORDER)
6140 # define ORDERBYTE (0x4444 - BYTEORDER)
6146 for (i = 1; i <= 3; i++) {
6154 #if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678
6155 growsize = maxlen; /* little endians can use vecs directly */
6163 masksize = NFDBITS / NBBY;
6165 masksize = sizeof(long); /* documented int, everyone seems to use long */
6167 growsize = maxlen + (masksize - (maxlen % masksize));
6168 Zero(&fd_sets[0], 4, char*);
6176 timebuf.tv_sec = (long)value;
6177 value -= (double)timebuf.tv_sec;
6178 timebuf.tv_usec = (long)(value * 1000000.0);
6181 tbuf = Null(struct timeval*);
6183 for (i = 1; i <= 3; i++) {
6191 Sv_Grow(sv, growsize);
6193 while (++j <= growsize) {
6197 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
6199 New(403, fd_sets[i], growsize, char);
6200 for (offset = 0; offset < growsize; offset += masksize) {
6201 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
6202 fd_sets[i][j+offset] = s[(k % masksize) + offset];
6205 fd_sets[i] = SvPV(sv);
6215 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
6216 for (i = 1; i <= 3; i++) {
6220 for (offset = 0; offset < growsize; offset += masksize) {
6221 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
6222 s[(k % masksize) + offset] = fd_sets[i][j+offset];
6224 Safefree(fd_sets[i]);
6230 if (GIMME == G_ARRAY && tbuf) {
6231 value = (double)(timebuf.tv_sec) +
6232 (double)(timebuf.tv_usec) / 1000000.0;
6233 PUSHs(sv = sv_mortalcopy(&sv_no));
6234 sv_setnv(sv, value);
6238 DIE("select not implemented");
6245 GV *oldgv = defoutgv;
6246 if (op->op_private > 0) {
6247 defoutgv = (GV*)POPs;
6248 if (!GvIO(defoutgv))
6249 GvIO(defoutgv) = newIO();
6250 curoutgv = defoutgv;
6252 gv_efullname(TARG, oldgv);
6268 if (!gv || do_eof(gv)) /* make sure we have fp with something */
6271 sv_setpv(TARG, " ");
6272 *SvPV(TARG) = getc(GvIO(gv)->ifp); /* should never be EOF */
6279 return pp_sysread(ARGS);
6288 register CONTEXT *cx;
6294 PUSHBLOCK(cx, CXt_SUB, stack_sp);
6296 defoutgv = gv; /* locally select filehandle so $% et al work */
6331 SV *tmpstr = sv_mortalcopy(&sv_undef);
6332 gv_efullname(tmpstr, gv);
6333 DIE("Undefined format \"%s\" called",SvPV(tmpstr));
6335 DIE("Not a format reference");
6338 return doform(cv,gv,op->op_next);
6344 GV *gv = cxstack[cxstack_ix].blk_sub.gv;
6345 register IO *io = GvIO(gv);
6346 FILE *ofp = io->ofp;
6351 register CONTEXT *cx;
6353 DEBUG_f(fprintf(stderr,"left=%ld, todo=%ld\n",
6354 (long)io->lines_left, (long)FmLINES(formtarget)));
6355 if (io->lines_left < FmLINES(formtarget) &&
6356 formtarget != toptarget)
6362 if (!io->top_name) {
6364 io->fmt_name = savestr(GvNAME(gv));
6365 sprintf(tmpbuf, "%s_TOP", io->fmt_name);
6366 topgv = gv_fetchpv(tmpbuf,FALSE);
6367 if (topgv && GvFORM(topgv))
6368 io->top_name = savestr(tmpbuf);
6370 io->top_name = savestr("top");
6372 topgv = gv_fetchpv(io->top_name,FALSE);
6373 if (!topgv || !GvFORM(topgv)) {
6374 io->lines_left = 100000000;
6379 if (io->lines_left >= 0 && io->page > 0)
6380 fwrite(SvPV(formfeed), SvCUR(formfeed), 1, ofp);
6381 io->lines_left = io->page_len;
6383 formtarget = toptarget;
6384 return doform(GvFORM(io->top_gv),gv,op);
6396 warn("Filehandle only opened for input");
6398 warn("Write on closed filehandle");
6403 if ((io->lines_left -= FmLINES(formtarget)) < 0) {
6405 warn("page overflow");
6407 if (!fwrite(SvPV(formtarget), 1, SvCUR(formtarget), ofp) ||
6411 FmLINES(formtarget) = 0;
6412 SvCUR_set(formtarget, 0);
6413 if (io->flags & IOf_FLUSH)
6418 formtarget = bodytarget;
6420 return pop_return();
6425 dSP; dMARK; dORIGMARK;
6429 SV *sv = NEWSV(0,0);
6431 if (op->op_flags & OPf_STACKED)
6435 if (!(io = GvIO(gv))) {
6437 warn("Filehandle never opened");
6441 else if (!(fp = io->ofp)) {
6444 warn("Filehandle opened only for input");
6446 warn("printf on closed filehandle");
6452 do_sprintf(sv, SP - MARK, MARK + 1);
6453 if (!do_print(sv, fp))
6456 if (io->flags & IOf_FLUSH)
6457 if (fflush(fp) == EOF)
6474 dSP; dMARK; dORIGMARK;
6479 if (op->op_flags & OPf_STACKED)
6483 if (!(io = GvIO(gv))) {
6485 warn("Filehandle never opened");
6489 else if (!(fp = io->ofp)) {
6492 warn("Filehandle opened only for input");
6494 warn("print on closed filehandle");
6502 while (MARK <= SP) {
6503 if (!do_print(*MARK, fp))
6507 if (fwrite(ofs, 1, ofslen, fp) == 0 || ferror(fp)) {
6515 while (MARK <= SP) {
6516 if (!do_print(*MARK, fp))
6525 if (fwrite(ors, 1, orslen, fp) == 0 || ferror(fp))
6528 if (io->flags & IOf_FLUSH)
6529 if (fflush(fp) == EOF)
6545 dSP; dMARK; dORIGMARK; dTARGET;
6558 buffer = SvPVn(bufstr);
6559 length = SvIVnx(*++MARK);
6562 offset = SvIVnx(*++MARK);
6566 warn("Too many args on read");
6568 if (!io || !io->ifp)
6571 if (op->op_type == OP_RECV) {
6572 bufsize = sizeof buf;
6573 SvGROW(bufstr, length+1), (buffer = SvPVn(bufstr)); /* sneaky */
6574 length = recvfrom(fileno(io->ifp), buffer, length, offset,
6578 SvCUR_set(bufstr, length);
6579 *SvEND(bufstr) = '\0';
6582 sv_setpvn(TARG, buf, bufsize);
6587 if (op->op_type == OP_RECV)
6588 DIE(no_sock_func, "recv");
6590 SvGROW(bufstr, length+offset+1), (buffer = SvPVn(bufstr)); /* sneaky */
6591 if (op->op_type == OP_SYSREAD) {
6592 length = read(fileno(io->ifp), buffer+offset, length);
6596 if (io->type == 's') {
6597 bufsize = sizeof buf;
6598 length = recvfrom(fileno(io->ifp), buffer+offset, length, 0,
6603 length = fread(buffer+offset, 1, length, io->ifp);
6606 SvCUR_set(bufstr, length+offset);
6607 *SvEND(bufstr) = '\0';
6620 return pp_send(ARGS);
6625 dSP; dMARK; dORIGMARK; dTARGET;
6637 buffer = SvPVn(bufstr);
6638 length = SvIVnx(*++MARK);
6641 if (!io || !io->ifp) {
6644 if (op->op_type == OP_SYSWRITE)
6645 warn("Syswrite on closed filehandle");
6647 warn("Send on closed socket");
6650 else if (op->op_type == OP_SYSWRITE) {
6652 offset = SvIVnx(*++MARK);
6656 warn("Too many args on syswrite");
6657 length = write(fileno(io->ifp), buffer+offset, length);
6660 else if (SP >= MARK) {
6662 warn("Too many args on send");
6663 buffer = SvPVnx(*++MARK);
6664 length = sendto(fileno(io->ifp), buffer, SvCUR(bufstr),
6665 length, buffer, SvCUR(*MARK));
6668 length = send(fileno(io->ifp), buffer, SvCUR(bufstr), length);
6671 DIE(no_sock_func, "send");
6686 return pp_sysread(ARGS);
6698 PUSHs(do_eof(gv) ? &sv_yes : &sv_no);
6711 PUSHi( do_tell(gv) );
6723 PUSHs( do_seek(gv, offset, whence) ? &sv_yes : &sv_no );
6730 off_t len = (off_t)POPn;
6735 #if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE)
6737 if (op->op_flags & OPf_SPECIAL) {
6738 tmpgv = gv_fetchpv(POPp,FALSE);
6739 if (!tmpgv || !GvIO(tmpgv) || !GvIO(tmpgv)->ifp ||
6740 ftruncate(fileno(GvIO(tmpgv)->ifp), len) < 0)
6743 else if (truncate(POPp, len) < 0)
6746 if (op->op_flags & OPf_SPECIAL) {
6747 tmpgv = gv_fetchpv(POPp,FALSE);
6748 if (!tmpgv || !GvIO(tmpgv) || !GvIO(tmpgv)->ifp ||
6749 chsize(fileno(GvIO(tmpgv)->ifp), len) < 0)
6755 if ((tmpfd = open(POPp, 0)) < 0)
6758 if (chsize(tmpfd, len) < 0)
6771 DIE("truncate not implemented");
6777 return pp_ioctl(ARGS);
6784 unsigned int func = U_I(POPn);
6785 int optype = op->op_type;
6791 TAINT_PROPER(optype == OP_IOCTL ? "ioctl" : "fcntl");
6793 if (!io || !argstr || !io->ifp) {
6794 errno = EBADF; /* well, sort of... */
6798 if (SvPOK(argstr) || !SvNIOK(argstr)) {
6801 retval = IOCPARM_LEN(func);
6802 if (SvCUR(argstr) < retval) {
6803 Sv_Grow(argstr, retval+1);
6804 SvCUR_set(argstr, retval);
6808 s[SvCUR(argstr)] = 17; /* a little sanity check here */
6811 retval = SvIVn(argstr);
6813 s = (char*)(long)retval; /* ouch */
6815 s = (char*)retval; /* ouch */
6819 if (optype == OP_IOCTL)
6820 retval = ioctl(fileno(io->ifp), func, s);
6823 DIE("fcntl is not implemented");
6826 retval = fcntl(fileno(io->ifp), func, s);
6828 DIE("fcntl is not implemented");
6832 if (SvPOK(argstr)) {
6833 if (s[SvCUR(argstr)] != 17)
6834 DIE("Return value overflowed string");
6835 s[SvCUR(argstr)] = 0; /* put our null back */
6844 PUSHp("0 but true", 10);
6867 value = (I32)(flock(fileno(fp), argtype) >= 0);
6874 DIE(no_func, "flock()");
6886 int protocol = POPi;
6900 do_close(gv, FALSE);
6902 TAINT_PROPER("socket");
6903 fd = socket(domain, type, protocol);
6906 io->ifp = fdopen(fd, "r"); /* stdio gets confused about sockets */
6907 io->ofp = fdopen(fd, "w");
6909 if (!io->ifp || !io->ofp) {
6910 if (io->ifp) fclose(io->ifp);
6911 if (io->ofp) fclose(io->ofp);
6912 if (!io->ifp && !io->ofp) close(fd);
6918 DIE(no_sock_func, "socket");
6925 #ifdef HAS_SOCKETPAIR
6930 int protocol = POPi;
6943 do_close(gv1, FALSE);
6945 do_close(gv2, FALSE);
6947 TAINT_PROPER("socketpair");
6948 if (socketpair(domain, type, protocol, fd) < 0)
6950 io1->ifp = fdopen(fd[0], "r");
6951 io1->ofp = fdopen(fd[0], "w");
6953 io2->ifp = fdopen(fd[1], "r");
6954 io2->ofp = fdopen(fd[1], "w");
6956 if (!io1->ifp || !io1->ofp || !io2->ifp || !io2->ofp) {
6957 if (io1->ifp) fclose(io1->ifp);
6958 if (io1->ofp) fclose(io1->ofp);
6959 if (!io1->ifp && !io1->ofp) close(fd[0]);
6960 if (io2->ifp) fclose(io2->ifp);
6961 if (io2->ofp) fclose(io2->ofp);
6962 if (!io2->ifp && !io2->ofp) close(fd[1]);
6968 DIE(no_sock_func, "socketpair");
6979 register IO *io = GvIOn(gv);
6981 if (!io || !io->ifp)
6984 addr = SvPVn(addrstr);
6985 TAINT_PROPER("bind");
6986 if (bind(fileno(io->ifp), addr, SvCUR(addrstr)) >= 0)
6993 warn("bind() on closed fd");
6997 DIE(no_sock_func, "bind");
7008 register IO *io = GvIOn(gv);
7010 if (!io || !io->ifp)
7013 addr = SvPVn(addrstr);
7014 TAINT_PROPER("connect");
7015 if (connect(fileno(io->ifp), addr, SvCUR(addrstr)) >= 0)
7022 warn("connect() on closed fd");
7026 DIE(no_sock_func, "connect");
7036 register IO *io = GvIOn(gv);
7038 if (!io || !io->ifp)
7041 if (listen(fileno(io->ifp), backlog) >= 0)
7048 warn("listen() on closed fd");
7052 DIE(no_sock_func, "listen");
7064 int len = sizeof buf;
7076 if (!gstio || !gstio->ifp)
7081 do_close(ngv, FALSE);
7083 fd = accept(fileno(gstio->ifp), (struct sockaddr *)buf, &len);
7086 nstio->ifp = fdopen(fd, "r");
7087 nstio->ofp = fdopen(fd, "w");
7089 if (!nstio->ifp || !nstio->ofp) {
7090 if (nstio->ifp) fclose(nstio->ifp);
7091 if (nstio->ofp) fclose(nstio->ofp);
7092 if (!nstio->ifp && !nstio->ofp) close(fd);
7101 warn("accept() on closed fd");
7108 DIE(no_sock_func, "accept");
7118 register IO *io = GvIOn(gv);
7120 if (!io || !io->ifp)
7123 PUSHi( shutdown(fileno(io->ifp), how) >= 0 );
7128 warn("shutdown() on closed fd");
7132 DIE(no_sock_func, "shutdown");
7139 return pp_ssockopt(ARGS);
7141 DIE(no_sock_func, "getsockopt");
7149 int optype = op->op_type;
7152 unsigned int optname;
7157 if (optype == OP_GSOCKOPT)
7158 sv = sv_2mortal(NEWSV(22, 257));
7161 optname = (unsigned int) POPi;
7162 lvl = (unsigned int) POPi;
7166 if (!io || !io->ifp)
7169 fd = fileno(io->ifp);
7174 if (getsockopt(fd, lvl, optname, SvPV(sv), (int*)&SvCUR(sv)) < 0)
7179 if (setsockopt(fd, lvl, optname, SvPV(sv), SvCUR(sv)) < 0)
7188 warn("[gs]etsockopt() on closed fd");
7194 DIE(no_sock_func, "setsockopt");
7201 return pp_getpeername(ARGS);
7203 DIE(no_sock_func, "getsockname");
7211 int optype = op->op_type;
7215 register IO *io = GvIOn(gv);
7217 if (!io || !io->ifp)
7220 sv = sv_2mortal(NEWSV(22, 257));
7223 fd = fileno(io->ifp);
7225 case OP_GETSOCKNAME:
7226 if (getsockname(fd, SvPV(sv), (int*)&SvCUR(sv)) < 0)
7229 case OP_GETPEERNAME:
7230 if (getpeername(fd, SvPV(sv), (int*)&SvCUR(sv)) < 0)
7239 warn("get{sock, peer}name() on closed fd");
7245 DIE(no_sock_func, "getpeername");
7253 return pp_stat(ARGS);
7262 if (op->op_flags & OPf_SPECIAL) {
7263 tmpgv = cGVOP->op_gv;
7264 if (tmpgv != defgv) {
7265 laststype = OP_STAT;
7267 sv_setpv(statname, "");
7268 if (!GvIO(tmpgv) || !GvIO(tmpgv)->ifp ||
7269 fstat(fileno(GvIO(tmpgv)->ifp), &statcache) < 0) {
7274 else if (laststatval < 0)
7278 sv_setpv(statname, POPp);
7281 laststype = op->op_type;
7282 if (op->op_type == OP_LSTAT)
7283 laststatval = lstat(SvPVn(statname), &statcache);
7286 laststatval = stat(SvPVn(statname), &statcache);
7287 if (laststatval < 0) {
7288 if (dowarn && index(SvPVn(statname), '\n'))
7289 warn(warn_nl, "stat");
7295 if (GIMME != G_ARRAY) {
7302 PUSHs(sv_2mortal(newSVnv((double)statcache.st_dev)));
7303 PUSHs(sv_2mortal(newSVnv((double)statcache.st_ino)));
7304 PUSHs(sv_2mortal(newSVnv((double)statcache.st_mode)));
7305 PUSHs(sv_2mortal(newSVnv((double)statcache.st_nlink)));
7306 PUSHs(sv_2mortal(newSVnv((double)statcache.st_uid)));
7307 PUSHs(sv_2mortal(newSVnv((double)statcache.st_gid)));
7308 PUSHs(sv_2mortal(newSVnv((double)statcache.st_rdev)));
7309 PUSHs(sv_2mortal(newSVnv((double)statcache.st_size)));
7310 PUSHs(sv_2mortal(newSVnv((double)statcache.st_atime)));
7311 PUSHs(sv_2mortal(newSVnv((double)statcache.st_mtime)));
7312 PUSHs(sv_2mortal(newSVnv((double)statcache.st_ctime)));
7314 PUSHs(sv_2mortal(newSVnv((double)statcache.st_blksize)));
7315 PUSHs(sv_2mortal(newSVnv((double)statcache.st_blocks)));
7317 PUSHs(sv_2mortal(newSVpv("", 0)));
7318 PUSHs(sv_2mortal(newSVpv("", 0)));
7326 I32 result = my_stat(ARGS);
7330 if (cando(S_IRUSR, 0, &statcache))
7337 I32 result = my_stat(ARGS);
7341 if (cando(S_IWUSR, 0, &statcache))
7348 I32 result = my_stat(ARGS);
7352 if (cando(S_IXUSR, 0, &statcache))
7359 I32 result = my_stat(ARGS);
7363 if (cando(S_IRUSR, 1, &statcache))
7370 I32 result = my_stat(ARGS);
7374 if (cando(S_IWUSR, 1, &statcache))
7381 I32 result = my_stat(ARGS);
7385 if (cando(S_IXUSR, 1, &statcache))
7392 I32 result = my_stat(ARGS);
7401 return pp_ftrowned(ARGS);
7406 I32 result = my_stat(ARGS);
7410 if (statcache.st_uid == (op->op_type == OP_FTEOWNED ? euid : uid) )
7417 I32 result = my_stat(ARGS);
7421 if (!statcache.st_size)
7428 I32 result = my_stat(ARGS);
7432 PUSHi(statcache.st_size);
7438 I32 result = my_stat(ARGS);
7442 PUSHn( (basetime - statcache.st_mtime) / 86400.0 );
7448 I32 result = my_stat(ARGS);
7452 PUSHn( (basetime - statcache.st_atime) / 86400.0 );
7458 I32 result = my_stat(ARGS);
7462 PUSHn( (basetime - statcache.st_ctime) / 86400.0 );
7468 I32 result = my_stat(ARGS);
7472 if (S_ISSOCK(statcache.st_mode))
7479 I32 result = my_stat(ARGS);
7483 if (S_ISCHR(statcache.st_mode))
7490 I32 result = my_stat(ARGS);
7494 if (S_ISBLK(statcache.st_mode))
7501 I32 result = my_stat(ARGS);
7505 if (S_ISREG(statcache.st_mode))
7512 I32 result = my_stat(ARGS);
7516 if (S_ISDIR(statcache.st_mode))
7523 I32 result = my_stat(ARGS);
7527 if (S_ISFIFO(statcache.st_mode))
7534 I32 result = my_lstat(ARGS);
7538 if (S_ISLNK(statcache.st_mode))
7547 I32 result = my_stat(ARGS);
7551 if (statcache.st_mode & S_ISUID)
7561 I32 result = my_stat(ARGS);
7565 if (statcache.st_mode & S_ISGID)
7575 I32 result = my_stat(ARGS);
7579 if (statcache.st_mode & S_ISVTX)
7591 if (op->op_flags & OPf_SPECIAL) {
7596 gv = gv_fetchpv(tmps = POPp, FALSE);
7597 if (gv && GvIO(gv) && GvIO(gv)->ifp)
7598 fd = fileno(GvIO(gv)->ifp);
7599 else if (isDIGIT(*tmps))
7615 register STDCHAR *s;
7619 if (op->op_flags & OPf_SPECIAL) {
7621 if (cGVOP->op_gv == defgv) {
7626 goto really_filename;
7630 statgv = cGVOP->op_gv;
7631 sv_setpv(statname, "");
7634 if (io && io->ifp) {
7635 #if defined(STDSTDIO) || defined(atarist) /* this will work with atariST */
7636 fstat(fileno(io->ifp), &statcache);
7637 if (S_ISDIR(statcache.st_mode)) /* handle NFS glitch */
7638 if (op->op_type == OP_FTTEXT)
7642 if (io->ifp->_cnt <= 0) {
7645 (void)ungetc(i, io->ifp);
7647 if (io->ifp->_cnt <= 0) /* null file is anything */
7649 len = io->ifp->_cnt + (io->ifp->_ptr - io->ifp->_base);
7652 DIE("-T and -B not implemented on filehandles");
7657 warn("Test on unopened file <%s>",
7658 GvENAME(cGVOP->op_gv));
7666 sv_setpv(statname, SvPVn(sv));
7668 i = open(SvPVn(sv), 0);
7670 if (dowarn && index(SvPVn(sv), '\n'))
7671 warn(warn_nl, "open");
7674 fstat(i, &statcache);
7675 len = read(i, tbuf, 512);
7678 if (S_ISDIR(statcache.st_mode) && op->op_type == OP_FTTEXT)
7679 RETPUSHNO; /* special case NFS directories */
7680 RETPUSHYES; /* null file is anything */
7685 /* now scan s to look for textiness */
7687 for (i = 0; i < len; i++, s++) {
7688 if (!*s) { /* null never allowed in text */
7695 *s != '\n' && *s != '\r' && *s != '\b' &&
7696 *s != '\t' && *s != '\f' && *s != 27)
7700 if ((odd * 10 > len) == (op->op_type == OP_FTTEXT)) /* allow 10% odd */
7708 return pp_fttext(ARGS);
7724 if (!tmps || !*tmps) {
7725 svp = hv_fetch(GvHVn(envgv), "HOME", 4, FALSE);
7729 if (!tmps || !*tmps) {
7730 svp = hv_fetch(GvHVn(envgv), "LOGDIR", 6, FALSE);
7734 TAINT_PROPER("chdir");
7735 PUSHi( chdir(tmps) >= 0 );
7741 dSP; dMARK; dTARGET;
7744 value = (I32)apply(op->op_type, MARK, SP);
7749 DIE(no_func, "Unsupported function chown");
7759 tmps = SvPVnx(GvSV(defgv));
7762 TAINT_PROPER("chroot");
7763 PUSHi( chroot(tmps) >= 0 );
7766 DIE(no_func, "chroot");
7772 dSP; dMARK; dTARGET;
7774 value = (I32)apply(op->op_type, MARK, SP);
7782 dSP; dMARK; dTARGET;
7784 value = (I32)apply(op->op_type, MARK, SP);
7792 dSP; dMARK; dTARGET;
7794 value = (I32)apply(op->op_type, MARK, SP);
7806 char *tmps = SvPVn(TOPs);
7807 TAINT_PROPER("rename");
7809 anum = rename(tmps, tmps2);
7811 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
7814 if (euid || stat(tmps2, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
7815 (void)UNLINK(tmps2);
7816 if (!(anum = link(tmps, tmps2)))
7817 anum = UNLINK(tmps);
7829 char *tmps = SvPVn(TOPs);
7830 TAINT_PROPER("link");
7831 SETi( link(tmps, tmps2) >= 0 );
7833 DIE(no_func, "Unsupported function link");
7843 char *tmps = SvPVn(TOPs);
7844 TAINT_PROPER("symlink");
7845 SETi( symlink(tmps, tmps2) >= 0 );
7848 DIE(no_func, "symlink");
7859 tmps = SvPVnx(GvSV(defgv));
7862 len = readlink(tmps, buf, sizeof buf);
7870 RETSETUNDEF; /* just pretend it's a normal file */
7874 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
7876 dooneliner(cmd, filename)
7887 for (s = mybuf+strlen(mybuf); *filename; ) {
7892 myfp = my_popen(mybuf, "r");
7895 s = fgets(mybuf, sizeof mybuf, myfp);
7896 (void)my_pclose(myfp);
7898 for (errno = 1; errno < sys_nerr; errno++) {
7899 if (instr(mybuf, sys_errlist[errno])) /* you don't see this */
7904 #define EACCES EPERM
7906 if (instr(mybuf, "cannot make"))
7908 else if (instr(mybuf, "existing file"))
7910 else if (instr(mybuf, "ile exists"))
7912 else if (instr(mybuf, "non-exist"))
7914 else if (instr(mybuf, "does not exist"))
7916 else if (instr(mybuf, "not empty"))
7918 else if (instr(mybuf, "cannot access"))
7924 else { /* some mkdirs return no failure indication */
7925 tmps = SvPVnx(st[1]);
7926 anum = (stat(tmps, &statbuf) >= 0);
7927 if (op->op_type == OP_RMDIR)
7932 errno = EACCES; /* a guess */
7946 char *tmps = SvPVn(TOPs);
7948 TAINT_PROPER("mkdir");
7950 SETi( mkdir(tmps, mode) >= 0 );
7952 SETi( dooneliner("mkdir", tmps) );
7955 chmod(tmps, (mode & ~oldumask) & 0777);
7966 tmps = SvPVnx(GvSV(defgv));
7969 TAINT_PROPER("rmdir");
7971 XPUSHi( rmdir(tmps) >= 0 );
7973 XPUSHi( dooneliner("rmdir", tmps) );
7978 /* Directory calls. */
7983 #if defined(DIRENT) && defined(HAS_READDIR)
7984 char *dirname = POPp;
7986 register IO *io = GvIOn(gv);
7993 if (!(io->dirp = opendir(dirname)))
8002 DIE(no_dir_func, "opendir");
8009 #if defined(DIRENT) && defined(HAS_READDIR)
8011 struct DIRENT *readdir();
8013 register struct DIRENT *dp;
8015 register IO *io = GvIOn(gv);
8017 if (!io || !io->dirp)
8020 if (GIMME == G_ARRAY) {
8022 while (dp = readdir(io->dirp)) {
8024 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
8026 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
8031 if (!(dp = readdir(io->dirp)))
8034 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
8036 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
8044 if (GIMME == G_ARRAY)
8049 DIE(no_dir_func, "readdir");
8056 #if defined(HAS_TELLDIR) || defined(telldir)
8061 register IO *io = GvIOn(gv);
8063 if (!io || !io->dirp)
8066 PUSHi( telldir(io->dirp) );
8073 DIE(no_dir_func, "telldir");
8080 #if defined(HAS_SEEKDIR) || defined(seekdir)
8083 register IO *io = GvIOn(gv);
8085 if (!io || !io->dirp)
8088 (void)seekdir(io->dirp, along);
8096 DIE(no_dir_func, "seekdir");
8103 #if defined(HAS_REWINDDIR) || defined(rewinddir)
8105 register IO *io = GvIOn(gv);
8107 if (!io || !io->dirp)
8110 (void)rewinddir(io->dirp);
8117 DIE(no_dir_func, "rewinddir");
8124 #if defined(DIRENT) && defined(HAS_READDIR)
8126 register IO *io = GvIOn(gv);
8128 if (!io || !io->dirp)
8131 if (closedir(io->dirp) < 0)
8141 DIE(no_dir_func, "closedir");
8145 /* Process control. */
8160 if (tmpgv = gv_fetchpv("$", allgvs))
8161 sv_setiv(GvSV(tmpgv), (I32)getpid());
8162 hv_clear(pidstatus, FALSE); /* no kids, so don't wait for 'em */
8167 DIE(no_func, "Unsupported function fork");
8180 childpid = wait(&argflags);
8182 pidgone(childpid, argflags);
8183 value = (I32)childpid;
8184 statusvalue = (U16)argflags;
8188 DIE(no_func, "Unsupported function wait");
8203 childpid = wait4pid(childpid, &argflags, optype);
8204 value = (I32)childpid;
8205 statusvalue = (U16)argflags;
8209 DIE(no_func, "Unsupported function wait");
8215 dSP; dMARK; dORIGMARK; dTARGET;
8220 VOIDRET (*ihand)(); /* place to save signal during system() */
8221 VOIDRET (*qhand)(); /* place to save signal during system() */
8224 if (SP - MARK == 1) {
8226 TAINT_IF(TOPs->sv_tainted);
8227 TAINT_PROPER("system");
8229 while ((childpid = vfork()) == -1) {
8230 if (errno != EAGAIN) {
8239 ihand = signal(SIGINT, SIG_IGN);
8240 qhand = signal(SIGQUIT, SIG_IGN);
8241 result = wait4pid(childpid, &status, 0);
8242 (void)signal(SIGINT, ihand);
8243 (void)signal(SIGQUIT, qhand);
8244 statusvalue = (U16)status;
8248 value = (I32)((unsigned int)status & 0xffff);
8250 do_execfree(); /* free any memory child malloced on vfork */
8255 if (op->op_flags & OPf_STACKED) {
8256 SV *really = *++MARK;
8257 value = (I32)do_aexec(really, MARK, SP);
8259 else if (SP - MARK != 1)
8260 value = (I32)do_aexec(Nullsv, MARK, SP);
8262 value = (I32)do_exec(SvPVnx(sv_mortalcopy(*SP)));
8266 if ((op[1].op_type & A_MASK) == A_GV)
8267 value = (I32)do_aspawn(st[1], arglast);
8268 else if (arglast[2] - arglast[1] != 1)
8269 value = (I32)do_aspawn(Nullsv, arglast);
8271 value = (I32)do_spawn(SvPVnx(sv_mortalcopy(st[2])));
8280 dSP; dMARK; dORIGMARK; dTARGET;
8283 if (op->op_flags & OPf_STACKED) {
8284 SV *really = *++MARK;
8285 value = (I32)do_aexec(really, MARK, SP);
8287 else if (SP - MARK != 1)
8288 value = (I32)do_aexec(Nullsv, MARK, SP);
8291 TAINT_IF((*SP)->sv_tainted);
8292 TAINT_PROPER("exec");
8293 value = (I32)do_exec(SvPVnx(sv_mortalcopy(*SP)));
8302 dSP; dMARK; dTARGET;
8305 value = (I32)apply(op->op_type, MARK, SP);
8310 DIE(no_func, "Unsupported function kill");
8318 XPUSHi( getppid() );
8321 DIE(no_func, "getppid");
8336 #ifdef _POSIX_SOURCE
8338 DIE("POSIX getpgrp can't take an argument");
8339 value = (I32)getpgrp();
8341 value = (I32)getpgrp(pid);
8346 DIE(no_func, "getpgrp()");
8357 TAINT_PROPER("setpgrp");
8358 SETi( setpgrp(pid, pgrp) >= 0 );
8361 DIE(no_func, "setpgrp()");
8370 #ifdef HAS_GETPRIORITY
8373 SETi( getpriority(which, who) );
8376 DIE(no_func, "getpriority()");
8386 #ifdef HAS_SETPRIORITY
8390 TAINT_PROPER("setpriority");
8391 SETi( setpriority(which, who, niceval) >= 0 );
8394 DIE(no_func, "setpriority()");
8403 XPUSHi( time(Null(long*)) );
8416 DIE("times not implemented");
8420 (void)times(×buf);
8422 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_utime)/HZ)));
8423 if (GIMME == G_ARRAY) {
8424 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_stime)/HZ)));
8425 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cutime)/HZ)));
8426 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cstime)/HZ)));
8434 return pp_gmtime(ARGS);
8442 static char *dayname[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
8443 static char *monname[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
8444 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
8449 when = (time_t)SvIVnx(POPs);
8451 if (op->op_type == OP_LOCALTIME)
8452 tmbuf = localtime(&when);
8454 tmbuf = gmtime(&when);
8457 if (GIMME != G_ARRAY) {
8462 sprintf(mybuf, "%s %s %2d %02d:%02d:%02d %d",
8463 dayname[tmbuf->tm_wday],
8464 monname[tmbuf->tm_mon],
8469 tmbuf->tm_year + 1900);
8470 PUSHp(mybuf, strlen(mybuf));
8473 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_sec)));
8474 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_min)));
8475 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_hour)));
8476 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_mday)));
8477 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_mon)));
8478 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_year)));
8479 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_wday)));
8480 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_yday)));
8481 PUSHs(sv_2mortal(newSVnv((double)tmbuf->tm_isdst)));
8493 tmps = SvPVnx(GvSV(defgv));
8498 anum = alarm((unsigned int)atoi(tmps));
8505 DIE(no_func, "Unsupported function alarm");
8518 (void)time(&lasttime);
8523 sleep((unsigned int)duration);
8526 XPUSHi(when - lasttime);
8530 /* Shared memory. */
8534 return pp_semget(ARGS);
8539 return pp_semctl(ARGS);
8544 return pp_shmwrite(ARGS);
8549 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
8550 dSP; dMARK; dTARGET;
8551 I32 value = (I32)(do_shmio(op->op_type, MARK, SP) >= 0);
8560 /* Message passing. */
8564 return pp_semget(ARGS);
8569 return pp_semctl(ARGS);
8574 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
8575 dSP; dMARK; dTARGET;
8576 I32 value = (I32)(do_msgsnd(MARK, SP) >= 0);
8587 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
8588 dSP; dMARK; dTARGET;
8589 I32 value = (I32)(do_msgrcv(MARK, SP) >= 0);
8602 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
8603 dSP; dMARK; dTARGET;
8604 int anum = do_ipcget(op->op_type, MARK, SP);
8611 DIE("System V IPC is not implemented on this machine");
8617 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
8618 dSP; dMARK; dTARGET;
8619 int anum = do_ipcctl(op->op_type, MARK, SP);
8627 PUSHp("0 but true",10);
8637 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
8638 dSP; dMARK; dTARGET;
8639 I32 value = (I32)(do_semop(MARK, SP) >= 0);
8651 save_lines(array, sv)
8655 register char *s = SvPV(sv);
8656 register char *send = SvPV(sv) + SvCUR(sv);
8658 register I32 line = 1;
8660 while (s && s < send) {
8661 SV *tmpstr = NEWSV(85,0);
8669 sv_setpvn(tmpstr, s, t - s);
8670 av_store(array, line++, tmpstr);
8685 /* set up a scratch pad */
8691 av_push(comppad, Nullsv);
8692 curpad = AvARRAY(comppad);
8695 /* make sure we compile in the right package */
8697 newstash = curcop->cop_stash;
8698 if (curstash != newstash) {
8700 curstash = newstash;
8703 /* try to compile it */
8707 curcop = &compiling;
8708 if (yyparse() || error_count || !eval_root) {
8723 if (optype == OP_REQUIRE)
8724 DIE("%s", SvPVnx(GvSV(gv_fetchpv("@",TRUE))));
8727 compiling.cop_line = 0;
8729 DEBUG_x(dump_eval(eval_root, eval_start));
8731 /* compiled okay, so do it */
8733 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
8734 RETURNOP(eval_start);
8740 register CONTEXT *cx;
8742 char *name = SvPVn(sv);
8745 I32 gimme = G_SCALAR;
8747 if (op->op_type == OP_REQUIRE &&
8748 (svp = hv_fetch(GvHVn(incgv), name, SvCUR(sv), 0)) &&
8752 /* prepare to compile file */
8754 sv_setpv(linestr,"");
8756 tmpname = savestr(name);
8757 if (*tmpname == '/' ||
8759 (tmpname[1] == '/' ||
8760 (tmpname[1] == '.' && tmpname[2] == '/'))))
8762 rsfp = fopen(tmpname,"r");
8765 AV *ar = GvAVn(incgv);
8768 for (i = 0; i <= AvFILL(ar); i++) {
8769 (void)sprintf(buf, "%s/%s", SvPVnx(*av_fetch(ar, i, TRUE)), name);
8770 rsfp = fopen(buf, "r");
8774 if (*s == '.' && s[1] == '/')
8777 tmpname = savestr(s);
8782 compiling.cop_filegv = gv_fetchfile(tmpname);
8786 if (op->op_type == OP_REQUIRE) {
8787 sprintf(tokenbuf,"Can't locate %s in @INC", name);
8788 if (instr(tokenbuf,".h "))
8789 strcat(tokenbuf," (change .h to .ph maybe?)");
8790 if (instr(tokenbuf,".ph "))
8791 strcat(tokenbuf," (did you run h2ph?)");
8801 /* switch to eval mode */
8803 push_return(op->op_next);
8804 PUSHBLOCK(cx,CXt_EVAL,SP);
8805 PUSHEVAL(cx,savestr(name));
8807 if (curcop->cop_line == 0) /* don't debug debugger... */
8809 compiling.cop_line = 0;
8817 return pp_require(ARGS);
8823 register CONTEXT *cx;
8830 /* switch to eval mode */
8832 push_return(op->op_next);
8833 PUSHBLOCK(cx,CXt_EVAL,SP);
8836 /* prepare to compile string */
8839 sv_setsv(linestr, sv);
8840 sv_catpv(linestr, "\n;");
8841 compiling.cop_filegv = gv_fetchfile("(eval)");
8842 compiling.cop_line = 1;
8844 save_lines(GvAV(curcop->cop_filegv), linestr);
8855 register CONTEXT *cx;
8858 OP *eroot = eval_root;
8862 retop = pop_return();
8864 if (gimme == G_SCALAR) {
8867 *MARK = sv_mortalcopy(TOPs);
8875 for (mark = newsp + 1; mark <= SP; mark++)
8876 *mark = sv_mortalcopy(*mark);
8877 /* in case LEAVE wipes old return values */
8880 if (optype != OP_ENTEREVAL) {
8881 char *name = cx->blk_eval.old_name;
8883 if (gimme == G_SCALAR ? SvTRUE(*sp) : sp > newsp) {
8884 (void)hv_store(GvHVn(incgv), name,
8885 strlen(name), newSVsv(GvSV(curcop->cop_filegv)), 0 );
8887 else if (optype == OP_REQUIRE)
8888 retop = die("%s did not return a true value", name);
8895 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
8904 SP = do_eval(st[1], OP_EVAL, curcop->cop_stash, TRUE,
8907 sv_free(cSVOP->op_sv);
8908 op[1].arg_ptr.arg_cmd = eval_root;
8909 op[1].op_type = (A_CMD|A_DONT);
8910 op[0].op_type = OP_TRY;
8921 register CONTEXT *cx;
8927 push_return(cLOGOP->op_other->op_next);
8928 PUSHBLOCK(cx,CXt_EVAL,SP);
8932 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
8942 register CONTEXT *cx;
8949 if (gimme == G_SCALAR) {
8952 *MARK = sv_mortalcopy(TOPs);
8960 for (mark = newsp + 1; mark <= SP; mark++)
8961 *mark = sv_mortalcopy(*mark);
8962 /* in case LEAVE wipes old return values */
8966 sv_setpv(GvSV(gv_fetchpv("@",TRUE)),"");
8970 /* Get system info. */
8975 return pp_ghostent(ARGS);
8977 DIE(no_sock_func, "gethostbyname");
8984 return pp_ghostent(ARGS);
8986 DIE(no_sock_func, "gethostbyaddr");
8994 I32 which = op->op_type;
8995 register char **elem;
8997 struct hostent *gethostbyname();
8998 struct hostent *gethostbyaddr();
8999 #ifdef HAS_GETHOSTENT
9000 struct hostent *gethostent();
9002 struct hostent *hent;
9006 if (which == OP_GHBYNAME) {
9007 hent = gethostbyname(POPp);
9009 else if (which == OP_GHBYADDR) {
9010 int addrtype = POPi;
9012 char *addr = SvPVn(addrstr);
9014 hent = gethostbyaddr(addr, SvCUR(addrstr), addrtype);
9017 #ifdef HAS_GETHOSTENT
9018 hent = gethostent();
9020 DIE("gethostent not implemented");
9023 #ifdef HOST_NOT_FOUND
9025 statusvalue = (U16)h_errno & 0xffff;
9028 if (GIMME != G_ARRAY) {
9029 PUSHs(sv = sv_mortalcopy(&sv_undef));
9031 if (which == OP_GHBYNAME) {
9032 sv_setpvn(sv, hent->h_addr, hent->h_length);
9035 sv_setpv(sv, hent->h_name);
9041 PUSHs(sv = sv_mortalcopy(&sv_no));
9042 sv_setpv(sv, hent->h_name);
9043 PUSHs(sv = sv_mortalcopy(&sv_no));
9044 for (elem = hent->h_aliases; *elem; elem++) {
9045 sv_catpv(sv, *elem);
9047 sv_catpvn(sv, " ", 1);
9049 PUSHs(sv = sv_mortalcopy(&sv_no));
9050 sv_setiv(sv, (I32)hent->h_addrtype);
9051 PUSHs(sv = sv_mortalcopy(&sv_no));
9052 len = hent->h_length;
9053 sv_setiv(sv, (I32)len);
9055 for (elem = hent->h_addr_list; *elem; elem++) {
9056 XPUSHs(sv = sv_mortalcopy(&sv_no));
9057 sv_setpvn(sv, *elem, len);
9060 PUSHs(sv = sv_mortalcopy(&sv_no));
9061 sv_setpvn(sv, hent->h_addr, len);
9066 DIE(no_sock_func, "gethostent");
9073 return pp_gnetent(ARGS);
9075 DIE(no_sock_func, "getnetbyname");
9082 return pp_gnetent(ARGS);
9084 DIE(no_sock_func, "getnetbyaddr");
9092 I32 which = op->op_type;
9093 register char **elem;
9095 struct netent *getnetbyname();
9096 struct netent *getnetbyaddr();
9097 struct netent *getnetent();
9098 struct netent *nent;
9100 if (which == OP_GNBYNAME)
9101 nent = getnetbyname(POPp);
9102 else if (which == OP_GNBYADDR) {
9103 int addrtype = POPi;
9104 unsigned long addr = U_L(POPn);
9105 nent = getnetbyaddr((long)addr, addrtype);
9111 if (GIMME != G_ARRAY) {
9112 PUSHs(sv = sv_mortalcopy(&sv_undef));
9114 if (which == OP_GNBYNAME)
9115 sv_setiv(sv, (I32)nent->n_net);
9117 sv_setpv(sv, nent->n_name);
9123 PUSHs(sv = sv_mortalcopy(&sv_no));
9124 sv_setpv(sv, nent->n_name);
9125 PUSHs(sv = sv_mortalcopy(&sv_no));
9126 for (elem = nent->n_aliases; *elem; elem++) {
9127 sv_catpv(sv, *elem);
9129 sv_catpvn(sv, " ", 1);
9131 PUSHs(sv = sv_mortalcopy(&sv_no));
9132 sv_setiv(sv, (I32)nent->n_addrtype);
9133 PUSHs(sv = sv_mortalcopy(&sv_no));
9134 sv_setiv(sv, (I32)nent->n_net);
9139 DIE(no_sock_func, "getnetent");
9146 return pp_gprotoent(ARGS);
9148 DIE(no_sock_func, "getprotobyname");
9155 return pp_gprotoent(ARGS);
9157 DIE(no_sock_func, "getprotobynumber");
9165 I32 which = op->op_type;
9166 register char **elem;
9168 struct protoent *getprotobyname();
9169 struct protoent *getprotobynumber();
9170 struct protoent *getprotoent();
9171 struct protoent *pent;
9173 if (which == OP_GPBYNAME)
9174 pent = getprotobyname(POPp);
9175 else if (which == OP_GPBYNUMBER)
9176 pent = getprotobynumber(POPi);
9178 pent = getprotoent();
9181 if (GIMME != G_ARRAY) {
9182 PUSHs(sv = sv_mortalcopy(&sv_undef));
9184 if (which == OP_GPBYNAME)
9185 sv_setiv(sv, (I32)pent->p_proto);
9187 sv_setpv(sv, pent->p_name);
9193 PUSHs(sv = sv_mortalcopy(&sv_no));
9194 sv_setpv(sv, pent->p_name);
9195 PUSHs(sv = sv_mortalcopy(&sv_no));
9196 for (elem = pent->p_aliases; *elem; elem++) {
9197 sv_catpv(sv, *elem);
9199 sv_catpvn(sv, " ", 1);
9201 PUSHs(sv = sv_mortalcopy(&sv_no));
9202 sv_setiv(sv, (I32)pent->p_proto);
9207 DIE(no_sock_func, "getprotoent");
9214 return pp_gservent(ARGS);
9216 DIE(no_sock_func, "getservbyname");
9223 return pp_gservent(ARGS);
9225 DIE(no_sock_func, "getservbyport");
9233 I32 which = op->op_type;
9234 register char **elem;
9236 struct servent *getservbyname();
9237 struct servent *getservbynumber();
9238 struct servent *getservent();
9239 struct servent *sent;
9241 if (which == OP_GSBYNAME) {
9245 if (proto && !*proto)
9248 sent = getservbyname(name, proto);
9250 else if (which == OP_GSBYPORT) {
9254 sent = getservbyport(port, proto);
9257 sent = getservent();
9260 if (GIMME != G_ARRAY) {
9261 PUSHs(sv = sv_mortalcopy(&sv_undef));
9263 if (which == OP_GSBYNAME) {
9265 sv_setiv(sv, (I32)ntohs(sent->s_port));
9267 sv_setiv(sv, (I32)(sent->s_port));
9271 sv_setpv(sv, sent->s_name);
9277 PUSHs(sv = sv_mortalcopy(&sv_no));
9278 sv_setpv(sv, sent->s_name);
9279 PUSHs(sv = sv_mortalcopy(&sv_no));
9280 for (elem = sent->s_aliases; *elem; elem++) {
9281 sv_catpv(sv, *elem);
9283 sv_catpvn(sv, " ", 1);
9285 PUSHs(sv = sv_mortalcopy(&sv_no));
9287 sv_setiv(sv, (I32)ntohs(sent->s_port));
9289 sv_setiv(sv, (I32)(sent->s_port));
9291 PUSHs(sv = sv_mortalcopy(&sv_no));
9292 sv_setpv(sv, sent->s_proto);
9297 DIE(no_sock_func, "getservent");
9305 SETi( sethostent(TOPi) );
9308 DIE(no_sock_func, "sethostent");
9316 SETi( setnetent(TOPi) );
9319 DIE(no_sock_func, "setnetent");
9327 SETi( setprotoent(TOPi) );
9330 DIE(no_sock_func, "setprotoent");
9338 SETi( setservent(TOPi) );
9341 DIE(no_sock_func, "setservent");
9349 XPUSHi( endhostent() );
9352 DIE(no_sock_func, "endhostent");
9360 XPUSHi( endnetent() );
9363 DIE(no_sock_func, "endnetent");
9371 XPUSHi( endprotoent() );
9374 DIE(no_sock_func, "endprotoent");
9382 XPUSHi( endservent() );
9385 DIE(no_sock_func, "endservent");
9392 return pp_gpwent(ARGS);
9394 DIE(no_func, "getpwnam");
9401 return pp_gpwent(ARGS);
9403 DIE(no_func, "getpwuid");
9411 I32 which = op->op_type;
9412 register AV *ary = stack;
9414 struct passwd *getpwnam();
9415 struct passwd *getpwuid();
9416 struct passwd *getpwent();
9417 struct passwd *pwent;
9419 if (which == OP_GPWNAM)
9420 pwent = getpwnam(POPp);
9421 else if (which == OP_GPWUID)
9422 pwent = getpwuid(POPi);
9427 if (GIMME != G_ARRAY) {
9428 PUSHs(sv = sv_mortalcopy(&sv_undef));
9430 if (which == OP_GPWNAM)
9431 sv_setiv(sv, (I32)pwent->pw_uid);
9433 sv_setpv(sv, pwent->pw_name);
9439 PUSHs(sv = sv_mortalcopy(&sv_no));
9440 sv_setpv(sv, pwent->pw_name);
9441 PUSHs(sv = sv_mortalcopy(&sv_no));
9442 sv_setpv(sv, pwent->pw_passwd);
9443 PUSHs(sv = sv_mortalcopy(&sv_no));
9444 sv_setiv(sv, (I32)pwent->pw_uid);
9445 PUSHs(sv = sv_mortalcopy(&sv_no));
9446 sv_setiv(sv, (I32)pwent->pw_gid);
9447 PUSHs(sv = sv_mortalcopy(&sv_no));
9449 sv_setiv(sv, (I32)pwent->pw_change);
9452 sv_setiv(sv, (I32)pwent->pw_quota);
9455 sv_setpv(sv, pwent->pw_age);
9459 PUSHs(sv = sv_mortalcopy(&sv_no));
9461 sv_setpv(sv, pwent->pw_class);
9464 sv_setpv(sv, pwent->pw_comment);
9467 PUSHs(sv = sv_mortalcopy(&sv_no));
9468 sv_setpv(sv, pwent->pw_gecos);
9469 PUSHs(sv = sv_mortalcopy(&sv_no));
9470 sv_setpv(sv, pwent->pw_dir);
9471 PUSHs(sv = sv_mortalcopy(&sv_no));
9472 sv_setpv(sv, pwent->pw_shell);
9474 PUSHs(sv = sv_mortalcopy(&sv_no));
9475 sv_setiv(sv, (I32)pwent->pw_expire);
9480 DIE(no_func, "getpwent");
9491 DIE(no_func, "setpwent");
9502 DIE(no_func, "endpwent");
9509 return pp_ggrent(ARGS);
9511 DIE(no_func, "getgrnam");
9518 return pp_ggrent(ARGS);
9520 DIE(no_func, "getgrgid");
9528 I32 which = op->op_type;
9529 register char **elem;
9531 struct group *getgrnam();
9532 struct group *getgrgid();
9533 struct group *getgrent();
9534 struct group *grent;
9536 if (which == OP_GGRNAM)
9537 grent = getgrnam(POPp);
9538 else if (which == OP_GGRGID)
9539 grent = getgrgid(POPi);
9544 if (GIMME != G_ARRAY) {
9545 PUSHs(sv = sv_mortalcopy(&sv_undef));
9547 if (which == OP_GGRNAM)
9548 sv_setiv(sv, (I32)grent->gr_gid);
9550 sv_setpv(sv, grent->gr_name);
9556 PUSHs(sv = sv_mortalcopy(&sv_no));
9557 sv_setpv(sv, grent->gr_name);
9558 PUSHs(sv = sv_mortalcopy(&sv_no));
9559 sv_setpv(sv, grent->gr_passwd);
9560 PUSHs(sv = sv_mortalcopy(&sv_no));
9561 sv_setiv(sv, (I32)grent->gr_gid);
9562 PUSHs(sv = sv_mortalcopy(&sv_no));
9563 for (elem = grent->gr_mem; *elem; elem++) {
9564 sv_catpv(sv, *elem);
9566 sv_catpvn(sv, " ", 1);
9572 DIE(no_func, "getgrent");
9583 DIE(no_func, "setgrent");
9594 DIE(no_func, "endgrent");
9604 if (!(tmps = getlogin()))
9606 PUSHp(tmps, strlen(tmps));
9609 DIE(no_func, "getlogin");
9613 /* Miscellaneous. */
9618 dSP; dMARK; dORIGMARK; dTARGET;
9619 register I32 items = SP - MARK;
9620 unsigned long a[20];
9625 while (++MARK <= SP)
9626 TAINT_IF((*MARK)->sv_tainted);
9628 TAINT_PROPER("syscall");
9631 /* This probably won't work on machines where sizeof(long) != sizeof(int)
9632 * or where sizeof(long) != sizeof(char*). But such machines will
9633 * not likely have syscall implemented either, so who cares?
9635 while (++MARK <= SP) {
9636 if (SvNIOK(*MARK) || !i)
9637 a[i++] = SvIVn(*MARK);
9639 a[i++] = (unsigned long)SvPV(*MARK);
9645 DIE("Too many args to syscall");
9647 DIE("Too few args to syscall");
9649 retval = syscall(a[0]);
9652 retval = syscall(a[0],a[1]);
9655 retval = syscall(a[0],a[1],a[2]);
9658 retval = syscall(a[0],a[1],a[2],a[3]);
9661 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
9664 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
9667 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
9670 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
9674 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
9677 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
9680 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
9684 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
9688 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
9692 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
9693 a[10],a[11],a[12],a[13]);
9695 #endif /* atarist */
9701 DIE(no_func, "syscall");