3 * Copyright (c) 1991-1997, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "It's a big house this, and very peculiar. Always a bit more to discover,
12 * and no knowing what you'll find around a corner. And Elves, sir!" --Samwise
19 * The compiler on Concurrent CX/UX systems has a subtle bug which only
20 * seems to show up when compiling pp.c - it generates the wrong double
21 * precision constant value for (double)UV_MAX when used inline in the body
22 * of the code below, so this makes a static variable up front (which the
23 * compiler seems to get correct) and uses it in place of UV_MAX below.
25 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
26 static double UV_MAX_cxux = ((double)UV_MAX);
30 * Types used in bitwise operations.
32 * Normally we'd just use IV and UV. However, some hardware and
33 * software combinations (e.g. Alpha and current OSF/1) don't have a
34 * floating-point type to use for NV that has adequate bits to fully
35 * hold an IV/UV. (In other words, sizeof(long) == sizeof(double).)
37 * It just so happens that "int" is the right size almost everywhere.
43 * Mask used after bitwise operations.
45 * There is at least one realm (Cray word machines) that doesn't
46 * have an integral type (except char) small enough to be represented
47 * in a double without loss; that is, it has no 32-bit type.
49 #if LONGSIZE > 4 && defined(_CRAY) && !defined(_CRAYMPP)
51 # define BW_MASK ((1 << BW_BITS) - 1)
52 # define BW_SIGN (1 << (BW_BITS - 1))
53 # define BWi(i) (((i) & BW_SIGN) ? ((i) | ~BW_MASK) : ((i) & BW_MASK))
54 # define BWu(u) ((u) & BW_MASK)
61 * Offset for integer pack/unpack.
63 * On architectures where I16 and I32 aren't really 16 and 32 bits,
64 * which for now are all Crays, pack and unpack have to play games.
68 * These values are required for portability of pack() output.
69 * If they're not right on your machine, then pack() and unpack()
70 * wouldn't work right anyway; you'll need to apply the Cray hack.
71 * (I'd like to check them with #if, but you can't use sizeof() in
72 * the preprocessor.) --???
75 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
76 defines are now in config.h. --Andy Dougherty April 1998
81 #if BYTEORDER > 0xFFFF && defined(_CRAY) && !defined(_CRAYMPP)
82 # if BYTEORDER == 0x12345678
83 # define OFF16(p) (char*)(p)
84 # define OFF32(p) (char*)(p)
86 # if BYTEORDER == 0x87654321
87 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
88 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
90 }}}} bad cray byte order
93 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
94 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
95 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
96 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
98 # define COPY16(s,p) Copy(s, p, SIZE16, char)
99 # define COPY32(s,p) Copy(s, p, SIZE32, char)
100 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
101 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
105 static void doencodes _((SV* sv, char* s, I32 len));
106 static SV* refto _((SV* sv));
107 static U32 seed _((void));
108 static bool srand_called = FALSE;
112 /* variations on pp_null */
118 /* XXX I can't imagine anyone who doesn't have this actually _needs_
119 it, since pid_t is an integral type.
122 #ifdef NEED_GETPID_PROTO
123 extern Pid_t getpid (void);
129 if (GIMME_V == G_SCALAR)
130 XPUSHs(&PL_sv_undef);
144 if (PL_op->op_private & OPpLVAL_INTRO)
145 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
147 if (PL_op->op_flags & OPf_REF) {
151 if (GIMME == G_ARRAY) {
152 I32 maxarg = AvFILL((AV*)TARG) + 1;
154 if (SvMAGICAL(TARG)) {
156 for (i=0; i < maxarg; i++) {
157 SV **svp = av_fetch((AV*)TARG, i, FALSE);
158 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
162 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
167 SV* sv = sv_newmortal();
168 I32 maxarg = AvFILL((AV*)TARG) + 1;
169 sv_setiv(sv, maxarg);
181 if (PL_op->op_private & OPpLVAL_INTRO)
182 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
183 if (PL_op->op_flags & OPf_REF)
186 if (gimme == G_ARRAY) {
187 RETURNOP(do_kv(ARGS));
189 else if (gimme == G_SCALAR) {
190 SV* sv = sv_newmortal();
191 if (HvFILL((HV*)TARG))
192 sv_setpvf(sv, "%ld/%ld",
193 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
203 DIE("NOT IMPL LINE %d",__LINE__);
215 if (SvTYPE(sv) == SVt_PVIO) {
216 GV *gv = (GV*) sv_newmortal();
217 gv_init(gv, 0, "", 0, 0);
218 GvIOp(gv) = (IO *)sv;
219 (void)SvREFCNT_inc(sv);
221 } else if (SvTYPE(sv) != SVt_PVGV)
222 DIE("Not a GLOB reference");
225 if (SvTYPE(sv) != SVt_PVGV) {
229 if (SvGMAGICAL(sv)) {
235 if (PL_op->op_flags & OPf_REF ||
236 PL_op->op_private & HINT_STRICT_REFS)
237 DIE(no_usym, "a symbol");
243 if (PL_op->op_private & HINT_STRICT_REFS)
244 DIE(no_symref, sym, "a symbol");
245 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
248 if (PL_op->op_private & OPpLVAL_INTRO)
249 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
261 switch (SvTYPE(sv)) {
265 DIE("Not a SCALAR reference");
273 if (SvTYPE(gv) != SVt_PVGV) {
274 if (SvGMAGICAL(sv)) {
280 if (PL_op->op_flags & OPf_REF ||
281 PL_op->op_private & HINT_STRICT_REFS)
282 DIE(no_usym, "a SCALAR");
288 if (PL_op->op_private & HINT_STRICT_REFS)
289 DIE(no_symref, sym, "a SCALAR");
290 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
294 if (PL_op->op_flags & OPf_MOD) {
295 if (PL_op->op_private & OPpLVAL_INTRO)
296 sv = save_scalar((GV*)TOPs);
297 else if (PL_op->op_private & OPpDEREF)
298 vivify_ref(sv, PL_op->op_private & OPpDEREF);
308 SV *sv = AvARYLEN(av);
310 AvARYLEN(av) = sv = NEWSV(0,0);
311 sv_upgrade(sv, SVt_IV);
312 sv_magic(sv, (SV*)av, '#', Nullch, 0);
320 djSP; dTARGET; dPOPss;
322 if (PL_op->op_flags & OPf_MOD) {
323 if (SvTYPE(TARG) < SVt_PVLV) {
324 sv_upgrade(TARG, SVt_PVLV);
325 sv_magic(TARG, Nullsv, '.', Nullch, 0);
329 if (LvTARG(TARG) != sv) {
331 SvREFCNT_dec(LvTARG(TARG));
332 LvTARG(TARG) = SvREFCNT_inc(sv);
334 PUSHs(TARG); /* no SvSETMAGIC */
340 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
341 mg = mg_find(sv, 'g');
342 if (mg && mg->mg_len >= 0) {
343 PUSHi(mg->mg_len + PL_curcop->cop_arybase);
357 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
358 /* (But not in defined().) */
359 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
362 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
365 cv = (CV*)&PL_sv_undef;
379 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
380 char *s = SvPVX(TOPs);
381 if (strnEQ(s, "CORE::", 6)) {
384 code = keyword(s + 6, SvCUR(TOPs) - 6);
385 if (code < 0) { /* Overridable. */
386 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
387 int i = 0, n = 0, seen_question = 0;
389 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
391 while (i < MAXO) { /* The slow way. */
392 if (strEQ(s + 6, op_name[i]) || strEQ(s + 6, op_desc[i]))
396 goto nonesuch; /* Should not happen... */
398 oa = opargs[i] >> OASHIFT;
400 if (oa & OA_OPTIONAL) {
403 } else if (seen_question)
404 goto set; /* XXXX system, exec */
405 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
406 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
409 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
410 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
414 ret = sv_2mortal(newSVpv(str, n - 1));
415 } else if (code) /* Non-Overridable */
417 else { /* None such */
419 croak("Cannot find an opnumber for \"%s\"", s+6);
423 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
425 ret = sv_2mortal(newSVpv(SvPVX(cv), SvCUR(cv)));
434 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
436 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
452 if (GIMME != G_ARRAY) {
456 *MARK = &PL_sv_undef;
457 *MARK = refto(*MARK);
461 EXTEND_MORTAL(SP - MARK);
463 *MARK = refto(*MARK);
472 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
475 if (!(sv = LvTARG(sv)))
478 else if (SvPADTMP(sv))
482 (void)SvREFCNT_inc(sv);
485 sv_upgrade(rv, SVt_RV);
499 if (sv && SvGMAGICAL(sv))
502 if (!sv || !SvROK(sv))
506 pv = sv_reftype(sv,TRUE);
507 PUSHp(pv, strlen(pv));
517 stash = PL_curcop->cop_stash;
521 char *ptr = SvPV(ssv,len);
522 if (PL_dowarn && len == 0)
523 warn("Explicit blessing to '' (assuming package main)");
524 stash = gv_stashpvn(ptr, len, TRUE);
527 (void)sv_bless(TOPs, stash);
541 elem = SvPV(sv, n_a);
545 switch (elem ? *elem : '\0')
548 if (strEQ(elem, "ARRAY"))
549 tmpRef = (SV*)GvAV(gv);
552 if (strEQ(elem, "CODE"))
553 tmpRef = (SV*)GvCVu(gv);
556 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
557 tmpRef = (SV*)GvIOp(gv);
560 if (strEQ(elem, "GLOB"))
564 if (strEQ(elem, "HASH"))
565 tmpRef = (SV*)GvHV(gv);
568 if (strEQ(elem, "IO"))
569 tmpRef = (SV*)GvIOp(gv);
572 if (strEQ(elem, "NAME"))
573 sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
576 if (strEQ(elem, "PACKAGE"))
577 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
580 if (strEQ(elem, "SCALAR"))
594 /* Pattern matching */
599 register UNOP *unop = cUNOP;
600 register unsigned char *s;
603 register I32 *sfirst;
607 if (sv == PL_lastscream) {
613 SvSCREAM_off(PL_lastscream);
614 SvREFCNT_dec(PL_lastscream);
616 PL_lastscream = SvREFCNT_inc(sv);
619 s = (unsigned char*)(SvPV(sv, len));
623 if (pos > PL_maxscream) {
624 if (PL_maxscream < 0) {
625 PL_maxscream = pos + 80;
626 New(301, PL_screamfirst, 256, I32);
627 New(302, PL_screamnext, PL_maxscream, I32);
630 PL_maxscream = pos + pos / 4;
631 Renew(PL_screamnext, PL_maxscream, I32);
635 sfirst = PL_screamfirst;
636 snext = PL_screamnext;
638 if (!sfirst || !snext)
639 DIE("do_study: out of memory");
641 for (ch = 256; ch; --ch)
648 snext[pos] = sfirst[ch] - pos;
655 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
664 if (PL_op->op_flags & OPf_STACKED)
670 TARG = sv_newmortal();
671 PUSHi(do_trans(sv, PL_op));
675 /* Lvalue operators. */
687 djSP; dMARK; dTARGET;
697 SETi(do_chomp(TOPs));
703 djSP; dMARK; dTARGET;
704 register I32 count = 0;
707 count += do_chomp(POPs);
718 if (!sv || !SvANY(sv))
720 switch (SvTYPE(sv)) {
722 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
726 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
730 if (CvROOT(sv) || CvXSUB(sv))
747 if (!PL_op->op_private) {
756 if (SvTHINKFIRST(sv)) {
757 if (SvREADONLY(sv)) {
759 if (PL_curcop != &PL_compiling)
766 switch (SvTYPE(sv)) {
776 if (PL_dowarn && cv_const_sv((CV*)sv))
777 warn("Constant subroutine %s undefined",
778 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
781 { GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
783 CvGV((CV*)sv) = gv; } /* let user-undef'd sub keep its identity */
787 SvSetMagicSV(sv, &PL_sv_undef);
791 Newz(602, gp, 1, GP);
792 GvGP(sv) = gp_ref(gp);
793 GvSV(sv) = NEWSV(72,0);
794 GvLINE(sv) = PL_curcop->cop_line;
800 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
803 SvPV_set(sv, Nullch);
816 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
818 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
819 SvIVX(TOPs) != IV_MIN)
822 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
833 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
835 sv_setsv(TARG, TOPs);
836 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
837 SvIVX(TOPs) != IV_MAX)
840 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
854 if(SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
856 sv_setsv(TARG, TOPs);
857 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
858 SvIVX(TOPs) != IV_MIN)
861 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
870 /* Ordinary operators. */
874 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
877 SETn( pow( left, right) );
884 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
887 SETn( left * right );
894 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
899 DIE("Illegal division by zero");
901 /* insure that 20./5. == 4. */
904 if ((double)I_V(left) == left &&
905 (double)I_V(right) == right &&
906 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
909 value = left / right;
913 value = left / right;
922 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
930 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
932 right = (right_neg = (i < 0)) ? -i : i;
936 right = U_V((right_neg = (n < 0)) ? -n : n);
939 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
941 left = (left_neg = (i < 0)) ? -i : i;
945 left = U_V((left_neg = (n < 0)) ? -n : n);
949 DIE("Illegal modulus zero");
952 if ((left_neg != right_neg) && ans)
955 /* XXX may warn: unary minus operator applied to unsigned type */
956 /* could change -foo to be (~foo)+1 instead */
957 if (ans <= ~((UV)IV_MAX)+1)
958 sv_setiv(TARG, ~ans+1);
960 sv_setnv(TARG, -(double)ans);
971 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
973 register I32 count = POPi;
974 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
976 I32 items = SP - MARK;
988 repeatcpy((char*)(MARK + items), (char*)MARK,
989 items * sizeof(SV*), count - 1);
995 else { /* Note: mark already snarfed by pp_list */
1000 if (TARG == tmpstr && SvTHINKFIRST(tmpstr)) {
1001 if (SvREADONLY(tmpstr) && PL_curcop != &PL_compiling)
1002 DIE("Can't x= to readonly value");
1006 SvSetSV(TARG, tmpstr);
1007 SvPV_force(TARG, len);
1012 SvGROW(TARG, (count * len) + 1);
1013 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1014 SvCUR(TARG) *= count;
1016 *SvEND(TARG) = '\0';
1018 (void)SvPOK_only(TARG);
1027 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1030 SETn( left - right );
1037 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1040 if (PL_op->op_private & HINT_INTEGER) {
1042 i = BWi(i) << shift;
1056 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1059 if (PL_op->op_private & HINT_INTEGER) {
1061 i = BWi(i) >> shift;
1075 djSP; tryAMAGICbinSET(lt,0);
1078 SETs(boolSV(TOPn < value));
1085 djSP; tryAMAGICbinSET(gt,0);
1088 SETs(boolSV(TOPn > value));
1095 djSP; tryAMAGICbinSET(le,0);
1098 SETs(boolSV(TOPn <= value));
1105 djSP; tryAMAGICbinSET(ge,0);
1108 SETs(boolSV(TOPn >= value));
1115 djSP; tryAMAGICbinSET(ne,0);
1118 SETs(boolSV(TOPn != value));
1125 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1132 else if (left < right)
1134 else if (left > right)
1147 djSP; tryAMAGICbinSET(slt,0);
1150 int cmp = ((PL_op->op_private & OPpLOCALE)
1151 ? sv_cmp_locale(left, right)
1152 : sv_cmp(left, right));
1153 SETs(boolSV(cmp < 0));
1160 djSP; tryAMAGICbinSET(sgt,0);
1163 int cmp = ((PL_op->op_private & OPpLOCALE)
1164 ? sv_cmp_locale(left, right)
1165 : sv_cmp(left, right));
1166 SETs(boolSV(cmp > 0));
1173 djSP; tryAMAGICbinSET(sle,0);
1176 int cmp = ((PL_op->op_private & OPpLOCALE)
1177 ? sv_cmp_locale(left, right)
1178 : sv_cmp(left, right));
1179 SETs(boolSV(cmp <= 0));
1186 djSP; tryAMAGICbinSET(sge,0);
1189 int cmp = ((PL_op->op_private & OPpLOCALE)
1190 ? sv_cmp_locale(left, right)
1191 : sv_cmp(left, right));
1192 SETs(boolSV(cmp >= 0));
1199 djSP; tryAMAGICbinSET(seq,0);
1202 SETs(boolSV(sv_eq(left, right)));
1209 djSP; tryAMAGICbinSET(sne,0);
1212 SETs(boolSV(!sv_eq(left, right)));
1219 djSP; dTARGET; tryAMAGICbin(scmp,0);
1222 int cmp = ((PL_op->op_private & OPpLOCALE)
1223 ? sv_cmp_locale(left, right)
1224 : sv_cmp(left, right));
1232 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1235 if (SvNIOKp(left) || SvNIOKp(right)) {
1236 if (PL_op->op_private & HINT_INTEGER) {
1237 IBW value = SvIV(left) & SvIV(right);
1241 UBW value = SvUV(left) & SvUV(right);
1246 do_vop(PL_op->op_type, TARG, left, right);
1255 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1258 if (SvNIOKp(left) || SvNIOKp(right)) {
1259 if (PL_op->op_private & HINT_INTEGER) {
1260 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1264 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1269 do_vop(PL_op->op_type, TARG, left, right);
1278 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1281 if (SvNIOKp(left) || SvNIOKp(right)) {
1282 if (PL_op->op_private & HINT_INTEGER) {
1283 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1287 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1292 do_vop(PL_op->op_type, TARG, left, right);
1301 djSP; dTARGET; tryAMAGICun(neg);
1306 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv) && SvIVX(sv) != IV_MIN)
1308 else if (SvNIOKp(sv))
1310 else if (SvPOKp(sv)) {
1312 char *s = SvPV(sv, len);
1313 if (isIDFIRST(*s)) {
1314 sv_setpvn(TARG, "-", 1);
1317 else if (*s == '+' || *s == '-') {
1319 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1322 sv_setnv(TARG, -SvNV(sv));
1334 djSP; tryAMAGICunSET(not);
1335 #endif /* OVERLOAD */
1336 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1342 djSP; dTARGET; tryAMAGICun(compl);
1346 if (PL_op->op_private & HINT_INTEGER) {
1347 IBW value = ~SvIV(sv);
1351 UBW value = ~SvUV(sv);
1356 register char *tmps;
1357 register long *tmpl;
1362 tmps = SvPV_force(TARG, len);
1365 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1368 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1372 for ( ; anum > 0; anum--, tmps++)
1381 /* integer versions of some of the above */
1385 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1388 SETi( left * right );
1395 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1399 DIE("Illegal division by zero");
1400 value = POPi / value;
1408 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1412 DIE("Illegal modulus zero");
1413 SETi( left % right );
1420 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1423 SETi( left + right );
1430 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1433 SETi( left - right );
1440 djSP; tryAMAGICbinSET(lt,0);
1443 SETs(boolSV(left < right));
1450 djSP; tryAMAGICbinSET(gt,0);
1453 SETs(boolSV(left > right));
1460 djSP; tryAMAGICbinSET(le,0);
1463 SETs(boolSV(left <= right));
1470 djSP; tryAMAGICbinSET(ge,0);
1473 SETs(boolSV(left >= right));
1480 djSP; tryAMAGICbinSET(eq,0);
1483 SETs(boolSV(left == right));
1490 djSP; tryAMAGICbinSET(ne,0);
1493 SETs(boolSV(left != right));
1500 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1507 else if (left < right)
1518 djSP; dTARGET; tryAMAGICun(neg);
1523 /* High falutin' math. */
1527 djSP; dTARGET; tryAMAGICbin(atan2,0);
1530 SETn(atan2(left, right));
1537 djSP; dTARGET; tryAMAGICun(sin);
1549 djSP; dTARGET; tryAMAGICun(cos);
1559 /* Support Configure command-line overrides for rand() functions.
1560 After 5.005, perhaps we should replace this by Configure support
1561 for drand48(), random(), or rand(). For 5.005, though, maintain
1562 compatibility by calling rand() but allow the user to override it.
1563 See INSTALL for details. --Andy Dougherty 15 July 1998
1566 # define my_rand rand
1569 # define my_srand srand
1582 if (!srand_called) {
1583 (void)my_srand((unsigned)seed());
1584 srand_called = TRUE;
1587 value = my_rand() * value / 2147483648.0;
1590 value = my_rand() * value / 65536.0;
1593 value = my_rand() * value / 32768.0;
1595 value = my_rand() * value / (double)(((unsigned long)1) << RANDBITS);
1611 (void)my_srand((unsigned)anum);
1612 srand_called = TRUE;
1621 * This is really just a quick hack which grabs various garbage
1622 * values. It really should be a real hash algorithm which
1623 * spreads the effect of every input bit onto every output bit,
1624 * if someone who knows about such tings would bother to write it.
1625 * Might be a good idea to add that function to CORE as well.
1626 * No numbers below come from careful analysis or anyting here,
1627 * except they are primes and SEED_C1 > 1E6 to get a full-width
1628 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1629 * probably be bigger too.
1632 # define SEED_C1 1000003
1633 #define SEED_C4 73819
1635 # define SEED_C1 25747
1636 #define SEED_C4 20639
1640 #define SEED_C5 26107
1643 #ifndef PERL_NO_DEV_RANDOM
1648 # include <starlet.h>
1649 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1650 * in 100-ns units, typically incremented ever 10 ms. */
1651 unsigned int when[2];
1653 # ifdef HAS_GETTIMEOFDAY
1654 struct timeval when;
1660 /* This test is an escape hatch, this symbol isn't set by Configure. */
1661 #ifndef PERL_NO_DEV_RANDOM
1662 #ifndef PERL_RANDOM_DEVICE
1663 /* /dev/random isn't used by default because reads from it will block
1664 * if there isn't enough entropy available. You can compile with
1665 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1666 * is enough real entropy to fill the seed. */
1667 # define PERL_RANDOM_DEVICE "/dev/urandom"
1669 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1671 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1680 _ckvmssts(sys$gettim(when));
1681 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1683 # ifdef HAS_GETTIMEOFDAY
1684 gettimeofday(&when,(struct timezone *) 0);
1685 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1688 u = (U32)SEED_C1 * when;
1691 u += SEED_C3 * (U32)getpid();
1692 u += SEED_C4 * (U32)(UV)PL_stack_sp;
1693 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1694 u += SEED_C5 * (U32)(UV)&when;
1701 djSP; dTARGET; tryAMAGICun(exp);
1713 djSP; dTARGET; tryAMAGICun(log);
1718 SET_NUMERIC_STANDARD();
1719 DIE("Can't take log of %g", value);
1729 djSP; dTARGET; tryAMAGICun(sqrt);
1734 SET_NUMERIC_STANDARD();
1735 DIE("Can't take sqrt of %g", value);
1737 value = sqrt(value);
1747 double value = TOPn;
1750 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1756 (void)modf(value, &value);
1758 (void)modf(-value, &value);
1773 djSP; dTARGET; tryAMAGICun(abs);
1775 double value = TOPn;
1778 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1779 (iv = SvIVX(TOPs)) != IV_MIN) {
1801 XPUSHu(scan_hex(tmps, 99, &argtype));
1814 while (*tmps && isSPACE(*tmps))
1819 value = scan_hex(++tmps, 99, &argtype);
1821 value = scan_oct(tmps, 99, &argtype);
1831 SETi( sv_len(TOPs) );
1844 I32 lvalue = PL_op->op_flags & OPf_MOD;
1846 I32 arybase = PL_curcop->cop_arybase;
1850 SvTAINTED_off(TARG); /* decontaminate */
1854 repl = SvPV(sv, repl_len);
1861 tmps = SvPV(sv, curlen);
1862 if (pos >= arybase) {
1880 else if (len >= 0) {
1882 if (rem > (I32)curlen)
1896 if (PL_dowarn || lvalue || repl)
1897 warn("substr outside of string");
1902 sv_setpvn(TARG, tmps, rem);
1903 if (lvalue) { /* it's an lvalue! */
1904 if (!SvGMAGICAL(sv)) {
1909 warn("Attempt to use reference as lvalue in substr");
1911 if (SvOK(sv)) /* is it defined ? */
1912 (void)SvPOK_only(sv);
1914 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
1917 if (SvTYPE(TARG) < SVt_PVLV) {
1918 sv_upgrade(TARG, SVt_PVLV);
1919 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
1923 if (LvTARG(TARG) != sv) {
1925 SvREFCNT_dec(LvTARG(TARG));
1926 LvTARG(TARG) = SvREFCNT_inc(sv);
1928 LvTARGOFF(TARG) = pos;
1929 LvTARGLEN(TARG) = rem;
1932 sv_insert(sv, pos, rem, repl, repl_len);
1935 PUSHs(TARG); /* avoid SvSETMAGIC here */
1942 register I32 size = POPi;
1943 register I32 offset = POPi;
1944 register SV *src = POPs;
1945 I32 lvalue = PL_op->op_flags & OPf_MOD;
1947 unsigned char *s = (unsigned char*)SvPV(src, srclen);
1948 unsigned long retnum;
1951 SvTAINTED_off(TARG); /* decontaminate */
1952 offset *= size; /* turn into bit offset */
1953 len = (offset + size + 7) / 8;
1954 if (offset < 0 || size < 1)
1957 if (lvalue) { /* it's an lvalue! */
1958 if (SvTYPE(TARG) < SVt_PVLV) {
1959 sv_upgrade(TARG, SVt_PVLV);
1960 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
1964 if (LvTARG(TARG) != src) {
1966 SvREFCNT_dec(LvTARG(TARG));
1967 LvTARG(TARG) = SvREFCNT_inc(src);
1969 LvTARGOFF(TARG) = offset;
1970 LvTARGLEN(TARG) = size;
1978 if (offset >= srclen)
1981 retnum = (unsigned long) s[offset] << 8;
1983 else if (size == 32) {
1984 if (offset >= srclen)
1986 else if (offset + 1 >= srclen)
1987 retnum = (unsigned long) s[offset] << 24;
1988 else if (offset + 2 >= srclen)
1989 retnum = ((unsigned long) s[offset] << 24) +
1990 ((unsigned long) s[offset + 1] << 16);
1992 retnum = ((unsigned long) s[offset] << 24) +
1993 ((unsigned long) s[offset + 1] << 16) +
1994 (s[offset + 2] << 8);
1999 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
2004 else if (size == 16)
2005 retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
2006 else if (size == 32)
2007 retnum = ((unsigned long) s[offset] << 24) +
2008 ((unsigned long) s[offset + 1] << 16) +
2009 (s[offset + 2] << 8) + s[offset+3];
2013 sv_setuv(TARG, (UV)retnum);
2028 I32 arybase = PL_curcop->cop_arybase;
2033 offset = POPi - arybase;
2036 tmps = SvPV(big, biglen);
2039 else if (offset > biglen)
2041 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2042 (unsigned char*)tmps + biglen, little, 0)))
2043 retval = -1 + arybase;
2045 retval = tmps2 - tmps + arybase;
2062 I32 arybase = PL_curcop->cop_arybase;
2068 tmps2 = SvPV(little, llen);
2069 tmps = SvPV(big, blen);
2073 offset = SvIV(offstr) - arybase + llen;
2076 else if (offset > blen)
2078 if (!(tmps2 = rninstr(tmps, tmps + offset,
2079 tmps2, tmps2 + llen)))
2080 retval = -1 + arybase;
2082 retval = tmps2 - tmps + arybase;
2089 djSP; dMARK; dORIGMARK; dTARGET;
2090 #ifdef USE_LOCALE_NUMERIC
2091 if (PL_op->op_private & OPpLOCALE)
2092 SET_NUMERIC_LOCAL();
2094 SET_NUMERIC_STANDARD();
2096 do_sprintf(TARG, SP-MARK, MARK+1);
2097 TAINT_IF(SvTAINTED(TARG));
2112 value = (I32) (*tmps & 255);
2117 value = (I32) (anum & 255);
2128 (void)SvUPGRADE(TARG,SVt_PV);
2134 (void)SvPOK_only(TARG);
2141 djSP; dTARGET; dPOPTOPssrl;
2144 char *tmps = SvPV(left, n_a);
2146 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
2148 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
2152 "The crypt() function is unimplemented due to excessive paranoia.");
2165 if (!SvPADTMP(sv)) {
2171 s = SvPV_force(sv, n_a);
2173 if (PL_op->op_private & OPpLOCALE) {
2176 *s = toUPPER_LC(*s);
2192 if (!SvPADTMP(sv)) {
2198 s = SvPV_force(sv, n_a);
2200 if (PL_op->op_private & OPpLOCALE) {
2203 *s = toLOWER_LC(*s);
2220 if (!SvPADTMP(sv)) {
2227 s = SvPV_force(sv, len);
2229 register char *send = s + len;
2231 if (PL_op->op_private & OPpLOCALE) {
2234 for (; s < send; s++)
2235 *s = toUPPER_LC(*s);
2238 for (; s < send; s++)
2252 if (!SvPADTMP(sv)) {
2259 s = SvPV_force(sv, len);
2261 register char *send = s + len;
2263 if (PL_op->op_private & OPpLOCALE) {
2266 for (; s < send; s++)
2267 *s = toLOWER_LC(*s);
2270 for (; s < send; s++)
2282 register char *s = SvPV(sv,len);
2286 (void)SvUPGRADE(TARG, SVt_PV);
2287 SvGROW(TARG, (len * 2) + 1);
2295 SvCUR_set(TARG, d - SvPVX(TARG));
2296 (void)SvPOK_only(TARG);
2299 sv_setpvn(TARG, s, len);
2308 djSP; dMARK; dORIGMARK;
2310 register AV* av = (AV*)POPs;
2311 register I32 lval = PL_op->op_flags & OPf_MOD;
2312 I32 arybase = PL_curcop->cop_arybase;
2315 if (SvTYPE(av) == SVt_PVAV) {
2316 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2318 for (svp = MARK + 1; svp <= SP; svp++) {
2323 if (max > AvMAX(av))
2326 while (++MARK <= SP) {
2327 elem = SvIVx(*MARK);
2331 svp = av_fetch(av, elem, lval);
2333 if (!svp || *svp == &PL_sv_undef)
2334 DIE(no_aelem, elem);
2335 if (PL_op->op_private & OPpLVAL_INTRO)
2336 save_aelem(av, elem, svp);
2338 *MARK = svp ? *svp : &PL_sv_undef;
2341 if (GIMME != G_ARRAY) {
2349 /* Associative arrays. */
2354 HV *hash = (HV*)POPs;
2356 I32 gimme = GIMME_V;
2357 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2360 /* might clobber stack_sp */
2361 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2366 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2367 if (gimme == G_ARRAY) {
2369 /* might clobber stack_sp */
2370 sv_setsv(TARG, realhv ?
2371 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry));
2376 else if (gimme == G_SCALAR)
2395 I32 gimme = GIMME_V;
2396 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2400 if (PL_op->op_private & OPpSLICE) {
2404 hvtype = SvTYPE(hv);
2405 while (++MARK <= SP) {
2406 if (hvtype == SVt_PVHV)
2407 sv = hv_delete_ent(hv, *MARK, discard, 0);
2409 DIE("Not a HASH reference");
2410 *MARK = sv ? sv : &PL_sv_undef;
2414 else if (gimme == G_SCALAR) {
2423 if (SvTYPE(hv) == SVt_PVHV)
2424 sv = hv_delete_ent(hv, keysv, discard, 0);
2426 DIE("Not a HASH reference");
2440 if (SvTYPE(hv) == SVt_PVHV) {
2441 if (hv_exists_ent(hv, tmpsv, 0))
2443 } else if (SvTYPE(hv) == SVt_PVAV) {
2444 if (avhv_exists_ent((AV*)hv, tmpsv, 0))
2447 DIE("Not a HASH reference");
2454 djSP; dMARK; dORIGMARK;
2455 register HV *hv = (HV*)POPs;
2456 register I32 lval = PL_op->op_flags & OPf_MOD;
2457 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2459 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2460 DIE("Can't localize pseudo-hash element");
2462 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2463 while (++MARK <= SP) {
2467 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2468 svp = he ? &HeVAL(he) : 0;
2470 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2473 if (!svp || *svp == &PL_sv_undef) {
2475 DIE(no_helem, SvPV(keysv, n_a));
2477 if (PL_op->op_private & OPpLVAL_INTRO)
2478 save_helem(hv, keysv, svp);
2480 *MARK = svp ? *svp : &PL_sv_undef;
2483 if (GIMME != G_ARRAY) {
2491 /* List operators. */
2496 if (GIMME != G_ARRAY) {
2498 *MARK = *SP; /* unwanted list, return last item */
2500 *MARK = &PL_sv_undef;
2509 SV **lastrelem = PL_stack_sp;
2510 SV **lastlelem = PL_stack_base + POPMARK;
2511 SV **firstlelem = PL_stack_base + POPMARK + 1;
2512 register SV **firstrelem = lastlelem + 1;
2513 I32 arybase = PL_curcop->cop_arybase;
2514 I32 lval = PL_op->op_flags & OPf_MOD;
2515 I32 is_something_there = lval;
2517 register I32 max = lastrelem - lastlelem;
2518 register SV **lelem;
2521 if (GIMME != G_ARRAY) {
2522 ix = SvIVx(*lastlelem);
2527 if (ix < 0 || ix >= max)
2528 *firstlelem = &PL_sv_undef;
2530 *firstlelem = firstrelem[ix];
2536 SP = firstlelem - 1;
2540 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2545 *lelem = &PL_sv_undef;
2546 else if (!(*lelem = firstrelem[ix]))
2547 *lelem = &PL_sv_undef;
2551 if (ix >= max || !(*lelem = firstrelem[ix]))
2552 *lelem = &PL_sv_undef;
2554 if (!is_something_there && (SvOK(*lelem) || SvGMAGICAL(*lelem)))
2555 is_something_there = TRUE;
2557 if (is_something_there)
2560 SP = firstlelem - 1;
2566 djSP; dMARK; dORIGMARK;
2567 I32 items = SP - MARK;
2568 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2569 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2576 djSP; dMARK; dORIGMARK;
2577 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2581 SV *val = NEWSV(46, 0);
2583 sv_setsv(val, *++MARK);
2585 warn("Odd number of elements in hash assignment");
2586 (void)hv_store_ent(hv,key,val,0);
2595 djSP; dMARK; dORIGMARK;
2596 register AV *ary = (AV*)*++MARK;
2600 register I32 offset;
2601 register I32 length;
2608 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2609 *MARK-- = SvTIED_obj((SV*)ary, mg);
2613 perl_call_method("SPLICE",GIMME_V);
2622 offset = i = SvIVx(*MARK);
2624 offset += AvFILLp(ary) + 1;
2626 offset -= PL_curcop->cop_arybase;
2630 length = SvIVx(*MARK++);
2632 length += AvFILLp(ary) - offset + 1;
2638 length = AvMAX(ary) + 1; /* close enough to infinity */
2642 length = AvMAX(ary) + 1;
2644 if (offset > AvFILLp(ary) + 1)
2645 offset = AvFILLp(ary) + 1;
2646 after = AvFILLp(ary) + 1 - (offset + length);
2647 if (after < 0) { /* not that much array */
2648 length += after; /* offset+length now in array */
2654 /* At this point, MARK .. SP-1 is our new LIST */
2657 diff = newlen - length;
2658 if (newlen && !AvREAL(ary)) {
2662 assert(AvREAL(ary)); /* would leak, so croak */
2665 if (diff < 0) { /* shrinking the area */
2667 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2668 Copy(MARK, tmparyval, newlen, SV*);
2671 MARK = ORIGMARK + 1;
2672 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2673 MEXTEND(MARK, length);
2674 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2676 EXTEND_MORTAL(length);
2677 for (i = length, dst = MARK; i; i--) {
2678 sv_2mortal(*dst); /* free them eventualy */
2685 *MARK = AvARRAY(ary)[offset+length-1];
2688 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2689 SvREFCNT_dec(*dst++); /* free them now */
2692 AvFILLp(ary) += diff;
2694 /* pull up or down? */
2696 if (offset < after) { /* easier to pull up */
2697 if (offset) { /* esp. if nothing to pull */
2698 src = &AvARRAY(ary)[offset-1];
2699 dst = src - diff; /* diff is negative */
2700 for (i = offset; i > 0; i--) /* can't trust Copy */
2704 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
2708 if (after) { /* anything to pull down? */
2709 src = AvARRAY(ary) + offset + length;
2710 dst = src + diff; /* diff is negative */
2711 Move(src, dst, after, SV*);
2713 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
2714 /* avoid later double free */
2718 dst[--i] = &PL_sv_undef;
2721 for (src = tmparyval, dst = AvARRAY(ary) + offset;
2723 *dst = NEWSV(46, 0);
2724 sv_setsv(*dst++, *src++);
2726 Safefree(tmparyval);
2729 else { /* no, expanding (or same) */
2731 New(452, tmparyval, length, SV*); /* so remember deletion */
2732 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
2735 if (diff > 0) { /* expanding */
2737 /* push up or down? */
2739 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
2743 Move(src, dst, offset, SV*);
2745 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
2747 AvFILLp(ary) += diff;
2750 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
2751 av_extend(ary, AvFILLp(ary) + diff);
2752 AvFILLp(ary) += diff;
2755 dst = AvARRAY(ary) + AvFILLp(ary);
2757 for (i = after; i; i--) {
2764 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
2765 *dst = NEWSV(46, 0);
2766 sv_setsv(*dst++, *src++);
2768 MARK = ORIGMARK + 1;
2769 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2771 Copy(tmparyval, MARK, length, SV*);
2773 EXTEND_MORTAL(length);
2774 for (i = length, dst = MARK; i; i--) {
2775 sv_2mortal(*dst); /* free them eventualy */
2779 Safefree(tmparyval);
2783 else if (length--) {
2784 *MARK = tmparyval[length];
2787 while (length-- > 0)
2788 SvREFCNT_dec(tmparyval[length]);
2790 Safefree(tmparyval);
2793 *MARK = &PL_sv_undef;
2801 djSP; dMARK; dORIGMARK; dTARGET;
2802 register AV *ary = (AV*)*++MARK;
2803 register SV *sv = &PL_sv_undef;
2806 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2807 *MARK-- = SvTIED_obj((SV*)ary, mg);
2811 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
2816 /* Why no pre-extend of ary here ? */
2817 for (++MARK; MARK <= SP; MARK++) {
2820 sv_setsv(sv, *MARK);
2825 PUSHi( AvFILL(ary) + 1 );
2833 SV *sv = av_pop(av);
2835 (void)sv_2mortal(sv);
2844 SV *sv = av_shift(av);
2849 (void)sv_2mortal(sv);
2856 djSP; dMARK; dORIGMARK; dTARGET;
2857 register AV *ary = (AV*)*++MARK;
2862 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2863 *MARK-- = SvTIED_obj((SV*)ary, mg);
2867 perl_call_method("UNSHIFT",G_SCALAR|G_DISCARD);
2872 av_unshift(ary, SP - MARK);
2875 sv_setsv(sv, *++MARK);
2876 (void)av_store(ary, i++, sv);
2880 PUSHi( AvFILL(ary) + 1 );
2890 if (GIMME == G_ARRAY) {
2901 register char *down;
2907 do_join(TARG, &PL_sv_no, MARK, SP);
2909 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
2910 up = SvPV_force(TARG, len);
2912 down = SvPVX(TARG) + len - 1;
2918 (void)SvPOK_only(TARG);
2927 mul128(SV *sv, U8 m)
2930 char *s = SvPV(sv, len);
2934 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
2935 SV *tmpNew = newSVpv("0000000000", 10);
2937 sv_catsv(tmpNew, sv);
2938 SvREFCNT_dec(sv); /* free old sv */
2943 while (!*t) /* trailing '\0'? */
2946 i = ((*t - '0') << 7) + m;
2947 *(t--) = '0' + (i % 10);
2953 /* Explosives and implosives. */
2955 static const char uuemap[] =
2956 "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
2958 static char uudmap[256]; /* Initialised on first use */
2960 #if 'I' == 73 && 'J' == 74
2961 /* On an ASCII/ISO kind of system */
2962 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
2965 Some other sort of character set - use memchr() so we don't match
2968 #define ISUUCHAR(ch) (memchr(uuemap, (ch), sizeof(uuemap)-1) || (ch) == ' ')
2976 I32 gimme = GIMME_V;
2980 register char *pat = SvPV(left, llen);
2981 register char *s = SvPV(right, rlen);
2982 char *strend = s + rlen;
2984 register char *patend = pat + llen;
2989 /* These must not be in registers: */
3000 unsigned Quad_t auquad;
3006 register U32 culong;
3009 static char* bitcount = 0;
3013 if (gimme != G_ARRAY) { /* arrange to do first one only */
3015 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3016 if (strchr("aAbBhHP", *patend) || *pat == '%') {
3018 while (isDIGIT(*patend) || *patend == '*')
3024 while (pat < patend) {
3026 datumtype = *pat++ & 0xFF;
3027 if (isSPACE(datumtype))
3031 else if (*pat == '*') {
3032 len = strend - strbeg; /* long enough */
3035 else if (isDIGIT(*pat)) {
3037 while (isDIGIT(*pat))
3038 len = (len * 10) + (*pat++ - '0');
3041 len = (datumtype != '@');
3044 croak("Invalid type in unpack: '%c'", (int)datumtype);
3045 case ',': /* grandfather in commas but with a warning */
3046 if (commas++ == 0 && PL_dowarn)
3047 warn("Invalid type in unpack: '%c'", (int)datumtype);
3050 if (len == 1 && pat[-1] != '1')
3059 if (len > strend - strbeg)
3060 DIE("@ outside of string");
3064 if (len > s - strbeg)
3065 DIE("X outside of string");
3069 if (len > strend - s)
3070 DIE("x outside of string");
3075 if (len > strend - s)
3078 goto uchar_checksum;
3079 sv = NEWSV(35, len);
3080 sv_setpvn(sv, s, len);
3082 if (datumtype == 'A') {
3083 aptr = s; /* borrow register */
3084 s = SvPVX(sv) + len - 1;
3085 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3088 SvCUR_set(sv, s - SvPVX(sv));
3089 s = aptr; /* unborrow register */
3091 XPUSHs(sv_2mortal(sv));
3095 if (pat[-1] == '*' || len > (strend - s) * 8)
3096 len = (strend - s) * 8;
3099 Newz(601, bitcount, 256, char);
3100 for (bits = 1; bits < 256; bits++) {
3101 if (bits & 1) bitcount[bits]++;
3102 if (bits & 2) bitcount[bits]++;
3103 if (bits & 4) bitcount[bits]++;
3104 if (bits & 8) bitcount[bits]++;
3105 if (bits & 16) bitcount[bits]++;
3106 if (bits & 32) bitcount[bits]++;
3107 if (bits & 64) bitcount[bits]++;
3108 if (bits & 128) bitcount[bits]++;
3112 culong += bitcount[*(unsigned char*)s++];
3117 if (datumtype == 'b') {
3119 if (bits & 1) culong++;
3125 if (bits & 128) culong++;
3132 sv = NEWSV(35, len + 1);
3135 aptr = pat; /* borrow register */
3137 if (datumtype == 'b') {
3139 for (len = 0; len < aint; len++) {
3140 if (len & 7) /*SUPPRESS 595*/
3144 *pat++ = '0' + (bits & 1);
3149 for (len = 0; len < aint; len++) {
3154 *pat++ = '0' + ((bits & 128) != 0);
3158 pat = aptr; /* unborrow register */
3159 XPUSHs(sv_2mortal(sv));
3163 if (pat[-1] == '*' || len > (strend - s) * 2)
3164 len = (strend - s) * 2;
3165 sv = NEWSV(35, len + 1);
3168 aptr = pat; /* borrow register */
3170 if (datumtype == 'h') {
3172 for (len = 0; len < aint; len++) {
3177 *pat++ = PL_hexdigit[bits & 15];
3182 for (len = 0; len < aint; len++) {
3187 *pat++ = PL_hexdigit[(bits >> 4) & 15];
3191 pat = aptr; /* unborrow register */
3192 XPUSHs(sv_2mortal(sv));
3195 if (len > strend - s)
3200 if (aint >= 128) /* fake up signed chars */
3210 if (aint >= 128) /* fake up signed chars */
3213 sv_setiv(sv, (IV)aint);
3214 PUSHs(sv_2mortal(sv));
3219 if (len > strend - s)
3234 sv_setiv(sv, (IV)auint);
3235 PUSHs(sv_2mortal(sv));
3240 along = (strend - s) / SIZE16;
3246 #if SHORTSIZE > SIZE16
3259 #if SHORTSIZE > SIZE16
3265 sv_setiv(sv, (IV)ashort);
3266 PUSHs(sv_2mortal(sv));
3273 along = (strend - s) / SIZE16;
3278 COPY16(s, &aushort);
3281 if (datumtype == 'n')
3282 aushort = PerlSock_ntohs(aushort);
3285 if (datumtype == 'v')
3286 aushort = vtohs(aushort);
3295 COPY16(s, &aushort);
3299 if (datumtype == 'n')
3300 aushort = PerlSock_ntohs(aushort);
3303 if (datumtype == 'v')
3304 aushort = vtohs(aushort);
3306 sv_setiv(sv, (IV)aushort);
3307 PUSHs(sv_2mortal(sv));
3312 along = (strend - s) / sizeof(int);
3317 Copy(s, &aint, 1, int);
3320 cdouble += (double)aint;
3329 Copy(s, &aint, 1, int);
3333 /* Without the dummy below unpack("i", pack("i",-1))
3334 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3335 * cc with optimization turned on */
3337 sv_setiv(sv, (IV)aint) :
3339 sv_setiv(sv, (IV)aint);
3340 PUSHs(sv_2mortal(sv));
3345 along = (strend - s) / sizeof(unsigned int);
3350 Copy(s, &auint, 1, unsigned int);
3351 s += sizeof(unsigned int);
3353 cdouble += (double)auint;
3362 Copy(s, &auint, 1, unsigned int);
3363 s += sizeof(unsigned int);
3366 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
3367 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF for
3368 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (aka V4.0D)
3369 * with optimization turned on.
3370 * (DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (aka V4.0B)
3371 * does not have this problem even with -O4)
3374 sv_setuv(sv, (UV)auint) :
3376 sv_setuv(sv, (UV)auint);
3377 PUSHs(sv_2mortal(sv));
3382 along = (strend - s) / SIZE32;
3388 #if LONGSIZE > SIZE32
3389 if (along > 2147483647)
3390 along -= 4294967296;
3394 cdouble += (double)along;
3404 #if LONGSIZE > SIZE32
3405 if (along > 2147483647)
3406 along -= 4294967296;
3410 sv_setiv(sv, (IV)along);
3411 PUSHs(sv_2mortal(sv));
3418 along = (strend - s) / SIZE32;
3426 if (datumtype == 'N')
3427 aulong = PerlSock_ntohl(aulong);
3430 if (datumtype == 'V')
3431 aulong = vtohl(aulong);
3434 cdouble += (double)aulong;
3446 if (datumtype == 'N')
3447 aulong = PerlSock_ntohl(aulong);
3450 if (datumtype == 'V')
3451 aulong = vtohl(aulong);
3454 sv_setuv(sv, (UV)aulong);
3455 PUSHs(sv_2mortal(sv));
3460 along = (strend - s) / sizeof(char*);
3466 if (sizeof(char*) > strend - s)
3469 Copy(s, &aptr, 1, char*);
3475 PUSHs(sv_2mortal(sv));
3485 while ((len > 0) && (s < strend)) {
3486 auv = (auv << 7) | (*s & 0x7f);
3487 if (!(*s++ & 0x80)) {
3491 PUSHs(sv_2mortal(sv));
3495 else if (++bytes >= sizeof(UV)) { /* promote to string */
3499 sv = newSVpvf("%.*Vu", (int)TYPE_DIGITS(UV), auv);
3500 while (s < strend) {
3501 sv = mul128(sv, *s & 0x7f);
3502 if (!(*s++ & 0x80)) {
3511 PUSHs(sv_2mortal(sv));
3516 if ((s >= strend) && bytes)
3517 croak("Unterminated compressed integer");
3522 if (sizeof(char*) > strend - s)
3525 Copy(s, &aptr, 1, char*);
3530 sv_setpvn(sv, aptr, len);
3531 PUSHs(sv_2mortal(sv));
3535 along = (strend - s) / sizeof(Quad_t);
3541 if (s + sizeof(Quad_t) > strend)
3544 Copy(s, &aquad, 1, Quad_t);
3545 s += sizeof(Quad_t);
3548 if (aquad >= IV_MIN && aquad <= IV_MAX)
3549 sv_setiv(sv, (IV)aquad);
3551 sv_setnv(sv, (double)aquad);
3552 PUSHs(sv_2mortal(sv));
3556 along = (strend - s) / sizeof(Quad_t);
3562 if (s + sizeof(unsigned Quad_t) > strend)
3565 Copy(s, &auquad, 1, unsigned Quad_t);
3566 s += sizeof(unsigned Quad_t);
3569 if (auquad <= UV_MAX)
3570 sv_setuv(sv, (UV)auquad);
3572 sv_setnv(sv, (double)auquad);
3573 PUSHs(sv_2mortal(sv));
3577 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
3580 along = (strend - s) / sizeof(float);
3585 Copy(s, &afloat, 1, float);
3594 Copy(s, &afloat, 1, float);
3597 sv_setnv(sv, (double)afloat);
3598 PUSHs(sv_2mortal(sv));
3604 along = (strend - s) / sizeof(double);
3609 Copy(s, &adouble, 1, double);
3610 s += sizeof(double);
3618 Copy(s, &adouble, 1, double);
3619 s += sizeof(double);
3621 sv_setnv(sv, (double)adouble);
3622 PUSHs(sv_2mortal(sv));
3628 * Initialise the decode mapping. By using a table driven
3629 * algorithm, the code will be character-set independent
3630 * (and just as fast as doing character arithmetic)
3632 if (uudmap['M'] == 0) {
3635 for (i = 0; i < sizeof(uuemap); i += 1)
3636 uudmap[uuemap[i]] = i;
3638 * Because ' ' and '`' map to the same value,
3639 * we need to decode them both the same.
3644 along = (strend - s) * 3 / 4;
3645 sv = NEWSV(42, along);
3648 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
3653 len = uudmap[*s++] & 077;
3655 if (s < strend && ISUUCHAR(*s))
3656 a = uudmap[*s++] & 077;
3659 if (s < strend && ISUUCHAR(*s))
3660 b = uudmap[*s++] & 077;
3663 if (s < strend && ISUUCHAR(*s))
3664 c = uudmap[*s++] & 077;
3667 if (s < strend && ISUUCHAR(*s))
3668 d = uudmap[*s++] & 077;
3671 hunk[0] = (a << 2) | (b >> 4);
3672 hunk[1] = (b << 4) | (c >> 2);
3673 hunk[2] = (c << 6) | d;
3674 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
3679 else if (s[1] == '\n') /* possible checksum byte */
3682 XPUSHs(sv_2mortal(sv));
3687 if (strchr("fFdD", datumtype) ||
3688 (checksum > 32 && strchr("iIlLN", datumtype)) ) {
3692 while (checksum >= 16) {
3696 while (checksum >= 4) {
3702 along = (1 << checksum) - 1;
3703 while (cdouble < 0.0)
3705 cdouble = modf(cdouble / adouble, &trouble) * adouble;
3706 sv_setnv(sv, cdouble);
3709 if (checksum < 32) {
3710 aulong = (1 << checksum) - 1;
3713 sv_setuv(sv, (UV)culong);
3715 XPUSHs(sv_2mortal(sv));
3719 if (SP == oldsp && gimme == G_SCALAR)
3720 PUSHs(&PL_sv_undef);
3725 doencodes(register SV *sv, register char *s, register I32 len)
3729 *hunk = uuemap[len];
3730 sv_catpvn(sv, hunk, 1);
3733 hunk[0] = uuemap[(077 & (*s >> 2))];
3734 hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
3735 hunk[2] = uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
3736 hunk[3] = uuemap[(077 & (s[2] & 077))];
3737 sv_catpvn(sv, hunk, 4);
3742 char r = (len > 1 ? s[1] : '\0');
3743 hunk[0] = uuemap[(077 & (*s >> 2))];
3744 hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
3745 hunk[2] = uuemap[(077 & ((r << 2) & 074))];
3746 hunk[3] = uuemap[0];
3747 sv_catpvn(sv, hunk, 4);
3749 sv_catpvn(sv, "\n", 1);
3753 is_an_int(char *s, STRLEN l)
3756 SV *result = newSVpv("", l);
3757 char *result_c = SvPV(result, n_a); /* convenience */
3758 char *out = result_c;
3768 SvREFCNT_dec(result);
3791 SvREFCNT_dec(result);
3797 SvCUR_set(result, out - result_c);
3802 div128(SV *pnum, bool *done)
3803 /* must be '\0' terminated */
3807 char *s = SvPV(pnum, len);
3816 i = m * 10 + (*t - '0');
3818 r = (i >> 7); /* r < 10 */
3825 SvCUR_set(pnum, (STRLEN) (t - s));
3832 djSP; dMARK; dORIGMARK; dTARGET;
3833 register SV *cat = TARG;
3836 register char *pat = SvPVx(*++MARK, fromlen);
3837 register char *patend = pat + fromlen;
3842 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
3843 static char *space10 = " ";
3845 /* These must not be in registers: */
3854 unsigned Quad_t auquad;
3863 sv_setpvn(cat, "", 0);
3864 while (pat < patend) {
3865 #define NEXTFROM (items-- > 0 ? *MARK++ : &PL_sv_no)
3866 datumtype = *pat++ & 0xFF;
3867 if (isSPACE(datumtype))
3870 len = strchr("@Xxu", datumtype) ? 0 : items;
3873 else if (isDIGIT(*pat)) {
3875 while (isDIGIT(*pat))
3876 len = (len * 10) + (*pat++ - '0');
3882 croak("Invalid type in pack: '%c'", (int)datumtype);
3883 case ',': /* grandfather in commas but with a warning */
3884 if (commas++ == 0 && PL_dowarn)
3885 warn("Invalid type in pack: '%c'", (int)datumtype);
3888 DIE("%% may only be used in unpack");
3899 if (SvCUR(cat) < len)
3900 DIE("X outside of string");
3907 sv_catpvn(cat, null10, 10);
3910 sv_catpvn(cat, null10, len);
3915 aptr = SvPV(fromstr, fromlen);
3919 sv_catpvn(cat, aptr, len);
3921 sv_catpvn(cat, aptr, fromlen);
3923 if (datumtype == 'A') {
3925 sv_catpvn(cat, space10, 10);
3928 sv_catpvn(cat, space10, len);
3932 sv_catpvn(cat, null10, 10);
3935 sv_catpvn(cat, null10, len);
3942 char *savepat = pat;
3947 aptr = SvPV(fromstr, fromlen);
3952 SvCUR(cat) += (len+7)/8;
3953 SvGROW(cat, SvCUR(cat) + 1);
3954 aptr = SvPVX(cat) + aint;
3959 if (datumtype == 'B') {
3960 for (len = 0; len++ < aint;) {
3961 items |= *pat++ & 1;
3965 *aptr++ = items & 0xff;
3971 for (len = 0; len++ < aint;) {
3977 *aptr++ = items & 0xff;
3983 if (datumtype == 'B')
3984 items <<= 7 - (aint & 7);
3986 items >>= 7 - (aint & 7);
3987 *aptr++ = items & 0xff;
3989 pat = SvPVX(cat) + SvCUR(cat);
4000 char *savepat = pat;
4005 aptr = SvPV(fromstr, fromlen);
4010 SvCUR(cat) += (len+1)/2;
4011 SvGROW(cat, SvCUR(cat) + 1);
4012 aptr = SvPVX(cat) + aint;
4017 if (datumtype == 'H') {
4018 for (len = 0; len++ < aint;) {
4020 items |= ((*pat++ & 15) + 9) & 15;
4022 items |= *pat++ & 15;
4026 *aptr++ = items & 0xff;
4032 for (len = 0; len++ < aint;) {
4034 items |= (((*pat++ & 15) + 9) & 15) << 4;
4036 items |= (*pat++ & 15) << 4;
4040 *aptr++ = items & 0xff;
4046 *aptr++ = items & 0xff;
4047 pat = SvPVX(cat) + SvCUR(cat);
4059 aint = SvIV(fromstr);
4061 sv_catpvn(cat, &achar, sizeof(char));
4064 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4069 afloat = (float)SvNV(fromstr);
4070 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4077 adouble = (double)SvNV(fromstr);
4078 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4084 ashort = (I16)SvIV(fromstr);
4086 ashort = PerlSock_htons(ashort);
4088 CAT16(cat, &ashort);
4094 ashort = (I16)SvIV(fromstr);
4096 ashort = htovs(ashort);
4098 CAT16(cat, &ashort);
4105 ashort = (I16)SvIV(fromstr);
4106 CAT16(cat, &ashort);
4112 auint = SvUV(fromstr);
4113 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4119 adouble = floor(SvNV(fromstr));
4122 croak("Cannot compress negative numbers");
4128 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
4129 adouble <= UV_MAX_cxux
4136 char buf[1 + sizeof(UV)];
4137 char *in = buf + sizeof(buf);
4138 UV auv = U_V(adouble);;
4141 *--in = (auv & 0x7f) | 0x80;
4144 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4145 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4147 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4148 char *from, *result, *in;
4153 /* Copy string and check for compliance */
4154 from = SvPV(fromstr, len);
4155 if ((norm = is_an_int(from, len)) == NULL)
4156 croak("can compress only unsigned integer");
4158 New('w', result, len, char);
4162 *--in = div128(norm, &done) | 0x80;
4163 result[len - 1] &= 0x7F; /* clear continue bit */
4164 sv_catpvn(cat, in, (result + len) - in);
4166 SvREFCNT_dec(norm); /* free norm */
4168 else if (SvNOKp(fromstr)) {
4169 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4170 char *in = buf + sizeof(buf);
4173 double next = floor(adouble / 128);
4174 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4175 if (--in < buf) /* this cannot happen ;-) */
4176 croak ("Cannot compress integer");
4178 } while (adouble > 0);
4179 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4180 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4183 croak("Cannot compress non integer");
4189 aint = SvIV(fromstr);
4190 sv_catpvn(cat, (char*)&aint, sizeof(int));
4196 aulong = SvUV(fromstr);
4198 aulong = PerlSock_htonl(aulong);
4200 CAT32(cat, &aulong);
4206 aulong = SvUV(fromstr);
4208 aulong = htovl(aulong);
4210 CAT32(cat, &aulong);
4216 aulong = SvUV(fromstr);
4217 CAT32(cat, &aulong);
4223 along = SvIV(fromstr);
4231 auquad = (unsigned Quad_t)SvIV(fromstr);
4232 sv_catpvn(cat, (char*)&auquad, sizeof(unsigned Quad_t));
4238 aquad = (Quad_t)SvIV(fromstr);
4239 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
4242 #endif /* HAS_QUAD */
4244 len = 1; /* assume SV is correct length */
4249 if (fromstr == &PL_sv_undef)
4253 /* XXX better yet, could spirit away the string to
4254 * a safe spot and hang on to it until the result
4255 * of pack() (and all copies of the result) are
4258 if (PL_dowarn && (SvTEMP(fromstr) || SvPADTMP(fromstr)))
4259 warn("Attempt to pack pointer to temporary value");
4260 if (SvPOK(fromstr) || SvNIOK(fromstr))
4261 aptr = SvPV(fromstr,n_a);
4263 aptr = SvPV_force(fromstr,n_a);
4265 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4270 aptr = SvPV(fromstr, fromlen);
4271 SvGROW(cat, fromlen * 4 / 3);
4276 while (fromlen > 0) {
4283 doencodes(cat, aptr, todo);
4302 register I32 limit = POPi; /* note, negative is forever */
4305 register char *s = SvPV(sv, len);
4306 char *strend = s + len;
4308 register REGEXP *rx;
4312 I32 maxiters = (strend - s) + 10;
4315 I32 origlimit = limit;
4318 AV *oldstack = PL_curstack;
4319 I32 gimme = GIMME_V;
4320 I32 oldsave = PL_savestack_ix;
4321 I32 make_mortal = 1;
4322 MAGIC *mg = (MAGIC *) NULL;
4325 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4330 DIE("panic: do_split");
4331 rx = pm->op_pmregexp;
4333 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4334 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4336 if (pm->op_pmreplroot)
4337 ary = GvAVn((GV*)pm->op_pmreplroot);
4338 else if (gimme != G_ARRAY)
4340 ary = (AV*)PL_curpad[0];
4342 ary = GvAVn(PL_defgv);
4343 #endif /* USE_THREADS */
4346 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4352 if (mg = SvTIED_mg((SV*)ary, 'P')) {
4354 XPUSHs(SvTIED_obj((SV*)ary, mg));
4359 for (i = AvFILLp(ary); i >= 0; i--)
4360 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4362 /* temporarily switch stacks */
4363 SWITCHSTACK(PL_curstack, ary);
4367 base = SP - PL_stack_base;
4369 if (pm->op_pmflags & PMf_SKIPWHITE) {
4370 if (pm->op_pmflags & PMf_LOCALE) {
4371 while (isSPACE_LC(*s))
4379 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4380 SAVEINT(PL_multiline);
4381 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4385 limit = maxiters + 2;
4386 if (pm->op_pmflags & PMf_WHITE) {
4389 while (m < strend &&
4390 !((pm->op_pmflags & PMf_LOCALE)
4391 ? isSPACE_LC(*m) : isSPACE(*m)))
4396 dstr = NEWSV(30, m-s);
4397 sv_setpvn(dstr, s, m-s);
4403 while (s < strend &&
4404 ((pm->op_pmflags & PMf_LOCALE)
4405 ? isSPACE_LC(*s) : isSPACE(*s)))
4409 else if (strEQ("^", rx->precomp)) {
4412 for (m = s; m < strend && *m != '\n'; m++) ;
4416 dstr = NEWSV(30, m-s);
4417 sv_setpvn(dstr, s, m-s);
4424 else if (rx->check_substr && !rx->nparens
4425 && (rx->reganch & ROPT_CHECK_ALL)
4426 && !(rx->reganch & ROPT_ANCH)) {
4427 i = SvCUR(rx->check_substr);
4428 if (i == 1 && !SvTAIL(rx->check_substr)) {
4429 i = *SvPVX(rx->check_substr);
4432 for (m = s; m < strend && *m != i; m++) ;
4435 dstr = NEWSV(30, m-s);
4436 sv_setpvn(dstr, s, m-s);
4445 while (s < strend && --limit &&
4446 (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
4447 rx->check_substr, 0)) )
4450 dstr = NEWSV(31, m-s);
4451 sv_setpvn(dstr, s, m-s);
4460 maxiters += (strend - s) * rx->nparens;
4461 while (s < strend && --limit &&
4462 CALLREGEXEC(rx, s, strend, orig, 1, Nullsv, NULL, 0))
4464 TAINT_IF(RX_MATCH_TAINTED(rx));
4466 && rx->subbase != orig) {
4471 strend = s + (strend - m);
4474 dstr = NEWSV(32, m-s);
4475 sv_setpvn(dstr, s, m-s);
4480 for (i = 1; i <= rx->nparens; i++) {
4484 dstr = NEWSV(33, m-s);
4485 sv_setpvn(dstr, s, m-s);
4488 dstr = NEWSV(33, 0);
4498 LEAVE_SCOPE(oldsave);
4499 iters = (SP - PL_stack_base) - base;
4500 if (iters > maxiters)
4503 /* keep field after final delim? */
4504 if (s < strend || (iters && origlimit)) {
4505 dstr = NEWSV(34, strend-s);
4506 sv_setpvn(dstr, s, strend-s);
4512 else if (!origlimit) {
4513 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
4519 SWITCHSTACK(ary, oldstack);
4520 if (SvSMAGICAL(ary)) {
4525 if (gimme == G_ARRAY) {
4527 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4535 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
4538 if (gimme == G_ARRAY) {
4539 /* EXTEND should not be needed - we just popped them */
4541 for (i=0; i < iters; i++) {
4542 SV **svp = av_fetch(ary, i, FALSE);
4543 PUSHs((svp) ? *svp : &PL_sv_undef);
4550 if (gimme == G_ARRAY)
4553 if (iters || !pm->op_pmreplroot) {
4563 unlock_condpair(void *svv)
4566 MAGIC *mg = mg_find((SV*)svv, 'm');
4569 croak("panic: unlock_condpair unlocking non-mutex");
4570 MUTEX_LOCK(MgMUTEXP(mg));
4571 if (MgOWNER(mg) != thr)
4572 croak("panic: unlock_condpair unlocking mutex that we don't own");
4574 COND_SIGNAL(MgOWNERCONDP(mg));
4575 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: unlock 0x%lx\n",
4576 (unsigned long)thr, (unsigned long)svv);)
4577 MUTEX_UNLOCK(MgMUTEXP(mg));
4579 #endif /* USE_THREADS */
4592 mg = condpair_magic(sv);
4593 MUTEX_LOCK(MgMUTEXP(mg));
4594 if (MgOWNER(mg) == thr)
4595 MUTEX_UNLOCK(MgMUTEXP(mg));
4598 COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
4600 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: pp_lock lock 0x%lx\n",
4601 (unsigned long)thr, (unsigned long)sv);)
4602 MUTEX_UNLOCK(MgMUTEXP(mg));
4603 save_destructor(unlock_condpair, sv);
4605 #endif /* USE_THREADS */
4606 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4607 || SvTYPE(retsv) == SVt_PVCV) {
4608 retsv = refto(retsv);
4619 if (PL_op->op_private & OPpLVAL_INTRO)
4620 PUSHs(*save_threadsv(PL_op->op_targ));
4622 PUSHs(THREADSV(PL_op->op_targ));
4625 DIE("tried to access per-thread data in non-threaded perl");
4626 #endif /* USE_THREADS */