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));
110 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) {
228 if (SvGMAGICAL(sv)) {
234 if (PL_op->op_flags & OPf_REF ||
235 PL_op->op_private & HINT_STRICT_REFS)
236 DIE(no_usym, "a symbol");
237 if (ckWARN(WARN_UNINITIALIZED))
238 warner(WARN_UNINITIALIZED, warn_uninit);
241 sym = SvPV(sv, PL_na);
242 if (PL_op->op_private & HINT_STRICT_REFS)
243 DIE(no_symref, sym, "a symbol");
244 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
247 if (PL_op->op_private & OPpLVAL_INTRO)
248 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
260 switch (SvTYPE(sv)) {
264 DIE("Not a SCALAR reference");
271 if (SvTYPE(gv) != SVt_PVGV) {
272 if (SvGMAGICAL(sv)) {
278 if (PL_op->op_flags & OPf_REF ||
279 PL_op->op_private & HINT_STRICT_REFS)
280 DIE(no_usym, "a SCALAR");
281 if (ckWARN(WARN_UNINITIALIZED))
282 warner(WARN_UNINITIALIZED, warn_uninit);
285 sym = SvPV(sv, PL_na);
286 if (PL_op->op_private & HINT_STRICT_REFS)
287 DIE(no_symref, sym, "a SCALAR");
288 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
292 if (PL_op->op_flags & OPf_MOD) {
293 if (PL_op->op_private & OPpLVAL_INTRO)
294 sv = save_scalar((GV*)TOPs);
295 else if (PL_op->op_private & OPpDEREF)
296 vivify_ref(sv, PL_op->op_private & OPpDEREF);
306 SV *sv = AvARYLEN(av);
308 AvARYLEN(av) = sv = NEWSV(0,0);
309 sv_upgrade(sv, SVt_IV);
310 sv_magic(sv, (SV*)av, '#', Nullch, 0);
318 djSP; dTARGET; dPOPss;
320 if (PL_op->op_flags & OPf_MOD) {
321 if (SvTYPE(TARG) < SVt_PVLV) {
322 sv_upgrade(TARG, SVt_PVLV);
323 sv_magic(TARG, Nullsv, '.', Nullch, 0);
327 if (LvTARG(TARG) != sv) {
329 SvREFCNT_dec(LvTARG(TARG));
330 LvTARG(TARG) = SvREFCNT_inc(sv);
332 PUSHs(TARG); /* no SvSETMAGIC */
338 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
339 mg = mg_find(sv, 'g');
340 if (mg && mg->mg_len >= 0) {
344 PUSHi(i + PL_curcop->cop_arybase);
358 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
359 /* (But not in defined().) */
360 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
363 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
366 cv = (CV*)&PL_sv_undef;
380 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
381 char *s = SvPVX(TOPs);
382 if (strnEQ(s, "CORE::", 6)) {
385 code = keyword(s + 6, SvCUR(TOPs) - 6);
386 if (code < 0) { /* Overridable. */
387 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
388 int i = 0, n = 0, seen_question = 0;
390 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
392 while (i < MAXO) { /* The slow way. */
393 if (strEQ(s + 6, op_name[i]) || strEQ(s + 6, op_desc[i]))
397 goto nonesuch; /* Should not happen... */
399 oa = opargs[i] >> OASHIFT;
401 if (oa & OA_OPTIONAL) {
404 } else if (seen_question)
405 goto set; /* XXXX system, exec */
406 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
407 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
410 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
411 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
415 ret = sv_2mortal(newSVpv(str, n - 1));
416 } else if (code) /* Non-Overridable */
418 else { /* None such */
420 croak("Cannot find an opnumber for \"%s\"", s+6);
424 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
426 ret = sv_2mortal(newSVpv(SvPVX(cv), SvCUR(cv)));
435 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
437 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
453 if (GIMME != G_ARRAY) {
457 *MARK = &PL_sv_undef;
458 *MARK = refto(*MARK);
462 EXTEND_MORTAL(SP - MARK);
464 *MARK = refto(*MARK);
473 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
476 if (!(sv = LvTARG(sv)))
479 else if (SvPADTMP(sv))
483 (void)SvREFCNT_inc(sv);
486 sv_upgrade(rv, SVt_RV);
500 if (sv && SvGMAGICAL(sv))
503 if (!sv || !SvROK(sv))
507 pv = sv_reftype(sv,TRUE);
508 PUSHp(pv, strlen(pv));
518 stash = PL_curcop->cop_stash;
522 char *ptr = SvPV(ssv,len);
523 if (ckWARN(WARN_UNSAFE) && len == 0)
525 "Explicit blessing to '' (assuming package main)");
526 stash = gv_stashpvn(ptr, len, TRUE);
529 (void)sv_bless(TOPs, stash);
542 elem = SvPV(sv, PL_na);
546 switch (elem ? *elem : '\0')
549 if (strEQ(elem, "ARRAY"))
550 tmpRef = (SV*)GvAV(gv);
553 if (strEQ(elem, "CODE"))
554 tmpRef = (SV*)GvCVu(gv);
557 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
558 tmpRef = (SV*)GvIOp(gv);
561 if (strEQ(elem, "GLOB"))
565 if (strEQ(elem, "HASH"))
566 tmpRef = (SV*)GvHV(gv);
569 if (strEQ(elem, "IO"))
570 tmpRef = (SV*)GvIOp(gv);
573 if (strEQ(elem, "NAME"))
574 sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
577 if (strEQ(elem, "PACKAGE"))
578 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
581 if (strEQ(elem, "SCALAR"))
595 /* Pattern matching */
600 register UNOP *unop = cUNOP;
601 register unsigned char *s;
604 register I32 *sfirst;
608 if (sv == PL_lastscream) {
614 SvSCREAM_off(PL_lastscream);
615 SvREFCNT_dec(PL_lastscream);
617 PL_lastscream = SvREFCNT_inc(sv);
620 s = (unsigned char*)(SvPV(sv, len));
624 if (pos > PL_maxscream) {
625 if (PL_maxscream < 0) {
626 PL_maxscream = pos + 80;
627 New(301, PL_screamfirst, 256, I32);
628 New(302, PL_screamnext, PL_maxscream, I32);
631 PL_maxscream = pos + pos / 4;
632 Renew(PL_screamnext, PL_maxscream, I32);
636 sfirst = PL_screamfirst;
637 snext = PL_screamnext;
639 if (!sfirst || !snext)
640 DIE("do_study: out of memory");
642 for (ch = 256; ch; --ch)
649 snext[pos] = sfirst[ch] - pos;
656 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
665 if (PL_op->op_flags & OPf_STACKED)
671 TARG = sv_newmortal();
676 /* Lvalue operators. */
688 djSP; dMARK; dTARGET;
698 SETi(do_chomp(TOPs));
704 djSP; dMARK; dTARGET;
705 register I32 count = 0;
708 count += do_chomp(POPs);
719 if (!sv || !SvANY(sv))
721 switch (SvTYPE(sv)) {
723 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv))
727 if (HvARRAY(sv) || SvGMAGICAL(sv))
731 if (CvROOT(sv) || CvXSUB(sv))
748 if (!PL_op->op_private) {
757 if (SvTHINKFIRST(sv)) {
764 switch (SvTYPE(sv)) {
774 if (ckWARN(WARN_UNSAFE) && cv_const_sv((CV*)sv))
775 warner(WARN_UNSAFE, "Constant subroutine %s undefined",
776 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
779 { GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
781 CvGV((CV*)sv) = gv; } /* let user-undef'd sub keep its identity */
785 SvSetMagicSV(sv, &PL_sv_undef);
789 Newz(602, gp, 1, GP);
790 GvGP(sv) = gp_ref(gp);
791 GvSV(sv) = NEWSV(72,0);
792 GvLINE(sv) = PL_curcop->cop_line;
798 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
801 SvPV_set(sv, Nullch);
814 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
816 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
817 SvIVX(TOPs) != IV_MIN)
820 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
831 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
833 sv_setsv(TARG, TOPs);
834 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
835 SvIVX(TOPs) != IV_MAX)
838 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
852 if(SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
854 sv_setsv(TARG, TOPs);
855 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
856 SvIVX(TOPs) != IV_MIN)
859 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
868 /* Ordinary operators. */
872 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
875 SETn( pow( left, right) );
882 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
885 SETn( left * right );
892 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
897 DIE("Illegal division by zero");
899 /* insure that 20./5. == 4. */
902 if ((double)I_V(left) == left &&
903 (double)I_V(right) == right &&
904 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
907 value = left / right;
911 value = left / right;
920 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
928 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
930 right = (right_neg = (i < 0)) ? -i : i;
934 right = U_V((right_neg = (n < 0)) ? -n : n);
937 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
939 left = (left_neg = (i < 0)) ? -i : i;
943 left = U_V((left_neg = (n < 0)) ? -n : n);
947 DIE("Illegal modulus zero");
950 if ((left_neg != right_neg) && ans)
953 /* XXX may warn: unary minus operator applied to unsigned type */
954 /* could change -foo to be (~foo)+1 instead */
955 if (ans <= ~((UV)IV_MAX)+1)
956 sv_setiv(TARG, ~ans+1);
958 sv_setnv(TARG, -(double)ans);
969 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
971 register I32 count = POPi;
972 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
974 I32 items = SP - MARK;
986 repeatcpy((char*)(MARK + items), (char*)MARK,
987 items * sizeof(SV*), count - 1);
993 else { /* Note: mark already snarfed by pp_list */
998 if (TARG == tmpstr && SvTHINKFIRST(tmpstr)) {
999 if (SvREADONLY(tmpstr) && PL_curcop != &PL_compiling)
1000 DIE("Can't x= to readonly value");
1004 SvSetSV(TARG, tmpstr);
1005 SvPV_force(TARG, len);
1010 SvGROW(TARG, (count * len) + 1);
1011 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1012 SvCUR(TARG) *= count;
1014 *SvEND(TARG) = '\0';
1016 (void)SvPOK_only(TARG);
1025 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1028 SETn( left - right );
1035 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1038 if (PL_op->op_private & HINT_INTEGER) {
1040 i = BWi(i) << shift;
1054 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1057 if (PL_op->op_private & HINT_INTEGER) {
1059 i = BWi(i) >> shift;
1073 djSP; tryAMAGICbinSET(lt,0);
1076 SETs(boolSV(TOPn < value));
1083 djSP; tryAMAGICbinSET(gt,0);
1086 SETs(boolSV(TOPn > value));
1093 djSP; tryAMAGICbinSET(le,0);
1096 SETs(boolSV(TOPn <= value));
1103 djSP; tryAMAGICbinSET(ge,0);
1106 SETs(boolSV(TOPn >= value));
1113 djSP; tryAMAGICbinSET(ne,0);
1116 SETs(boolSV(TOPn != value));
1123 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1130 else if (left < right)
1132 else if (left > right)
1145 djSP; tryAMAGICbinSET(slt,0);
1148 int cmp = ((PL_op->op_private & OPpLOCALE)
1149 ? sv_cmp_locale(left, right)
1150 : sv_cmp(left, right));
1151 SETs(boolSV(cmp < 0));
1158 djSP; tryAMAGICbinSET(sgt,0);
1161 int cmp = ((PL_op->op_private & OPpLOCALE)
1162 ? sv_cmp_locale(left, right)
1163 : sv_cmp(left, right));
1164 SETs(boolSV(cmp > 0));
1171 djSP; tryAMAGICbinSET(sle,0);
1174 int cmp = ((PL_op->op_private & OPpLOCALE)
1175 ? sv_cmp_locale(left, right)
1176 : sv_cmp(left, right));
1177 SETs(boolSV(cmp <= 0));
1184 djSP; tryAMAGICbinSET(sge,0);
1187 int cmp = ((PL_op->op_private & OPpLOCALE)
1188 ? sv_cmp_locale(left, right)
1189 : sv_cmp(left, right));
1190 SETs(boolSV(cmp >= 0));
1197 djSP; tryAMAGICbinSET(seq,0);
1200 SETs(boolSV(sv_eq(left, right)));
1207 djSP; tryAMAGICbinSET(sne,0);
1210 SETs(boolSV(!sv_eq(left, right)));
1217 djSP; dTARGET; tryAMAGICbin(scmp,0);
1220 int cmp = ((PL_op->op_private & OPpLOCALE)
1221 ? sv_cmp_locale(left, right)
1222 : sv_cmp(left, right));
1230 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1233 if (SvNIOKp(left) || SvNIOKp(right)) {
1234 if (PL_op->op_private & HINT_INTEGER) {
1235 IBW value = SvIV(left) & SvIV(right);
1239 UBW value = SvUV(left) & SvUV(right);
1244 do_vop(PL_op->op_type, TARG, left, right);
1253 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1256 if (SvNIOKp(left) || SvNIOKp(right)) {
1257 if (PL_op->op_private & HINT_INTEGER) {
1258 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1262 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1267 do_vop(PL_op->op_type, TARG, left, right);
1276 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1279 if (SvNIOKp(left) || SvNIOKp(right)) {
1280 if (PL_op->op_private & HINT_INTEGER) {
1281 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1285 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1290 do_vop(PL_op->op_type, TARG, left, right);
1299 djSP; dTARGET; tryAMAGICun(neg);
1304 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv) && SvIVX(sv) != IV_MIN)
1306 else if (SvNIOKp(sv))
1308 else if (SvPOKp(sv)) {
1310 char *s = SvPV(sv, len);
1311 if (isIDFIRST(*s)) {
1312 sv_setpvn(TARG, "-", 1);
1315 else if (*s == '+' || *s == '-') {
1317 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1319 else if (IN_UTF8 && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
1320 sv_setpvn(TARG, "-", 1);
1324 sv_setnv(TARG, -SvNV(sv));
1336 djSP; tryAMAGICunSET(not);
1337 #endif /* OVERLOAD */
1338 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1344 djSP; dTARGET; tryAMAGICun(compl);
1348 if (PL_op->op_private & HINT_INTEGER) {
1349 IBW value = ~SvIV(sv);
1353 UBW value = ~SvUV(sv);
1358 register char *tmps;
1359 register long *tmpl;
1364 tmps = SvPV_force(TARG, len);
1367 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1370 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1374 for ( ; anum > 0; anum--, tmps++)
1383 /* integer versions of some of the above */
1387 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1390 SETi( left * right );
1397 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1401 DIE("Illegal division by zero");
1402 value = POPi / value;
1410 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1414 DIE("Illegal modulus zero");
1415 SETi( left % right );
1422 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1425 SETi( left + right );
1432 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1435 SETi( left - right );
1442 djSP; tryAMAGICbinSET(lt,0);
1445 SETs(boolSV(left < right));
1452 djSP; tryAMAGICbinSET(gt,0);
1455 SETs(boolSV(left > right));
1462 djSP; tryAMAGICbinSET(le,0);
1465 SETs(boolSV(left <= right));
1472 djSP; tryAMAGICbinSET(ge,0);
1475 SETs(boolSV(left >= right));
1482 djSP; tryAMAGICbinSET(eq,0);
1485 SETs(boolSV(left == right));
1492 djSP; tryAMAGICbinSET(ne,0);
1495 SETs(boolSV(left != right));
1502 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1509 else if (left < right)
1520 djSP; dTARGET; tryAMAGICun(neg);
1525 /* High falutin' math. */
1529 djSP; dTARGET; tryAMAGICbin(atan2,0);
1532 SETn(atan2(left, right));
1539 djSP; dTARGET; tryAMAGICun(sin);
1551 djSP; dTARGET; tryAMAGICun(cos);
1561 /* Support Configure command-line overrides for rand() functions.
1562 After 5.005, perhaps we should replace this by Configure support
1563 for drand48(), random(), or rand(). For 5.005, though, maintain
1564 compatibility by calling rand() but allow the user to override it.
1565 See INSTALL for details. --Andy Dougherty 15 July 1998
1567 /* Now it's after 5.005, and Configure supports drand48() and random(),
1568 in addition to rand(). So the overrides should not be needed any more.
1569 --Jarkko Hietaniemi 27 September 1998
1572 #ifndef HAS_DRAND48_PROTO
1573 extern double drand48 _((void));
1586 if (!srand_called) {
1587 (void)seedDrand01((Rand_seed_t)seed());
1588 srand_called = TRUE;
1603 (void)seedDrand01((Rand_seed_t)anum);
1604 srand_called = TRUE;
1613 * This is really just a quick hack which grabs various garbage
1614 * values. It really should be a real hash algorithm which
1615 * spreads the effect of every input bit onto every output bit,
1616 * if someone who knows about such things would bother to write it.
1617 * Might be a good idea to add that function to CORE as well.
1618 * No numbers below come from careful analysis or anything here,
1619 * except they are primes and SEED_C1 > 1E6 to get a full-width
1620 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1621 * probably be bigger too.
1624 # define SEED_C1 1000003
1625 #define SEED_C4 73819
1627 # define SEED_C1 25747
1628 #define SEED_C4 20639
1632 #define SEED_C5 26107
1635 #ifndef PERL_NO_DEV_RANDOM
1640 # include <starlet.h>
1641 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1642 * in 100-ns units, typically incremented ever 10 ms. */
1643 unsigned int when[2];
1645 # ifdef HAS_GETTIMEOFDAY
1646 struct timeval when;
1652 /* This test is an escape hatch, this symbol isn't set by Configure. */
1653 #ifndef PERL_NO_DEV_RANDOM
1654 #ifndef PERL_RANDOM_DEVICE
1655 /* /dev/random isn't used by default because reads from it will block
1656 * if there isn't enough entropy available. You can compile with
1657 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1658 * is enough real entropy to fill the seed. */
1659 # define PERL_RANDOM_DEVICE "/dev/urandom"
1661 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1663 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1672 _ckvmssts(sys$gettim(when));
1673 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1675 # ifdef HAS_GETTIMEOFDAY
1676 gettimeofday(&when,(struct timezone *) 0);
1677 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1680 u = (U32)SEED_C1 * when;
1683 u += SEED_C3 * (U32)getpid();
1684 u += SEED_C4 * (U32)(UV)PL_stack_sp;
1685 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1686 u += SEED_C5 * (U32)(UV)&when;
1693 djSP; dTARGET; tryAMAGICun(exp);
1705 djSP; dTARGET; tryAMAGICun(log);
1710 SET_NUMERIC_STANDARD();
1711 DIE("Can't take log of %g", value);
1721 djSP; dTARGET; tryAMAGICun(sqrt);
1726 SET_NUMERIC_STANDARD();
1727 DIE("Can't take sqrt of %g", value);
1729 value = sqrt(value);
1739 double value = TOPn;
1742 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1748 (void)modf(value, &value);
1750 (void)modf(-value, &value);
1765 djSP; dTARGET; tryAMAGICun(abs);
1767 double value = TOPn;
1770 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1771 (iv = SvIVX(TOPs)) != IV_MIN) {
1792 XPUSHu(scan_hex(tmps, 99, &argtype));
1804 while (*tmps && isSPACE(*tmps))
1809 value = scan_hex(++tmps, 99, &argtype);
1811 value = scan_oct(tmps, 99, &argtype);
1823 SETi( sv_len_utf8(TOPs) );
1827 SETi( sv_len(TOPs) );
1841 I32 lvalue = PL_op->op_flags & OPf_MOD;
1843 I32 arybase = PL_curcop->cop_arybase;
1847 SvTAINTED_off(TARG); /* decontaminate */
1851 repl = SvPV(sv, repl_len);
1858 tmps = SvPV(sv, curlen);
1860 utfcurlen = sv_len_utf8(sv);
1861 if (utfcurlen == curlen)
1869 if (pos >= arybase) {
1887 else if (len >= 0) {
1889 if (rem > (I32)curlen)
1903 if (ckWARN(WARN_SUBSTR) || lvalue || repl)
1904 warner(WARN_SUBSTR, "substr outside of string");
1909 sv_pos_u2b(sv, &pos, &rem);
1911 sv_setpvn(TARG, tmps, rem);
1912 if (lvalue) { /* it's an lvalue! */
1913 if (!SvGMAGICAL(sv)) {
1915 SvPV_force(sv,PL_na);
1916 if (ckWARN(WARN_SUBSTR))
1918 "Attempt to use reference as lvalue in substr");
1920 if (SvOK(sv)) /* is it defined ? */
1921 (void)SvPOK_only(sv);
1923 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
1926 if (SvTYPE(TARG) < SVt_PVLV) {
1927 sv_upgrade(TARG, SVt_PVLV);
1928 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
1932 if (LvTARG(TARG) != sv) {
1934 SvREFCNT_dec(LvTARG(TARG));
1935 LvTARG(TARG) = SvREFCNT_inc(sv);
1937 LvTARGOFF(TARG) = pos;
1938 LvTARGLEN(TARG) = rem;
1941 sv_insert(sv, pos, rem, repl, repl_len);
1944 PUSHs(TARG); /* avoid SvSETMAGIC here */
1951 register I32 size = POPi;
1952 register I32 offset = POPi;
1953 register SV *src = POPs;
1954 I32 lvalue = PL_op->op_flags & OPf_MOD;
1956 unsigned char *s = (unsigned char*)SvPV(src, srclen);
1957 unsigned long retnum;
1960 SvTAINTED_off(TARG); /* decontaminate */
1961 offset *= size; /* turn into bit offset */
1962 len = (offset + size + 7) / 8;
1963 if (offset < 0 || size < 1)
1966 if (lvalue) { /* it's an lvalue! */
1967 if (SvTYPE(TARG) < SVt_PVLV) {
1968 sv_upgrade(TARG, SVt_PVLV);
1969 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
1973 if (LvTARG(TARG) != src) {
1975 SvREFCNT_dec(LvTARG(TARG));
1976 LvTARG(TARG) = SvREFCNT_inc(src);
1978 LvTARGOFF(TARG) = offset;
1979 LvTARGLEN(TARG) = size;
1987 if (offset >= srclen)
1990 retnum = (unsigned long) s[offset] << 8;
1992 else if (size == 32) {
1993 if (offset >= srclen)
1995 else if (offset + 1 >= srclen)
1996 retnum = (unsigned long) s[offset] << 24;
1997 else if (offset + 2 >= srclen)
1998 retnum = ((unsigned long) s[offset] << 24) +
1999 ((unsigned long) s[offset + 1] << 16);
2001 retnum = ((unsigned long) s[offset] << 24) +
2002 ((unsigned long) s[offset + 1] << 16) +
2003 (s[offset + 2] << 8);
2008 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
2013 else if (size == 16)
2014 retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
2015 else if (size == 32)
2016 retnum = ((unsigned long) s[offset] << 24) +
2017 ((unsigned long) s[offset + 1] << 16) +
2018 (s[offset + 2] << 8) + s[offset+3];
2022 sv_setuv(TARG, (UV)retnum);
2037 I32 arybase = PL_curcop->cop_arybase;
2042 offset = POPi - arybase;
2045 tmps = SvPV(big, biglen);
2046 if (IN_UTF8 && offset > 0)
2047 sv_pos_u2b(big, &offset, 0);
2050 else if (offset > biglen)
2052 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2053 (unsigned char*)tmps + biglen, little, 0)))
2056 retval = tmps2 - tmps;
2057 if (IN_UTF8 && retval > 0)
2058 sv_pos_b2u(big, &retval);
2059 PUSHi(retval + arybase);
2074 I32 arybase = PL_curcop->cop_arybase;
2080 tmps2 = SvPV(little, llen);
2081 tmps = SvPV(big, blen);
2085 if (IN_UTF8 && offset > 0)
2086 sv_pos_u2b(big, &offset, 0);
2087 offset = offset - arybase + llen;
2091 else if (offset > blen)
2093 if (!(tmps2 = rninstr(tmps, tmps + offset,
2094 tmps2, tmps2 + llen)))
2097 retval = tmps2 - tmps;
2098 if (IN_UTF8 && retval > 0)
2099 sv_pos_b2u(big, &retval);
2100 PUSHi(retval + arybase);
2106 djSP; dMARK; dORIGMARK; dTARGET;
2107 #ifdef USE_LOCALE_NUMERIC
2108 if (PL_op->op_private & OPpLOCALE)
2109 SET_NUMERIC_LOCAL();
2111 SET_NUMERIC_STANDARD();
2113 do_sprintf(TARG, SP-MARK, MARK+1);
2114 TAINT_IF(SvTAINTED(TARG));
2124 U8 *tmps = (U8*)POPp;
2127 if (IN_UTF8 && (*tmps & 0x80))
2128 value = utf8_to_uv(tmps, &retlen);
2130 value = (UV)(*tmps & 255);
2141 (void)SvUPGRADE(TARG,SVt_PV);
2143 if (IN_UTF8 && value >= 128) {
2146 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
2147 SvCUR_set(TARG, tmps - SvPVX(TARG));
2149 (void)SvPOK_only(TARG);
2159 (void)SvPOK_only(TARG);
2166 djSP; dTARGET; dPOPTOPssrl;
2168 char *tmps = SvPV(left, PL_na);
2170 sv_setpv(TARG, fcrypt(tmps, SvPV(right, PL_na)));
2172 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, PL_na)));
2176 "The crypt() function is unimplemented due to excessive paranoia.");
2189 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2193 UV uv = utf8_to_uv(s, &ulen);
2195 if (PL_op->op_private & OPpLOCALE) {
2198 uv = toTITLE_LC_uni(uv);
2201 uv = toTITLE_utf8(s);
2203 tend = uv_to_utf8(tmpbuf, uv);
2205 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2207 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2208 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2212 s = (U8*)SvPV_force(sv, slen);
2213 Copy(tmpbuf, s, ulen, U8);
2218 if (!SvPADTMP(sv)) {
2224 s = (U8*)SvPV_force(sv, PL_na);
2226 if (PL_op->op_private & OPpLOCALE) {
2229 *s = toUPPER_LC(*s);
2245 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2249 UV uv = utf8_to_uv(s, &ulen);
2251 if (PL_op->op_private & OPpLOCALE) {
2254 uv = toLOWER_LC_uni(uv);
2257 uv = toLOWER_utf8(s);
2259 tend = uv_to_utf8(tmpbuf, uv);
2261 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2263 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2264 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2268 s = (U8*)SvPV_force(sv, slen);
2269 Copy(tmpbuf, s, ulen, U8);
2274 if (!SvPADTMP(sv)) {
2280 s = (U8*)SvPV_force(sv, PL_na);
2282 if (PL_op->op_private & OPpLOCALE) {
2285 *s = toLOWER_LC(*s);
2308 s = (U8*)SvPV(sv,len);
2310 sv_setpvn(TARG, "", 0);
2315 (void)SvUPGRADE(TARG, SVt_PV);
2316 SvGROW(TARG, (len * 2) + 1);
2317 (void)SvPOK_only(TARG);
2318 d = (U8*)SvPVX(TARG);
2320 if (PL_op->op_private & OPpLOCALE) {
2324 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2330 d = uv_to_utf8(d, toUPPER_utf8( s ));
2335 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2340 if (!SvPADTMP(sv)) {
2347 s = (U8*)SvPV_force(sv, len);
2349 register U8 *send = s + len;
2351 if (PL_op->op_private & OPpLOCALE) {
2354 for (; s < send; s++)
2355 *s = toUPPER_LC(*s);
2358 for (; s < send; s++)
2378 s = (U8*)SvPV(sv,len);
2380 sv_setpvn(TARG, "", 0);
2385 (void)SvUPGRADE(TARG, SVt_PV);
2386 SvGROW(TARG, (len * 2) + 1);
2387 (void)SvPOK_only(TARG);
2388 d = (U8*)SvPVX(TARG);
2390 if (PL_op->op_private & OPpLOCALE) {
2394 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2400 d = uv_to_utf8(d, toLOWER_utf8(s));
2405 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2410 if (!SvPADTMP(sv)) {
2417 s = (U8*)SvPV_force(sv, len);
2419 register U8 *send = s + len;
2421 if (PL_op->op_private & OPpLOCALE) {
2424 for (; s < send; s++)
2425 *s = toLOWER_LC(*s);
2428 for (; s < send; s++)
2440 register char *s = SvPV(sv,len);
2444 (void)SvUPGRADE(TARG, SVt_PV);
2445 SvGROW(TARG, (len * 2) + 1);
2450 STRLEN ulen = UTF8SKIP(s);
2480 SvCUR_set(TARG, d - SvPVX(TARG));
2481 (void)SvPOK_only(TARG);
2484 sv_setpvn(TARG, s, len);
2493 djSP; dMARK; dORIGMARK;
2495 register AV* av = (AV*)POPs;
2496 register I32 lval = PL_op->op_flags & OPf_MOD;
2497 I32 arybase = PL_curcop->cop_arybase;
2500 if (SvTYPE(av) == SVt_PVAV) {
2501 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2503 for (svp = MARK + 1; svp <= SP; svp++) {
2508 if (max > AvMAX(av))
2511 while (++MARK <= SP) {
2512 elem = SvIVx(*MARK);
2516 svp = av_fetch(av, elem, lval);
2518 if (!svp || *svp == &PL_sv_undef)
2519 DIE(no_aelem, elem);
2520 if (PL_op->op_private & OPpLVAL_INTRO)
2521 save_aelem(av, elem, svp);
2523 *MARK = svp ? *svp : &PL_sv_undef;
2526 if (GIMME != G_ARRAY) {
2534 /* Associative arrays. */
2539 HV *hash = (HV*)POPs;
2541 I32 gimme = GIMME_V;
2542 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2545 /* might clobber stack_sp */
2546 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2551 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2552 if (gimme == G_ARRAY) {
2554 /* might clobber stack_sp */
2555 sv_setsv(TARG, realhv ?
2556 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry));
2561 else if (gimme == G_SCALAR)
2580 I32 gimme = GIMME_V;
2581 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2585 if (PL_op->op_private & OPpSLICE) {
2589 hvtype = SvTYPE(hv);
2590 while (++MARK <= SP) {
2591 if (hvtype == SVt_PVHV)
2592 sv = hv_delete_ent(hv, *MARK, discard, 0);
2594 DIE("Not a HASH reference");
2595 *MARK = sv ? sv : &PL_sv_undef;
2599 else if (gimme == G_SCALAR) {
2608 if (SvTYPE(hv) == SVt_PVHV)
2609 sv = hv_delete_ent(hv, keysv, discard, 0);
2611 DIE("Not a HASH reference");
2625 if (SvTYPE(hv) == SVt_PVHV) {
2626 if (hv_exists_ent(hv, tmpsv, 0))
2628 } else if (SvTYPE(hv) == SVt_PVAV) {
2629 if (avhv_exists_ent((AV*)hv, tmpsv, 0))
2632 DIE("Not a HASH reference");
2639 djSP; dMARK; dORIGMARK;
2640 register HV *hv = (HV*)POPs;
2641 register I32 lval = PL_op->op_flags & OPf_MOD;
2642 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2644 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2645 DIE("Can't localize pseudo-hash element");
2647 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2648 while (++MARK <= SP) {
2652 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2653 svp = he ? &HeVAL(he) : 0;
2655 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2658 if (!svp || *svp == &PL_sv_undef)
2659 DIE(no_helem, SvPV(keysv, PL_na));
2660 if (PL_op->op_private & OPpLVAL_INTRO)
2661 save_helem(hv, keysv, svp);
2663 *MARK = svp ? *svp : &PL_sv_undef;
2666 if (GIMME != G_ARRAY) {
2674 /* List operators. */
2679 if (GIMME != G_ARRAY) {
2681 *MARK = *SP; /* unwanted list, return last item */
2683 *MARK = &PL_sv_undef;
2692 SV **lastrelem = PL_stack_sp;
2693 SV **lastlelem = PL_stack_base + POPMARK;
2694 SV **firstlelem = PL_stack_base + POPMARK + 1;
2695 register SV **firstrelem = lastlelem + 1;
2696 I32 arybase = PL_curcop->cop_arybase;
2697 I32 lval = PL_op->op_flags & OPf_MOD;
2698 I32 is_something_there = lval;
2700 register I32 max = lastrelem - lastlelem;
2701 register SV **lelem;
2704 if (GIMME != G_ARRAY) {
2705 ix = SvIVx(*lastlelem);
2710 if (ix < 0 || ix >= max)
2711 *firstlelem = &PL_sv_undef;
2713 *firstlelem = firstrelem[ix];
2719 SP = firstlelem - 1;
2723 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2728 *lelem = &PL_sv_undef;
2729 else if (!(*lelem = firstrelem[ix]))
2730 *lelem = &PL_sv_undef;
2734 if (ix >= max || !(*lelem = firstrelem[ix]))
2735 *lelem = &PL_sv_undef;
2737 if (!is_something_there && (SvOK(*lelem) || SvGMAGICAL(*lelem)))
2738 is_something_there = TRUE;
2740 if (is_something_there)
2743 SP = firstlelem - 1;
2749 djSP; dMARK; dORIGMARK;
2750 I32 items = SP - MARK;
2751 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2752 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2759 djSP; dMARK; dORIGMARK;
2760 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2764 SV *val = NEWSV(46, 0);
2766 sv_setsv(val, *++MARK);
2767 else if (ckWARN(WARN_UNSAFE))
2768 warner(WARN_UNSAFE, "Odd number of elements in hash assignment");
2769 (void)hv_store_ent(hv,key,val,0);
2778 djSP; dMARK; dORIGMARK;
2779 register AV *ary = (AV*)*++MARK;
2783 register I32 offset;
2784 register I32 length;
2791 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2792 *MARK-- = SvTIED_obj((SV*)ary, mg);
2796 perl_call_method("SPLICE",GIMME_V);
2805 offset = i = SvIVx(*MARK);
2807 offset += AvFILLp(ary) + 1;
2809 offset -= PL_curcop->cop_arybase;
2813 length = SvIVx(*MARK++);
2815 length += AvFILLp(ary) - offset + 1;
2821 length = AvMAX(ary) + 1; /* close enough to infinity */
2825 length = AvMAX(ary) + 1;
2827 if (offset > AvFILLp(ary) + 1)
2828 offset = AvFILLp(ary) + 1;
2829 after = AvFILLp(ary) + 1 - (offset + length);
2830 if (after < 0) { /* not that much array */
2831 length += after; /* offset+length now in array */
2837 /* At this point, MARK .. SP-1 is our new LIST */
2840 diff = newlen - length;
2841 if (newlen && !AvREAL(ary)) {
2845 assert(AvREAL(ary)); /* would leak, so croak */
2848 if (diff < 0) { /* shrinking the area */
2850 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2851 Copy(MARK, tmparyval, newlen, SV*);
2854 MARK = ORIGMARK + 1;
2855 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2856 MEXTEND(MARK, length);
2857 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2859 EXTEND_MORTAL(length);
2860 for (i = length, dst = MARK; i; i--) {
2861 sv_2mortal(*dst); /* free them eventualy */
2868 *MARK = AvARRAY(ary)[offset+length-1];
2871 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2872 SvREFCNT_dec(*dst++); /* free them now */
2875 AvFILLp(ary) += diff;
2877 /* pull up or down? */
2879 if (offset < after) { /* easier to pull up */
2880 if (offset) { /* esp. if nothing to pull */
2881 src = &AvARRAY(ary)[offset-1];
2882 dst = src - diff; /* diff is negative */
2883 for (i = offset; i > 0; i--) /* can't trust Copy */
2887 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
2891 if (after) { /* anything to pull down? */
2892 src = AvARRAY(ary) + offset + length;
2893 dst = src + diff; /* diff is negative */
2894 Move(src, dst, after, SV*);
2896 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
2897 /* avoid later double free */
2901 dst[--i] = &PL_sv_undef;
2904 for (src = tmparyval, dst = AvARRAY(ary) + offset;
2906 *dst = NEWSV(46, 0);
2907 sv_setsv(*dst++, *src++);
2909 Safefree(tmparyval);
2912 else { /* no, expanding (or same) */
2914 New(452, tmparyval, length, SV*); /* so remember deletion */
2915 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
2918 if (diff > 0) { /* expanding */
2920 /* push up or down? */
2922 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
2926 Move(src, dst, offset, SV*);
2928 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
2930 AvFILLp(ary) += diff;
2933 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
2934 av_extend(ary, AvFILLp(ary) + diff);
2935 AvFILLp(ary) += diff;
2938 dst = AvARRAY(ary) + AvFILLp(ary);
2940 for (i = after; i; i--) {
2947 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
2948 *dst = NEWSV(46, 0);
2949 sv_setsv(*dst++, *src++);
2951 MARK = ORIGMARK + 1;
2952 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2954 Copy(tmparyval, MARK, length, SV*);
2956 EXTEND_MORTAL(length);
2957 for (i = length, dst = MARK; i; i--) {
2958 sv_2mortal(*dst); /* free them eventualy */
2962 Safefree(tmparyval);
2966 else if (length--) {
2967 *MARK = tmparyval[length];
2970 while (length-- > 0)
2971 SvREFCNT_dec(tmparyval[length]);
2973 Safefree(tmparyval);
2976 *MARK = &PL_sv_undef;
2984 djSP; dMARK; dORIGMARK; dTARGET;
2985 register AV *ary = (AV*)*++MARK;
2986 register SV *sv = &PL_sv_undef;
2989 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2990 *MARK-- = SvTIED_obj((SV*)ary, mg);
2994 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
2999 /* Why no pre-extend of ary here ? */
3000 for (++MARK; MARK <= SP; MARK++) {
3003 sv_setsv(sv, *MARK);
3008 PUSHi( AvFILL(ary) + 1 );
3016 SV *sv = av_pop(av);
3018 (void)sv_2mortal(sv);
3027 SV *sv = av_shift(av);
3032 (void)sv_2mortal(sv);
3039 djSP; dMARK; dORIGMARK; dTARGET;
3040 register AV *ary = (AV*)*++MARK;
3045 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3046 *MARK-- = SvTIED_obj((SV*)ary, mg);
3050 perl_call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3055 av_unshift(ary, SP - MARK);
3058 sv_setsv(sv, *++MARK);
3059 (void)av_store(ary, i++, sv);
3063 PUSHi( AvFILL(ary) + 1 );
3073 if (GIMME == G_ARRAY) {
3084 register char *down;
3090 do_join(TARG, &PL_sv_no, MARK, SP);
3092 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3093 up = SvPV_force(TARG, len);
3095 if (IN_UTF8) { /* first reverse each character */
3096 U8* s = (U8*)SvPVX(TARG);
3097 U8* send = (U8*)(s + len);
3106 down = (char*)(s - 1);
3107 if (s > send || !((*down & 0xc0) == 0x80)) {
3108 warn("Malformed UTF-8 character");
3120 down = SvPVX(TARG) + len - 1;
3126 (void)SvPOK_only(TARG);
3135 mul128(SV *sv, U8 m)
3138 char *s = SvPV(sv, len);
3142 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
3143 SV *tmpNew = newSVpv("0000000000", 10);
3145 sv_catsv(tmpNew, sv);
3146 SvREFCNT_dec(sv); /* free old sv */
3151 while (!*t) /* trailing '\0'? */
3154 i = ((*t - '0') << 7) + m;
3155 *(t--) = '0' + (i % 10);
3161 /* Explosives and implosives. */
3163 static const char uuemap[] =
3164 "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
3165 static char uudmap[256]; /* Initialised on first use */
3166 #if 'I' == 73 && 'J' == 74
3167 /* On an ASCII/ISO kind of system */
3168 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
3171 Some other sort of character set - use memchr() so we don't match
3174 #define ISUUCHAR(ch) (memchr(uuemap, (ch), sizeof(uuemap)-1) || (ch) == ' ')
3182 I32 gimme = GIMME_V;
3186 register char *pat = SvPV(left, llen);
3187 register char *s = SvPV(right, rlen);
3188 char *strend = s + rlen;
3190 register char *patend = pat + llen;
3195 /* These must not be in registers: */
3206 unsigned Quad_t auquad;
3212 register U32 culong;
3214 static char* bitcount = 0;
3217 if (gimme != G_ARRAY) { /* arrange to do first one only */
3219 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3220 if (strchr("aAbBhHP", *patend) || *pat == '%') {
3222 while (isDIGIT(*patend) || *patend == '*')
3228 while (pat < patend) {
3230 datumtype = *pat++ & 0xFF;
3231 if (isSPACE(datumtype))
3235 else if (*pat == '*') {
3236 len = strend - strbeg; /* long enough */
3239 else if (isDIGIT(*pat)) {
3241 while (isDIGIT(*pat))
3242 len = (len * 10) + (*pat++ - '0');
3245 len = (datumtype != '@');
3248 croak("Invalid type in unpack: '%c'", (int)datumtype);
3249 case ',': /* grandfather in commas but with a warning */
3250 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
3251 warner(WARN_UNSAFE, "Invalid type in unpack: '%c'", (int)datumtype);
3254 if (len == 1 && pat[-1] != '1')
3263 if (len > strend - strbeg)
3264 DIE("@ outside of string");
3268 if (len > s - strbeg)
3269 DIE("X outside of string");
3273 if (len > strend - s)
3274 DIE("x outside of string");
3279 if (len > strend - s)
3282 goto uchar_checksum;
3283 sv = NEWSV(35, len);
3284 sv_setpvn(sv, s, len);
3286 if (datumtype == 'A') {
3287 aptr = s; /* borrow register */
3288 s = SvPVX(sv) + len - 1;
3289 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3292 SvCUR_set(sv, s - SvPVX(sv));
3293 s = aptr; /* unborrow register */
3295 XPUSHs(sv_2mortal(sv));
3299 if (pat[-1] == '*' || len > (strend - s) * 8)
3300 len = (strend - s) * 8;
3303 Newz(601, bitcount, 256, char);
3304 for (bits = 1; bits < 256; bits++) {
3305 if (bits & 1) bitcount[bits]++;
3306 if (bits & 2) bitcount[bits]++;
3307 if (bits & 4) bitcount[bits]++;
3308 if (bits & 8) bitcount[bits]++;
3309 if (bits & 16) bitcount[bits]++;
3310 if (bits & 32) bitcount[bits]++;
3311 if (bits & 64) bitcount[bits]++;
3312 if (bits & 128) bitcount[bits]++;
3316 culong += bitcount[*(unsigned char*)s++];
3321 if (datumtype == 'b') {
3323 if (bits & 1) culong++;
3329 if (bits & 128) culong++;
3336 sv = NEWSV(35, len + 1);
3339 aptr = pat; /* borrow register */
3341 if (datumtype == 'b') {
3343 for (len = 0; len < aint; len++) {
3344 if (len & 7) /*SUPPRESS 595*/
3348 *pat++ = '0' + (bits & 1);
3353 for (len = 0; len < aint; len++) {
3358 *pat++ = '0' + ((bits & 128) != 0);
3362 pat = aptr; /* unborrow register */
3363 XPUSHs(sv_2mortal(sv));
3367 if (pat[-1] == '*' || len > (strend - s) * 2)
3368 len = (strend - s) * 2;
3369 sv = NEWSV(35, len + 1);
3372 aptr = pat; /* borrow register */
3374 if (datumtype == 'h') {
3376 for (len = 0; len < aint; len++) {
3381 *pat++ = PL_hexdigit[bits & 15];
3386 for (len = 0; len < aint; len++) {
3391 *pat++ = PL_hexdigit[(bits >> 4) & 15];
3395 pat = aptr; /* unborrow register */
3396 XPUSHs(sv_2mortal(sv));
3399 if (len > strend - s)
3404 if (aint >= 128) /* fake up signed chars */
3414 if (aint >= 128) /* fake up signed chars */
3417 sv_setiv(sv, (IV)aint);
3418 PUSHs(sv_2mortal(sv));
3423 if (len > strend - s)
3438 sv_setiv(sv, (IV)auint);
3439 PUSHs(sv_2mortal(sv));
3444 if (len > strend - s)
3447 while (len-- > 0 && s < strend) {
3448 auint = utf8_to_uv((U8*)s, &along);
3451 cdouble += (double)auint;
3459 while (len-- > 0 && s < strend) {
3460 auint = utf8_to_uv((U8*)s, &along);
3463 sv_setuv(sv, (UV)auint);
3464 PUSHs(sv_2mortal(sv));
3469 along = (strend - s) / SIZE16;
3486 sv_setiv(sv, (IV)ashort);
3487 PUSHs(sv_2mortal(sv));
3494 along = (strend - s) / SIZE16;
3499 COPY16(s, &aushort);
3502 if (datumtype == 'n')
3503 aushort = PerlSock_ntohs(aushort);
3506 if (datumtype == 'v')
3507 aushort = vtohs(aushort);
3516 COPY16(s, &aushort);
3520 if (datumtype == 'n')
3521 aushort = PerlSock_ntohs(aushort);
3524 if (datumtype == 'v')
3525 aushort = vtohs(aushort);
3527 sv_setiv(sv, (IV)aushort);
3528 PUSHs(sv_2mortal(sv));
3533 along = (strend - s) / sizeof(int);
3538 Copy(s, &aint, 1, int);
3541 cdouble += (double)aint;
3550 Copy(s, &aint, 1, int);
3554 /* Without the dummy below unpack("i", pack("i",-1))
3555 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3556 * cc with optimization turned on */
3558 sv_setiv(sv, (IV)aint) :
3560 sv_setiv(sv, (IV)aint);
3561 PUSHs(sv_2mortal(sv));
3566 along = (strend - s) / sizeof(unsigned int);
3571 Copy(s, &auint, 1, unsigned int);
3572 s += sizeof(unsigned int);
3574 cdouble += (double)auint;
3583 Copy(s, &auint, 1, unsigned int);
3584 s += sizeof(unsigned int);
3586 sv_setuv(sv, (UV)auint);
3587 PUSHs(sv_2mortal(sv));
3592 along = (strend - s) / SIZE32;
3600 cdouble += (double)along;
3612 sv_setiv(sv, (IV)along);
3613 PUSHs(sv_2mortal(sv));
3620 along = (strend - s) / SIZE32;
3628 if (datumtype == 'N')
3629 aulong = PerlSock_ntohl(aulong);
3632 if (datumtype == 'V')
3633 aulong = vtohl(aulong);
3636 cdouble += (double)aulong;
3648 if (datumtype == 'N')
3649 aulong = PerlSock_ntohl(aulong);
3652 if (datumtype == 'V')
3653 aulong = vtohl(aulong);
3656 sv_setuv(sv, (UV)aulong);
3657 PUSHs(sv_2mortal(sv));
3662 along = (strend - s) / sizeof(char*);
3668 if (sizeof(char*) > strend - s)
3671 Copy(s, &aptr, 1, char*);
3677 PUSHs(sv_2mortal(sv));
3687 while ((len > 0) && (s < strend)) {
3688 auv = (auv << 7) | (*s & 0x7f);
3689 if (!(*s++ & 0x80)) {
3693 PUSHs(sv_2mortal(sv));
3697 else if (++bytes >= sizeof(UV)) { /* promote to string */
3700 sv = newSVpvf("%.*Vu", (int)TYPE_DIGITS(UV), auv);
3701 while (s < strend) {
3702 sv = mul128(sv, *s & 0x7f);
3703 if (!(*s++ & 0x80)) {
3708 t = SvPV(sv, PL_na);
3712 PUSHs(sv_2mortal(sv));
3717 if ((s >= strend) && bytes)
3718 croak("Unterminated compressed integer");
3723 if (sizeof(char*) > strend - s)
3726 Copy(s, &aptr, 1, char*);
3731 sv_setpvn(sv, aptr, len);
3732 PUSHs(sv_2mortal(sv));
3736 along = (strend - s) / sizeof(Quad_t);
3742 if (s + sizeof(Quad_t) > strend)
3745 Copy(s, &aquad, 1, Quad_t);
3746 s += sizeof(Quad_t);
3749 if (aquad >= IV_MIN && aquad <= IV_MAX)
3750 sv_setiv(sv, (IV)aquad);
3752 sv_setnv(sv, (double)aquad);
3753 PUSHs(sv_2mortal(sv));
3757 along = (strend - s) / sizeof(Quad_t);
3763 if (s + sizeof(unsigned Quad_t) > strend)
3766 Copy(s, &auquad, 1, unsigned Quad_t);
3767 s += sizeof(unsigned Quad_t);
3770 if (auquad <= UV_MAX)
3771 sv_setuv(sv, (UV)auquad);
3773 sv_setnv(sv, (double)auquad);
3774 PUSHs(sv_2mortal(sv));
3778 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
3781 along = (strend - s) / sizeof(float);
3786 Copy(s, &afloat, 1, float);
3795 Copy(s, &afloat, 1, float);
3798 sv_setnv(sv, (double)afloat);
3799 PUSHs(sv_2mortal(sv));
3805 along = (strend - s) / sizeof(double);
3810 Copy(s, &adouble, 1, double);
3811 s += sizeof(double);
3819 Copy(s, &adouble, 1, double);
3820 s += sizeof(double);
3822 sv_setnv(sv, (double)adouble);
3823 PUSHs(sv_2mortal(sv));
3829 * Initialise the decode mapping. By using a table driven
3830 * algorithm, the code will be character-set independent
3831 * (and just as fast as doing character arithmetic)
3833 if (uudmap['M'] == 0) {
3836 for (i = 0; i < sizeof(uuemap); i += 1)
3837 uudmap[uuemap[i]] = i;
3839 * Because ' ' and '`' map to the same value,
3840 * we need to decode them both the same.
3845 along = (strend - s) * 3 / 4;
3846 sv = NEWSV(42, along);
3849 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
3854 len = uudmap[*s++] & 077;
3856 if (s < strend && ISUUCHAR(*s))
3857 a = uudmap[*s++] & 077;
3860 if (s < strend && ISUUCHAR(*s))
3861 b = uudmap[*s++] & 077;
3864 if (s < strend && ISUUCHAR(*s))
3865 c = uudmap[*s++] & 077;
3868 if (s < strend && ISUUCHAR(*s))
3869 d = uudmap[*s++] & 077;
3872 hunk[0] = (a << 2) | (b >> 4);
3873 hunk[1] = (b << 4) | (c >> 2);
3874 hunk[2] = (c << 6) | d;
3875 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
3880 else if (s[1] == '\n') /* possible checksum byte */
3883 XPUSHs(sv_2mortal(sv));
3888 if (strchr("fFdD", datumtype) ||
3889 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
3893 while (checksum >= 16) {
3897 while (checksum >= 4) {
3903 along = (1 << checksum) - 1;
3904 while (cdouble < 0.0)
3906 cdouble = modf(cdouble / adouble, &trouble) * adouble;
3907 sv_setnv(sv, cdouble);
3910 if (checksum < 32) {
3911 aulong = (1 << checksum) - 1;
3914 sv_setuv(sv, (UV)culong);
3916 XPUSHs(sv_2mortal(sv));
3920 if (SP == oldsp && gimme == G_SCALAR)
3921 PUSHs(&PL_sv_undef);
3926 doencodes(register SV *sv, register char *s, register I32 len)
3930 *hunk = uuemap[len];
3931 sv_catpvn(sv, hunk, 1);
3934 hunk[0] = uuemap[(077 & (*s >> 2))];
3935 hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
3936 hunk[2] = uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
3937 hunk[3] = uuemap[(077 & (s[2] & 077))];
3938 sv_catpvn(sv, hunk, 4);
3943 char r = (len > 1 ? s[1] : '\0');
3944 hunk[0] = uuemap[(077 & (*s >> 2))];
3945 hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
3946 hunk[2] = uuemap[(077 & ((r << 2) & 074))];
3947 hunk[3] = uuemap[0];
3948 sv_catpvn(sv, hunk, 4);
3950 sv_catpvn(sv, "\n", 1);
3954 is_an_int(char *s, STRLEN l)
3956 SV *result = newSVpv("", l);
3957 char *result_c = SvPV(result, PL_na); /* convenience */
3958 char *out = result_c;
3968 SvREFCNT_dec(result);
3991 SvREFCNT_dec(result);
3997 SvCUR_set(result, out - result_c);
4002 div128(SV *pnum, bool *done)
4003 /* must be '\0' terminated */
4007 char *s = SvPV(pnum, len);
4016 i = m * 10 + (*t - '0');
4018 r = (i >> 7); /* r < 10 */
4025 SvCUR_set(pnum, (STRLEN) (t - s));
4032 djSP; dMARK; dORIGMARK; dTARGET;
4033 register SV *cat = TARG;
4036 register char *pat = SvPVx(*++MARK, fromlen);
4037 register char *patend = pat + fromlen;
4042 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4043 static char *space10 = " ";
4045 /* These must not be in registers: */
4054 unsigned Quad_t auquad;
4063 sv_setpvn(cat, "", 0);
4064 while (pat < patend) {
4065 #define NEXTFROM (items-- > 0 ? *MARK++ : &PL_sv_no)
4066 datumtype = *pat++ & 0xFF;
4067 if (isSPACE(datumtype))
4070 len = strchr("@Xxu", datumtype) ? 0 : items;
4073 else if (isDIGIT(*pat)) {
4075 while (isDIGIT(*pat))
4076 len = (len * 10) + (*pat++ - '0');
4082 croak("Invalid type in pack: '%c'", (int)datumtype);
4083 case ',': /* grandfather in commas but with a warning */
4084 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
4085 warner(WARN_UNSAFE, "Invalid type in pack: '%c'", (int)datumtype);
4088 DIE("%% may only be used in unpack");
4099 if (SvCUR(cat) < len)
4100 DIE("X outside of string");
4107 sv_catpvn(cat, null10, 10);
4110 sv_catpvn(cat, null10, len);
4115 aptr = SvPV(fromstr, fromlen);
4119 sv_catpvn(cat, aptr, len);
4121 sv_catpvn(cat, aptr, fromlen);
4123 if (datumtype == 'A') {
4125 sv_catpvn(cat, space10, 10);
4128 sv_catpvn(cat, space10, len);
4132 sv_catpvn(cat, null10, 10);
4135 sv_catpvn(cat, null10, len);
4142 char *savepat = pat;
4147 aptr = SvPV(fromstr, fromlen);
4152 SvCUR(cat) += (len+7)/8;
4153 SvGROW(cat, SvCUR(cat) + 1);
4154 aptr = SvPVX(cat) + aint;
4159 if (datumtype == 'B') {
4160 for (len = 0; len++ < aint;) {
4161 items |= *pat++ & 1;
4165 *aptr++ = items & 0xff;
4171 for (len = 0; len++ < aint;) {
4177 *aptr++ = items & 0xff;
4183 if (datumtype == 'B')
4184 items <<= 7 - (aint & 7);
4186 items >>= 7 - (aint & 7);
4187 *aptr++ = items & 0xff;
4189 pat = SvPVX(cat) + SvCUR(cat);
4200 char *savepat = pat;
4205 aptr = SvPV(fromstr, fromlen);
4210 SvCUR(cat) += (len+1)/2;
4211 SvGROW(cat, SvCUR(cat) + 1);
4212 aptr = SvPVX(cat) + aint;
4217 if (datumtype == 'H') {
4218 for (len = 0; len++ < aint;) {
4220 items |= ((*pat++ & 15) + 9) & 15;
4222 items |= *pat++ & 15;
4226 *aptr++ = items & 0xff;
4232 for (len = 0; len++ < aint;) {
4234 items |= (((*pat++ & 15) + 9) & 15) << 4;
4236 items |= (*pat++ & 15) << 4;
4240 *aptr++ = items & 0xff;
4246 *aptr++ = items & 0xff;
4247 pat = SvPVX(cat) + SvCUR(cat);
4259 aint = SvIV(fromstr);
4261 sv_catpvn(cat, &achar, sizeof(char));
4267 auint = SvUV(fromstr);
4268 SvGROW(cat, SvCUR(cat) + 10);
4269 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4274 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4279 afloat = (float)SvNV(fromstr);
4280 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4287 adouble = (double)SvNV(fromstr);
4288 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4294 ashort = (I16)SvIV(fromstr);
4296 ashort = PerlSock_htons(ashort);
4298 CAT16(cat, &ashort);
4304 ashort = (I16)SvIV(fromstr);
4306 ashort = htovs(ashort);
4308 CAT16(cat, &ashort);
4315 ashort = (I16)SvIV(fromstr);
4316 CAT16(cat, &ashort);
4322 auint = SvUV(fromstr);
4323 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4329 adouble = floor(SvNV(fromstr));
4332 croak("Cannot compress negative numbers");
4338 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
4339 adouble <= UV_MAX_cxux
4346 char buf[1 + sizeof(UV)];
4347 char *in = buf + sizeof(buf);
4348 UV auv = U_V(adouble);;
4351 *--in = (auv & 0x7f) | 0x80;
4354 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4355 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4357 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4358 char *from, *result, *in;
4363 /* Copy string and check for compliance */
4364 from = SvPV(fromstr, len);
4365 if ((norm = is_an_int(from, len)) == NULL)
4366 croak("can compress only unsigned integer");
4368 New('w', result, len, char);
4372 *--in = div128(norm, &done) | 0x80;
4373 result[len - 1] &= 0x7F; /* clear continue bit */
4374 sv_catpvn(cat, in, (result + len) - in);
4376 SvREFCNT_dec(norm); /* free norm */
4378 else if (SvNOKp(fromstr)) {
4379 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4380 char *in = buf + sizeof(buf);
4383 double next = floor(adouble / 128);
4384 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4385 if (--in < buf) /* this cannot happen ;-) */
4386 croak ("Cannot compress integer");
4388 } while (adouble > 0);
4389 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4390 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4393 croak("Cannot compress non integer");
4399 aint = SvIV(fromstr);
4400 sv_catpvn(cat, (char*)&aint, sizeof(int));
4406 aulong = SvUV(fromstr);
4408 aulong = PerlSock_htonl(aulong);
4410 CAT32(cat, &aulong);
4416 aulong = SvUV(fromstr);
4418 aulong = htovl(aulong);
4420 CAT32(cat, &aulong);
4426 aulong = SvUV(fromstr);
4427 CAT32(cat, &aulong);
4433 along = SvIV(fromstr);
4441 auquad = (unsigned Quad_t)SvIV(fromstr);
4442 sv_catpvn(cat, (char*)&auquad, sizeof(unsigned Quad_t));
4448 aquad = (Quad_t)SvIV(fromstr);
4449 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
4452 #endif /* HAS_QUAD */
4454 len = 1; /* assume SV is correct length */
4459 if (fromstr == &PL_sv_undef)
4462 /* XXX better yet, could spirit away the string to
4463 * a safe spot and hang on to it until the result
4464 * of pack() (and all copies of the result) are
4467 if (ckWARN(WARN_UNSAFE) && (SvTEMP(fromstr) || SvPADTMP(fromstr)))
4469 "Attempt to pack pointer to temporary value");
4470 if (SvPOK(fromstr) || SvNIOK(fromstr))
4471 aptr = SvPV(fromstr,PL_na);
4473 aptr = SvPV_force(fromstr,PL_na);
4475 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4480 aptr = SvPV(fromstr, fromlen);
4481 SvGROW(cat, fromlen * 4 / 3);
4486 while (fromlen > 0) {
4493 doencodes(cat, aptr, todo);
4512 register I32 limit = POPi; /* note, negative is forever */
4515 register char *s = SvPV(sv, len);
4516 char *strend = s + len;
4518 register REGEXP *rx;
4522 I32 maxiters = (strend - s) + 10;
4525 I32 origlimit = limit;
4528 AV *oldstack = PL_curstack;
4529 I32 gimme = GIMME_V;
4530 I32 oldsave = PL_savestack_ix;
4531 I32 make_mortal = 1;
4532 MAGIC *mg = (MAGIC *) NULL;
4535 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4540 DIE("panic: do_split");
4541 rx = pm->op_pmregexp;
4543 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4544 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4546 if (pm->op_pmreplroot)
4547 ary = GvAVn((GV*)pm->op_pmreplroot);
4548 else if (gimme != G_ARRAY)
4550 ary = (AV*)PL_curpad[0];
4552 ary = GvAVn(PL_defgv);
4553 #endif /* USE_THREADS */
4556 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4562 if (mg = SvTIED_mg((SV*)ary, 'P')) {
4564 XPUSHs(SvTIED_obj((SV*)ary, mg));
4569 for (i = AvFILLp(ary); i >= 0; i--)
4570 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4572 /* temporarily switch stacks */
4573 SWITCHSTACK(PL_curstack, ary);
4577 base = SP - PL_stack_base;
4579 if (pm->op_pmflags & PMf_SKIPWHITE) {
4580 if (pm->op_pmflags & PMf_LOCALE) {
4581 while (isSPACE_LC(*s))
4589 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4590 SAVEINT(PL_multiline);
4591 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4595 limit = maxiters + 2;
4596 if (pm->op_pmflags & PMf_WHITE) {
4599 while (m < strend &&
4600 !((pm->op_pmflags & PMf_LOCALE)
4601 ? isSPACE_LC(*m) : isSPACE(*m)))
4606 dstr = NEWSV(30, m-s);
4607 sv_setpvn(dstr, s, m-s);
4613 while (s < strend &&
4614 ((pm->op_pmflags & PMf_LOCALE)
4615 ? isSPACE_LC(*s) : isSPACE(*s)))
4619 else if (strEQ("^", rx->precomp)) {
4622 for (m = s; m < strend && *m != '\n'; m++) ;
4626 dstr = NEWSV(30, m-s);
4627 sv_setpvn(dstr, s, m-s);
4634 else if (rx->check_substr && !rx->nparens
4635 && (rx->reganch & ROPT_CHECK_ALL)
4636 && !(rx->reganch & ROPT_ANCH)) {
4637 i = SvCUR(rx->check_substr);
4638 if (i == 1 && !SvTAIL(rx->check_substr)) {
4639 i = *SvPVX(rx->check_substr);
4642 for (m = s; m < strend && *m != i; m++) ;
4645 dstr = NEWSV(30, m-s);
4646 sv_setpvn(dstr, s, m-s);
4655 while (s < strend && --limit &&
4656 (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
4657 rx->check_substr, 0)) )
4660 dstr = NEWSV(31, m-s);
4661 sv_setpvn(dstr, s, m-s);
4670 maxiters += (strend - s) * rx->nparens;
4671 while (s < strend && --limit &&
4672 CALLREGEXEC(rx, s, strend, orig, 1, Nullsv, NULL, 0))
4674 TAINT_IF(RX_MATCH_TAINTED(rx));
4676 && rx->subbase != orig) {
4681 strend = s + (strend - m);
4684 dstr = NEWSV(32, m-s);
4685 sv_setpvn(dstr, s, m-s);
4690 for (i = 1; i <= rx->nparens; i++) {
4694 dstr = NEWSV(33, m-s);
4695 sv_setpvn(dstr, s, m-s);
4698 dstr = NEWSV(33, 0);
4708 LEAVE_SCOPE(oldsave);
4709 iters = (SP - PL_stack_base) - base;
4710 if (iters > maxiters)
4713 /* keep field after final delim? */
4714 if (s < strend || (iters && origlimit)) {
4715 dstr = NEWSV(34, strend-s);
4716 sv_setpvn(dstr, s, strend-s);
4722 else if (!origlimit) {
4723 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
4729 SWITCHSTACK(ary, oldstack);
4730 if (SvSMAGICAL(ary)) {
4735 if (gimme == G_ARRAY) {
4737 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4745 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
4748 if (gimme == G_ARRAY) {
4749 /* EXTEND should not be needed - we just popped them */
4751 for (i=0; i < iters; i++) {
4752 SV **svp = av_fetch(ary, i, FALSE);
4753 PUSHs((svp) ? *svp : &PL_sv_undef);
4760 if (gimme == G_ARRAY)
4763 if (iters || !pm->op_pmreplroot) {
4773 unlock_condpair(void *svv)
4776 MAGIC *mg = mg_find((SV*)svv, 'm');
4779 croak("panic: unlock_condpair unlocking non-mutex");
4780 MUTEX_LOCK(MgMUTEXP(mg));
4781 if (MgOWNER(mg) != thr)
4782 croak("panic: unlock_condpair unlocking mutex that we don't own");
4784 COND_SIGNAL(MgOWNERCONDP(mg));
4785 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: unlock 0x%lx\n",
4786 (unsigned long)thr, (unsigned long)svv);)
4787 MUTEX_UNLOCK(MgMUTEXP(mg));
4789 #endif /* USE_THREADS */
4802 mg = condpair_magic(sv);
4803 MUTEX_LOCK(MgMUTEXP(mg));
4804 if (MgOWNER(mg) == thr)
4805 MUTEX_UNLOCK(MgMUTEXP(mg));
4808 COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
4810 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: pp_lock lock 0x%lx\n",
4811 (unsigned long)thr, (unsigned long)sv);)
4812 MUTEX_UNLOCK(MgMUTEXP(mg));
4813 save_destructor(unlock_condpair, sv);
4815 #endif /* USE_THREADS */
4816 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4817 || SvTYPE(retsv) == SVt_PVCV) {
4818 retsv = refto(retsv);
4829 if (PL_op->op_private & OPpLVAL_INTRO)
4830 PUSHs(*save_threadsv(PL_op->op_targ));
4832 PUSHs(THREADSV(PL_op->op_targ));
4835 DIE("tried to access per-thread data in non-threaded perl");
4836 #endif /* USE_THREADS */