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_SCALARREF
452 /* But globs are already references (kinda) */
453 && (oa & (OA_OPTIONAL - 1)) != OA_FILEREF
457 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
461 ret = sv_2mortal(newSVpvn(str, n - 1));
463 else if (code) /* Non-Overridable */
465 else { /* None such */
467 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
471 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
473 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
482 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
484 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
500 if (GIMME != G_ARRAY) {
504 *MARK = &PL_sv_undef;
505 *MARK = refto(*MARK);
509 EXTEND_MORTAL(SP - MARK);
511 *MARK = refto(*MARK);
516 S_refto(pTHX_ SV *sv)
520 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
523 if (!(sv = LvTARG(sv)))
526 (void)SvREFCNT_inc(sv);
528 else if (SvTYPE(sv) == SVt_PVAV) {
529 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
532 (void)SvREFCNT_inc(sv);
534 else if (SvPADTMP(sv))
538 (void)SvREFCNT_inc(sv);
541 sv_upgrade(rv, SVt_RV);
555 if (sv && SvGMAGICAL(sv))
558 if (!sv || !SvROK(sv))
562 pv = sv_reftype(sv,TRUE);
563 PUSHp(pv, strlen(pv));
573 stash = CopSTASH(PL_curcop);
579 if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
580 Perl_croak(aTHX_ "Attempt to bless into a reference");
582 if (ckWARN(WARN_MISC) && len == 0)
583 Perl_warner(aTHX_ WARN_MISC,
584 "Explicit blessing to '' (assuming package main)");
585 stash = gv_stashpvn(ptr, len, TRUE);
588 (void)sv_bless(TOPs, stash);
602 elem = SvPV(sv, n_a);
606 switch (elem ? *elem : '\0')
609 if (strEQ(elem, "ARRAY"))
610 tmpRef = (SV*)GvAV(gv);
613 if (strEQ(elem, "CODE"))
614 tmpRef = (SV*)GvCVu(gv);
617 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
618 tmpRef = (SV*)GvIOp(gv);
620 if (strEQ(elem, "FORMAT"))
621 tmpRef = (SV*)GvFORM(gv);
624 if (strEQ(elem, "GLOB"))
628 if (strEQ(elem, "HASH"))
629 tmpRef = (SV*)GvHV(gv);
632 if (strEQ(elem, "IO"))
633 tmpRef = (SV*)GvIOp(gv);
636 if (strEQ(elem, "NAME"))
637 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
640 if (strEQ(elem, "PACKAGE"))
641 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
644 if (strEQ(elem, "SCALAR"))
658 /* Pattern matching */
663 register unsigned char *s;
666 register I32 *sfirst;
670 if (sv == PL_lastscream) {
676 SvSCREAM_off(PL_lastscream);
677 SvREFCNT_dec(PL_lastscream);
679 PL_lastscream = SvREFCNT_inc(sv);
682 s = (unsigned char*)(SvPV(sv, len));
686 if (pos > PL_maxscream) {
687 if (PL_maxscream < 0) {
688 PL_maxscream = pos + 80;
689 New(301, PL_screamfirst, 256, I32);
690 New(302, PL_screamnext, PL_maxscream, I32);
693 PL_maxscream = pos + pos / 4;
694 Renew(PL_screamnext, PL_maxscream, I32);
698 sfirst = PL_screamfirst;
699 snext = PL_screamnext;
701 if (!sfirst || !snext)
702 DIE(aTHX_ "do_study: out of memory");
704 for (ch = 256; ch; --ch)
711 snext[pos] = sfirst[ch] - pos;
718 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
727 if (PL_op->op_flags & OPf_STACKED)
733 TARG = sv_newmortal();
738 /* Lvalue operators. */
750 dSP; dMARK; dTARGET; dORIGMARK;
752 do_chop(TARG, *++MARK);
761 SETi(do_chomp(TOPs));
768 register I32 count = 0;
771 count += do_chomp(POPs);
782 if (!sv || !SvANY(sv))
784 switch (SvTYPE(sv)) {
786 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
790 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
794 if (CvROOT(sv) || CvXSUB(sv))
811 if (!PL_op->op_private) {
820 if (SvTHINKFIRST(sv))
823 switch (SvTYPE(sv)) {
833 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
834 Perl_warner(aTHX_ WARN_MISC, "Constant subroutine %s undefined",
835 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
839 /* let user-undef'd sub keep its identity */
840 GV* gv = CvGV((CV*)sv);
847 SvSetMagicSV(sv, &PL_sv_undef);
851 Newz(602, gp, 1, GP);
852 GvGP(sv) = gp_ref(gp);
853 GvSV(sv) = NEWSV(72,0);
854 GvLINE(sv) = CopLINE(PL_curcop);
860 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
863 SvPV_set(sv, Nullch);
876 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
877 DIE(aTHX_ PL_no_modify);
878 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
879 SvIVX(TOPs) != IV_MIN)
882 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
893 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
894 DIE(aTHX_ PL_no_modify);
895 sv_setsv(TARG, TOPs);
896 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
897 SvIVX(TOPs) != IV_MAX)
900 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
914 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
915 DIE(aTHX_ PL_no_modify);
916 sv_setsv(TARG, TOPs);
917 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
918 SvIVX(TOPs) != IV_MIN)
921 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
930 /* Ordinary operators. */
934 dSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
937 SETn( Perl_pow( left, right) );
944 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
945 #ifdef PERL_PRESERVE_IVUV
948 /* Unless the left argument is integer in range we are going to have to
949 use NV maths. Hence only attempt to coerce the right argument if
950 we know the left is integer. */
951 /* Left operand is defined, so is it IV? */
954 bool auvok = SvUOK(TOPm1s);
955 bool buvok = SvUOK(TOPs);
956 const UV topmask = (~ (UV)0) << (4 * sizeof (UV));
957 const UV botmask = ~((~ (UV)0) << (4 * sizeof (UV)));
964 alow = SvUVX(TOPm1s);
966 IV aiv = SvIVX(TOPm1s);
969 auvok = TRUE; /* effectively it's a UV now */
971 alow = -aiv; /* abs, auvok == false records sign */
977 IV biv = SvIVX(TOPs);
980 buvok = TRUE; /* effectively it's a UV now */
982 blow = -biv; /* abs, buvok == false records sign */
986 /* If this does sign extension on unsigned it's time for plan B */
987 ahigh = alow >> (4 * sizeof (UV));
989 bhigh = blow >> (4 * sizeof (UV));
991 if (ahigh && bhigh) {
992 /* eg 32 bit is at least 0x10000 * 0x10000 == 0x100000000
993 which is overflow. Drop to NVs below. */
994 } else if (!ahigh && !bhigh) {
995 /* eg 32 bit is at most 0xFFFF * 0xFFFF == 0xFFFE0001
996 so the unsigned multiply cannot overflow. */
997 UV product = alow * blow;
998 if (auvok == buvok) {
999 /* -ve * -ve or +ve * +ve gives a +ve result. */
1003 } else if (product <= (UV)IV_MIN) {
1004 /* 2s complement assumption that (UV)-IV_MIN is correct. */
1005 /* -ve result, which could overflow an IV */
1009 } /* else drop to NVs below. */
1011 /* One operand is large, 1 small */
1014 /* swap the operands */
1016 bhigh = blow; /* bhigh now the temp var for the swap */
1020 /* now, ((ahigh * blow) << half_UV_len) + (alow * blow)
1021 multiplies can't overflow. shift can, add can, -ve can. */
1022 product_middle = ahigh * blow;
1023 if (!(product_middle & topmask)) {
1024 /* OK, (ahigh * blow) won't lose bits when we shift it. */
1026 product_middle <<= (4 * sizeof (UV));
1027 product_low = alow * blow;
1029 /* as for pp_add, UV + something mustn't get smaller.
1030 IIRC ANSI mandates this wrapping *behaviour* for
1031 unsigned whatever the actual representation*/
1032 product_low += product_middle;
1033 if (product_low >= product_middle) {
1034 /* didn't overflow */
1035 if (auvok == buvok) {
1036 /* -ve * -ve or +ve * +ve gives a +ve result. */
1038 SETu( product_low );
1040 } else if (product_low <= (UV)IV_MIN) {
1041 /* 2s complement assumption again */
1042 /* -ve result, which could overflow an IV */
1044 SETi( -product_low );
1046 } /* else drop to NVs below. */
1048 } /* product_middle too large */
1049 } /* ahigh && bhigh */
1050 } /* SvIOK(TOPm1s) */
1055 SETn( left * right );
1062 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1067 DIE(aTHX_ "Illegal division by zero");
1069 /* insure that 20./5. == 4. */
1072 if ((NV)I_V(left) == left &&
1073 (NV)I_V(right) == right &&
1074 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
1078 value = left / right;
1082 value = left / right;
1091 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1097 bool use_double = 0;
1101 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
1103 right = (right_neg = (i < 0)) ? -i : i;
1108 right_neg = dright < 0;
1113 if (!use_double && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
1115 left = (left_neg = (i < 0)) ? -i : i;
1123 left_neg = dleft < 0;
1132 /* Somehow U_V is pessimized even if CASTFLAGS is 0 */
1134 # define CAST_D2UV(d) U_V(d)
1136 # define CAST_D2UV(d) ((UV)(d))
1138 /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
1139 * or, in other words, precision of UV more than of NV.
1140 * But in fact the approach below turned out to be an
1141 * optimization - floor() may be slow */
1142 if (dright <= UV_MAX && dleft <= UV_MAX) {
1143 right = CAST_D2UV(dright);
1144 left = CAST_D2UV(dleft);
1149 /* Backward-compatibility clause: */
1150 dright = Perl_floor(dright + 0.5);
1151 dleft = Perl_floor(dleft + 0.5);
1154 DIE(aTHX_ "Illegal modulus zero");
1156 dans = Perl_fmod(dleft, dright);
1157 if ((left_neg != right_neg) && dans)
1158 dans = dright - dans;
1161 sv_setnv(TARG, dans);
1168 DIE(aTHX_ "Illegal modulus zero");
1171 if ((left_neg != right_neg) && ans)
1174 /* XXX may warn: unary minus operator applied to unsigned type */
1175 /* could change -foo to be (~foo)+1 instead */
1176 if (ans <= ~((UV)IV_MAX)+1)
1177 sv_setiv(TARG, ~ans+1);
1179 sv_setnv(TARG, -(NV)ans);
1182 sv_setuv(TARG, ans);
1191 dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1193 register IV count = POPi;
1194 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1196 I32 items = SP - MARK;
1199 max = items * count;
1208 repeatcpy((char*)(MARK + items), (char*)MARK,
1209 items * sizeof(SV*), count - 1);
1212 else if (count <= 0)
1215 else { /* Note: mark already snarfed by pp_list */
1220 SvSetSV(TARG, tmpstr);
1221 SvPV_force(TARG, len);
1222 isutf = DO_UTF8(TARG);
1227 SvGROW(TARG, (count * len) + 1);
1228 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1229 SvCUR(TARG) *= count;
1231 *SvEND(TARG) = '\0';
1234 (void)SvPOK_only_UTF8(TARG);
1236 (void)SvPOK_only(TARG);
1238 if (PL_op->op_private & OPpREPEAT_DOLIST) {
1239 /* The parser saw this as a list repeat, and there
1240 are probably several items on the stack. But we're
1241 in scalar context, and there's no pp_list to save us
1242 now. So drop the rest of the items -- robin@kitsite.com
1255 dSP; dATARGET; bool useleft; tryAMAGICbin(subtr,opASSIGN);
1256 useleft = USE_LEFT(TOPm1s);
1257 #ifdef PERL_PRESERVE_IVUV
1258 /* See comments in pp_add (in pp_hot.c) about Overflow, and how
1259 "bad things" happen if you rely on signed integers wrapping. */
1262 /* Unless the left argument is integer in range we are going to have to
1263 use NV maths. Hence only attempt to coerce the right argument if
1264 we know the left is integer. */
1271 a_valid = auvok = 1;
1272 /* left operand is undef, treat as zero. */
1274 /* Left operand is defined, so is it IV? */
1275 SvIV_please(TOPm1s);
1276 if (SvIOK(TOPm1s)) {
1277 if ((auvok = SvUOK(TOPm1s)))
1278 auv = SvUVX(TOPm1s);
1280 register IV aiv = SvIVX(TOPm1s);
1283 auvok = 1; /* Now acting as a sign flag. */
1284 } else { /* 2s complement assumption for IV_MIN */
1292 bool result_good = 0;
1295 bool buvok = SvUOK(TOPs);
1300 register IV biv = SvIVX(TOPs);
1307 /* ?uvok if value is >= 0. basically, flagged as UV if it's +ve,
1308 else "IV" now, independant of how it came in.
1309 if a, b represents positive, A, B negative, a maps to -A etc
1314 all UV maths. negate result if A negative.
1315 subtract if signs same, add if signs differ. */
1317 if (auvok ^ buvok) {
1326 /* Must get smaller */
1331 if (result <= buv) {
1332 /* result really should be -(auv-buv). as its negation
1333 of true value, need to swap our result flag */
1345 if (result <= (UV)IV_MIN)
1346 SETi( -(IV)result );
1348 /* result valid, but out of range for IV. */
1349 SETn( -(NV)result );
1353 } /* Overflow, drop through to NVs. */
1357 useleft = USE_LEFT(TOPm1s);
1361 /* left operand is undef, treat as zero - value */
1365 SETn( TOPn - value );
1372 dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1375 if (PL_op->op_private & HINT_INTEGER) {
1389 dSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1392 if (PL_op->op_private & HINT_INTEGER) {
1406 dSP; tryAMAGICbinSET(lt,0);
1407 #ifdef PERL_PRESERVE_IVUV
1410 SvIV_please(TOPm1s);
1411 if (SvIOK(TOPm1s)) {
1412 bool auvok = SvUOK(TOPm1s);
1413 bool buvok = SvUOK(TOPs);
1415 if (!auvok && !buvok) { /* ## IV < IV ## */
1416 IV aiv = SvIVX(TOPm1s);
1417 IV biv = SvIVX(TOPs);
1420 SETs(boolSV(aiv < biv));
1423 if (auvok && buvok) { /* ## UV < UV ## */
1424 UV auv = SvUVX(TOPm1s);
1425 UV buv = SvUVX(TOPs);
1428 SETs(boolSV(auv < buv));
1431 if (auvok) { /* ## UV < IV ## */
1438 /* As (a) is a UV, it's >=0, so it cannot be < */
1443 if (auv >= (UV) IV_MAX) {
1444 /* As (b) is an IV, it cannot be > IV_MAX */
1448 SETs(boolSV(auv < (UV)biv));
1451 { /* ## IV < UV ## */
1455 aiv = SvIVX(TOPm1s);
1457 /* As (b) is a UV, it's >=0, so it must be < */
1464 if (buv > (UV) IV_MAX) {
1465 /* As (a) is an IV, it cannot be > IV_MAX */
1469 SETs(boolSV((UV)aiv < buv));
1477 SETs(boolSV(TOPn < value));
1484 dSP; tryAMAGICbinSET(gt,0);
1485 #ifdef PERL_PRESERVE_IVUV
1488 SvIV_please(TOPm1s);
1489 if (SvIOK(TOPm1s)) {
1490 bool auvok = SvUOK(TOPm1s);
1491 bool buvok = SvUOK(TOPs);
1493 if (!auvok && !buvok) { /* ## IV > IV ## */
1494 IV aiv = SvIVX(TOPm1s);
1495 IV biv = SvIVX(TOPs);
1498 SETs(boolSV(aiv > biv));
1501 if (auvok && buvok) { /* ## UV > UV ## */
1502 UV auv = SvUVX(TOPm1s);
1503 UV buv = SvUVX(TOPs);
1506 SETs(boolSV(auv > buv));
1509 if (auvok) { /* ## UV > IV ## */
1516 /* As (a) is a UV, it's >=0, so it must be > */
1521 if (auv > (UV) IV_MAX) {
1522 /* As (b) is an IV, it cannot be > IV_MAX */
1526 SETs(boolSV(auv > (UV)biv));
1529 { /* ## IV > UV ## */
1533 aiv = SvIVX(TOPm1s);
1535 /* As (b) is a UV, it's >=0, so it cannot be > */
1542 if (buv >= (UV) IV_MAX) {
1543 /* As (a) is an IV, it cannot be > IV_MAX */
1547 SETs(boolSV((UV)aiv > buv));
1555 SETs(boolSV(TOPn > value));
1562 dSP; tryAMAGICbinSET(le,0);
1563 #ifdef PERL_PRESERVE_IVUV
1566 SvIV_please(TOPm1s);
1567 if (SvIOK(TOPm1s)) {
1568 bool auvok = SvUOK(TOPm1s);
1569 bool buvok = SvUOK(TOPs);
1571 if (!auvok && !buvok) { /* ## IV <= IV ## */
1572 IV aiv = SvIVX(TOPm1s);
1573 IV biv = SvIVX(TOPs);
1576 SETs(boolSV(aiv <= biv));
1579 if (auvok && buvok) { /* ## UV <= UV ## */
1580 UV auv = SvUVX(TOPm1s);
1581 UV buv = SvUVX(TOPs);
1584 SETs(boolSV(auv <= buv));
1587 if (auvok) { /* ## UV <= IV ## */
1594 /* As (a) is a UV, it's >=0, so a cannot be <= */
1599 if (auv > (UV) IV_MAX) {
1600 /* As (b) is an IV, it cannot be > IV_MAX */
1604 SETs(boolSV(auv <= (UV)biv));
1607 { /* ## IV <= UV ## */
1611 aiv = SvIVX(TOPm1s);
1613 /* As (b) is a UV, it's >=0, so a must be <= */
1620 if (buv >= (UV) IV_MAX) {
1621 /* As (a) is an IV, it cannot be > IV_MAX */
1625 SETs(boolSV((UV)aiv <= buv));
1633 SETs(boolSV(TOPn <= value));
1640 dSP; tryAMAGICbinSET(ge,0);
1641 #ifdef PERL_PRESERVE_IVUV
1644 SvIV_please(TOPm1s);
1645 if (SvIOK(TOPm1s)) {
1646 bool auvok = SvUOK(TOPm1s);
1647 bool buvok = SvUOK(TOPs);
1649 if (!auvok && !buvok) { /* ## IV >= IV ## */
1650 IV aiv = SvIVX(TOPm1s);
1651 IV biv = SvIVX(TOPs);
1654 SETs(boolSV(aiv >= biv));
1657 if (auvok && buvok) { /* ## UV >= UV ## */
1658 UV auv = SvUVX(TOPm1s);
1659 UV buv = SvUVX(TOPs);
1662 SETs(boolSV(auv >= buv));
1665 if (auvok) { /* ## UV >= IV ## */
1672 /* As (a) is a UV, it's >=0, so it must be >= */
1677 if (auv >= (UV) IV_MAX) {
1678 /* As (b) is an IV, it cannot be > IV_MAX */
1682 SETs(boolSV(auv >= (UV)biv));
1685 { /* ## IV >= UV ## */
1689 aiv = SvIVX(TOPm1s);
1691 /* As (b) is a UV, it's >=0, so a cannot be >= */
1698 if (buv > (UV) IV_MAX) {
1699 /* As (a) is an IV, it cannot be > IV_MAX */
1703 SETs(boolSV((UV)aiv >= buv));
1711 SETs(boolSV(TOPn >= value));
1718 dSP; tryAMAGICbinSET(ne,0);
1719 #ifndef NV_PRESERVES_UV
1720 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1721 SETs(boolSV(SvRV(TOPs) != SvRV(TOPm1s)));
1725 #ifdef PERL_PRESERVE_IVUV
1728 SvIV_please(TOPm1s);
1729 if (SvIOK(TOPm1s)) {
1730 bool auvok = SvUOK(TOPm1s);
1731 bool buvok = SvUOK(TOPs);
1733 if (!auvok && !buvok) { /* ## IV <=> IV ## */
1734 IV aiv = SvIVX(TOPm1s);
1735 IV biv = SvIVX(TOPs);
1738 SETs(boolSV(aiv != biv));
1741 if (auvok && buvok) { /* ## UV != UV ## */
1742 UV auv = SvUVX(TOPm1s);
1743 UV buv = SvUVX(TOPs);
1746 SETs(boolSV(auv != buv));
1749 { /* ## Mixed IV,UV ## */
1753 /* != is commutative so swap if needed (save code) */
1755 /* swap. top of stack (b) is the iv */
1759 /* As (a) is a UV, it's >0, so it cannot be == */
1768 /* As (b) is a UV, it's >0, so it cannot be == */
1772 uv = SvUVX(*(SP+1)); /* Do I want TOPp1s() ? */
1774 /* we know iv is >= 0 */
1775 if (uv > (UV) IV_MAX) {
1779 SETs(boolSV((UV)iv != uv));
1787 SETs(boolSV(TOPn != value));
1794 dSP; dTARGET; tryAMAGICbin(ncmp,0);
1795 #ifndef NV_PRESERVES_UV
1796 if (SvROK(TOPs) && SvROK(TOPm1s)) {
1797 SETi(PTR2UV(SvRV(TOPs)) - PTR2UV(SvRV(TOPm1s)));
1801 #ifdef PERL_PRESERVE_IVUV
1802 /* Fortunately it seems NaN isn't IOK */
1805 SvIV_please(TOPm1s);
1806 if (SvIOK(TOPm1s)) {
1807 bool leftuvok = SvUOK(TOPm1s);
1808 bool rightuvok = SvUOK(TOPs);
1810 if (!leftuvok && !rightuvok) { /* ## IV <=> IV ## */
1811 IV leftiv = SvIVX(TOPm1s);
1812 IV rightiv = SvIVX(TOPs);
1814 if (leftiv > rightiv)
1816 else if (leftiv < rightiv)
1820 } else if (leftuvok && rightuvok) { /* ## UV <=> UV ## */
1821 UV leftuv = SvUVX(TOPm1s);
1822 UV rightuv = SvUVX(TOPs);
1824 if (leftuv > rightuv)
1826 else if (leftuv < rightuv)
1830 } else if (leftuvok) { /* ## UV <=> IV ## */
1834 rightiv = SvIVX(TOPs);
1836 /* As (a) is a UV, it's >=0, so it cannot be < */
1839 leftuv = SvUVX(TOPm1s);
1840 if (leftuv > (UV) IV_MAX) {
1841 /* As (b) is an IV, it cannot be > IV_MAX */
1843 } else if (leftuv > (UV)rightiv) {
1845 } else if (leftuv < (UV)rightiv) {
1851 } else { /* ## IV <=> UV ## */
1855 leftiv = SvIVX(TOPm1s);
1857 /* As (b) is a UV, it's >=0, so it must be < */
1860 rightuv = SvUVX(TOPs);
1861 if (rightuv > (UV) IV_MAX) {
1862 /* As (a) is an IV, it cannot be > IV_MAX */
1864 } else if (leftiv > (UV)rightuv) {
1866 } else if (leftiv < (UV)rightuv) {
1884 if (Perl_isnan(left) || Perl_isnan(right)) {
1888 value = (left > right) - (left < right);
1892 else if (left < right)
1894 else if (left > right)
1908 dSP; tryAMAGICbinSET(slt,0);
1911 int cmp = ((PL_op->op_private & OPpLOCALE)
1912 ? sv_cmp_locale(left, right)
1913 : sv_cmp(left, right));
1914 SETs(boolSV(cmp < 0));
1921 dSP; tryAMAGICbinSET(sgt,0);
1924 int cmp = ((PL_op->op_private & OPpLOCALE)
1925 ? sv_cmp_locale(left, right)
1926 : sv_cmp(left, right));
1927 SETs(boolSV(cmp > 0));
1934 dSP; tryAMAGICbinSET(sle,0);
1937 int cmp = ((PL_op->op_private & OPpLOCALE)
1938 ? sv_cmp_locale(left, right)
1939 : sv_cmp(left, right));
1940 SETs(boolSV(cmp <= 0));
1947 dSP; tryAMAGICbinSET(sge,0);
1950 int cmp = ((PL_op->op_private & OPpLOCALE)
1951 ? sv_cmp_locale(left, right)
1952 : sv_cmp(left, right));
1953 SETs(boolSV(cmp >= 0));
1960 dSP; tryAMAGICbinSET(seq,0);
1963 SETs(boolSV(sv_eq(left, right)));
1970 dSP; tryAMAGICbinSET(sne,0);
1973 SETs(boolSV(!sv_eq(left, right)));
1980 dSP; dTARGET; tryAMAGICbin(scmp,0);
1983 int cmp = ((PL_op->op_private & OPpLOCALE)
1984 ? sv_cmp_locale(left, right)
1985 : sv_cmp(left, right));
1993 dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1996 if (SvNIOKp(left) || SvNIOKp(right)) {
1997 if (PL_op->op_private & HINT_INTEGER) {
1998 IV i = SvIV(left) & SvIV(right);
2002 UV u = SvUV(left) & SvUV(right);
2007 do_vop(PL_op->op_type, TARG, left, right);
2016 dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
2019 if (SvNIOKp(left) || SvNIOKp(right)) {
2020 if (PL_op->op_private & HINT_INTEGER) {
2021 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
2025 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
2030 do_vop(PL_op->op_type, TARG, left, right);
2039 dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
2042 if (SvNIOKp(left) || SvNIOKp(right)) {
2043 if (PL_op->op_private & HINT_INTEGER) {
2044 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
2048 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
2053 do_vop(PL_op->op_type, TARG, left, right);
2062 dSP; dTARGET; tryAMAGICun(neg);
2065 int flags = SvFLAGS(sv);
2068 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
2069 /* It's publicly an integer, or privately an integer-not-float */
2072 if (SvIVX(sv) == IV_MIN) {
2073 /* 2s complement assumption. */
2074 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
2077 else if (SvUVX(sv) <= IV_MAX) {
2082 else if (SvIVX(sv) != IV_MIN) {
2086 #ifdef PERL_PRESERVE_IVUV
2095 else if (SvPOKp(sv)) {
2097 char *s = SvPV(sv, len);
2098 if (isIDFIRST(*s)) {
2099 sv_setpvn(TARG, "-", 1);
2102 else if (*s == '+' || *s == '-') {
2104 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
2106 else if (DO_UTF8(sv) && UTF8_IS_START(*s) && isIDFIRST_utf8((U8*)s)) {
2107 sv_setpvn(TARG, "-", 1);
2113 goto oops_its_an_int;
2114 sv_setnv(TARG, -SvNV(sv));
2126 dSP; tryAMAGICunSET(not);
2127 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
2133 dSP; dTARGET; tryAMAGICun(compl);
2137 if (PL_op->op_private & HINT_INTEGER) {
2152 tmps = (U8*)SvPV_force(TARG, len);
2155 /* Calculate exact length, let's not estimate. */
2164 while (tmps < send) {
2165 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2166 tmps += UTF8SKIP(tmps);
2167 targlen += UNISKIP(~c);
2173 /* Now rewind strings and write them. */
2177 Newz(0, result, targlen + 1, U8);
2178 while (tmps < send) {
2179 UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
2180 tmps += UTF8SKIP(tmps);
2181 result = uvchr_to_utf8(result, ~c);
2185 sv_setpvn(TARG, (char*)result, targlen);
2189 Newz(0, result, nchar + 1, U8);
2190 while (tmps < send) {
2191 U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY);
2192 tmps += UTF8SKIP(tmps);
2197 sv_setpvn(TARG, (char*)result, nchar);
2205 register long *tmpl;
2206 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
2209 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
2214 for ( ; anum > 0; anum--, tmps++)
2223 /* integer versions of some of the above */
2227 dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
2230 SETi( left * right );
2237 dSP; dATARGET; tryAMAGICbin(div,opASSIGN);
2241 DIE(aTHX_ "Illegal division by zero");
2242 value = POPi / value;
2250 dSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
2254 DIE(aTHX_ "Illegal modulus zero");
2255 SETi( left % right );
2262 dSP; dATARGET; tryAMAGICbin(add,opASSIGN);
2265 SETi( left + right );
2272 dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
2275 SETi( left - right );
2282 dSP; tryAMAGICbinSET(lt,0);
2285 SETs(boolSV(left < right));
2292 dSP; tryAMAGICbinSET(gt,0);
2295 SETs(boolSV(left > right));
2302 dSP; tryAMAGICbinSET(le,0);
2305 SETs(boolSV(left <= right));
2312 dSP; tryAMAGICbinSET(ge,0);
2315 SETs(boolSV(left >= right));
2322 dSP; tryAMAGICbinSET(eq,0);
2325 SETs(boolSV(left == right));
2332 dSP; tryAMAGICbinSET(ne,0);
2335 SETs(boolSV(left != right));
2342 dSP; dTARGET; tryAMAGICbin(ncmp,0);
2349 else if (left < right)
2360 dSP; dTARGET; tryAMAGICun(neg);
2365 /* High falutin' math. */
2369 dSP; dTARGET; tryAMAGICbin(atan2,0);
2372 SETn(Perl_atan2(left, right));
2379 dSP; dTARGET; tryAMAGICun(sin);
2383 value = Perl_sin(value);
2391 dSP; dTARGET; tryAMAGICun(cos);
2395 value = Perl_cos(value);
2401 /* Support Configure command-line overrides for rand() functions.
2402 After 5.005, perhaps we should replace this by Configure support
2403 for drand48(), random(), or rand(). For 5.005, though, maintain
2404 compatibility by calling rand() but allow the user to override it.
2405 See INSTALL for details. --Andy Dougherty 15 July 1998
2407 /* Now it's after 5.005, and Configure supports drand48() and random(),
2408 in addition to rand(). So the overrides should not be needed any more.
2409 --Jarkko Hietaniemi 27 September 1998
2412 #ifndef HAS_DRAND48_PROTO
2413 extern double drand48 (void);
2426 if (!PL_srand_called) {
2427 (void)seedDrand01((Rand_seed_t)seed());
2428 PL_srand_called = TRUE;
2443 (void)seedDrand01((Rand_seed_t)anum);
2444 PL_srand_called = TRUE;
2453 * This is really just a quick hack which grabs various garbage
2454 * values. It really should be a real hash algorithm which
2455 * spreads the effect of every input bit onto every output bit,
2456 * if someone who knows about such things would bother to write it.
2457 * Might be a good idea to add that function to CORE as well.
2458 * No numbers below come from careful analysis or anything here,
2459 * except they are primes and SEED_C1 > 1E6 to get a full-width
2460 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
2461 * probably be bigger too.
2464 # define SEED_C1 1000003
2465 #define SEED_C4 73819
2467 # define SEED_C1 25747
2468 #define SEED_C4 20639
2472 #define SEED_C5 26107
2474 #ifndef PERL_NO_DEV_RANDOM
2479 # include <starlet.h>
2480 /* when[] = (low 32 bits, high 32 bits) of time since epoch
2481 * in 100-ns units, typically incremented ever 10 ms. */
2482 unsigned int when[2];
2484 # ifdef HAS_GETTIMEOFDAY
2485 struct timeval when;
2491 /* This test is an escape hatch, this symbol isn't set by Configure. */
2492 #ifndef PERL_NO_DEV_RANDOM
2493 #ifndef PERL_RANDOM_DEVICE
2494 /* /dev/random isn't used by default because reads from it will block
2495 * if there isn't enough entropy available. You can compile with
2496 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
2497 * is enough real entropy to fill the seed. */
2498 # define PERL_RANDOM_DEVICE "/dev/urandom"
2500 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
2502 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
2511 _ckvmssts(sys$gettim(when));
2512 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
2514 # ifdef HAS_GETTIMEOFDAY
2515 gettimeofday(&when,(struct timezone *) 0);
2516 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
2519 u = (U32)SEED_C1 * when;
2522 u += SEED_C3 * (U32)PerlProc_getpid();
2523 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
2524 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
2525 u += SEED_C5 * (U32)PTR2UV(&when);
2532 dSP; dTARGET; tryAMAGICun(exp);
2536 value = Perl_exp(value);
2544 dSP; dTARGET; tryAMAGICun(log);
2549 SET_NUMERIC_STANDARD();
2550 DIE(aTHX_ "Can't take log of %g", value);
2552 value = Perl_log(value);
2560 dSP; dTARGET; tryAMAGICun(sqrt);
2565 SET_NUMERIC_STANDARD();
2566 DIE(aTHX_ "Can't take sqrt of %g", value);
2568 value = Perl_sqrt(value);
2576 dSP; dTARGET; tryAMAGICun(int);
2579 IV iv = TOPi; /* attempt to convert to IV if possible. */
2580 /* XXX it's arguable that compiler casting to IV might be subtly
2581 different from modf (for numbers inside (IV_MIN,UV_MAX)) in which
2582 else preferring IV has introduced a subtle behaviour change bug. OTOH
2583 relying on floating point to be accurate is a bug. */
2594 if (value < (NV)UV_MAX + 0.5) {
2597 #if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
2598 (void)Perl_modf(value, &value);
2600 double tmp = (double)value;
2601 (void)Perl_modf(tmp, &tmp);
2608 if (value > (NV)IV_MIN - 0.5) {
2611 #if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
2612 (void)Perl_modf(-value, &value);
2615 double tmp = (double)value;
2616 (void)Perl_modf(-tmp, &tmp);
2629 dSP; dTARGET; tryAMAGICun(abs);
2631 /* This will cache the NV value if string isn't actually integer */
2635 /* IVX is precise */
2637 SETu(TOPu); /* force it to be numeric only */
2645 /* 2s complement assumption. Also, not really needed as
2646 IV_MIN and -IV_MIN should both be %100...00 and NV-able */
2668 tmps = (SvPVx(POPs, len));
2669 argtype = 1; /* allow underscores */
2670 XPUSHn(scan_hex(tmps, len, &argtype));
2682 tmps = (SvPVx(POPs, len));
2683 while (*tmps && len && isSPACE(*tmps))
2687 argtype = 1; /* allow underscores */
2689 value = scan_hex(++tmps, --len, &argtype);
2690 else if (*tmps == 'b')
2691 value = scan_bin(++tmps, --len, &argtype);
2693 value = scan_oct(tmps, len, &argtype);
2706 SETi(sv_len_utf8(sv));
2722 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2724 I32 arybase = PL_curcop->cop_arybase;
2728 int num_args = PL_op->op_private & 7;
2729 bool repl_need_utf8_upgrade = FALSE;
2730 bool repl_is_utf8 = FALSE;
2732 SvTAINTED_off(TARG); /* decontaminate */
2733 SvUTF8_off(TARG); /* decontaminate */
2737 repl = SvPV(repl_sv, repl_len);
2738 repl_is_utf8 = DO_UTF8(repl_sv) && SvCUR(repl_sv);
2748 sv_utf8_upgrade(sv);
2750 else if (DO_UTF8(sv))
2751 repl_need_utf8_upgrade = TRUE;
2753 tmps = SvPV(sv, curlen);
2755 utf8_curlen = sv_len_utf8(sv);
2756 if (utf8_curlen == curlen)
2759 curlen = utf8_curlen;
2764 if (pos >= arybase) {
2782 else if (len >= 0) {
2784 if (rem > (I32)curlen)
2799 Perl_croak(aTHX_ "substr outside of string");
2800 if (ckWARN(WARN_SUBSTR))
2801 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
2808 sv_pos_u2b(sv, &pos, &rem);
2810 sv_setpvn(TARG, tmps, rem);
2814 SV* repl_sv_copy = NULL;
2816 if (repl_need_utf8_upgrade) {
2817 repl_sv_copy = newSVsv(repl_sv);
2818 sv_utf8_upgrade(repl_sv_copy);
2819 repl = SvPV(repl_sv_copy, repl_len);
2820 repl_is_utf8 = DO_UTF8(repl_sv_copy) && SvCUR(sv);
2822 sv_insert(sv, pos, rem, repl, repl_len);
2826 SvREFCNT_dec(repl_sv_copy);
2828 else if (lvalue) { /* it's an lvalue! */
2829 if (!SvGMAGICAL(sv)) {
2833 if (ckWARN(WARN_SUBSTR))
2834 Perl_warner(aTHX_ WARN_SUBSTR,
2835 "Attempt to use reference as lvalue in substr");
2837 if (SvOK(sv)) /* is it defined ? */
2838 (void)SvPOK_only_UTF8(sv);
2840 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
2843 if (SvTYPE(TARG) < SVt_PVLV) {
2844 sv_upgrade(TARG, SVt_PVLV);
2845 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
2849 if (LvTARG(TARG) != sv) {
2851 SvREFCNT_dec(LvTARG(TARG));
2852 LvTARG(TARG) = SvREFCNT_inc(sv);
2854 LvTARGOFF(TARG) = upos;
2855 LvTARGLEN(TARG) = urem;
2859 PUSHs(TARG); /* avoid SvSETMAGIC here */
2866 register IV size = POPi;
2867 register IV offset = POPi;
2868 register SV *src = POPs;
2869 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2871 SvTAINTED_off(TARG); /* decontaminate */
2872 if (lvalue) { /* it's an lvalue! */
2873 if (SvTYPE(TARG) < SVt_PVLV) {
2874 sv_upgrade(TARG, SVt_PVLV);
2875 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
2878 if (LvTARG(TARG) != src) {
2880 SvREFCNT_dec(LvTARG(TARG));
2881 LvTARG(TARG) = SvREFCNT_inc(src);
2883 LvTARGOFF(TARG) = offset;
2884 LvTARGLEN(TARG) = size;
2887 sv_setuv(TARG, do_vecget(src, offset, size));
2902 I32 arybase = PL_curcop->cop_arybase;
2907 offset = POPi - arybase;
2910 tmps = SvPV(big, biglen);
2911 if (offset > 0 && DO_UTF8(big))
2912 sv_pos_u2b(big, &offset, 0);
2915 else if (offset > biglen)
2917 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2918 (unsigned char*)tmps + biglen, little, 0)))
2921 retval = tmps2 - tmps;
2922 if (retval > 0 && DO_UTF8(big))
2923 sv_pos_b2u(big, &retval);
2924 PUSHi(retval + arybase);
2939 I32 arybase = PL_curcop->cop_arybase;
2945 tmps2 = SvPV(little, llen);
2946 tmps = SvPV(big, blen);
2950 if (offset > 0 && DO_UTF8(big))
2951 sv_pos_u2b(big, &offset, 0);
2952 offset = offset - arybase + llen;
2956 else if (offset > blen)
2958 if (!(tmps2 = rninstr(tmps, tmps + offset,
2959 tmps2, tmps2 + llen)))
2962 retval = tmps2 - tmps;
2963 if (retval > 0 && DO_UTF8(big))
2964 sv_pos_b2u(big, &retval);
2965 PUSHi(retval + arybase);
2971 dSP; dMARK; dORIGMARK; dTARGET;
2972 do_sprintf(TARG, SP-MARK, MARK+1);
2973 TAINT_IF(SvTAINTED(TARG));
2984 U8 *s = (U8*)SvPVx(argsv, len);
2986 XPUSHu(DO_UTF8(argsv) ? utf8_to_uvchr(s, 0) : (*s & 0xff));
2996 (void)SvUPGRADE(TARG,SVt_PV);
2998 if (value > 255 && !IN_BYTE) {
2999 SvGROW(TARG, UNISKIP(value)+1);
3000 tmps = (char*)uvchr_to_utf8((U8*)SvPVX(TARG), value);
3001 SvCUR_set(TARG, tmps - SvPVX(TARG));
3003 (void)SvPOK_only(TARG);
3014 (void)SvPOK_only(TARG);
3021 dSP; dTARGET; dPOPTOPssrl;
3024 char *tmps = SvPV(left, n_a);
3026 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
3028 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
3032 "The crypt() function is unimplemented due to excessive paranoia.");
3045 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && UTF8_IS_START(*s)) {
3047 U8 tmpbuf[UTF8_MAXLEN+1];
3051 if (PL_op->op_private & OPpLOCALE) {
3054 uv = toTITLE_LC_uvchr(utf8n_to_uvchr(s, slen, &ulen, 0));
3057 uv = toTITLE_utf8(s);
3059 tend = uvchr_to_utf8(tmpbuf, uv);
3061 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
3063 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3064 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3069 s = (U8*)SvPV_force(sv, slen);
3070 Copy(tmpbuf, s, ulen, U8);
3074 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3076 SvUTF8_off(TARG); /* decontaminate */
3081 s = (U8*)SvPV_force(sv, slen);
3083 if (PL_op->op_private & OPpLOCALE) {
3086 *s = toUPPER_LC(*s);
3104 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && UTF8_IS_START(*s)) {
3106 U8 tmpbuf[UTF8_MAXLEN+1];
3110 if (PL_op->op_private & OPpLOCALE) {
3113 uv = toLOWER_LC_uvchr(utf8n_to_uvchr(s, slen, &ulen, 0));
3116 uv = toLOWER_utf8(s);
3118 tend = uvchr_to_utf8(tmpbuf, uv);
3120 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
3122 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
3123 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
3128 s = (U8*)SvPV_force(sv, slen);
3129 Copy(tmpbuf, s, ulen, U8);
3133 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3135 SvUTF8_off(TARG); /* decontaminate */
3140 s = (U8*)SvPV_force(sv, slen);
3142 if (PL_op->op_private & OPpLOCALE) {
3145 *s = toLOWER_LC(*s);
3169 s = (U8*)SvPV(sv,len);
3171 SvUTF8_off(TARG); /* decontaminate */
3172 sv_setpvn(TARG, "", 0);
3176 (void)SvUPGRADE(TARG, SVt_PV);
3177 SvGROW(TARG, (len * 2) + 1);
3178 (void)SvPOK_only(TARG);
3179 d = (U8*)SvPVX(TARG);
3181 if (PL_op->op_private & OPpLOCALE) {
3185 d = uvchr_to_utf8(d, toUPPER_LC_uvchr( utf8n_to_uvchr(s, len, &ulen, 0)));
3191 d = uvchr_to_utf8(d, toUPPER_utf8( s ));
3197 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3202 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3204 SvUTF8_off(TARG); /* decontaminate */
3209 s = (U8*)SvPV_force(sv, len);
3211 register U8 *send = s + len;
3213 if (PL_op->op_private & OPpLOCALE) {
3216 for (; s < send; s++)
3217 *s = toUPPER_LC(*s);
3220 for (; s < send; s++)
3243 s = (U8*)SvPV(sv,len);
3245 SvUTF8_off(TARG); /* decontaminate */
3246 sv_setpvn(TARG, "", 0);
3250 (void)SvUPGRADE(TARG, SVt_PV);
3251 SvGROW(TARG, (len * 2) + 1);
3252 (void)SvPOK_only(TARG);
3253 d = (U8*)SvPVX(TARG);
3255 if (PL_op->op_private & OPpLOCALE) {
3259 d = uvchr_to_utf8(d, toLOWER_LC_uvchr( utf8n_to_uvchr(s, len, &ulen, 0)));
3265 d = uvchr_to_utf8(d, toLOWER_utf8(s));
3271 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
3276 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
3278 SvUTF8_off(TARG); /* decontaminate */
3284 s = (U8*)SvPV_force(sv, len);
3286 register U8 *send = s + len;
3288 if (PL_op->op_private & OPpLOCALE) {
3291 for (; s < send; s++)
3292 *s = toLOWER_LC(*s);
3295 for (; s < send; s++)
3310 register char *s = SvPV(sv,len);
3313 SvUTF8_off(TARG); /* decontaminate */
3315 (void)SvUPGRADE(TARG, SVt_PV);
3316 SvGROW(TARG, (len * 2) + 1);
3320 if (UTF8_IS_CONTINUED(*s)) {
3321 STRLEN ulen = UTF8SKIP(s);
3345 SvCUR_set(TARG, d - SvPVX(TARG));
3346 (void)SvPOK_only_UTF8(TARG);
3349 sv_setpvn(TARG, s, len);
3351 if (SvSMAGICAL(TARG))
3360 dSP; dMARK; dORIGMARK;
3362 register AV* av = (AV*)POPs;
3363 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3364 I32 arybase = PL_curcop->cop_arybase;
3367 if (SvTYPE(av) == SVt_PVAV) {
3368 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
3370 for (svp = MARK + 1; svp <= SP; svp++) {
3375 if (max > AvMAX(av))
3378 while (++MARK <= SP) {
3379 elem = SvIVx(*MARK);
3383 svp = av_fetch(av, elem, lval);
3385 if (!svp || *svp == &PL_sv_undef)
3386 DIE(aTHX_ PL_no_aelem, elem);
3387 if (PL_op->op_private & OPpLVAL_INTRO)
3388 save_aelem(av, elem, svp);
3390 *MARK = svp ? *svp : &PL_sv_undef;
3393 if (GIMME != G_ARRAY) {
3401 /* Associative arrays. */
3406 HV *hash = (HV*)POPs;
3408 I32 gimme = GIMME_V;
3409 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
3412 /* might clobber stack_sp */
3413 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
3418 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
3419 if (gimme == G_ARRAY) {
3422 /* might clobber stack_sp */
3424 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
3429 else if (gimme == G_SCALAR)
3448 I32 gimme = GIMME_V;
3449 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
3453 if (PL_op->op_private & OPpSLICE) {
3457 hvtype = SvTYPE(hv);
3458 if (hvtype == SVt_PVHV) { /* hash element */
3459 while (++MARK <= SP) {
3460 sv = hv_delete_ent(hv, *MARK, discard, 0);
3461 *MARK = sv ? sv : &PL_sv_undef;
3464 else if (hvtype == SVt_PVAV) {
3465 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3466 while (++MARK <= SP) {
3467 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
3468 *MARK = sv ? sv : &PL_sv_undef;
3471 else { /* pseudo-hash element */
3472 while (++MARK <= SP) {
3473 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
3474 *MARK = sv ? sv : &PL_sv_undef;
3479 DIE(aTHX_ "Not a HASH reference");
3482 else if (gimme == G_SCALAR) {
3491 if (SvTYPE(hv) == SVt_PVHV)
3492 sv = hv_delete_ent(hv, keysv, discard, 0);
3493 else if (SvTYPE(hv) == SVt_PVAV) {
3494 if (PL_op->op_flags & OPf_SPECIAL)
3495 sv = av_delete((AV*)hv, SvIV(keysv), discard);
3497 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
3500 DIE(aTHX_ "Not a HASH reference");
3515 if (PL_op->op_private & OPpEXISTS_SUB) {
3519 cv = sv_2cv(sv, &hv, &gv, FALSE);
3522 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
3528 if (SvTYPE(hv) == SVt_PVHV) {
3529 if (hv_exists_ent(hv, tmpsv, 0))
3532 else if (SvTYPE(hv) == SVt_PVAV) {
3533 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
3534 if (av_exists((AV*)hv, SvIV(tmpsv)))
3537 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
3541 DIE(aTHX_ "Not a HASH reference");
3548 dSP; dMARK; dORIGMARK;
3549 register HV *hv = (HV*)POPs;
3550 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
3551 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
3553 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
3554 DIE(aTHX_ "Can't localize pseudo-hash element");
3556 if (realhv || SvTYPE(hv) == SVt_PVAV) {
3557 while (++MARK <= SP) {
3560 I32 preeminent = SvRMAGICAL(hv) ? 1 :
3561 realhv ? hv_exists_ent(hv, keysv, 0)
3562 : avhv_exists_ent((AV*)hv, keysv, 0);
3564 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
3565 svp = he ? &HeVAL(he) : 0;
3568 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
3571 if (!svp || *svp == &PL_sv_undef) {
3573 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
3575 if (PL_op->op_private & OPpLVAL_INTRO) {
3577 save_helem(hv, keysv, svp);
3580 char *key = SvPV(keysv, keylen);
3581 SAVEDELETE(hv, savepvn(key,keylen), keylen);
3585 *MARK = svp ? *svp : &PL_sv_undef;
3588 if (GIMME != G_ARRAY) {
3596 /* List operators. */
3601 if (GIMME != G_ARRAY) {
3603 *MARK = *SP; /* unwanted list, return last item */
3605 *MARK = &PL_sv_undef;
3614 SV **lastrelem = PL_stack_sp;
3615 SV **lastlelem = PL_stack_base + POPMARK;
3616 SV **firstlelem = PL_stack_base + POPMARK + 1;
3617 register SV **firstrelem = lastlelem + 1;
3618 I32 arybase = PL_curcop->cop_arybase;
3619 I32 lval = PL_op->op_flags & OPf_MOD;
3620 I32 is_something_there = lval;
3622 register I32 max = lastrelem - lastlelem;
3623 register SV **lelem;
3626 if (GIMME != G_ARRAY) {
3627 ix = SvIVx(*lastlelem);
3632 if (ix < 0 || ix >= max)
3633 *firstlelem = &PL_sv_undef;
3635 *firstlelem = firstrelem[ix];
3641 SP = firstlelem - 1;
3645 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
3651 if (ix < 0 || ix >= max)
3652 *lelem = &PL_sv_undef;
3654 is_something_there = TRUE;
3655 if (!(*lelem = firstrelem[ix]))
3656 *lelem = &PL_sv_undef;
3659 if (is_something_there)
3662 SP = firstlelem - 1;
3668 dSP; dMARK; dORIGMARK;
3669 I32 items = SP - MARK;
3670 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
3671 SP = ORIGMARK; /* av_make() might realloc stack_sp */
3678 dSP; dMARK; dORIGMARK;
3679 HV* hv = (HV*)sv_2mortal((SV*)newHV());
3683 SV *val = NEWSV(46, 0);
3685 sv_setsv(val, *++MARK);
3686 else if (ckWARN(WARN_MISC))
3687 Perl_warner(aTHX_ WARN_MISC, "Odd number of elements in hash assignment");
3688 (void)hv_store_ent(hv,key,val,0);
3697 dSP; dMARK; dORIGMARK;
3698 register AV *ary = (AV*)*++MARK;
3702 register I32 offset;
3703 register I32 length;
3710 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3711 *MARK-- = SvTIED_obj((SV*)ary, mg);
3715 call_method("SPLICE",GIMME_V);
3724 offset = i = SvIVx(*MARK);
3726 offset += AvFILLp(ary) + 1;
3728 offset -= PL_curcop->cop_arybase;
3730 DIE(aTHX_ PL_no_aelem, i);
3732 length = SvIVx(*MARK++);
3734 length += AvFILLp(ary) - offset + 1;
3740 length = AvMAX(ary) + 1; /* close enough to infinity */
3744 length = AvMAX(ary) + 1;
3746 if (offset > AvFILLp(ary) + 1)
3747 offset = AvFILLp(ary) + 1;
3748 after = AvFILLp(ary) + 1 - (offset + length);
3749 if (after < 0) { /* not that much array */
3750 length += after; /* offset+length now in array */
3756 /* At this point, MARK .. SP-1 is our new LIST */
3759 diff = newlen - length;
3760 if (newlen && !AvREAL(ary) && AvREIFY(ary))
3763 if (diff < 0) { /* shrinking the area */
3765 New(451, tmparyval, newlen, SV*); /* so remember insertion */
3766 Copy(MARK, tmparyval, newlen, SV*);
3769 MARK = ORIGMARK + 1;
3770 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3771 MEXTEND(MARK, length);
3772 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
3774 EXTEND_MORTAL(length);
3775 for (i = length, dst = MARK; i; i--) {
3776 sv_2mortal(*dst); /* free them eventualy */
3783 *MARK = AvARRAY(ary)[offset+length-1];
3786 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
3787 SvREFCNT_dec(*dst++); /* free them now */
3790 AvFILLp(ary) += diff;
3792 /* pull up or down? */
3794 if (offset < after) { /* easier to pull up */
3795 if (offset) { /* esp. if nothing to pull */
3796 src = &AvARRAY(ary)[offset-1];
3797 dst = src - diff; /* diff is negative */
3798 for (i = offset; i > 0; i--) /* can't trust Copy */
3802 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
3806 if (after) { /* anything to pull down? */
3807 src = AvARRAY(ary) + offset + length;
3808 dst = src + diff; /* diff is negative */
3809 Move(src, dst, after, SV*);
3811 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
3812 /* avoid later double free */
3816 dst[--i] = &PL_sv_undef;
3819 for (src = tmparyval, dst = AvARRAY(ary) + offset;
3821 *dst = NEWSV(46, 0);
3822 sv_setsv(*dst++, *src++);
3824 Safefree(tmparyval);
3827 else { /* no, expanding (or same) */
3829 New(452, tmparyval, length, SV*); /* so remember deletion */
3830 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
3833 if (diff > 0) { /* expanding */
3835 /* push up or down? */
3837 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
3841 Move(src, dst, offset, SV*);
3843 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
3845 AvFILLp(ary) += diff;
3848 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
3849 av_extend(ary, AvFILLp(ary) + diff);
3850 AvFILLp(ary) += diff;
3853 dst = AvARRAY(ary) + AvFILLp(ary);
3855 for (i = after; i; i--) {
3862 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
3863 *dst = NEWSV(46, 0);
3864 sv_setsv(*dst++, *src++);
3866 MARK = ORIGMARK + 1;
3867 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3869 Copy(tmparyval, MARK, length, SV*);
3871 EXTEND_MORTAL(length);
3872 for (i = length, dst = MARK; i; i--) {
3873 sv_2mortal(*dst); /* free them eventualy */
3877 Safefree(tmparyval);
3881 else if (length--) {
3882 *MARK = tmparyval[length];
3885 while (length-- > 0)
3886 SvREFCNT_dec(tmparyval[length]);
3888 Safefree(tmparyval);
3891 *MARK = &PL_sv_undef;
3899 dSP; dMARK; dORIGMARK; dTARGET;
3900 register AV *ary = (AV*)*++MARK;
3901 register SV *sv = &PL_sv_undef;
3904 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3905 *MARK-- = SvTIED_obj((SV*)ary, mg);
3909 call_method("PUSH",G_SCALAR|G_DISCARD);
3914 /* Why no pre-extend of ary here ? */
3915 for (++MARK; MARK <= SP; MARK++) {
3918 sv_setsv(sv, *MARK);
3923 PUSHi( AvFILL(ary) + 1 );
3931 SV *sv = av_pop(av);
3933 (void)sv_2mortal(sv);
3942 SV *sv = av_shift(av);
3947 (void)sv_2mortal(sv);
3954 dSP; dMARK; dORIGMARK; dTARGET;
3955 register AV *ary = (AV*)*++MARK;
3960 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3961 *MARK-- = SvTIED_obj((SV*)ary, mg);
3965 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3970 av_unshift(ary, SP - MARK);
3973 sv_setsv(sv, *++MARK);
3974 (void)av_store(ary, i++, sv);
3978 PUSHi( AvFILL(ary) + 1 );
3988 if (GIMME == G_ARRAY) {
3995 /* safe as long as stack cannot get extended in the above */
4000 register char *down;
4005 SvUTF8_off(TARG); /* decontaminate */
4007 do_join(TARG, &PL_sv_no, MARK, SP);
4009 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
4010 up = SvPV_force(TARG, len);
4012 if (DO_UTF8(TARG)) { /* first reverse each character */
4013 U8* s = (U8*)SvPVX(TARG);
4014 U8* send = (U8*)(s + len);
4016 if (UTF8_IS_INVARIANT(*s)) {
4021 if (!utf8_to_uvchr(s, 0))
4025 down = (char*)(s - 1);
4026 /* reverse this character */
4036 down = SvPVX(TARG) + len - 1;
4042 (void)SvPOK_only_UTF8(TARG);
4051 S_mul128(pTHX_ SV *sv, U8 m)
4054 char *s = SvPV(sv, len);
4058 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
4059 SV *tmpNew = newSVpvn("0000000000", 10);
4061 sv_catsv(tmpNew, sv);
4062 SvREFCNT_dec(sv); /* free old sv */
4067 while (!*t) /* trailing '\0'? */
4070 i = ((*t - '0') << 7) + m;
4071 *(t--) = '0' + (i % 10);
4077 /* Explosives and implosives. */
4079 #if 'I' == 73 && 'J' == 74
4080 /* On an ASCII/ISO kind of system */
4081 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
4084 Some other sort of character set - use memchr() so we don't match
4087 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
4095 I32 start_sp_offset = SP - PL_stack_base;
4096 I32 gimme = GIMME_V;
4100 register char *pat = SvPV(left, llen);
4101 #ifdef PACKED_IS_OCTETS
4102 /* Packed side is assumed to be octets - so force downgrade if it
4103 has been UTF-8 encoded by accident
4105 register char *s = SvPVbyte(right, rlen);
4107 register char *s = SvPV(right, rlen);
4109 char *strend = s + rlen;
4111 register char *patend = pat + llen;
4117 /* These must not be in registers: */
4134 register U32 culong;
4138 #ifdef PERL_NATINT_PACK
4139 int natint; /* native integer */
4140 int unatint; /* unsigned native integer */
4143 if (gimme != G_ARRAY) { /* arrange to do first one only */
4145 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
4146 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
4148 while (isDIGIT(*patend) || *patend == '*')
4154 while (pat < patend) {
4156 datumtype = *pat++ & 0xFF;
4157 #ifdef PERL_NATINT_PACK
4160 if (isSPACE(datumtype))
4162 if (datumtype == '#') {
4163 while (pat < patend && *pat != '\n')
4168 char *natstr = "sSiIlL";
4170 if (strchr(natstr, datumtype)) {
4171 #ifdef PERL_NATINT_PACK
4177 DIE(aTHX_ "'!' allowed only after types %s", natstr);
4182 else if (*pat == '*') {
4183 len = strend - strbeg; /* long enough */
4187 else if (isDIGIT(*pat)) {
4189 while (isDIGIT(*pat)) {
4190 len = (len * 10) + (*pat++ - '0');
4192 DIE(aTHX_ "Repeat count in unpack overflows");
4196 len = (datumtype != '@');
4200 DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
4201 case ',': /* grandfather in commas but with a warning */
4202 if (commas++ == 0 && ckWARN(WARN_UNPACK))
4203 Perl_warner(aTHX_ WARN_UNPACK,
4204 "Invalid type in unpack: '%c'", (int)datumtype);
4207 if (len == 1 && pat[-1] != '1')
4216 if (len > strend - strbeg)
4217 DIE(aTHX_ "@ outside of string");
4221 if (len > s - strbeg)
4222 DIE(aTHX_ "X outside of string");
4226 if (len > strend - s)
4227 DIE(aTHX_ "x outside of string");
4231 if (start_sp_offset >= SP - PL_stack_base)
4232 DIE(aTHX_ "/ must follow a numeric type");
4235 pat++; /* ignore '*' for compatibility with pack */
4237 DIE(aTHX_ "/ cannot take a count" );
4244 if (len > strend - s)
4247 goto uchar_checksum;
4248 sv = NEWSV(35, len);
4249 sv_setpvn(sv, s, len);
4251 if (datumtype == 'A' || datumtype == 'Z') {
4252 aptr = s; /* borrow register */
4253 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
4258 else { /* 'A' strips both nulls and spaces */
4259 s = SvPVX(sv) + len - 1;
4260 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
4264 SvCUR_set(sv, s - SvPVX(sv));
4265 s = aptr; /* unborrow register */
4267 XPUSHs(sv_2mortal(sv));
4271 if (star || len > (strend - s) * 8)
4272 len = (strend - s) * 8;
4275 Newz(601, PL_bitcount, 256, char);
4276 for (bits = 1; bits < 256; bits++) {
4277 if (bits & 1) PL_bitcount[bits]++;
4278 if (bits & 2) PL_bitcount[bits]++;
4279 if (bits & 4) PL_bitcount[bits]++;
4280 if (bits & 8) PL_bitcount[bits]++;
4281 if (bits & 16) PL_bitcount[bits]++;
4282 if (bits & 32) PL_bitcount[bits]++;
4283 if (bits & 64) PL_bitcount[bits]++;
4284 if (bits & 128) PL_bitcount[bits]++;
4288 culong += PL_bitcount[*(unsigned char*)s++];
4293 if (datumtype == 'b') {
4295 if (bits & 1) culong++;
4301 if (bits & 128) culong++;
4308 sv = NEWSV(35, len + 1);
4312 if (datumtype == 'b') {
4314 for (len = 0; len < aint; len++) {
4315 if (len & 7) /*SUPPRESS 595*/
4319 *str++ = '0' + (bits & 1);
4324 for (len = 0; len < aint; len++) {
4329 *str++ = '0' + ((bits & 128) != 0);
4333 XPUSHs(sv_2mortal(sv));
4337 if (star || len > (strend - s) * 2)
4338 len = (strend - s) * 2;
4339 sv = NEWSV(35, len + 1);
4343 if (datumtype == 'h') {
4345 for (len = 0; len < aint; len++) {
4350 *str++ = PL_hexdigit[bits & 15];
4355 for (len = 0; len < aint; len++) {
4360 *str++ = PL_hexdigit[(bits >> 4) & 15];
4364 XPUSHs(sv_2mortal(sv));
4367 if (len > strend - s)
4372 if (aint >= 128) /* fake up signed chars */
4382 if (aint >= 128) /* fake up signed chars */
4385 sv_setiv(sv, (IV)aint);
4386 PUSHs(sv_2mortal(sv));
4391 if (len > strend - s)
4406 sv_setiv(sv, (IV)auint);
4407 PUSHs(sv_2mortal(sv));
4412 if (len > strend - s)
4415 while (len-- > 0 && s < strend) {
4417 auint = utf8n_to_uvchr((U8*)s, strend - s, &alen, 0);
4421 cdouble += (NV)auint;
4429 while (len-- > 0 && s < strend) {
4431 auint = utf8n_to_uvchr((U8*)s, strend - s, &alen, 0);
4435 sv_setuv(sv, (UV)auint);
4436 PUSHs(sv_2mortal(sv));
4441 #if SHORTSIZE == SIZE16
4442 along = (strend - s) / SIZE16;
4444 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
4449 #if SHORTSIZE != SIZE16
4453 COPYNN(s, &ashort, sizeof(short));
4464 #if SHORTSIZE > SIZE16
4476 #if SHORTSIZE != SIZE16
4480 COPYNN(s, &ashort, sizeof(short));
4483 sv_setiv(sv, (IV)ashort);
4484 PUSHs(sv_2mortal(sv));
4492 #if SHORTSIZE > SIZE16
4498 sv_setiv(sv, (IV)ashort);
4499 PUSHs(sv_2mortal(sv));
4507 #if SHORTSIZE == SIZE16
4508 along = (strend - s) / SIZE16;
4510 unatint = natint && datumtype == 'S';
4511 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
4516 #if SHORTSIZE != SIZE16
4518 unsigned short aushort;
4520 COPYNN(s, &aushort, sizeof(unsigned short));
4521 s += sizeof(unsigned short);
4529 COPY16(s, &aushort);
4532 if (datumtype == 'n')
4533 aushort = PerlSock_ntohs(aushort);
4536 if (datumtype == 'v')
4537 aushort = vtohs(aushort);
4546 #if SHORTSIZE != SIZE16
4548 unsigned short aushort;
4550 COPYNN(s, &aushort, sizeof(unsigned short));
4551 s += sizeof(unsigned short);
4553 sv_setiv(sv, (UV)aushort);
4554 PUSHs(sv_2mortal(sv));
4561 COPY16(s, &aushort);
4565 if (datumtype == 'n')
4566 aushort = PerlSock_ntohs(aushort);
4569 if (datumtype == 'v')
4570 aushort = vtohs(aushort);
4572 sv_setiv(sv, (UV)aushort);
4573 PUSHs(sv_2mortal(sv));
4579 along = (strend - s) / sizeof(int);
4584 Copy(s, &aint, 1, int);
4587 cdouble += (NV)aint;
4596 Copy(s, &aint, 1, int);
4600 /* Without the dummy below unpack("i", pack("i",-1))
4601 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
4602 * cc with optimization turned on.
4604 * The bug was detected in
4605 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
4606 * with optimization (-O4) turned on.
4607 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
4608 * does not have this problem even with -O4.
4610 * This bug was reported as DECC_BUGS 1431
4611 * and tracked internally as GEM_BUGS 7775.
4613 * The bug is fixed in
4614 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
4615 * UNIX V4.0F support: DEC C V5.9-006 or later
4616 * UNIX V4.0E support: DEC C V5.8-011 or later
4619 * See also few lines later for the same bug.
4622 sv_setiv(sv, (IV)aint) :
4624 sv_setiv(sv, (IV)aint);
4625 PUSHs(sv_2mortal(sv));
4630 along = (strend - s) / sizeof(unsigned int);
4635 Copy(s, &auint, 1, unsigned int);
4636 s += sizeof(unsigned int);
4638 cdouble += (NV)auint;
4647 Copy(s, &auint, 1, unsigned int);
4648 s += sizeof(unsigned int);
4651 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
4652 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
4653 * See details few lines earlier. */
4655 sv_setuv(sv, (UV)auint) :
4657 sv_setuv(sv, (UV)auint);
4658 PUSHs(sv_2mortal(sv));
4663 #if LONGSIZE == SIZE32
4664 along = (strend - s) / SIZE32;
4666 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
4671 #if LONGSIZE != SIZE32
4674 COPYNN(s, &along, sizeof(long));
4677 cdouble += (NV)along;
4686 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
4690 #if LONGSIZE > SIZE32
4691 if (along > 2147483647)
4692 along -= 4294967296;
4696 cdouble += (NV)along;
4705 #if LONGSIZE != SIZE32
4708 COPYNN(s, &along, sizeof(long));
4711 sv_setiv(sv, (IV)along);
4712 PUSHs(sv_2mortal(sv));
4719 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
4723 #if LONGSIZE > SIZE32
4724 if (along > 2147483647)
4725 along -= 4294967296;
4729 sv_setiv(sv, (IV)along);
4730 PUSHs(sv_2mortal(sv));
4738 #if LONGSIZE == SIZE32
4739 along = (strend - s) / SIZE32;
4741 unatint = natint && datumtype == 'L';
4742 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
4747 #if LONGSIZE != SIZE32
4749 unsigned long aulong;
4751 COPYNN(s, &aulong, sizeof(unsigned long));
4752 s += sizeof(unsigned long);
4754 cdouble += (NV)aulong;
4766 if (datumtype == 'N')
4767 aulong = PerlSock_ntohl(aulong);
4770 if (datumtype == 'V')
4771 aulong = vtohl(aulong);
4774 cdouble += (NV)aulong;
4783 #if LONGSIZE != SIZE32
4785 unsigned long aulong;
4787 COPYNN(s, &aulong, sizeof(unsigned long));
4788 s += sizeof(unsigned long);
4790 sv_setuv(sv, (UV)aulong);
4791 PUSHs(sv_2mortal(sv));
4801 if (datumtype == 'N')
4802 aulong = PerlSock_ntohl(aulong);
4805 if (datumtype == 'V')
4806 aulong = vtohl(aulong);
4809 sv_setuv(sv, (UV)aulong);
4810 PUSHs(sv_2mortal(sv));
4816 along = (strend - s) / sizeof(char*);
4822 if (sizeof(char*) > strend - s)
4825 Copy(s, &aptr, 1, char*);
4831 PUSHs(sv_2mortal(sv));
4841 while ((len > 0) && (s < strend)) {
4842 auv = (auv << 7) | (*s & 0x7f);
4843 /* UTF8_IS_XXXXX not right here - using constant 0x80 */
4844 if ((U8)(*s++) < 0x80) {
4848 PUSHs(sv_2mortal(sv));
4852 else if (++bytes >= sizeof(UV)) { /* promote to string */
4856 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
4857 while (s < strend) {
4858 sv = mul128(sv, *s & 0x7f);
4859 if (!(*s++ & 0x80)) {
4868 PUSHs(sv_2mortal(sv));
4873 if ((s >= strend) && bytes)
4874 DIE(aTHX_ "Unterminated compressed integer");
4879 if (sizeof(char*) > strend - s)
4882 Copy(s, &aptr, 1, char*);
4887 sv_setpvn(sv, aptr, len);
4888 PUSHs(sv_2mortal(sv));
4892 along = (strend - s) / sizeof(Quad_t);
4898 if (s + sizeof(Quad_t) > strend)
4901 Copy(s, &aquad, 1, Quad_t);
4902 s += sizeof(Quad_t);
4905 if (aquad >= IV_MIN && aquad <= IV_MAX)
4906 sv_setiv(sv, (IV)aquad);
4908 sv_setnv(sv, (NV)aquad);
4909 PUSHs(sv_2mortal(sv));
4913 along = (strend - s) / sizeof(Quad_t);
4919 if (s + sizeof(Uquad_t) > strend)
4922 Copy(s, &auquad, 1, Uquad_t);
4923 s += sizeof(Uquad_t);
4926 if (auquad <= UV_MAX)
4927 sv_setuv(sv, (UV)auquad);
4929 sv_setnv(sv, (NV)auquad);
4930 PUSHs(sv_2mortal(sv));
4934 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
4937 along = (strend - s) / sizeof(float);
4942 Copy(s, &afloat, 1, float);
4951 Copy(s, &afloat, 1, float);
4954 sv_setnv(sv, (NV)afloat);
4955 PUSHs(sv_2mortal(sv));
4961 along = (strend - s) / sizeof(double);
4966 Copy(s, &adouble, 1, double);
4967 s += sizeof(double);
4975 Copy(s, &adouble, 1, double);
4976 s += sizeof(double);
4978 sv_setnv(sv, (NV)adouble);
4979 PUSHs(sv_2mortal(sv));
4985 * Initialise the decode mapping. By using a table driven
4986 * algorithm, the code will be character-set independent
4987 * (and just as fast as doing character arithmetic)
4989 if (PL_uudmap['M'] == 0) {
4992 for (i = 0; i < sizeof(PL_uuemap); i += 1)
4993 PL_uudmap[(U8)PL_uuemap[i]] = i;
4995 * Because ' ' and '`' map to the same value,
4996 * we need to decode them both the same.
5001 along = (strend - s) * 3 / 4;
5002 sv = NEWSV(42, along);
5005 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
5010 len = PL_uudmap[*(U8*)s++] & 077;
5012 if (s < strend && ISUUCHAR(*s))
5013 a = PL_uudmap[*(U8*)s++] & 077;
5016 if (s < strend && ISUUCHAR(*s))
5017 b = PL_uudmap[*(U8*)s++] & 077;
5020 if (s < strend && ISUUCHAR(*s))
5021 c = PL_uudmap[*(U8*)s++] & 077;
5024 if (s < strend && ISUUCHAR(*s))
5025 d = PL_uudmap[*(U8*)s++] & 077;
5028 hunk[0] = (a << 2) | (b >> 4);
5029 hunk[1] = (b << 4) | (c >> 2);
5030 hunk[2] = (c << 6) | d;
5031 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
5036 else if (s[1] == '\n') /* possible checksum byte */
5039 XPUSHs(sv_2mortal(sv));
5044 if (strchr("fFdD", datumtype) ||
5045 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
5049 while (checksum >= 16) {
5053 while (checksum >= 4) {
5059 along = (1 << checksum) - 1;
5060 while (cdouble < 0.0)
5062 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
5063 sv_setnv(sv, cdouble);
5066 if (checksum < 32) {
5067 aulong = (1 << checksum) - 1;
5070 sv_setuv(sv, (UV)culong);
5072 XPUSHs(sv_2mortal(sv));
5076 if (SP - PL_stack_base == start_sp_offset && gimme == G_SCALAR)
5077 PUSHs(&PL_sv_undef);
5082 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
5086 *hunk = PL_uuemap[len];
5087 sv_catpvn(sv, hunk, 1);
5090 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
5091 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
5092 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
5093 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
5094 sv_catpvn(sv, hunk, 4);
5099 char r = (len > 1 ? s[1] : '\0');
5100 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
5101 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
5102 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
5103 hunk[3] = PL_uuemap[0];
5104 sv_catpvn(sv, hunk, 4);
5106 sv_catpvn(sv, "\n", 1);
5110 S_is_an_int(pTHX_ char *s, STRLEN l)
5113 SV *result = newSVpvn(s, l);
5114 char *result_c = SvPV(result, n_a); /* convenience */
5115 char *out = result_c;
5125 SvREFCNT_dec(result);
5148 SvREFCNT_dec(result);
5154 SvCUR_set(result, out - result_c);
5158 /* pnum must be '\0' terminated */
5160 S_div128(pTHX_ SV *pnum, bool *done)
5163 char *s = SvPV(pnum, len);
5172 i = m * 10 + (*t - '0');
5174 r = (i >> 7); /* r < 10 */
5181 SvCUR_set(pnum, (STRLEN) (t - s));
5188 dSP; dMARK; dORIGMARK; dTARGET;
5189 register SV *cat = TARG;
5192 register char *pat = SvPVx(*++MARK, fromlen);
5194 register char *patend = pat + fromlen;
5199 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
5200 static char *space10 = " ";
5202 /* These must not be in registers: */
5217 #ifdef PERL_NATINT_PACK
5218 int natint; /* native integer */
5223 sv_setpvn(cat, "", 0);
5225 while (pat < patend) {
5226 SV *lengthcode = Nullsv;
5227 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
5228 datumtype = *pat++ & 0xFF;
5229 #ifdef PERL_NATINT_PACK
5232 if (isSPACE(datumtype)) {
5236 #ifndef PACKED_IS_OCTETS
5237 if (datumtype == 'U' && pat == patcopy+1)
5240 if (datumtype == '#') {
5241 while (pat < patend && *pat != '\n')
5246 char *natstr = "sSiIlL";
5248 if (strchr(natstr, datumtype)) {
5249 #ifdef PERL_NATINT_PACK
5255 DIE(aTHX_ "'!' allowed only after types %s", natstr);
5258 len = strchr("@Xxu", datumtype) ? 0 : items;
5261 else if (isDIGIT(*pat)) {
5263 while (isDIGIT(*pat)) {
5264 len = (len * 10) + (*pat++ - '0');
5266 DIE(aTHX_ "Repeat count in pack overflows");
5273 if ((*pat != 'a' && *pat != 'A' && *pat != 'Z') || pat[1] != '*')
5274 DIE(aTHX_ "/ must be followed by a*, A* or Z*");
5275 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
5276 ? *MARK : &PL_sv_no)
5277 + (*pat == 'Z' ? 1 : 0)));
5281 DIE(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
5282 case ',': /* grandfather in commas but with a warning */
5283 if (commas++ == 0 && ckWARN(WARN_PACK))
5284 Perl_warner(aTHX_ WARN_PACK,
5285 "Invalid type in pack: '%c'", (int)datumtype);
5288 DIE(aTHX_ "%% may only be used in unpack");
5299 if (SvCUR(cat) < len)
5300 DIE(aTHX_ "X outside of string");
5307 sv_catpvn(cat, null10, 10);
5310 sv_catpvn(cat, null10, len);
5316 aptr = SvPV(fromstr, fromlen);
5317 if (pat[-1] == '*') {
5319 if (datumtype == 'Z')
5322 if (fromlen >= len) {
5323 sv_catpvn(cat, aptr, len);
5324 if (datumtype == 'Z')
5325 *(SvEND(cat)-1) = '\0';
5328 sv_catpvn(cat, aptr, fromlen);
5330 if (datumtype == 'A') {
5332 sv_catpvn(cat, space10, 10);
5335 sv_catpvn(cat, space10, len);
5339 sv_catpvn(cat, null10, 10);
5342 sv_catpvn(cat, null10, len);
5354 str = SvPV(fromstr, fromlen);
5358 SvCUR(cat) += (len+7)/8;
5359 SvGROW(cat, SvCUR(cat) + 1);
5360 aptr = SvPVX(cat) + aint;
5365 if (datumtype == 'B') {
5366 for (len = 0; len++ < aint;) {
5367 items |= *str++ & 1;
5371 *aptr++ = items & 0xff;
5377 for (len = 0; len++ < aint;) {
5383 *aptr++ = items & 0xff;
5389 if (datumtype == 'B')
5390 items <<= 7 - (aint & 7);
5392 items >>= 7 - (aint & 7);
5393 *aptr++ = items & 0xff;
5395 str = SvPVX(cat) + SvCUR(cat);
5410 str = SvPV(fromstr, fromlen);
5414 SvCUR(cat) += (len+1)/2;
5415 SvGROW(cat, SvCUR(cat) + 1);
5416 aptr = SvPVX(cat) + aint;
5421 if (datumtype == 'H') {
5422 for (len = 0; len++ < aint;) {
5424 items |= ((*str++ & 15) + 9) & 15;
5426 items |= *str++ & 15;
5430 *aptr++ = items & 0xff;
5436 for (len = 0; len++ < aint;) {
5438 items |= (((*str++ & 15) + 9) & 15) << 4;
5440 items |= (*str++ & 15) << 4;
5444 *aptr++ = items & 0xff;
5450 *aptr++ = items & 0xff;
5451 str = SvPVX(cat) + SvCUR(cat);
5462 aint = SvIV(fromstr);
5464 sv_catpvn(cat, &achar, sizeof(char));
5470 auint = SvUV(fromstr);
5471 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
5472 SvCUR_set(cat, (char*)uvchr_to_utf8((U8*)SvEND(cat),auint)
5477 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
5482 afloat = (float)SvNV(fromstr);
5483 sv_catpvn(cat, (char *)&afloat, sizeof (float));
5490 adouble = (double)SvNV(fromstr);
5491 sv_catpvn(cat, (char *)&adouble, sizeof (double));
5497 ashort = (I16)SvIV(fromstr);
5499 ashort = PerlSock_htons(ashort);
5501 CAT16(cat, &ashort);
5507 ashort = (I16)SvIV(fromstr);
5509 ashort = htovs(ashort);
5511 CAT16(cat, &ashort);
5515 #if SHORTSIZE != SIZE16
5517 unsigned short aushort;
5521 aushort = SvUV(fromstr);
5522 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
5532 aushort = (U16)SvUV(fromstr);
5533 CAT16(cat, &aushort);
5539 #if SHORTSIZE != SIZE16
5545 ashort = SvIV(fromstr);
5546 sv_catpvn(cat, (char *)&ashort, sizeof(short));
5554 ashort = (I16)SvIV(fromstr);
5555 CAT16(cat, &ashort);
5562 auint = SvUV(fromstr);
5563 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
5569 adouble = Perl_floor(SvNV(fromstr));
5572 DIE(aTHX_ "Cannot compress negative numbers");
5575 #if UVSIZE > 4 && UVSIZE >= NVSIZE
5576 adouble <= 0xffffffff
5578 # ifdef CXUX_BROKEN_CONSTANT_CONVERT
5579 adouble <= UV_MAX_cxux
5586 char buf[1 + sizeof(UV)];
5587 char *in = buf + sizeof(buf);
5588 UV auv = U_V(adouble);
5591 *--in = (auv & 0x7f) | 0x80;
5594 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
5595 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
5597 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
5598 char *from, *result, *in;
5603 /* Copy string and check for compliance */
5604 from = SvPV(fromstr, len);
5605 if ((norm = is_an_int(from, len)) == NULL)
5606 DIE(aTHX_ "can compress only unsigned integer");
5608 New('w', result, len, char);
5612 *--in = div128(norm, &done) | 0x80;
5613 result[len - 1] &= 0x7F; /* clear continue bit */
5614 sv_catpvn(cat, in, (result + len) - in);
5616 SvREFCNT_dec(norm); /* free norm */
5618 else if (SvNOKp(fromstr)) {
5619 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
5620 char *in = buf + sizeof(buf);
5623 double next = floor(adouble / 128);
5624 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
5625 if (in <= buf) /* this cannot happen ;-) */
5626 DIE(aTHX_ "Cannot compress integer");
5629 } while (adouble > 0);
5630 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
5631 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
5634 DIE(aTHX_ "Cannot compress non integer");
5640 aint = SvIV(fromstr);
5641 sv_catpvn(cat, (char*)&aint, sizeof(int));
5647 aulong = SvUV(fromstr);
5649 aulong = PerlSock_htonl(aulong);
5651 CAT32(cat, &aulong);
5657 aulong = SvUV(fromstr);
5659 aulong = htovl(aulong);
5661 CAT32(cat, &aulong);
5665 #if LONGSIZE != SIZE32
5667 unsigned long aulong;
5671 aulong = SvUV(fromstr);
5672 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
5680 aulong = SvUV(fromstr);
5681 CAT32(cat, &aulong);
5686 #if LONGSIZE != SIZE32
5692 along = SvIV(fromstr);
5693 sv_catpvn(cat, (char *)&along, sizeof(long));
5701 along = SvIV(fromstr);
5710 auquad = (Uquad_t)SvUV(fromstr);
5711 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
5717 aquad = (Quad_t)SvIV(fromstr);
5718 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
5723 len = 1; /* assume SV is correct length */
5728 if (fromstr == &PL_sv_undef)
5732 /* XXX better yet, could spirit away the string to
5733 * a safe spot and hang on to it until the result
5734 * of pack() (and all copies of the result) are
5737 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
5738 || (SvPADTMP(fromstr)
5739 && !SvREADONLY(fromstr))))
5741 Perl_warner(aTHX_ WARN_PACK,
5742 "Attempt to pack pointer to temporary value");
5744 if (SvPOK(fromstr) || SvNIOK(fromstr))
5745 aptr = SvPV(fromstr,n_a);
5747 aptr = SvPV_force(fromstr,n_a);
5749 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
5754 aptr = SvPV(fromstr, fromlen);
5755 SvGROW(cat, fromlen * 4 / 3);
5760 while (fromlen > 0) {
5767 doencodes(cat, aptr, todo);
5786 register IV limit = POPi; /* note, negative is forever */
5789 register char *s = SvPV(sv, len);
5790 bool do_utf8 = DO_UTF8(sv);
5791 char *strend = s + len;
5793 register REGEXP *rx;
5797 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
5798 I32 maxiters = slen + 10;
5801 I32 origlimit = limit;
5804 AV *oldstack = PL_curstack;
5805 I32 gimme = GIMME_V;
5806 I32 oldsave = PL_savestack_ix;
5807 I32 make_mortal = 1;
5808 MAGIC *mg = (MAGIC *) NULL;
5811 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
5816 DIE(aTHX_ "panic: pp_split");
5817 rx = pm->op_pmregexp;
5819 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
5820 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
5822 if (pm->op_pmreplroot) {
5824 ary = GvAVn((GV*)PL_curpad[(PADOFFSET)pm->op_pmreplroot]);
5826 ary = GvAVn((GV*)pm->op_pmreplroot);
5829 else if (gimme != G_ARRAY)
5831 ary = (AV*)PL_curpad[0];
5833 ary = GvAVn(PL_defgv);
5834 #endif /* USE_THREADS */
5837 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
5843 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
5845 XPUSHs(SvTIED_obj((SV*)ary, mg));
5851 for (i = AvFILLp(ary); i >= 0; i--)
5852 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5854 /* temporarily switch stacks */
5855 SWITCHSTACK(PL_curstack, ary);
5859 base = SP - PL_stack_base;
5861 if (pm->op_pmflags & PMf_SKIPWHITE) {
5862 if (pm->op_pmflags & PMf_LOCALE) {
5863 while (isSPACE_LC(*s))
5871 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
5872 SAVEINT(PL_multiline);
5873 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
5877 limit = maxiters + 2;
5878 if (pm->op_pmflags & PMf_WHITE) {
5881 while (m < strend &&
5882 !((pm->op_pmflags & PMf_LOCALE)
5883 ? isSPACE_LC(*m) : isSPACE(*m)))
5888 dstr = NEWSV(30, m-s);
5889 sv_setpvn(dstr, s, m-s);
5893 (void)SvUTF8_on(dstr);
5897 while (s < strend &&
5898 ((pm->op_pmflags & PMf_LOCALE)
5899 ? isSPACE_LC(*s) : isSPACE(*s)))
5903 else if (strEQ("^", rx->precomp)) {
5906 for (m = s; m < strend && *m != '\n'; m++) ;
5910 dstr = NEWSV(30, m-s);
5911 sv_setpvn(dstr, s, m-s);
5915 (void)SvUTF8_on(dstr);
5920 else if (do_utf8 == ((rx->reganch & ROPT_UTF8) != 0) &&
5921 (rx->reganch & RE_USE_INTUIT) && !rx->nparens
5922 && (rx->reganch & ROPT_CHECK_ALL)
5923 && !(rx->reganch & ROPT_ANCH)) {
5924 int tail = (rx->reganch & RE_INTUIT_TAIL);
5925 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
5928 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
5930 char c = *SvPV(csv, n_a);
5933 for (m = s; m < strend && *m != c; m++) ;
5936 dstr = NEWSV(30, m-s);
5937 sv_setpvn(dstr, s, m-s);
5941 (void)SvUTF8_on(dstr);
5943 /* The rx->minlen is in characters but we want to step
5944 * s ahead by bytes. */
5946 s = (char*)utf8_hop((U8*)m, len);
5948 s = m + len; /* Fake \n at the end */
5953 while (s < strend && --limit &&
5954 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
5955 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
5958 dstr = NEWSV(31, m-s);
5959 sv_setpvn(dstr, s, m-s);
5963 (void)SvUTF8_on(dstr);
5965 /* The rx->minlen is in characters but we want to step
5966 * s ahead by bytes. */
5968 s = (char*)utf8_hop((U8*)m, len);
5970 s = m + len; /* Fake \n at the end */
5975 maxiters += slen * rx->nparens;
5976 while (s < strend && --limit
5977 /* && (!rx->check_substr
5978 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
5980 */ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
5981 1 /* minend */, sv, NULL, 0))
5983 TAINT_IF(RX_MATCH_TAINTED(rx));
5984 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
5989 strend = s + (strend - m);
5991 m = rx->startp[0] + orig;
5992 dstr = NEWSV(32, m-s);
5993 sv_setpvn(dstr, s, m-s);
5997 (void)SvUTF8_on(dstr);
6000 for (i = 1; i <= rx->nparens; i++) {
6001 s = rx->startp[i] + orig;
6002 m = rx->endp[i] + orig;
6004 dstr = NEWSV(33, m-s);
6005 sv_setpvn(dstr, s, m-s);
6008 dstr = NEWSV(33, 0);
6012 (void)SvUTF8_on(dstr);
6016 s = rx->endp[0] + orig;
6020 LEAVE_SCOPE(oldsave);
6021 iters = (SP - PL_stack_base) - base;
6022 if (iters > maxiters)
6023 DIE(aTHX_ "Split loop");
6025 /* keep field after final delim? */
6026 if (s < strend || (iters && origlimit)) {
6027 STRLEN l = strend - s;
6028 dstr = NEWSV(34, l);
6029 sv_setpvn(dstr, s, l);
6033 (void)SvUTF8_on(dstr);
6037 else if (!origlimit) {
6038 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
6044 SWITCHSTACK(ary, oldstack);
6045 if (SvSMAGICAL(ary)) {
6050 if (gimme == G_ARRAY) {
6052 Copy(AvARRAY(ary), SP + 1, iters, SV*);
6060 call_method("PUSH",G_SCALAR|G_DISCARD);
6063 if (gimme == G_ARRAY) {
6064 /* EXTEND should not be needed - we just popped them */
6066 for (i=0; i < iters; i++) {
6067 SV **svp = av_fetch(ary, i, FALSE);
6068 PUSHs((svp) ? *svp : &PL_sv_undef);
6075 if (gimme == G_ARRAY)
6078 if (iters || !pm->op_pmreplroot) {
6088 Perl_unlock_condpair(pTHX_ void *svv)
6090 MAGIC *mg = mg_find((SV*)svv, 'm');
6093 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
6094 MUTEX_LOCK(MgMUTEXP(mg));
6095 if (MgOWNER(mg) != thr)
6096 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
6098 COND_SIGNAL(MgOWNERCONDP(mg));
6099 DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": unlock 0x%"UVxf"\n",
6100 PTR2UV(thr), PTR2UV(svv));)
6101 MUTEX_UNLOCK(MgMUTEXP(mg));
6103 #endif /* USE_THREADS */
6112 #endif /* USE_THREADS */
6113 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
6114 || SvTYPE(retsv) == SVt_PVCV) {
6115 retsv = refto(retsv);
6126 if (PL_op->op_private & OPpLVAL_INTRO)
6127 PUSHs(*save_threadsv(PL_op->op_targ));
6129 PUSHs(THREADSV(PL_op->op_targ));
6132 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
6133 #endif /* USE_THREADS */