3 * Copyright (c) 1991-2001, 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
20 * The compiler on Concurrent CX/UX systems has a subtle bug which only
21 * seems to show up when compiling pp.c - it generates the wrong double
22 * precision constant value for (double)UV_MAX when used inline in the body
23 * of the code below, so this makes a static variable up front (which the
24 * compiler seems to get correct) and uses it in place of UV_MAX below.
26 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
27 static double UV_MAX_cxux = ((double)UV_MAX);
31 * Offset for integer pack/unpack.
33 * On architectures where I16 and I32 aren't really 16 and 32 bits,
34 * which for now are all Crays, pack and unpack have to play games.
38 * These values are required for portability of pack() output.
39 * If they're not right on your machine, then pack() and unpack()
40 * wouldn't work right anyway; you'll need to apply the Cray hack.
41 * (I'd like to check them with #if, but you can't use sizeof() in
42 * the preprocessor.) --???
45 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
46 defines are now in config.h. --Andy Dougherty April 1998
51 /* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
54 #if SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
55 # define PERL_NATINT_PACK
58 #if LONGSIZE > 4 && defined(_CRAY)
59 # if BYTEORDER == 0x12345678
60 # define OFF16(p) (char*)(p)
61 # define OFF32(p) (char*)(p)
63 # if BYTEORDER == 0x87654321
64 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
65 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
67 }}}} bad cray byte order
70 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
71 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
72 # define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
73 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
74 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
76 # define COPY16(s,p) Copy(s, p, SIZE16, char)
77 # define COPY32(s,p) Copy(s, p, SIZE32, char)
78 # define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
79 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
80 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
83 /* variations on pp_null */
85 /* XXX I can't imagine anyone who doesn't have this actually _needs_
86 it, since pid_t is an integral type.
89 #ifdef NEED_GETPID_PROTO
90 extern Pid_t getpid (void);
96 if (GIMME_V == G_SCALAR)
111 if (PL_op->op_private & OPpLVAL_INTRO)
112 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
114 if (PL_op->op_flags & OPf_REF) {
118 if (GIMME == G_SCALAR)
119 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
123 if (GIMME == G_ARRAY) {
124 I32 maxarg = AvFILL((AV*)TARG) + 1;
126 if (SvMAGICAL(TARG)) {
128 for (i=0; i < maxarg; i++) {
129 SV **svp = av_fetch((AV*)TARG, i, FALSE);
130 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
134 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
139 SV* sv = sv_newmortal();
140 I32 maxarg = AvFILL((AV*)TARG) + 1;
141 sv_setiv(sv, maxarg);
153 if (PL_op->op_private & OPpLVAL_INTRO)
154 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
155 if (PL_op->op_flags & OPf_REF)
158 if (GIMME == G_SCALAR)
159 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
163 if (gimme == G_ARRAY) {
166 else if (gimme == G_SCALAR) {
167 SV* sv = sv_newmortal();
168 if (HvFILL((HV*)TARG))
169 Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
170 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
180 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
191 tryAMAGICunDEREF(to_gv);
194 if (SvTYPE(sv) == SVt_PVIO) {
195 GV *gv = (GV*) sv_newmortal();
196 gv_init(gv, 0, "", 0, 0);
197 GvIOp(gv) = (IO *)sv;
198 (void)SvREFCNT_inc(sv);
201 else if (SvTYPE(sv) != SVt_PVGV)
202 DIE(aTHX_ "Not a GLOB reference");
205 if (SvTYPE(sv) != SVt_PVGV) {
209 if (SvGMAGICAL(sv)) {
214 if (!SvOK(sv) && sv != &PL_sv_undef) {
215 /* If this is a 'my' scalar and flag is set then vivify
218 if (PL_op->op_private & OPpDEREF) {
221 if (cUNOP->op_targ) {
223 SV *namesv = PL_curpad[cUNOP->op_targ];
224 name = SvPV(namesv, len);
225 gv = (GV*)NEWSV(0,0);
226 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
229 name = CopSTASHPV(PL_curcop);
232 if (SvTYPE(sv) < SVt_RV)
233 sv_upgrade(sv, SVt_RV);
239 if (PL_op->op_flags & OPf_REF ||
240 PL_op->op_private & HINT_STRICT_REFS)
241 DIE(aTHX_ PL_no_usym, "a symbol");
242 if (ckWARN(WARN_UNINITIALIZED))
247 if ((PL_op->op_flags & OPf_SPECIAL) &&
248 !(PL_op->op_flags & OPf_MOD))
250 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
252 && (!is_gv_magical(sym,len,0)
253 || !(sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV))))
259 if (PL_op->op_private & HINT_STRICT_REFS)
260 DIE(aTHX_ PL_no_symref, sym, "a symbol");
261 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
265 if (PL_op->op_private & OPpLVAL_INTRO)
266 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
277 tryAMAGICunDEREF(to_sv);
280 switch (SvTYPE(sv)) {
284 DIE(aTHX_ "Not a SCALAR reference");
292 if (SvTYPE(gv) != SVt_PVGV) {
293 if (SvGMAGICAL(sv)) {
299 if (PL_op->op_flags & OPf_REF ||
300 PL_op->op_private & HINT_STRICT_REFS)
301 DIE(aTHX_ PL_no_usym, "a SCALAR");
302 if (ckWARN(WARN_UNINITIALIZED))
307 if ((PL_op->op_flags & OPf_SPECIAL) &&
308 !(PL_op->op_flags & OPf_MOD))
310 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
312 && (!is_gv_magical(sym,len,0)
313 || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV))))
319 if (PL_op->op_private & HINT_STRICT_REFS)
320 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
321 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
326 if (PL_op->op_flags & OPf_MOD) {
327 if (PL_op->op_private & OPpLVAL_INTRO)
328 sv = save_scalar((GV*)TOPs);
329 else if (PL_op->op_private & OPpDEREF)
330 vivify_ref(sv, PL_op->op_private & OPpDEREF);
340 SV *sv = AvARYLEN(av);
342 AvARYLEN(av) = sv = NEWSV(0,0);
343 sv_upgrade(sv, SVt_IV);
344 sv_magic(sv, (SV*)av, '#', Nullch, 0);
352 dSP; dTARGET; dPOPss;
354 if (PL_op->op_flags & OPf_MOD || LVRET) {
355 if (SvTYPE(TARG) < SVt_PVLV) {
356 sv_upgrade(TARG, SVt_PVLV);
357 sv_magic(TARG, Nullsv, '.', Nullch, 0);
361 if (LvTARG(TARG) != sv) {
363 SvREFCNT_dec(LvTARG(TARG));
364 LvTARG(TARG) = SvREFCNT_inc(sv);
366 PUSHs(TARG); /* no SvSETMAGIC */
372 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
373 mg = mg_find(sv, 'g');
374 if (mg && mg->mg_len >= 0) {
378 PUSHi(i + PL_curcop->cop_arybase);
392 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
393 /* (But not in defined().) */
394 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
397 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
398 if ((PL_op->op_private & OPpLVAL_INTRO)) {
399 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
402 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
406 cv = (CV*)&PL_sv_undef;
420 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
421 char *s = SvPVX(TOPs);
422 if (strnEQ(s, "CORE::", 6)) {
425 code = keyword(s + 6, SvCUR(TOPs) - 6);
426 if (code < 0) { /* Overridable. */
427 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
428 int i = 0, n = 0, seen_question = 0;
430 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
432 while (i < MAXO) { /* The slow way. */
433 if (strEQ(s + 6, PL_op_name[i])
434 || strEQ(s + 6, PL_op_desc[i]))
440 goto nonesuch; /* Should not happen... */
442 oa = PL_opargs[i] >> OASHIFT;
444 if (oa & OA_OPTIONAL && !seen_question) {
448 else if (n && str[0] == ';' && seen_question)
449 goto set; /* XXXX system, exec */
450 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
451 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
454 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
455 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
459 ret = sv_2mortal(newSVpvn(str, n - 1));
461 else if (code) /* Non-Overridable */
463 else { /* None such */
465 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
469 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
471 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
480 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
482 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
498 if (GIMME != G_ARRAY) {
502 *MARK = &PL_sv_undef;
503 *MARK = refto(*MARK);
507 EXTEND_MORTAL(SP - MARK);
509 *MARK = refto(*MARK);
514 S_refto(pTHX_ SV *sv)
518 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
521 if (!(sv = LvTARG(sv)))
524 (void)SvREFCNT_inc(sv);
526 else if (SvTYPE(sv) == SVt_PVAV) {
527 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
530 (void)SvREFCNT_inc(sv);
532 else if (SvPADTMP(sv))
536 (void)SvREFCNT_inc(sv);
539 sv_upgrade(rv, SVt_RV);
553 if (sv && SvGMAGICAL(sv))
556 if (!sv || !SvROK(sv))
560 pv = sv_reftype(sv,TRUE);
561 PUSHp(pv, strlen(pv));
571 stash = CopSTASH(PL_curcop);
577 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
578 Perl_croak(aTHX_ "Attempt to bless into a reference");
580 if (ckWARN(WARN_MISC) && len == 0)
581 Perl_warner(aTHX_ WARN_MISC,
582 "Explicit blessing to '' (assuming package main)");
583 stash = gv_stashpvn(ptr, len, TRUE);
586 (void)sv_bless(TOPs, stash);
600 elem = SvPV(sv, n_a);
604 switch (elem ? *elem : '\0')
607 if (strEQ(elem, "ARRAY"))
608 tmpRef = (SV*)GvAV(gv);
611 if (strEQ(elem, "CODE"))
612 tmpRef = (SV*)GvCVu(gv);
615 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
616 tmpRef = (SV*)GvIOp(gv);
618 if (strEQ(elem, "FORMAT"))
619 tmpRef = (SV*)GvFORM(gv);
622 if (strEQ(elem, "GLOB"))
626 if (strEQ(elem, "HASH"))
627 tmpRef = (SV*)GvHV(gv);
630 if (strEQ(elem, "IO"))
631 tmpRef = (SV*)GvIOp(gv);
634 if (strEQ(elem, "NAME"))
635 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
638 if (strEQ(elem, "PACKAGE"))
639 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
642 if (strEQ(elem, "SCALAR"))
656 /* Pattern matching */
661 register unsigned char *s;
664 register I32 *sfirst;
668 if (sv == PL_lastscream) {
674 SvSCREAM_off(PL_lastscream);
675 SvREFCNT_dec(PL_lastscream);
677 PL_lastscream = SvREFCNT_inc(sv);
680 s = (unsigned char*)(SvPV(sv, len));
684 if (pos > PL_maxscream) {
685 if (PL_maxscream < 0) {
686 PL_maxscream = pos + 80;
687 New(301, PL_screamfirst, 256, I32);
688 New(302, PL_screamnext, PL_maxscream, I32);
691 PL_maxscream = pos + pos / 4;
692 Renew(PL_screamnext, PL_maxscream, I32);
696 sfirst = PL_screamfirst;
697 snext = PL_screamnext;
699 if (!sfirst || !snext)
700 DIE(aTHX_ "do_study: out of memory");
702 for (ch = 256; ch; --ch)
709 snext[pos] = sfirst[ch] - pos;
716 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
725 if (PL_op->op_flags & OPf_STACKED)
731 TARG = sv_newmortal();
736 /* Lvalue operators. */
748 dSP; dMARK; dTARGET; dORIGMARK;
750 do_chop(TARG, *++MARK);
759 SETi(do_chomp(TOPs));
766 register I32 count = 0;
769 count += do_chomp(POPs);
780 if (!sv || !SvANY(sv))
782 switch (SvTYPE(sv)) {
784 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
788 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
792 if (CvROOT(sv) || CvXSUB(sv))
809 if (!PL_op->op_private) {
818 if (SvTHINKFIRST(sv))
821 switch (SvTYPE(sv)) {
831 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
832 Perl_warner(aTHX_ WARN_MISC, "Constant subroutine %s undefined",
833 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
837 /* let user-undef'd sub keep its identity */
838 GV* gv = CvGV((CV*)sv);
845 SvSetMagicSV(sv, &PL_sv_undef);
849 Newz(602, gp, 1, GP);
850 GvGP(sv) = gp_ref(gp);
851 GvSV(sv) = NEWSV(72,0);
852 GvLINE(sv) = CopLINE(PL_curcop);
858 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
861 SvPV_set(sv, Nullch);
874 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
875 DIE(aTHX_ PL_no_modify);
876 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
877 SvIVX(TOPs) != IV_MIN)
880 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
891 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
892 DIE(aTHX_ PL_no_modify);
893 sv_setsv(TARG, TOPs);
894 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
895 SvIVX(TOPs) != IV_MAX)
898 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
912 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
913 DIE(aTHX_ PL_no_modify);
914 sv_setsv(TARG, TOPs);
915 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
916 SvIVX(TOPs) != IV_MIN)
919 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
928 /* Ordinary operators. */
932 dSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
935 SETn( Perl_pow( left, right) );
942 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
943 #ifdef PERL_PRESERVE_IVUV
946 /* Unless the left argument is integer in range we are going to have to
947 use NV maths. Hence only attempt to coerce the right argument if
948 we know the left is integer. */
949 /* Left operand is defined, so is it IV? */
952 bool auvok = SvUOK(TOPm1s);
953 bool buvok = SvUOK(TOPs);
954 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
955 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
962 alow = SvUVX(TOPm1s);
964 IV aiv = SvIVX(TOPm1s);
967 auvok = TRUE; /* effectively it's a UV now */
969 alow = -aiv; /* abs, auvok == false records sign */
975 IV biv = SvIVX(TOPs);
978 buvok = TRUE; /* effectively it's a UV now */
980 blow = -biv; /* abs, buvok == false records sign */
984 /* If this does sign extension on unsigned it's time for plan B */
985 ahigh = alow >> (4 * sizeof (UV));
987 bhigh = blow >> (4 * sizeof (UV));
989 if (ahigh && bhigh) {
990 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
991 which is overflow. Drop to NVs below. */
992 } else if (!ahigh && !bhigh) {
993 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
994 so the unsigned multiply cannot overflow. */
995 UV product = alow * blow;
996 if (auvok == buvok) {
997 /* -ve * -ve or +ve * +ve gives a +ve result. */
1001 } else if (product <= (UV)IV_MIN) {
1002 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1003 /* -ve result, which could overflow an IV */
1007 } /* else drop to NVs below. */
1009 /* One operand is large, 1 small */
1012 /* swap the operands */
1014 bhigh = blow; /* bhigh now the temp var for the swap */
1018 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1019 multiplies can't overflow. shift can, add can, -ve can. */
1020 product_middle = ahigh * blow;
1021 if (!(product_middle & topmask)) {
1022 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1024 product_middle <<= (4 * sizeof (UV));
1025 product_low = alow * blow;
1027 /* as for pp_add, UV + something mustn't get smaller.
1028 IIRC ANSI mandates this wrapping *behaviour* for
1029 unsigned whatever the actual representation*/
1030 product_low += product_middle;
1031 if (product_low >= product_middle) {
1032 /* didn't overflow */
1033 if (auvok == buvok) {
1034 /* -ve * -ve or +ve * +ve gives a +ve result. */
1036 SETu( product_low );
1038 } else if (product_low <= (UV)IV_MIN) {
1039 /* 2s complement assumption again */
1040 /* -ve result, which could overflow an IV */
1042 SETi( -product_low );
1044 } /* else drop to NVs below. */
1046 } /* product_middle too large */
1047 } /* ahigh && bhigh */
1048 } /* SvIOK(TOPm1s) */
1053 SETn( left * right );
1060 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1065 DIE(aTHX_ "Illegal division by zero");
1067 /* insure that 20./5. == 4. */
1070 if ((NV)I_V(left) == left &&
1071 (NV)I_V(right) == right &&
1072 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
1076 value = left / right;
1080 value = left / right;
1089 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1095 bool use_double = 0;
1099 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
1101 right = (right_neg = (i < 0)) ? -i : i;
1106 right_neg = dright < 0;
1111 if (!use_double && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
1113 left = (left_neg = (i < 0)) ? -i : i;
1121 left_neg = dleft < 0;
1130 /* Somehow U_V is pessimized even if CASTFLAGS is 0 */
1132 # define CAST_D2UV(d) U_V(d)
1134 # define CAST_D2UV(d) ((UV)(d))
1136 /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
1137 * or, in other words, precision of UV more than of NV.
1138 * But in fact the approach below turned out to be an
1139 * optimization - floor() may be slow */
1140 if (dright <= UV_MAX && dleft <= UV_MAX) {
1141 right = CAST_D2UV(dright);
1142 left = CAST_D2UV(dleft);
1147 /* Backward-compatibility clause: */
1148 dright = Perl_floor(dright + 0.5);
1149 dleft = Perl_floor(dleft + 0.5);
1152 DIE(aTHX_ "Illegal modulus zero");
1154 dans = Perl_fmod(dleft, dright);
1155 if ((left_neg != right_neg) && dans)
1156 dans = dright - dans;
1159 sv_setnv(TARG, dans);
1166 DIE(aTHX_ "Illegal modulus zero");
1169 if ((left_neg != right_neg) && ans)
1172 /* XXX may warn: unary minus operator applied to unsigned type */
1173 /* could change -foo to be (~foo)+1 instead */
1174 if (ans <= ~((UV)IV_MAX)+1)
1175 sv_setiv(TARG, ~ans+1);
1177 sv_setnv(TARG, -(NV)ans);
1180 sv_setuv(TARG, ans);
1189 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1191 register IV count = POPi;
1192 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1194 I32 items = SP - MARK;
1197 max = items * count;
1206 repeatcpy((char*)(MARK + items), (char*)MARK,
1207 items * sizeof(SV*), count - 1);
1210 else if (count <= 0)
1213 else { /* Note: mark already snarfed by pp_list */
1218 SvSetSV(TARG, tmpstr);
1219 SvPV_force(TARG, len);
1220 isutf = DO_UTF8(TARG);
1225 SvGROW(TARG, (count * len) + 1);
1226 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1227 SvCUR(TARG) *= count;
1229 *SvEND(TARG) = '\0';
1232 (void)SvPOK_only_UTF8(TARG);
1234 (void)SvPOK_only(TARG);
1236 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1237 /* The parser saw this as a list repeat, and there
1238 are probably several items on the stack. But we're
1239 in scalar context, and there's no pp_list to save us
1240 now. So drop the rest of the items -- robin@kitsite.com
1253 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1254 useleft = USE_LEFT(TOPm1s);
1255 #ifdef PERL_PRESERVE_IVUV
1256 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1257 "bad things" happen if you rely on signed integers wrapping. */
1260 /* Unless the left argument is integer in range we are going to have to
1261 use NV maths. Hence only attempt to coerce the right argument if
1262 we know the left is integer. */
1269 a_valid = auvok = 1;
1270 /* left operand is undef, treat as zero. */
1272 /* Left operand is defined, so is it IV? */
1273 SvIV_please(TOPm1s);
1274 if (SvIOK(TOPm1s)) {
1275 if ((auvok = SvUOK(TOPm1s)))
1276 auv = SvUVX(TOPm1s);
1278 register IV aiv = SvIVX(TOPm1s);
1281 auvok = 1; /* Now acting as a sign flag. */
1282 } else { /* 2s complement assumption for IV_MIN */
1290 bool result_good = 0;
1293 bool buvok = SvUOK(TOPs);
1298 register IV biv = SvIVX(TOPs);
1305 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1306 else "IV" now, independant of how it came in.
1307 if a, b represents positive, A, B negative, a maps to -A etc
1312 all UV maths. negate result if A negative.
1313 subtract if signs same, add if signs differ. */
1315 if (auvok ^ buvok) {
1324 /* Must get smaller */
1329 if (result <= buv) {
1330 /* result really should be -(auv-buv). as its negation
1331 of true value, need to swap our result flag */
1343 if (result <= (UV)IV_MIN)
1344 SETi( -(IV)result );
1346 /* result valid, but out of range for IV. */
1347 SETn( -(NV)result );
1351 } /* Overflow, drop through to NVs. */
1355 useleft = USE_LEFT(TOPm1s);
1359 /* left operand is undef, treat as zero - value */
1363 SETn( TOPn - value );
1370 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1373 if (PL_op->op_private & HINT_INTEGER) {
1387 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1390 if (PL_op->op_private & HINT_INTEGER) {
1404 dSP; tryAMAGICbinSET(lt,0);
1405 #ifdef PERL_PRESERVE_IVUV
1408 SvIV_please(TOPm1s);
1409 if (SvIOK(TOPm1s)) {
1410 bool auvok = SvUOK(TOPm1s);
1411 bool buvok = SvUOK(TOPs);
1413 if (!auvok && !buvok) { /* ## IV < IV ## */
1414 IV aiv = SvIVX(TOPm1s);
1415 IV biv = SvIVX(TOPs);
1418 SETs(boolSV(aiv < biv));
1421 if (auvok && buvok) { /* ## UV < UV ## */
1422 UV auv = SvUVX(TOPm1s);
1423 UV buv = SvUVX(TOPs);
1426 SETs(boolSV(auv < buv));
1429 if (auvok) { /* ## UV < IV ## */
1436 /* As (a) is a UV, it's >=0, so it cannot be < */
1441 if (auv >= (UV) IV_MAX) {
1442 /* As (b) is an IV, it cannot be > IV_MAX */
1446 SETs(boolSV(auv < (UV)biv));
1449 { /* ## IV < UV ## */
1453 aiv = SvIVX(TOPm1s);
1455 /* As (b) is a UV, it's >=0, so it must be < */
1462 if (buv > (UV) IV_MAX) {
1463 /* As (a) is an IV, it cannot be > IV_MAX */
1467 SETs(boolSV((UV)aiv < buv));
1475 SETs(boolSV(TOPn < value));
1482 dSP; tryAMAGICbinSET(gt,0);
1483 #ifdef PERL_PRESERVE_IVUV
1486 SvIV_please(TOPm1s);
1487 if (SvIOK(TOPm1s)) {
1488 bool auvok = SvUOK(TOPm1s);
1489 bool buvok = SvUOK(TOPs);
1491 if (!auvok && !buvok) { /* ## IV > IV ## */
1492 IV aiv = SvIVX(TOPm1s);
1493 IV biv = SvIVX(TOPs);
1496 SETs(boolSV(aiv > biv));
1499 if (auvok && buvok) { /* ## UV > UV ## */
1500 UV auv = SvUVX(TOPm1s);
1501 UV buv = SvUVX(TOPs);
1504 SETs(boolSV(auv > buv));
1507 if (auvok) { /* ## UV > IV ## */
1514 /* As (a) is a UV, it's >=0, so it must be > */
1519 if (auv > (UV) IV_MAX) {
1520 /* As (b) is an IV, it cannot be > IV_MAX */
1524 SETs(boolSV(auv > (UV)biv));
1527 { /* ## IV > UV ## */
1531 aiv = SvIVX(TOPm1s);
1533 /* As (b) is a UV, it's >=0, so it cannot be > */
1540 if (buv >= (UV) IV_MAX) {
1541 /* As (a) is an IV, it cannot be > IV_MAX */
1545 SETs(boolSV((UV)aiv > buv));
1553 SETs(boolSV(TOPn > value));
1560 dSP; tryAMAGICbinSET(le,0);
1561 #ifdef PERL_PRESERVE_IVUV
1564 SvIV_please(TOPm1s);
1565 if (SvIOK(TOPm1s)) {
1566 bool auvok = SvUOK(TOPm1s);
1567 bool buvok = SvUOK(TOPs);
1569 if (!auvok && !buvok) { /* ## IV <= IV ## */
1570 IV aiv = SvIVX(TOPm1s);
1571 IV biv = SvIVX(TOPs);
1574 SETs(boolSV(aiv <= biv));
1577 if (auvok && buvok) { /* ## UV <= UV ## */
1578 UV auv = SvUVX(TOPm1s);
1579 UV buv = SvUVX(TOPs);
1582 SETs(boolSV(auv <= buv));
1585 if (auvok) { /* ## UV <= IV ## */
1592 /* As (a) is a UV, it's >=0, so a cannot be <= */
1597 if (auv > (UV) IV_MAX) {
1598 /* As (b) is an IV, it cannot be > IV_MAX */
1602 SETs(boolSV(auv <= (UV)biv));
1605 { /* ## IV <= UV ## */
1609 aiv = SvIVX(TOPm1s);
1611 /* As (b) is a UV, it's >=0, so a must be <= */
1618 if (buv >= (UV) IV_MAX) {
1619 /* As (a) is an IV, it cannot be > IV_MAX */
1623 SETs(boolSV((UV)aiv <= buv));
1631 SETs(boolSV(TOPn <= value));
1638 dSP; tryAMAGICbinSET(ge,0);
1639 #ifdef PERL_PRESERVE_IVUV
1642 SvIV_please(TOPm1s);
1643 if (SvIOK(TOPm1s)) {
1644 bool auvok = SvUOK(TOPm1s);
1645 bool buvok = SvUOK(TOPs);
1647 if (!auvok && !buvok) { /* ## IV >= IV ## */
1648 IV aiv = SvIVX(TOPm1s);
1649 IV biv = SvIVX(TOPs);
1652 SETs(boolSV(aiv >= biv));
1655 if (auvok && buvok) { /* ## UV >= UV ## */
1656 UV auv = SvUVX(TOPm1s);
1657 UV buv = SvUVX(TOPs);
1660 SETs(boolSV(auv >= buv));
1663 if (auvok) { /* ## UV >= IV ## */
1670 /* As (a) is a UV, it's >=0, so it must be >= */
1675 if (auv >= (UV) IV_MAX) {
1676 /* As (b) is an IV, it cannot be > IV_MAX */
1680 SETs(boolSV(auv >= (UV)biv));
1683 { /* ## IV >= UV ## */
1687 aiv = SvIVX(TOPm1s);
1689 /* As (b) is a UV, it's >=0, so a cannot be >= */
1696 if (buv > (UV) IV_MAX) {
1697 /* As (a) is an IV, it cannot be > IV_MAX */
1701 SETs(boolSV((UV)aiv >= buv));
1709 SETs(boolSV(TOPn >= value));
1716 dSP; tryAMAGICbinSET(ne,0);
1717 #ifdef PERL_PRESERVE_IVUV
1720 SvIV_please(TOPm1s);
1721 if (SvIOK(TOPm1s)) {
1722 bool auvok = SvUOK(TOPm1s);
1723 bool buvok = SvUOK(TOPs);
1725 if (!auvok && !buvok) { /* ## IV <=> IV ## */
1726 IV aiv = SvIVX(TOPm1s);
1727 IV biv = SvIVX(TOPs);
1730 SETs(boolSV(aiv != biv));
1733 if (auvok && buvok) { /* ## UV != UV ## */
1734 UV auv = SvUVX(TOPm1s);
1735 UV buv = SvUVX(TOPs);
1738 SETs(boolSV(auv != buv));
1741 { /* ## Mixed IV,UV ## */
1745 /* != is commutative so swap if needed (save code) */
1747 /* swap. top of stack (b) is the iv */
1751 /* As (a) is a UV, it's >0, so it cannot be == */
1760 /* As (b) is a UV, it's >0, so it cannot be == */
1764 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
1766 /* we know iv is >= 0 */
1767 if (uv > (UV) IV_MAX) {
1771 SETs(boolSV((UV)iv != uv));
1779 SETs(boolSV(TOPn != value));
1786 dSP; dTARGET; tryAMAGICbin(ncmp,0);
1787 #ifdef PERL_PRESERVE_IVUV
1788 /* Fortunately it seems NaN isn't IOK */
1791 SvIV_please(TOPm1s);
1792 if (SvIOK(TOPm1s)) {
1793 bool leftuvok = SvUOK(TOPm1s);
1794 bool rightuvok = SvUOK(TOPs);
1796 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
1797 IV leftiv = SvIVX(TOPm1s);
1798 IV rightiv = SvIVX(TOPs);
1800 if (leftiv > rightiv)
1802 else if (leftiv < rightiv)
1806 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
1807 UV leftuv = SvUVX(TOPm1s);
1808 UV rightuv = SvUVX(TOPs);
1810 if (leftuv > rightuv)
1812 else if (leftuv < rightuv)
1816 } else if (leftuvok) { /* ## UV <=> IV ## */
1820 rightiv = SvIVX(TOPs);
1822 /* As (a) is a UV, it's >=0, so it cannot be < */
1825 leftuv = SvUVX(TOPm1s);
1826 if (leftuv > (UV) IV_MAX) {
1827 /* As (b) is an IV, it cannot be > IV_MAX */
1829 } else if (leftuv > (UV)rightiv) {
1831 } else if (leftuv < (UV)rightiv) {
1837 } else { /* ## IV <=> UV ## */
1841 leftiv = SvIVX(TOPm1s);
1843 /* As (b) is a UV, it's >=0, so it must be < */
1846 rightuv = SvUVX(TOPs);
1847 if (rightuv > (UV) IV_MAX) {
1848 /* As (a) is an IV, it cannot be > IV_MAX */
1850 } else if (leftiv > (UV)rightuv) {
1852 } else if (leftiv < (UV)rightuv) {
1870 if (Perl_isnan(left) || Perl_isnan(right)) {
1874 value = (left > right) - (left < right);
1878 else if (left < right)
1880 else if (left > right)
1894 dSP; tryAMAGICbinSET(slt,0);
1897 int cmp = ((PL_op->op_private & OPpLOCALE)
1898 ? sv_cmp_locale(left, right)
1899 : sv_cmp(left, right));
1900 SETs(boolSV(cmp < 0));
1907 dSP; tryAMAGICbinSET(sgt,0);
1910 int cmp = ((PL_op->op_private & OPpLOCALE)
1911 ? sv_cmp_locale(left, right)
1912 : sv_cmp(left, right));
1913 SETs(boolSV(cmp > 0));
1920 dSP; tryAMAGICbinSET(sle,0);
1923 int cmp = ((PL_op->op_private & OPpLOCALE)
1924 ? sv_cmp_locale(left, right)
1925 : sv_cmp(left, right));
1926 SETs(boolSV(cmp <= 0));
1933 dSP; tryAMAGICbinSET(sge,0);
1936 int cmp = ((PL_op->op_private & OPpLOCALE)
1937 ? sv_cmp_locale(left, right)
1938 : sv_cmp(left, right));
1939 SETs(boolSV(cmp >= 0));
1946 dSP; tryAMAGICbinSET(seq,0);
1949 SETs(boolSV(sv_eq(left, right)));
1956 dSP; tryAMAGICbinSET(sne,0);
1959 SETs(boolSV(!sv_eq(left, right)));
1966 dSP; dTARGET; tryAMAGICbin(scmp,0);
1969 int cmp = ((PL_op->op_private & OPpLOCALE)
1970 ? sv_cmp_locale(left, right)
1971 : sv_cmp(left, right));
1979 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1982 if (SvNIOKp(left) || SvNIOKp(right)) {
1983 if (PL_op->op_private & HINT_INTEGER) {
1984 IV i = SvIV(left) & SvIV(right);
1988 UV u = SvUV(left) & SvUV(right);
1993 do_vop(PL_op->op_type, TARG, left, right);
2002 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2005 if (SvNIOKp(left) || SvNIOKp(right)) {
2006 if (PL_op->op_private & HINT_INTEGER) {
2007 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
2011 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
2016 do_vop(PL_op->op_type, TARG, left, right);
2025 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2028 if (SvNIOKp(left) || SvNIOKp(right)) {
2029 if (PL_op->op_private & HINT_INTEGER) {
2030 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
2034 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
2039 do_vop(PL_op->op_type, TARG, left, right);
2048 dSP; dTARGET; tryAMAGICun(neg);
2051 int flags = SvFLAGS(sv);
2054 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2055 /* It's publicly an integer, or privately an integer-not-float */
2058 if (SvIVX(sv) == IV_MIN) {
2059 /* 2s complement assumption. */
2060 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2063 else if (SvUVX(sv) <= IV_MAX) {
2068 else if (SvIVX(sv) != IV_MIN) {
2072 #ifdef PERL_PRESERVE_IVUV
2081 else if (SvPOKp(sv)) {
2083 char *s = SvPV(sv, len);
2084 if (isIDFIRST(*s)) {
2085 sv_setpvn(TARG, "-", 1);
2088 else if (*s == '+' || *s == '-') {
2090 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2092 else if (DO_UTF8(sv) && UTF8_IS_START(*s) && isIDFIRST_utf8((U8*)s)) {
2093 sv_setpvn(TARG, "-", 1);
2099 goto oops_its_an_int;
2100 sv_setnv(TARG, -SvNV(sv));
2112 dSP; tryAMAGICunSET(not);
2113 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2119 dSP; dTARGET; tryAMAGICun(compl);
2123 if (PL_op->op_private & HINT_INTEGER) {
2138 tmps = (U8*)SvPV_force(TARG, len);
2141 /* Calculate exact length, let's not estimate. */
2150 while (tmps < send) {
2151 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2152 tmps += UTF8SKIP(tmps);
2153 targlen += UNISKIP(~c);
2159 /* Now rewind strings and write them. */
2163 Newz(0, result, targlen + 1, U8);
2164 while (tmps < send) {
2165 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2166 tmps += UTF8SKIP(tmps);
2167 result = uvchr_to_utf8(result, ~c);
2171 sv_setpvn(TARG, (char*)result, targlen);
2175 Newz(0, result, nchar + 1, U8);
2176 while (tmps < send) {
2177 U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2178 tmps += UTF8SKIP(tmps);
2183 sv_setpvn(TARG, (char*)result, nchar);
2191 register long *tmpl;
2192 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2195 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2200 for ( ; anum > 0; anum--, tmps++)
2209 /* integer versions of some of the above */
2213 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2216 SETi( left * right );
2223 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2227 DIE(aTHX_ "Illegal division by zero");
2228 value = POPi / value;
2236 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2240 DIE(aTHX_ "Illegal modulus zero");
2241 SETi( left % right );
2248 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2251 SETi( left + right );
2258 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2261 SETi( left - right );
2268 dSP; tryAMAGICbinSET(lt,0);
2271 SETs(boolSV(left < right));
2278 dSP; tryAMAGICbinSET(gt,0);
2281 SETs(boolSV(left > right));
2288 dSP; tryAMAGICbinSET(le,0);
2291 SETs(boolSV(left <= right));
2298 dSP; tryAMAGICbinSET(ge,0);
2301 SETs(boolSV(left >= right));
2308 dSP; tryAMAGICbinSET(eq,0);
2311 SETs(boolSV(left == right));
2318 dSP; tryAMAGICbinSET(ne,0);
2321 SETs(boolSV(left != right));
2328 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2335 else if (left < right)
2346 dSP; dTARGET; tryAMAGICun(neg);
2351 /* High falutin' math. */
2355 dSP; dTARGET; tryAMAGICbin(atan2,0);
2358 SETn(Perl_atan2(left, right));
2365 dSP; dTARGET; tryAMAGICun(sin);
2369 value = Perl_sin(value);
2377 dSP; dTARGET; tryAMAGICun(cos);
2381 value = Perl_cos(value);
2387 /* Support Configure command-line overrides for rand() functions.
2388 After 5.005, perhaps we should replace this by Configure support
2389 for drand48(), random(), or rand(). For 5.005, though, maintain
2390 compatibility by calling rand() but allow the user to override it.
2391 See INSTALL for details. --Andy Dougherty 15 July 1998
2393 /* Now it's after 5.005, and Configure supports drand48() and random(),
2394 in addition to rand(). So the overrides should not be needed any more.
2395 --Jarkko Hietaniemi 27 September 1998
2398 #ifndef HAS_DRAND48_PROTO
2399 extern double drand48 (void);
2412 if (!PL_srand_called) {
2413 (void)seedDrand01((Rand_seed_t)seed());
2414 PL_srand_called = TRUE;
2429 (void)seedDrand01((Rand_seed_t)anum);
2430 PL_srand_called = TRUE;
2439 * This is really just a quick hack which grabs various garbage
2440 * values. It really should be a real hash algorithm which
2441 * spreads the effect of every input bit onto every output bit,
2442 * if someone who knows about such things would bother to write it.
2443 * Might be a good idea to add that function to CORE as well.
2444 * No numbers below come from careful analysis or anything here,
2445 * except they are primes and SEED_C1 > 1E6 to get a full-width
2446 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
2447 * probably be bigger too.
2450 # define SEED_C1 1000003
2451 #define SEED_C4 73819
2453 # define SEED_C1 25747
2454 #define SEED_C4 20639
2458 #define SEED_C5 26107
2460 #ifndef PERL_NO_DEV_RANDOM
2465 # include <starlet.h>
2466 /* when[] = (low 32 bits, high 32 bits) of time since epoch
2467 * in 100-ns units, typically incremented ever 10 ms. */
2468 unsigned int when[2];
2470 # ifdef HAS_GETTIMEOFDAY
2471 struct timeval when;
2477 /* This test is an escape hatch, this symbol isn't set by Configure. */
2478 #ifndef PERL_NO_DEV_RANDOM
2479 #ifndef PERL_RANDOM_DEVICE
2480 /* /dev/random isn't used by default because reads from it will block
2481 * if there isn't enough entropy available. You can compile with
2482 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
2483 * is enough real entropy to fill the seed. */
2484 # define PERL_RANDOM_DEVICE "/dev/urandom"
2486 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
2488 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
2497 _ckvmssts(sys$gettim(when));
2498 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
2500 # ifdef HAS_GETTIMEOFDAY
2501 gettimeofday(&when,(struct timezone *) 0);
2502 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
2505 u = (U32)SEED_C1 * when;
2508 u += SEED_C3 * (U32)PerlProc_getpid();
2509 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
2510 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
2511 u += SEED_C5 * (U32)PTR2UV(&when);
2518 dSP; dTARGET; tryAMAGICun(exp);
2522 value = Perl_exp(value);
2530 dSP; dTARGET; tryAMAGICun(log);
2535 SET_NUMERIC_STANDARD();
2536 DIE(aTHX_ "Can't take log of %g", value);
2538 value = Perl_log(value);
2546 dSP; dTARGET; tryAMAGICun(sqrt);
2551 SET_NUMERIC_STANDARD();
2552 DIE(aTHX_ "Can't take sqrt of %g", value);
2554 value = Perl_sqrt(value);
2562 dSP; dTARGET; tryAMAGICun(int);
2565 IV iv = TOPi; /* attempt to convert to IV if possible. */
2566 /* XXX it's arguable that compiler casting to IV might be subtly
2567 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2568 else preferring IV has introduced a subtle behaviour change bug. OTOH
2569 relying on floating point to be accurate is a bug. */
2580 if (value < (NV)UV_MAX + 0.5) {
2583 #if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
2584 (void)Perl_modf(value, &value);
2586 double tmp = (double)value;
2587 (void)Perl_modf(tmp, &tmp);
2594 if (value > (NV)IV_MIN - 0.5) {
2597 #if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
2598 (void)Perl_modf(-value, &value);
2601 double tmp = (double)value;
2602 (void)Perl_modf(-tmp, &tmp);
2615 dSP; dTARGET; tryAMAGICun(abs);
2617 /* This will cache the NV value if string isn't actually integer */
2621 /* IVX is precise */
2623 SETu(TOPu); /* force it to be numeric only */
2631 /* 2s complement assumption. Also, not really needed as
2632 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2655 argtype = 1; /* allow underscores */
2656 XPUSHn(scan_hex(tmps, 99, &argtype));
2669 while (*tmps && isSPACE(*tmps))
2673 argtype = 1; /* allow underscores */
2675 value = scan_hex(++tmps, 99, &argtype);
2676 else if (*tmps == 'b')
2677 value = scan_bin(++tmps, 99, &argtype);
2679 value = scan_oct(tmps, 99, &argtype);
2692 SETi(sv_len_utf8(sv));
2708 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2710 I32 arybase = PL_curcop->cop_arybase;
2714 int num_args = PL_op->op_private & 7;
2715 bool repl_need_utf8_upgrade = FALSE;
2716 bool repl_is_utf8 = FALSE;
2718 SvTAINTED_off(TARG); /* decontaminate */
2719 SvUTF8_off(TARG); /* decontaminate */
2723 repl = SvPV(repl_sv, repl_len);
2724 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
2734 sv_utf8_upgrade(sv);
2736 else if (DO_UTF8(sv))
2737 repl_need_utf8_upgrade = TRUE;
2739 tmps = SvPV(sv, curlen);
2741 utf8_curlen = sv_len_utf8(sv);
2742 if (utf8_curlen == curlen)
2745 curlen = utf8_curlen;
2750 if (pos >= arybase) {
2768 else if (len >= 0) {
2770 if (rem > (I32)curlen)
2785 Perl_croak(aTHX_ "substr outside of string");
2786 if (ckWARN(WARN_SUBSTR))
2787 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
2794 sv_pos_u2b(sv, &pos, &rem);
2796 sv_setpvn(TARG, tmps, rem);
2800 SV* repl_sv_copy = NULL;
2802 if (repl_need_utf8_upgrade) {
2803 repl_sv_copy = newSVsv(repl_sv);
2804 sv_utf8_upgrade(repl_sv_copy);
2805 repl = SvPV(repl_sv_copy, repl_len);
2806 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
2808 sv_insert(sv, pos, rem, repl, repl_len);
2812 SvREFCNT_dec(repl_sv_copy);
2814 else if (lvalue) { /* it's an lvalue! */
2815 if (!SvGMAGICAL(sv)) {
2819 if (ckWARN(WARN_SUBSTR))
2820 Perl_warner(aTHX_ WARN_SUBSTR,
2821 "Attempt to use reference as lvalue in substr");
2823 if (SvOK(sv)) /* is it defined ? */
2824 (void)SvPOK_only_UTF8(sv);
2826 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
2829 if (SvTYPE(TARG) < SVt_PVLV) {
2830 sv_upgrade(TARG, SVt_PVLV);
2831 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
2835 if (LvTARG(TARG) != sv) {
2837 SvREFCNT_dec(LvTARG(TARG));
2838 LvTARG(TARG) = SvREFCNT_inc(sv);
2840 LvTARGOFF(TARG) = upos;
2841 LvTARGLEN(TARG) = urem;
2845 PUSHs(TARG); /* avoid SvSETMAGIC here */
2852 register IV size = POPi;
2853 register IV offset = POPi;
2854 register SV *src = POPs;
2855 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2857 SvTAINTED_off(TARG); /* decontaminate */
2858 if (lvalue) { /* it's an lvalue! */
2859 if (SvTYPE(TARG) < SVt_PVLV) {
2860 sv_upgrade(TARG, SVt_PVLV);
2861 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
2864 if (LvTARG(TARG) != src) {
2866 SvREFCNT_dec(LvTARG(TARG));
2867 LvTARG(TARG) = SvREFCNT_inc(src);
2869 LvTARGOFF(TARG) = offset;
2870 LvTARGLEN(TARG) = size;
2873 sv_setuv(TARG, do_vecget(src, offset, size));
2888 I32 arybase = PL_curcop->cop_arybase;
2893 offset = POPi - arybase;
2896 tmps = SvPV(big, biglen);
2897 if (offset > 0 && DO_UTF8(big))
2898 sv_pos_u2b(big, &offset, 0);
2901 else if (offset > biglen)
2903 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2904 (unsigned char*)tmps + biglen, little, 0)))
2907 retval = tmps2 - tmps;
2908 if (retval > 0 && DO_UTF8(big))
2909 sv_pos_b2u(big, &retval);
2910 PUSHi(retval + arybase);
2925 I32 arybase = PL_curcop->cop_arybase;
2931 tmps2 = SvPV(little, llen);
2932 tmps = SvPV(big, blen);
2936 if (offset > 0 && DO_UTF8(big))
2937 sv_pos_u2b(big, &offset, 0);
2938 offset = offset - arybase + llen;
2942 else if (offset > blen)
2944 if (!(tmps2 = rninstr(tmps, tmps + offset,
2945 tmps2, tmps2 + llen)))
2948 retval = tmps2 - tmps;
2949 if (retval > 0 && DO_UTF8(big))
2950 sv_pos_b2u(big, &retval);
2951 PUSHi(retval + arybase);
2957 dSP; dMARK; dORIGMARK; dTARGET;
2958 do_sprintf(TARG, SP-MARK, MARK+1);
2959 TAINT_IF(SvTAINTED(TARG));
2970 U8 *s = (U8*)SvPVx(argsv, len);
2972 XPUSHu(DO_UTF8(argsv) ? utf8_to_uvchr(s, 0) : (*s & 0xff));
2982 (void)SvUPGRADE(TARG,SVt_PV);
2984 if (value > 255 && !IN_BYTE) {
2985 SvGROW(TARG, UNISKIP(value)+1);
2986 tmps = (char*)uvchr_to_utf8((U8*)SvPVX(TARG), value);
2987 SvCUR_set(TARG, tmps - SvPVX(TARG));
2989 (void)SvPOK_only(TARG);
3000 (void)SvPOK_only(TARG);
3007 dSP; dTARGET; dPOPTOPssrl;
3010 char *tmps = SvPV(left, n_a);
3012 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3014 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3018 "The crypt() function is unimplemented due to excessive paranoia.");
3031 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && UTF8_IS_START(*s)) {
3033 U8 tmpbuf[UTF8_MAXLEN+1];
3037 if (PL_op->op_private & OPpLOCALE) {
3040 uv = toTITLE_LC_uvchr(utf8n_to_uvchr(s, slen, &ulen, 0));
3043 uv = toTITLE_utf8(s);
3045 tend = uvchr_to_utf8(tmpbuf, uv);
3047 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
3049 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3050 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3055 s = (U8*)SvPV_force(sv, slen);
3056 Copy(tmpbuf, s, ulen, U8);
3060 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3062 SvUTF8_off(TARG); /* decontaminate */
3067 s = (U8*)SvPV_force(sv, slen);
3069 if (PL_op->op_private & OPpLOCALE) {
3072 *s = toUPPER_LC(*s);
3090 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && UTF8_IS_START(*s)) {
3092 U8 tmpbuf[UTF8_MAXLEN+1];
3096 if (PL_op->op_private & OPpLOCALE) {
3099 uv = toLOWER_LC_uvchr(utf8n_to_uvchr(s, slen, &ulen, 0));
3102 uv = toLOWER_utf8(s);
3104 tend = uvchr_to_utf8(tmpbuf, uv);
3106 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
3108 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3109 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3114 s = (U8*)SvPV_force(sv, slen);
3115 Copy(tmpbuf, s, ulen, U8);
3119 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3121 SvUTF8_off(TARG); /* decontaminate */
3126 s = (U8*)SvPV_force(sv, slen);
3128 if (PL_op->op_private & OPpLOCALE) {
3131 *s = toLOWER_LC(*s);
3155 s = (U8*)SvPV(sv,len);
3157 SvUTF8_off(TARG); /* decontaminate */
3158 sv_setpvn(TARG, "", 0);
3162 (void)SvUPGRADE(TARG, SVt_PV);
3163 SvGROW(TARG, (len * 2) + 1);
3164 (void)SvPOK_only(TARG);
3165 d = (U8*)SvPVX(TARG);
3167 if (PL_op->op_private & OPpLOCALE) {
3171 d = uvchr_to_utf8(d, toUPPER_LC_uvchr( utf8n_to_uvchr(s, len, &ulen, 0)));
3177 d = uvchr_to_utf8(d, toUPPER_utf8( s ));
3183 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3188 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3190 SvUTF8_off(TARG); /* decontaminate */
3195 s = (U8*)SvPV_force(sv, len);
3197 register U8 *send = s + len;
3199 if (PL_op->op_private & OPpLOCALE) {
3202 for (; s < send; s++)
3203 *s = toUPPER_LC(*s);
3206 for (; s < send; s++)
3229 s = (U8*)SvPV(sv,len);
3231 SvUTF8_off(TARG); /* decontaminate */
3232 sv_setpvn(TARG, "", 0);
3236 (void)SvUPGRADE(TARG, SVt_PV);
3237 SvGROW(TARG, (len * 2) + 1);
3238 (void)SvPOK_only(TARG);
3239 d = (U8*)SvPVX(TARG);
3241 if (PL_op->op_private & OPpLOCALE) {
3245 d = uvchr_to_utf8(d, toLOWER_LC_uvchr( utf8n_to_uvchr(s, len, &ulen, 0)));
3251 d = uvchr_to_utf8(d, toLOWER_utf8(s));
3257 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3262 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3264 SvUTF8_off(TARG); /* decontaminate */
3270 s = (U8*)SvPV_force(sv, len);
3272 register U8 *send = s + len;
3274 if (PL_op->op_private & OPpLOCALE) {
3277 for (; s < send; s++)
3278 *s = toLOWER_LC(*s);
3281 for (; s < send; s++)
3296 register char *s = SvPV(sv,len);
3299 SvUTF8_off(TARG); /* decontaminate */
3301 (void)SvUPGRADE(TARG, SVt_PV);
3302 SvGROW(TARG, (len * 2) + 1);
3306 if (UTF8_IS_CONTINUED(*s)) {
3307 STRLEN ulen = UTF8SKIP(s);
3331 SvCUR_set(TARG, d - SvPVX(TARG));
3332 (void)SvPOK_only_UTF8(TARG);
3335 sv_setpvn(TARG, s, len);
3337 if (SvSMAGICAL(TARG))
3346 dSP; dMARK; dORIGMARK;
3348 register AV* av = (AV*)POPs;
3349 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3350 I32 arybase = PL_curcop->cop_arybase;
3353 if (SvTYPE(av) == SVt_PVAV) {
3354 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3356 for (svp = MARK + 1; svp <= SP; svp++) {
3361 if (max > AvMAX(av))
3364 while (++MARK <= SP) {
3365 elem = SvIVx(*MARK);
3369 svp = av_fetch(av, elem, lval);
3371 if (!svp || *svp == &PL_sv_undef)
3372 DIE(aTHX_ PL_no_aelem, elem);
3373 if (PL_op->op_private & OPpLVAL_INTRO)
3374 save_aelem(av, elem, svp);
3376 *MARK = svp ? *svp : &PL_sv_undef;
3379 if (GIMME != G_ARRAY) {
3387 /* Associative arrays. */
3392 HV *hash = (HV*)POPs;
3394 I32 gimme = GIMME_V;
3395 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
3398 /* might clobber stack_sp */
3399 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
3404 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
3405 if (gimme == G_ARRAY) {
3408 /* might clobber stack_sp */
3410 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
3415 else if (gimme == G_SCALAR)
3434 I32 gimme = GIMME_V;
3435 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3439 if (PL_op->op_private & OPpSLICE) {
3443 hvtype = SvTYPE(hv);
3444 if (hvtype == SVt_PVHV) { /* hash element */
3445 while (++MARK <= SP) {
3446 sv = hv_delete_ent(hv, *MARK, discard, 0);
3447 *MARK = sv ? sv : &PL_sv_undef;
3450 else if (hvtype == SVt_PVAV) {
3451 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3452 while (++MARK <= SP) {
3453 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3454 *MARK = sv ? sv : &PL_sv_undef;
3457 else { /* pseudo-hash element */
3458 while (++MARK <= SP) {
3459 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
3460 *MARK = sv ? sv : &PL_sv_undef;
3465 DIE(aTHX_ "Not a HASH reference");
3468 else if (gimme == G_SCALAR) {
3477 if (SvTYPE(hv) == SVt_PVHV)
3478 sv = hv_delete_ent(hv, keysv, discard, 0);
3479 else if (SvTYPE(hv) == SVt_PVAV) {
3480 if (PL_op->op_flags & OPf_SPECIAL)
3481 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3483 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
3486 DIE(aTHX_ "Not a HASH reference");
3501 if (PL_op->op_private & OPpEXISTS_SUB) {
3505 cv = sv_2cv(sv, &hv, &gv, FALSE);
3508 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3514 if (SvTYPE(hv) == SVt_PVHV) {
3515 if (hv_exists_ent(hv, tmpsv, 0))
3518 else if (SvTYPE(hv) == SVt_PVAV) {
3519 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3520 if (av_exists((AV*)hv, SvIV(tmpsv)))
3523 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
3527 DIE(aTHX_ "Not a HASH reference");
3534 dSP; dMARK; dORIGMARK;
3535 register HV *hv = (HV*)POPs;
3536 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3537 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
3539 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
3540 DIE(aTHX_ "Can't localize pseudo-hash element");
3542 if (realhv || SvTYPE(hv) == SVt_PVAV) {
3543 while (++MARK <= SP) {
3546 I32 preeminent = SvRMAGICAL(hv) ? 1 : hv_exists_ent(hv, keysv, 0);
3548 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
3549 svp = he ? &HeVAL(he) : 0;
3552 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
3555 if (!svp || *svp == &PL_sv_undef) {
3557 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
3559 if (PL_op->op_private & OPpLVAL_INTRO) {
3561 save_helem(hv, keysv, svp);
3564 char *key = SvPV(keysv, keylen);
3565 SAVEDELETE(hv, savepvn(key,keylen), keylen);
3569 *MARK = svp ? *svp : &PL_sv_undef;
3572 if (GIMME != G_ARRAY) {
3580 /* List operators. */
3585 if (GIMME != G_ARRAY) {
3587 *MARK = *SP; /* unwanted list, return last item */
3589 *MARK = &PL_sv_undef;
3598 SV **lastrelem = PL_stack_sp;
3599 SV **lastlelem = PL_stack_base + POPMARK;
3600 SV **firstlelem = PL_stack_base + POPMARK + 1;
3601 register SV **firstrelem = lastlelem + 1;
3602 I32 arybase = PL_curcop->cop_arybase;
3603 I32 lval = PL_op->op_flags & OPf_MOD;
3604 I32 is_something_there = lval;
3606 register I32 max = lastrelem - lastlelem;
3607 register SV **lelem;
3610 if (GIMME != G_ARRAY) {
3611 ix = SvIVx(*lastlelem);
3616 if (ix < 0 || ix >= max)
3617 *firstlelem = &PL_sv_undef;
3619 *firstlelem = firstrelem[ix];
3625 SP = firstlelem - 1;
3629 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
3635 if (ix < 0 || ix >= max)
3636 *lelem = &PL_sv_undef;
3638 is_something_there = TRUE;
3639 if (!(*lelem = firstrelem[ix]))
3640 *lelem = &PL_sv_undef;
3643 if (is_something_there)
3646 SP = firstlelem - 1;
3652 dSP; dMARK; dORIGMARK;
3653 I32 items = SP - MARK;
3654 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
3655 SP = ORIGMARK; /* av_make() might realloc stack_sp */
3662 dSP; dMARK; dORIGMARK;
3663 HV* hv = (HV*)sv_2mortal((SV*)newHV());
3667 SV *val = NEWSV(46, 0);
3669 sv_setsv(val, *++MARK);
3670 else if (ckWARN(WARN_MISC))
3671 Perl_warner(aTHX_ WARN_MISC, "Odd number of elements in hash assignment");
3672 (void)hv_store_ent(hv,key,val,0);
3681 dSP; dMARK; dORIGMARK;
3682 register AV *ary = (AV*)*++MARK;
3686 register I32 offset;
3687 register I32 length;
3694 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3695 *MARK-- = SvTIED_obj((SV*)ary, mg);
3699 call_method("SPLICE",GIMME_V);
3708 offset = i = SvIVx(*MARK);
3710 offset += AvFILLp(ary) + 1;
3712 offset -= PL_curcop->cop_arybase;
3714 DIE(aTHX_ PL_no_aelem, i);
3716 length = SvIVx(*MARK++);
3718 length += AvFILLp(ary) - offset + 1;
3724 length = AvMAX(ary) + 1; /* close enough to infinity */
3728 length = AvMAX(ary) + 1;
3730 if (offset > AvFILLp(ary) + 1)
3731 offset = AvFILLp(ary) + 1;
3732 after = AvFILLp(ary) + 1 - (offset + length);
3733 if (after < 0) { /* not that much array */
3734 length += after; /* offset+length now in array */
3740 /* At this point, MARK .. SP-1 is our new LIST */
3743 diff = newlen - length;
3744 if (newlen && !AvREAL(ary) && AvREIFY(ary))
3747 if (diff < 0) { /* shrinking the area */
3749 New(451, tmparyval, newlen, SV*); /* so remember insertion */
3750 Copy(MARK, tmparyval, newlen, SV*);
3753 MARK = ORIGMARK + 1;
3754 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3755 MEXTEND(MARK, length);
3756 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
3758 EXTEND_MORTAL(length);
3759 for (i = length, dst = MARK; i; i--) {
3760 sv_2mortal(*dst); /* free them eventualy */
3767 *MARK = AvARRAY(ary)[offset+length-1];
3770 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
3771 SvREFCNT_dec(*dst++); /* free them now */
3774 AvFILLp(ary) += diff;
3776 /* pull up or down? */
3778 if (offset < after) { /* easier to pull up */
3779 if (offset) { /* esp. if nothing to pull */
3780 src = &AvARRAY(ary)[offset-1];
3781 dst = src - diff; /* diff is negative */
3782 for (i = offset; i > 0; i--) /* can't trust Copy */
3786 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
3790 if (after) { /* anything to pull down? */
3791 src = AvARRAY(ary) + offset + length;
3792 dst = src + diff; /* diff is negative */
3793 Move(src, dst, after, SV*);
3795 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
3796 /* avoid later double free */
3800 dst[--i] = &PL_sv_undef;
3803 for (src = tmparyval, dst = AvARRAY(ary) + offset;
3805 *dst = NEWSV(46, 0);
3806 sv_setsv(*dst++, *src++);
3808 Safefree(tmparyval);
3811 else { /* no, expanding (or same) */
3813 New(452, tmparyval, length, SV*); /* so remember deletion */
3814 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
3817 if (diff > 0) { /* expanding */
3819 /* push up or down? */
3821 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
3825 Move(src, dst, offset, SV*);
3827 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
3829 AvFILLp(ary) += diff;
3832 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
3833 av_extend(ary, AvFILLp(ary) + diff);
3834 AvFILLp(ary) += diff;
3837 dst = AvARRAY(ary) + AvFILLp(ary);
3839 for (i = after; i; i--) {
3846 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
3847 *dst = NEWSV(46, 0);
3848 sv_setsv(*dst++, *src++);
3850 MARK = ORIGMARK + 1;
3851 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3853 Copy(tmparyval, MARK, length, SV*);
3855 EXTEND_MORTAL(length);
3856 for (i = length, dst = MARK; i; i--) {
3857 sv_2mortal(*dst); /* free them eventualy */
3861 Safefree(tmparyval);
3865 else if (length--) {
3866 *MARK = tmparyval[length];
3869 while (length-- > 0)
3870 SvREFCNT_dec(tmparyval[length]);
3872 Safefree(tmparyval);
3875 *MARK = &PL_sv_undef;
3883 dSP; dMARK; dORIGMARK; dTARGET;
3884 register AV *ary = (AV*)*++MARK;
3885 register SV *sv = &PL_sv_undef;
3888 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3889 *MARK-- = SvTIED_obj((SV*)ary, mg);
3893 call_method("PUSH",G_SCALAR|G_DISCARD);
3898 /* Why no pre-extend of ary here ? */
3899 for (++MARK; MARK <= SP; MARK++) {
3902 sv_setsv(sv, *MARK);
3907 PUSHi( AvFILL(ary) + 1 );
3915 SV *sv = av_pop(av);
3917 (void)sv_2mortal(sv);
3926 SV *sv = av_shift(av);
3931 (void)sv_2mortal(sv);
3938 dSP; dMARK; dORIGMARK; dTARGET;
3939 register AV *ary = (AV*)*++MARK;
3944 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3945 *MARK-- = SvTIED_obj((SV*)ary, mg);
3949 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3954 av_unshift(ary, SP - MARK);
3957 sv_setsv(sv, *++MARK);
3958 (void)av_store(ary, i++, sv);
3962 PUSHi( AvFILL(ary) + 1 );
3972 if (GIMME == G_ARRAY) {
3979 /* safe as long as stack cannot get extended in the above */
3984 register char *down;
3989 SvUTF8_off(TARG); /* decontaminate */
3991 do_join(TARG, &PL_sv_no, MARK, SP);
3993 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3994 up = SvPV_force(TARG, len);
3996 if (DO_UTF8(TARG)) { /* first reverse each character */
3997 U8* s = (U8*)SvPVX(TARG);
3998 U8* send = (U8*)(s + len);
4000 if (UTF8_IS_INVARIANT(*s)) {
4005 if (!utf8_to_uvchr(s, 0))
4009 down = (char*)(s - 1);
4010 /* reverse this character */
4020 down = SvPVX(TARG) + len - 1;
4026 (void)SvPOK_only_UTF8(TARG);
4035 S_mul128(pTHX_ SV *sv, U8 m)
4038 char *s = SvPV(sv, len);
4042 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
4043 SV *tmpNew = newSVpvn("0000000000", 10);
4045 sv_catsv(tmpNew, sv);
4046 SvREFCNT_dec(sv); /* free old sv */
4051 while (!*t) /* trailing '\0'? */
4054 i = ((*t - '0') << 7) + m;
4055 *(t--) = '0' + (i % 10);
4061 /* Explosives and implosives. */
4063 #if 'I' == 73 && 'J' == 74
4064 /* On an ASCII/ISO kind of system */
4065 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
4068 Some other sort of character set - use memchr() so we don't match
4071 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
4079 I32 start_sp_offset = SP - PL_stack_base;
4080 I32 gimme = GIMME_V;
4084 register char *pat = SvPV(left, llen);
4085 #ifdef PACKED_IS_OCTETS
4086 /* Packed side is assumed to be octets - so force downgrade if it
4087 has been UTF-8 encoded by accident
4089 register char *s = SvPVbyte(right, rlen);
4091 register char *s = SvPV(right, rlen);
4093 char *strend = s + rlen;
4095 register char *patend = pat + llen;
4101 /* These must not be in registers: */
4118 register U32 culong;
4122 #ifdef PERL_NATINT_PACK
4123 int natint; /* native integer */
4124 int unatint; /* unsigned native integer */
4127 if (gimme != G_ARRAY) { /* arrange to do first one only */
4129 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
4130 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
4132 while (isDIGIT(*patend) || *patend == '*')
4138 while (pat < patend) {
4140 datumtype = *pat++ & 0xFF;
4141 #ifdef PERL_NATINT_PACK
4144 if (isSPACE(datumtype))
4146 if (datumtype == '#') {
4147 while (pat < patend && *pat != '\n')
4152 char *natstr = "sSiIlL";
4154 if (strchr(natstr, datumtype)) {
4155 #ifdef PERL_NATINT_PACK
4161 DIE(aTHX_ "'!' allowed only after types %s", natstr);
4166 else if (*pat == '*') {
4167 len = strend - strbeg; /* long enough */
4171 else if (isDIGIT(*pat)) {
4173 while (isDIGIT(*pat)) {
4174 len = (len * 10) + (*pat++ - '0');
4176 DIE(aTHX_ "Repeat count in unpack overflows");
4180 len = (datumtype != '@');
4184 DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
4185 case ',': /* grandfather in commas but with a warning */
4186 if (commas++ == 0 && ckWARN(WARN_UNPACK))
4187 Perl_warner(aTHX_ WARN_UNPACK,
4188 "Invalid type in unpack: '%c'", (int)datumtype);
4191 if (len == 1 && pat[-1] != '1')
4200 if (len > strend - strbeg)
4201 DIE(aTHX_ "@ outside of string");
4205 if (len > s - strbeg)
4206 DIE(aTHX_ "X outside of string");
4210 if (len > strend - s)
4211 DIE(aTHX_ "x outside of string");
4215 if (start_sp_offset >= SP - PL_stack_base)
4216 DIE(aTHX_ "/ must follow a numeric type");
4219 pat++; /* ignore '*' for compatibility with pack */
4221 DIE(aTHX_ "/ cannot take a count" );
4228 if (len > strend - s)
4231 goto uchar_checksum;
4232 sv = NEWSV(35, len);
4233 sv_setpvn(sv, s, len);
4235 if (datumtype == 'A' || datumtype == 'Z') {
4236 aptr = s; /* borrow register */
4237 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
4242 else { /* 'A' strips both nulls and spaces */
4243 s = SvPVX(sv) + len - 1;
4244 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
4248 SvCUR_set(sv, s - SvPVX(sv));
4249 s = aptr; /* unborrow register */
4251 XPUSHs(sv_2mortal(sv));
4255 if (star || len > (strend - s) * 8)
4256 len = (strend - s) * 8;
4259 Newz(601, PL_bitcount, 256, char);
4260 for (bits = 1; bits < 256; bits++) {
4261 if (bits & 1) PL_bitcount[bits]++;
4262 if (bits & 2) PL_bitcount[bits]++;
4263 if (bits & 4) PL_bitcount[bits]++;
4264 if (bits & 8) PL_bitcount[bits]++;
4265 if (bits & 16) PL_bitcount[bits]++;
4266 if (bits & 32) PL_bitcount[bits]++;
4267 if (bits & 64) PL_bitcount[bits]++;
4268 if (bits & 128) PL_bitcount[bits]++;
4272 culong += PL_bitcount[*(unsigned char*)s++];
4277 if (datumtype == 'b') {
4279 if (bits & 1) culong++;
4285 if (bits & 128) culong++;
4292 sv = NEWSV(35, len + 1);
4296 if (datumtype == 'b') {
4298 for (len = 0; len < aint; len++) {
4299 if (len & 7) /*SUPPRESS 595*/
4303 *str++ = '0' + (bits & 1);
4308 for (len = 0; len < aint; len++) {
4313 *str++ = '0' + ((bits & 128) != 0);
4317 XPUSHs(sv_2mortal(sv));
4321 if (star || len > (strend - s) * 2)
4322 len = (strend - s) * 2;
4323 sv = NEWSV(35, len + 1);
4327 if (datumtype == 'h') {
4329 for (len = 0; len < aint; len++) {
4334 *str++ = PL_hexdigit[bits & 15];
4339 for (len = 0; len < aint; len++) {
4344 *str++ = PL_hexdigit[(bits >> 4) & 15];
4348 XPUSHs(sv_2mortal(sv));
4351 if (len > strend - s)
4356 if (aint >= 128) /* fake up signed chars */
4366 if (aint >= 128) /* fake up signed chars */
4369 sv_setiv(sv, (IV)aint);
4370 PUSHs(sv_2mortal(sv));
4375 if (len > strend - s)
4390 sv_setiv(sv, (IV)auint);
4391 PUSHs(sv_2mortal(sv));
4396 if (len > strend - s)
4399 while (len-- > 0 && s < strend) {
4401 auint = utf8n_to_uvchr((U8*)s, strend - s, &alen, 0);
4405 cdouble += (NV)auint;
4413 while (len-- > 0 && s < strend) {
4415 auint = utf8n_to_uvchr((U8*)s, strend - s, &alen, 0);
4419 sv_setuv(sv, (UV)auint);
4420 PUSHs(sv_2mortal(sv));
4425 #if SHORTSIZE == SIZE16
4426 along = (strend - s) / SIZE16;
4428 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
4433 #if SHORTSIZE != SIZE16
4437 COPYNN(s, &ashort, sizeof(short));
4448 #if SHORTSIZE > SIZE16
4460 #if SHORTSIZE != SIZE16
4464 COPYNN(s, &ashort, sizeof(short));
4467 sv_setiv(sv, (IV)ashort);
4468 PUSHs(sv_2mortal(sv));
4476 #if SHORTSIZE > SIZE16
4482 sv_setiv(sv, (IV)ashort);
4483 PUSHs(sv_2mortal(sv));
4491 #if SHORTSIZE == SIZE16
4492 along = (strend - s) / SIZE16;
4494 unatint = natint && datumtype == 'S';
4495 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
4500 #if SHORTSIZE != SIZE16
4502 unsigned short aushort;
4504 COPYNN(s, &aushort, sizeof(unsigned short));
4505 s += sizeof(unsigned short);
4513 COPY16(s, &aushort);
4516 if (datumtype == 'n')
4517 aushort = PerlSock_ntohs(aushort);
4520 if (datumtype == 'v')
4521 aushort = vtohs(aushort);
4530 #if SHORTSIZE != SIZE16
4532 unsigned short aushort;
4534 COPYNN(s, &aushort, sizeof(unsigned short));
4535 s += sizeof(unsigned short);
4537 sv_setiv(sv, (UV)aushort);
4538 PUSHs(sv_2mortal(sv));
4545 COPY16(s, &aushort);
4549 if (datumtype == 'n')
4550 aushort = PerlSock_ntohs(aushort);
4553 if (datumtype == 'v')
4554 aushort = vtohs(aushort);
4556 sv_setiv(sv, (UV)aushort);
4557 PUSHs(sv_2mortal(sv));
4563 along = (strend - s) / sizeof(int);
4568 Copy(s, &aint, 1, int);
4571 cdouble += (NV)aint;
4580 Copy(s, &aint, 1, int);
4584 /* Without the dummy below unpack("i", pack("i",-1))
4585 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
4586 * cc with optimization turned on.
4588 * The bug was detected in
4589 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
4590 * with optimization (-O4) turned on.
4591 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
4592 * does not have this problem even with -O4.
4594 * This bug was reported as DECC_BUGS 1431
4595 * and tracked internally as GEM_BUGS 7775.
4597 * The bug is fixed in
4598 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
4599 * UNIX V4.0F support: DEC C V5.9-006 or later
4600 * UNIX V4.0E support: DEC C V5.8-011 or later
4603 * See also few lines later for the same bug.
4606 sv_setiv(sv, (IV)aint) :
4608 sv_setiv(sv, (IV)aint);
4609 PUSHs(sv_2mortal(sv));
4614 along = (strend - s) / sizeof(unsigned int);
4619 Copy(s, &auint, 1, unsigned int);
4620 s += sizeof(unsigned int);
4622 cdouble += (NV)auint;
4631 Copy(s, &auint, 1, unsigned int);
4632 s += sizeof(unsigned int);
4635 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
4636 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
4637 * See details few lines earlier. */
4639 sv_setuv(sv, (UV)auint) :
4641 sv_setuv(sv, (UV)auint);
4642 PUSHs(sv_2mortal(sv));
4647 #if LONGSIZE == SIZE32
4648 along = (strend - s) / SIZE32;
4650 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
4655 #if LONGSIZE != SIZE32
4658 COPYNN(s, &along, sizeof(long));
4661 cdouble += (NV)along;
4670 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
4674 #if LONGSIZE > SIZE32
4675 if (along > 2147483647)
4676 along -= 4294967296;
4680 cdouble += (NV)along;
4689 #if LONGSIZE != SIZE32
4692 COPYNN(s, &along, sizeof(long));
4695 sv_setiv(sv, (IV)along);
4696 PUSHs(sv_2mortal(sv));
4703 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
4707 #if LONGSIZE > SIZE32
4708 if (along > 2147483647)
4709 along -= 4294967296;
4713 sv_setiv(sv, (IV)along);
4714 PUSHs(sv_2mortal(sv));
4722 #if LONGSIZE == SIZE32
4723 along = (strend - s) / SIZE32;
4725 unatint = natint && datumtype == 'L';
4726 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
4731 #if LONGSIZE != SIZE32
4733 unsigned long aulong;
4735 COPYNN(s, &aulong, sizeof(unsigned long));
4736 s += sizeof(unsigned long);
4738 cdouble += (NV)aulong;
4750 if (datumtype == 'N')
4751 aulong = PerlSock_ntohl(aulong);
4754 if (datumtype == 'V')
4755 aulong = vtohl(aulong);
4758 cdouble += (NV)aulong;
4767 #if LONGSIZE != SIZE32
4769 unsigned long aulong;
4771 COPYNN(s, &aulong, sizeof(unsigned long));
4772 s += sizeof(unsigned long);
4774 sv_setuv(sv, (UV)aulong);
4775 PUSHs(sv_2mortal(sv));
4785 if (datumtype == 'N')
4786 aulong = PerlSock_ntohl(aulong);
4789 if (datumtype == 'V')
4790 aulong = vtohl(aulong);
4793 sv_setuv(sv, (UV)aulong);
4794 PUSHs(sv_2mortal(sv));
4800 along = (strend - s) / sizeof(char*);
4806 if (sizeof(char*) > strend - s)
4809 Copy(s, &aptr, 1, char*);
4815 PUSHs(sv_2mortal(sv));
4825 while ((len > 0) && (s < strend)) {
4826 auv = (auv << 7) | (*s & 0x7f);
4827 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
4828 if ((U8)(*s++) < 0x80) {
4832 PUSHs(sv_2mortal(sv));
4836 else if (++bytes >= sizeof(UV)) { /* promote to string */
4840 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
4841 while (s < strend) {
4842 sv = mul128(sv, *s & 0x7f);
4843 if (!(*s++ & 0x80)) {
4852 PUSHs(sv_2mortal(sv));
4857 if ((s >= strend) && bytes)
4858 DIE(aTHX_ "Unterminated compressed integer");
4863 if (sizeof(char*) > strend - s)
4866 Copy(s, &aptr, 1, char*);
4871 sv_setpvn(sv, aptr, len);
4872 PUSHs(sv_2mortal(sv));
4876 along = (strend - s) / sizeof(Quad_t);
4882 if (s + sizeof(Quad_t) > strend)
4885 Copy(s, &aquad, 1, Quad_t);
4886 s += sizeof(Quad_t);
4889 if (aquad >= IV_MIN && aquad <= IV_MAX)
4890 sv_setiv(sv, (IV)aquad);
4892 sv_setnv(sv, (NV)aquad);
4893 PUSHs(sv_2mortal(sv));
4897 along = (strend - s) / sizeof(Quad_t);
4903 if (s + sizeof(Uquad_t) > strend)
4906 Copy(s, &auquad, 1, Uquad_t);
4907 s += sizeof(Uquad_t);
4910 if (auquad <= UV_MAX)
4911 sv_setuv(sv, (UV)auquad);
4913 sv_setnv(sv, (NV)auquad);
4914 PUSHs(sv_2mortal(sv));
4918 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
4921 along = (strend - s) / sizeof(float);
4926 Copy(s, &afloat, 1, float);
4935 Copy(s, &afloat, 1, float);
4938 sv_setnv(sv, (NV)afloat);
4939 PUSHs(sv_2mortal(sv));
4945 along = (strend - s) / sizeof(double);
4950 Copy(s, &adouble, 1, double);
4951 s += sizeof(double);
4959 Copy(s, &adouble, 1, double);
4960 s += sizeof(double);
4962 sv_setnv(sv, (NV)adouble);
4963 PUSHs(sv_2mortal(sv));
4969 * Initialise the decode mapping. By using a table driven
4970 * algorithm, the code will be character-set independent
4971 * (and just as fast as doing character arithmetic)
4973 if (PL_uudmap['M'] == 0) {
4976 for (i = 0; i < sizeof(PL_uuemap); i += 1)
4977 PL_uudmap[(U8)PL_uuemap[i]] = i;
4979 * Because ' ' and '`' map to the same value,
4980 * we need to decode them both the same.
4985 along = (strend - s) * 3 / 4;
4986 sv = NEWSV(42, along);
4989 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
4994 len = PL_uudmap[*(U8*)s++] & 077;
4996 if (s < strend && ISUUCHAR(*s))
4997 a = PL_uudmap[*(U8*)s++] & 077;
5000 if (s < strend && ISUUCHAR(*s))
5001 b = PL_uudmap[*(U8*)s++] & 077;
5004 if (s < strend && ISUUCHAR(*s))
5005 c = PL_uudmap[*(U8*)s++] & 077;
5008 if (s < strend && ISUUCHAR(*s))
5009 d = PL_uudmap[*(U8*)s++] & 077;
5012 hunk[0] = (a << 2) | (b >> 4);
5013 hunk[1] = (b << 4) | (c >> 2);
5014 hunk[2] = (c << 6) | d;
5015 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
5020 else if (s[1] == '\n') /* possible checksum byte */
5023 XPUSHs(sv_2mortal(sv));
5028 if (strchr("fFdD", datumtype) ||
5029 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
5033 while (checksum >= 16) {
5037 while (checksum >= 4) {
5043 along = (1 << checksum) - 1;
5044 while (cdouble < 0.0)
5046 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
5047 sv_setnv(sv, cdouble);
5050 if (checksum < 32) {
5051 aulong = (1 << checksum) - 1;
5054 sv_setuv(sv, (UV)culong);
5056 XPUSHs(sv_2mortal(sv));
5060 if (SP - PL_stack_base == start_sp_offset && gimme == G_SCALAR)
5061 PUSHs(&PL_sv_undef);
5066 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
5070 *hunk = PL_uuemap[len];
5071 sv_catpvn(sv, hunk, 1);
5074 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
5075 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
5076 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
5077 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
5078 sv_catpvn(sv, hunk, 4);
5083 char r = (len > 1 ? s[1] : '\0');
5084 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
5085 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
5086 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
5087 hunk[3] = PL_uuemap[0];
5088 sv_catpvn(sv, hunk, 4);
5090 sv_catpvn(sv, "\n", 1);
5094 S_is_an_int(pTHX_ char *s, STRLEN l)
5097 SV *result = newSVpvn(s, l);
5098 char *result_c = SvPV(result, n_a); /* convenience */
5099 char *out = result_c;
5109 SvREFCNT_dec(result);
5132 SvREFCNT_dec(result);
5138 SvCUR_set(result, out - result_c);
5142 /* pnum must be '\0' terminated */
5144 S_div128(pTHX_ SV *pnum, bool *done)
5147 char *s = SvPV(pnum, len);
5156 i = m * 10 + (*t - '0');
5158 r = (i >> 7); /* r < 10 */
5165 SvCUR_set(pnum, (STRLEN) (t - s));
5172 dSP; dMARK; dORIGMARK; dTARGET;
5173 register SV *cat = TARG;
5176 register char *pat = SvPVx(*++MARK, fromlen);
5178 register char *patend = pat + fromlen;
5183 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
5184 static char *space10 = " ";
5186 /* These must not be in registers: */
5201 #ifdef PERL_NATINT_PACK
5202 int natint; /* native integer */
5207 sv_setpvn(cat, "", 0);
5209 while (pat < patend) {
5210 SV *lengthcode = Nullsv;
5211 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
5212 datumtype = *pat++ & 0xFF;
5213 #ifdef PERL_NATINT_PACK
5216 if (isSPACE(datumtype)) {
5220 #ifndef PACKED_IS_OCTETS
5221 if (datumtype == 'U' && pat == patcopy+1)
5224 if (datumtype == '#') {
5225 while (pat < patend && *pat != '\n')
5230 char *natstr = "sSiIlL";
5232 if (strchr(natstr, datumtype)) {
5233 #ifdef PERL_NATINT_PACK
5239 DIE(aTHX_ "'!' allowed only after types %s", natstr);
5242 len = strchr("@Xxu", datumtype) ? 0 : items;
5245 else if (isDIGIT(*pat)) {
5247 while (isDIGIT(*pat)) {
5248 len = (len * 10) + (*pat++ - '0');
5250 DIE(aTHX_ "Repeat count in pack overflows");
5257 if ((*pat != 'a' && *pat != 'A' && *pat != 'Z') || pat[1] != '*')
5258 DIE(aTHX_ "/ must be followed by a*, A* or Z*");
5259 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
5260 ? *MARK : &PL_sv_no)
5261 + (*pat == 'Z' ? 1 : 0)));
5265 DIE(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
5266 case ',': /* grandfather in commas but with a warning */
5267 if (commas++ == 0 && ckWARN(WARN_PACK))
5268 Perl_warner(aTHX_ WARN_PACK,
5269 "Invalid type in pack: '%c'", (int)datumtype);
5272 DIE(aTHX_ "%% may only be used in unpack");
5283 if (SvCUR(cat) < len)
5284 DIE(aTHX_ "X outside of string");
5291 sv_catpvn(cat, null10, 10);
5294 sv_catpvn(cat, null10, len);
5300 aptr = SvPV(fromstr, fromlen);
5301 if (pat[-1] == '*') {
5303 if (datumtype == 'Z')
5306 if (fromlen >= len) {
5307 sv_catpvn(cat, aptr, len);
5308 if (datumtype == 'Z')
5309 *(SvEND(cat)-1) = '\0';
5312 sv_catpvn(cat, aptr, fromlen);
5314 if (datumtype == 'A') {
5316 sv_catpvn(cat, space10, 10);
5319 sv_catpvn(cat, space10, len);
5323 sv_catpvn(cat, null10, 10);
5326 sv_catpvn(cat, null10, len);
5338 str = SvPV(fromstr, fromlen);
5342 SvCUR(cat) += (len+7)/8;
5343 SvGROW(cat, SvCUR(cat) + 1);
5344 aptr = SvPVX(cat) + aint;
5349 if (datumtype == 'B') {
5350 for (len = 0; len++ < aint;) {
5351 items |= *str++ & 1;
5355 *aptr++ = items & 0xff;
5361 for (len = 0; len++ < aint;) {
5367 *aptr++ = items & 0xff;
5373 if (datumtype == 'B')
5374 items <<= 7 - (aint & 7);
5376 items >>= 7 - (aint & 7);
5377 *aptr++ = items & 0xff;
5379 str = SvPVX(cat) + SvCUR(cat);
5394 str = SvPV(fromstr, fromlen);
5398 SvCUR(cat) += (len+1)/2;
5399 SvGROW(cat, SvCUR(cat) + 1);
5400 aptr = SvPVX(cat) + aint;
5405 if (datumtype == 'H') {
5406 for (len = 0; len++ < aint;) {
5408 items |= ((*str++ & 15) + 9) & 15;
5410 items |= *str++ & 15;
5414 *aptr++ = items & 0xff;
5420 for (len = 0; len++ < aint;) {
5422 items |= (((*str++ & 15) + 9) & 15) << 4;
5424 items |= (*str++ & 15) << 4;
5428 *aptr++ = items & 0xff;
5434 *aptr++ = items & 0xff;
5435 str = SvPVX(cat) + SvCUR(cat);
5446 aint = SvIV(fromstr);
5448 sv_catpvn(cat, &achar, sizeof(char));
5454 auint = SvUV(fromstr);
5455 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
5456 SvCUR_set(cat, (char*)uvchr_to_utf8((U8*)SvEND(cat),auint)
5461 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
5466 afloat = (float)SvNV(fromstr);
5467 sv_catpvn(cat, (char *)&afloat, sizeof (float));
5474 adouble = (double)SvNV(fromstr);
5475 sv_catpvn(cat, (char *)&adouble, sizeof (double));
5481 ashort = (I16)SvIV(fromstr);
5483 ashort = PerlSock_htons(ashort);
5485 CAT16(cat, &ashort);
5491 ashort = (I16)SvIV(fromstr);
5493 ashort = htovs(ashort);
5495 CAT16(cat, &ashort);
5499 #if SHORTSIZE != SIZE16
5501 unsigned short aushort;
5505 aushort = SvUV(fromstr);
5506 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
5516 aushort = (U16)SvUV(fromstr);
5517 CAT16(cat, &aushort);
5523 #if SHORTSIZE != SIZE16
5529 ashort = SvIV(fromstr);
5530 sv_catpvn(cat, (char *)&ashort, sizeof(short));
5538 ashort = (I16)SvIV(fromstr);
5539 CAT16(cat, &ashort);
5546 auint = SvUV(fromstr);
5547 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
5553 adouble = Perl_floor(SvNV(fromstr));
5556 DIE(aTHX_ "Cannot compress negative numbers");
5559 #if UVSIZE > 4 && UVSIZE >= NVSIZE
5560 adouble <= 0xffffffff
5562 # ifdef CXUX_BROKEN_CONSTANT_CONVERT
5563 adouble <= UV_MAX_cxux
5570 char buf[1 + sizeof(UV)];
5571 char *in = buf + sizeof(buf);
5572 UV auv = U_V(adouble);
5575 *--in = (auv & 0x7f) | 0x80;
5578 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
5579 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
5581 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
5582 char *from, *result, *in;
5587 /* Copy string and check for compliance */
5588 from = SvPV(fromstr, len);
5589 if ((norm = is_an_int(from, len)) == NULL)
5590 DIE(aTHX_ "can compress only unsigned integer");
5592 New('w', result, len, char);
5596 *--in = div128(norm, &done) | 0x80;
5597 result[len - 1] &= 0x7F; /* clear continue bit */
5598 sv_catpvn(cat, in, (result + len) - in);
5600 SvREFCNT_dec(norm); /* free norm */
5602 else if (SvNOKp(fromstr)) {
5603 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
5604 char *in = buf + sizeof(buf);
5607 double next = floor(adouble / 128);
5608 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
5609 if (in <= buf) /* this cannot happen ;-) */
5610 DIE(aTHX_ "Cannot compress integer");
5613 } while (adouble > 0);
5614 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
5615 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
5618 DIE(aTHX_ "Cannot compress non integer");
5624 aint = SvIV(fromstr);
5625 sv_catpvn(cat, (char*)&aint, sizeof(int));
5631 aulong = SvUV(fromstr);
5633 aulong = PerlSock_htonl(aulong);
5635 CAT32(cat, &aulong);
5641 aulong = SvUV(fromstr);
5643 aulong = htovl(aulong);
5645 CAT32(cat, &aulong);
5649 #if LONGSIZE != SIZE32
5651 unsigned long aulong;
5655 aulong = SvUV(fromstr);
5656 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
5664 aulong = SvUV(fromstr);
5665 CAT32(cat, &aulong);
5670 #if LONGSIZE != SIZE32
5676 along = SvIV(fromstr);
5677 sv_catpvn(cat, (char *)&along, sizeof(long));
5685 along = SvIV(fromstr);
5694 auquad = (Uquad_t)SvUV(fromstr);
5695 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
5701 aquad = (Quad_t)SvIV(fromstr);
5702 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
5707 len = 1; /* assume SV is correct length */
5712 if (fromstr == &PL_sv_undef)
5716 /* XXX better yet, could spirit away the string to
5717 * a safe spot and hang on to it until the result
5718 * of pack() (and all copies of the result) are
5721 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
5722 || (SvPADTMP(fromstr)
5723 && !SvREADONLY(fromstr))))
5725 Perl_warner(aTHX_ WARN_PACK,
5726 "Attempt to pack pointer to temporary value");
5728 if (SvPOK(fromstr) || SvNIOK(fromstr))
5729 aptr = SvPV(fromstr,n_a);
5731 aptr = SvPV_force(fromstr,n_a);
5733 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
5738 aptr = SvPV(fromstr, fromlen);
5739 SvGROW(cat, fromlen * 4 / 3);
5744 while (fromlen > 0) {
5751 doencodes(cat, aptr, todo);
5770 register IV limit = POPi; /* note, negative is forever */
5773 register char *s = SvPV(sv, len);
5774 bool do_utf8 = DO_UTF8(sv);
5775 char *strend = s + len;
5777 register REGEXP *rx;
5781 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
5782 I32 maxiters = slen + 10;
5785 I32 origlimit = limit;
5788 AV *oldstack = PL_curstack;
5789 I32 gimme = GIMME_V;
5790 I32 oldsave = PL_savestack_ix;
5791 I32 make_mortal = 1;
5792 MAGIC *mg = (MAGIC *) NULL;
5795 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
5800 DIE(aTHX_ "panic: pp_split");
5801 rx = pm->op_pmregexp;
5803 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
5804 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
5806 if (pm->op_pmreplroot) {
5808 ary = GvAVn((GV*)PL_curpad[(PADOFFSET)pm->op_pmreplroot]);
5810 ary = GvAVn((GV*)pm->op_pmreplroot);
5813 else if (gimme != G_ARRAY)
5815 ary = (AV*)PL_curpad[0];
5817 ary = GvAVn(PL_defgv);
5818 #endif /* USE_THREADS */
5821 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
5827 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
5829 XPUSHs(SvTIED_obj((SV*)ary, mg));
5835 for (i = AvFILLp(ary); i >= 0; i--)
5836 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5838 /* temporarily switch stacks */
5839 SWITCHSTACK(PL_curstack, ary);
5843 base = SP - PL_stack_base;
5845 if (pm->op_pmflags & PMf_SKIPWHITE) {
5846 if (pm->op_pmflags & PMf_LOCALE) {
5847 while (isSPACE_LC(*s))
5855 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
5856 SAVEINT(PL_multiline);
5857 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
5861 limit = maxiters + 2;
5862 if (pm->op_pmflags & PMf_WHITE) {
5865 while (m < strend &&
5866 !((pm->op_pmflags & PMf_LOCALE)
5867 ? isSPACE_LC(*m) : isSPACE(*m)))
5872 dstr = NEWSV(30, m-s);
5873 sv_setpvn(dstr, s, m-s);
5877 (void)SvUTF8_on(dstr);
5881 while (s < strend &&
5882 ((pm->op_pmflags & PMf_LOCALE)
5883 ? isSPACE_LC(*s) : isSPACE(*s)))
5887 else if (strEQ("^", rx->precomp)) {
5890 for (m = s; m < strend && *m != '\n'; m++) ;
5894 dstr = NEWSV(30, m-s);
5895 sv_setpvn(dstr, s, m-s);
5899 (void)SvUTF8_on(dstr);
5904 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
5905 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
5906 && (rx->reganch & ROPT_CHECK_ALL)
5907 && !(rx->reganch & ROPT_ANCH)) {
5908 int tail = (rx->reganch & RE_INTUIT_TAIL);
5909 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
5912 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
5914 char c = *SvPV(csv, n_a);
5917 for (m = s; m < strend && *m != c; m++) ;
5920 dstr = NEWSV(30, m-s);
5921 sv_setpvn(dstr, s, m-s);
5925 (void)SvUTF8_on(dstr);
5927 /* The rx->minlen is in characters but we want to step
5928 * s ahead by bytes. */
5930 s = (char*)utf8_hop((U8*)m, len);
5932 s = m + len; /* Fake \n at the end */
5937 while (s < strend && --limit &&
5938 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
5939 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
5942 dstr = NEWSV(31, m-s);
5943 sv_setpvn(dstr, s, m-s);
5947 (void)SvUTF8_on(dstr);
5949 /* The rx->minlen is in characters but we want to step
5950 * s ahead by bytes. */
5952 s = (char*)utf8_hop((U8*)m, len);
5954 s = m + len; /* Fake \n at the end */
5959 maxiters += slen * rx->nparens;
5960 while (s < strend && --limit
5961 /* && (!rx->check_substr
5962 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
5964 */ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
5965 1 /* minend */, sv, NULL, 0))
5967 TAINT_IF(RX_MATCH_TAINTED(rx));
5968 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
5973 strend = s + (strend - m);
5975 m = rx->startp[0] + orig;
5976 dstr = NEWSV(32, m-s);
5977 sv_setpvn(dstr, s, m-s);
5981 (void)SvUTF8_on(dstr);
5984 for (i = 1; i <= rx->nparens; i++) {
5985 s = rx->startp[i] + orig;
5986 m = rx->endp[i] + orig;
5988 dstr = NEWSV(33, m-s);
5989 sv_setpvn(dstr, s, m-s);
5992 dstr = NEWSV(33, 0);
5996 (void)SvUTF8_on(dstr);
6000 s = rx->endp[0] + orig;
6004 LEAVE_SCOPE(oldsave);
6005 iters = (SP - PL_stack_base) - base;
6006 if (iters > maxiters)
6007 DIE(aTHX_ "Split loop");
6009 /* keep field after final delim? */
6010 if (s < strend || (iters && origlimit)) {
6011 STRLEN l = strend - s;
6012 dstr = NEWSV(34, l);
6013 sv_setpvn(dstr, s, l);
6017 (void)SvUTF8_on(dstr);
6021 else if (!origlimit) {
6022 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
6028 SWITCHSTACK(ary, oldstack);
6029 if (SvSMAGICAL(ary)) {
6034 if (gimme == G_ARRAY) {
6036 Copy(AvARRAY(ary), SP + 1, iters, SV*);
6044 call_method("PUSH",G_SCALAR|G_DISCARD);
6047 if (gimme == G_ARRAY) {
6048 /* EXTEND should not be needed - we just popped them */
6050 for (i=0; i < iters; i++) {
6051 SV **svp = av_fetch(ary, i, FALSE);
6052 PUSHs((svp) ? *svp : &PL_sv_undef);
6059 if (gimme == G_ARRAY)
6062 if (iters || !pm->op_pmreplroot) {
6072 Perl_unlock_condpair(pTHX_ void *svv)
6074 MAGIC *mg = mg_find((SV*)svv, 'm');
6077 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
6078 MUTEX_LOCK(MgMUTEXP(mg));
6079 if (MgOWNER(mg) != thr)
6080 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
6082 COND_SIGNAL(MgOWNERCONDP(mg));
6083 DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": unlock 0x%"UVxf"\n",
6084 PTR2UV(thr), PTR2UV(svv));)
6085 MUTEX_UNLOCK(MgMUTEXP(mg));
6087 #endif /* USE_THREADS */
6096 #endif /* USE_THREADS */
6097 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
6098 || SvTYPE(retsv) == SVt_PVCV) {
6099 retsv = refto(retsv);
6110 if (PL_op->op_private & OPpLVAL_INTRO)
6111 PUSHs(*save_threadsv(PL_op->op_targ));
6113 PUSHs(THREADSV(PL_op->op_targ));
6116 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
6117 #endif /* USE_THREADS */