3 * Copyright (c) 1991-1999, 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 BYTEORDER > 0xFFFF && defined(_CRAY) && !defined(_CRAYMPP)
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 */
89 /* XXX I can't imagine anyone who doesn't have this actually _needs_
90 it, since pid_t is an integral type.
93 #ifdef NEED_GETPID_PROTO
94 extern Pid_t getpid (void);
100 if (GIMME_V == G_SCALAR)
101 XPUSHs(&PL_sv_undef);
115 if (PL_op->op_private & OPpLVAL_INTRO)
116 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
118 if (PL_op->op_flags & OPf_REF) {
122 if (GIMME == G_ARRAY) {
123 I32 maxarg = AvFILL((AV*)TARG) + 1;
125 if (SvMAGICAL(TARG)) {
127 for (i=0; i < maxarg; i++) {
128 SV **svp = av_fetch((AV*)TARG, i, FALSE);
129 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
133 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
138 SV* sv = sv_newmortal();
139 I32 maxarg = AvFILL((AV*)TARG) + 1;
140 sv_setiv(sv, maxarg);
152 if (PL_op->op_private & OPpLVAL_INTRO)
153 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
154 if (PL_op->op_flags & OPf_REF)
157 if (gimme == G_ARRAY) {
160 else if (gimme == G_SCALAR) {
161 SV* sv = sv_newmortal();
162 if (HvFILL((HV*)TARG))
163 Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
164 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
174 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
185 tryAMAGICunDEREF(to_gv);
188 if (SvTYPE(sv) == SVt_PVIO) {
189 GV *gv = (GV*) sv_newmortal();
190 gv_init(gv, 0, "", 0, 0);
191 GvIOp(gv) = (IO *)sv;
192 (void)SvREFCNT_inc(sv);
195 else if (SvTYPE(sv) != SVt_PVGV)
196 DIE(aTHX_ "Not a GLOB reference");
199 if (SvTYPE(sv) != SVt_PVGV) {
203 if (SvGMAGICAL(sv)) {
209 /* If this is a 'my' scalar and flag is set then vivify
212 if (PL_op->op_private & OPpDEREF) {
213 GV *gv = (GV *) newSV(0);
216 if (cUNOP->op_first->op_type == OP_PADSV) {
217 SV *padname = *av_fetch(PL_comppad_name, cUNOP->op_first->op_targ, 4);
218 name = SvPV(padname,len);
220 gv_init(gv, PL_curcop->cop_stash, name, len, 0);
221 sv_upgrade(sv, SVt_RV);
222 SvRV(sv) = (SV *) gv;
227 if (PL_op->op_flags & OPf_REF ||
228 PL_op->op_private & HINT_STRICT_REFS)
229 DIE(aTHX_ PL_no_usym, "a symbol");
230 if (ckWARN(WARN_UNINITIALIZED))
231 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
235 if ((PL_op->op_flags & OPf_SPECIAL) &&
236 !(PL_op->op_flags & OPf_MOD))
238 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
243 if (PL_op->op_private & HINT_STRICT_REFS)
244 DIE(aTHX_ PL_no_symref, sym, "a symbol");
245 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
249 if (PL_op->op_private & OPpLVAL_INTRO)
250 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
261 tryAMAGICunDEREF(to_sv);
264 switch (SvTYPE(sv)) {
268 DIE(aTHX_ "Not a SCALAR reference");
276 if (SvTYPE(gv) != SVt_PVGV) {
277 if (SvGMAGICAL(sv)) {
283 if (PL_op->op_flags & OPf_REF ||
284 PL_op->op_private & HINT_STRICT_REFS)
285 DIE(aTHX_ PL_no_usym, "a SCALAR");
286 if (ckWARN(WARN_UNINITIALIZED))
287 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
291 if ((PL_op->op_flags & OPf_SPECIAL) &&
292 !(PL_op->op_flags & OPf_MOD))
294 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
299 if (PL_op->op_private & HINT_STRICT_REFS)
300 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
301 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
306 if (PL_op->op_flags & OPf_MOD) {
307 if (PL_op->op_private & OPpLVAL_INTRO)
308 sv = save_scalar((GV*)TOPs);
309 else if (PL_op->op_private & OPpDEREF)
310 vivify_ref(sv, PL_op->op_private & OPpDEREF);
320 SV *sv = AvARYLEN(av);
322 AvARYLEN(av) = sv = NEWSV(0,0);
323 sv_upgrade(sv, SVt_IV);
324 sv_magic(sv, (SV*)av, '#', Nullch, 0);
332 djSP; dTARGET; dPOPss;
334 if (PL_op->op_flags & OPf_MOD) {
335 if (SvTYPE(TARG) < SVt_PVLV) {
336 sv_upgrade(TARG, SVt_PVLV);
337 sv_magic(TARG, Nullsv, '.', Nullch, 0);
341 if (LvTARG(TARG) != sv) {
343 SvREFCNT_dec(LvTARG(TARG));
344 LvTARG(TARG) = SvREFCNT_inc(sv);
346 PUSHs(TARG); /* no SvSETMAGIC */
352 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
353 mg = mg_find(sv, 'g');
354 if (mg && mg->mg_len >= 0) {
358 PUSHi(i + PL_curcop->cop_arybase);
372 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
373 /* (But not in defined().) */
374 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
377 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
378 if ((PL_op->op_private & OPpLVAL_INTRO) && !CvLVALUE(cv))
379 Perl_croak(aTHX_ "Can't modify non-lvalue subroutine call");
382 cv = (CV*)&PL_sv_undef;
396 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
397 char *s = SvPVX(TOPs);
398 if (strnEQ(s, "CORE::", 6)) {
401 code = keyword(s + 6, SvCUR(TOPs) - 6);
402 if (code < 0) { /* Overridable. */
403 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
404 int i = 0, n = 0, seen_question = 0;
406 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
408 while (i < MAXO) { /* The slow way. */
409 if (strEQ(s + 6, PL_op_name[i])
410 || strEQ(s + 6, PL_op_desc[i]))
416 goto nonesuch; /* Should not happen... */
418 oa = PL_opargs[i] >> OASHIFT;
420 if (oa & OA_OPTIONAL) {
424 else if (seen_question)
425 goto set; /* XXXX system, exec */
426 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
427 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
430 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
431 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
435 ret = sv_2mortal(newSVpvn(str, n - 1));
437 else if (code) /* Non-Overridable */
439 else { /* None such */
441 Perl_croak(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
445 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
447 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
456 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
458 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
474 if (GIMME != G_ARRAY) {
478 *MARK = &PL_sv_undef;
479 *MARK = refto(*MARK);
483 EXTEND_MORTAL(SP - MARK);
485 *MARK = refto(*MARK);
490 S_refto(pTHX_ SV *sv)
494 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
497 if (!(sv = LvTARG(sv)))
500 (void)SvREFCNT_inc(sv);
502 else if (SvPADTMP(sv))
506 (void)SvREFCNT_inc(sv);
509 sv_upgrade(rv, SVt_RV);
523 if (sv && SvGMAGICAL(sv))
526 if (!sv || !SvROK(sv))
530 pv = sv_reftype(sv,TRUE);
531 PUSHp(pv, strlen(pv));
541 stash = PL_curcop->cop_stash;
545 char *ptr = SvPV(ssv,len);
546 if (ckWARN(WARN_UNSAFE) && len == 0)
547 Perl_warner(aTHX_ WARN_UNSAFE,
548 "Explicit blessing to '' (assuming package main)");
549 stash = gv_stashpvn(ptr, len, TRUE);
552 (void)sv_bless(TOPs, stash);
566 elem = SvPV(sv, n_a);
570 switch (elem ? *elem : '\0')
573 if (strEQ(elem, "ARRAY"))
574 tmpRef = (SV*)GvAV(gv);
577 if (strEQ(elem, "CODE"))
578 tmpRef = (SV*)GvCVu(gv);
581 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
582 tmpRef = (SV*)GvIOp(gv);
585 if (strEQ(elem, "GLOB"))
589 if (strEQ(elem, "HASH"))
590 tmpRef = (SV*)GvHV(gv);
593 if (strEQ(elem, "IO"))
594 tmpRef = (SV*)GvIOp(gv);
597 if (strEQ(elem, "NAME"))
598 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
601 if (strEQ(elem, "PACKAGE"))
602 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
605 if (strEQ(elem, "SCALAR"))
619 /* Pattern matching */
624 register unsigned char *s;
627 register I32 *sfirst;
631 if (sv == PL_lastscream) {
637 SvSCREAM_off(PL_lastscream);
638 SvREFCNT_dec(PL_lastscream);
640 PL_lastscream = SvREFCNT_inc(sv);
643 s = (unsigned char*)(SvPV(sv, len));
647 if (pos > PL_maxscream) {
648 if (PL_maxscream < 0) {
649 PL_maxscream = pos + 80;
650 New(301, PL_screamfirst, 256, I32);
651 New(302, PL_screamnext, PL_maxscream, I32);
654 PL_maxscream = pos + pos / 4;
655 Renew(PL_screamnext, PL_maxscream, I32);
659 sfirst = PL_screamfirst;
660 snext = PL_screamnext;
662 if (!sfirst || !snext)
663 DIE(aTHX_ "do_study: out of memory");
665 for (ch = 256; ch; --ch)
672 snext[pos] = sfirst[ch] - pos;
679 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
688 if (PL_op->op_flags & OPf_STACKED)
694 TARG = sv_newmortal();
699 /* Lvalue operators. */
711 djSP; dMARK; dTARGET;
721 SETi(do_chomp(TOPs));
727 djSP; dMARK; dTARGET;
728 register I32 count = 0;
731 count += do_chomp(POPs);
742 if (!sv || !SvANY(sv))
744 switch (SvTYPE(sv)) {
746 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
750 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
754 if (CvROOT(sv) || CvXSUB(sv))
771 if (!PL_op->op_private) {
780 if (SvTHINKFIRST(sv))
783 switch (SvTYPE(sv)) {
793 if (ckWARN(WARN_UNSAFE) && cv_const_sv((CV*)sv))
794 Perl_warner(aTHX_ WARN_UNSAFE, "Constant subroutine %s undefined",
795 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
799 /* let user-undef'd sub keep its identity */
800 GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
807 SvSetMagicSV(sv, &PL_sv_undef);
811 Newz(602, gp, 1, GP);
812 GvGP(sv) = gp_ref(gp);
813 GvSV(sv) = NEWSV(72,0);
814 GvLINE(sv) = PL_curcop->cop_line;
820 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
823 SvPV_set(sv, Nullch);
836 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
837 Perl_croak(aTHX_ PL_no_modify);
838 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
839 SvIVX(TOPs) != IV_MIN)
842 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
853 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
854 Perl_croak(aTHX_ PL_no_modify);
855 sv_setsv(TARG, TOPs);
856 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
857 SvIVX(TOPs) != IV_MAX)
860 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
874 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
875 Perl_croak(aTHX_ PL_no_modify);
876 sv_setsv(TARG, TOPs);
877 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
878 SvIVX(TOPs) != IV_MIN)
881 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
890 /* Ordinary operators. */
894 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
897 SETn( pow( left, right) );
904 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
907 SETn( left * right );
914 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
919 DIE(aTHX_ "Illegal division by zero");
921 /* insure that 20./5. == 4. */
924 if ((NV)I_V(left) == left &&
925 (NV)I_V(right) == right &&
926 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
930 value = left / right;
934 value = left / right;
943 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
953 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
955 right = (right_neg = (i < 0)) ? -i : i;
960 right_neg = dright < 0;
965 if (!use_double && SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
967 left = (left_neg = (i < 0)) ? -i : i;
975 left_neg = dleft < 0;
984 /* Somehow U_V is pessimized even if CASTFLAGS is 0 */
986 # define CAST_D2UV(d) U_V(d)
988 # define CAST_D2UV(d) ((UV)(d))
990 /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
991 * or, in other words, precision of UV more than of NV.
992 * But in fact the approach below turned out to be an
993 * optimization - floor() may be slow */
994 if (dright <= UV_MAX && dleft <= UV_MAX) {
995 right = CAST_D2UV(dright);
996 left = CAST_D2UV(dleft);
1001 /* Backward-compatibility clause: */
1002 dright = floor(dright + 0.5);
1003 dleft = floor(dleft + 0.5);
1006 DIE(aTHX_ "Illegal modulus zero");
1008 dans = Perl_fmod(dleft, dright);
1009 if ((left_neg != right_neg) && dans)
1010 dans = dright - dans;
1013 sv_setnv(TARG, dans);
1020 DIE(aTHX_ "Illegal modulus zero");
1023 if ((left_neg != right_neg) && ans)
1026 /* XXX may warn: unary minus operator applied to unsigned type */
1027 /* could change -foo to be (~foo)+1 instead */
1028 if (ans <= ~((UV)IV_MAX)+1)
1029 sv_setiv(TARG, ~ans+1);
1031 sv_setnv(TARG, -(NV)ans);
1034 sv_setuv(TARG, ans);
1043 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1045 register I32 count = POPi;
1046 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1048 I32 items = SP - MARK;
1051 max = items * count;
1060 repeatcpy((char*)(MARK + items), (char*)MARK,
1061 items * sizeof(SV*), count - 1);
1064 else if (count <= 0)
1067 else { /* Note: mark already snarfed by pp_list */
1072 SvSetSV(TARG, tmpstr);
1073 SvPV_force(TARG, len);
1078 SvGROW(TARG, (count * len) + 1);
1079 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1080 SvCUR(TARG) *= count;
1082 *SvEND(TARG) = '\0';
1084 (void)SvPOK_only(TARG);
1093 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1096 SETn( left - right );
1103 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1106 if (PL_op->op_private & HINT_INTEGER)
1107 SETi(TOPi << shift);
1109 SETu(TOPu << shift);
1116 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1119 if (PL_op->op_private & HINT_INTEGER)
1120 SETi(TOPi >> shift);
1122 SETu(TOPu >> shift);
1129 djSP; tryAMAGICbinSET(lt,0);
1132 SETs(boolSV(TOPn < value));
1139 djSP; tryAMAGICbinSET(gt,0);
1142 SETs(boolSV(TOPn > value));
1149 djSP; tryAMAGICbinSET(le,0);
1152 SETs(boolSV(TOPn <= value));
1159 djSP; tryAMAGICbinSET(ge,0);
1162 SETs(boolSV(TOPn >= value));
1169 djSP; tryAMAGICbinSET(ne,0);
1172 SETs(boolSV(TOPn != value));
1179 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1186 else if (left < right)
1188 else if (left > right)
1201 djSP; tryAMAGICbinSET(slt,0);
1204 int cmp = ((PL_op->op_private & OPpLOCALE)
1205 ? sv_cmp_locale(left, right)
1206 : sv_cmp(left, right));
1207 SETs(boolSV(cmp < 0));
1214 djSP; tryAMAGICbinSET(sgt,0);
1217 int cmp = ((PL_op->op_private & OPpLOCALE)
1218 ? sv_cmp_locale(left, right)
1219 : sv_cmp(left, right));
1220 SETs(boolSV(cmp > 0));
1227 djSP; tryAMAGICbinSET(sle,0);
1230 int cmp = ((PL_op->op_private & OPpLOCALE)
1231 ? sv_cmp_locale(left, right)
1232 : sv_cmp(left, right));
1233 SETs(boolSV(cmp <= 0));
1240 djSP; tryAMAGICbinSET(sge,0);
1243 int cmp = ((PL_op->op_private & OPpLOCALE)
1244 ? sv_cmp_locale(left, right)
1245 : sv_cmp(left, right));
1246 SETs(boolSV(cmp >= 0));
1253 djSP; tryAMAGICbinSET(seq,0);
1256 SETs(boolSV(sv_eq(left, right)));
1263 djSP; tryAMAGICbinSET(sne,0);
1266 SETs(boolSV(!sv_eq(left, right)));
1273 djSP; dTARGET; tryAMAGICbin(scmp,0);
1276 int cmp = ((PL_op->op_private & OPpLOCALE)
1277 ? sv_cmp_locale(left, right)
1278 : sv_cmp(left, right));
1286 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1289 if (SvNIOKp(left) || SvNIOKp(right)) {
1290 if (PL_op->op_private & HINT_INTEGER)
1291 SETi( SvIV(left) & SvIV(right) );
1293 SETu( SvUV(left) & SvUV(right) );
1296 do_vop(PL_op->op_type, TARG, left, right);
1305 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1308 if (SvNIOKp(left) || SvNIOKp(right)) {
1309 if (PL_op->op_private & HINT_INTEGER)
1310 SETi( (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right) );
1312 SETu( (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right) );
1315 do_vop(PL_op->op_type, TARG, left, right);
1324 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1327 if (SvNIOKp(left) || SvNIOKp(right)) {
1328 if (PL_op->op_private & HINT_INTEGER)
1329 SETi( (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right) );
1331 SETu( (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right) );
1334 do_vop(PL_op->op_type, TARG, left, right);
1343 djSP; dTARGET; tryAMAGICun(neg);
1348 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv) && SvIVX(sv) != IV_MIN)
1350 else if (SvNIOKp(sv))
1352 else if (SvPOKp(sv)) {
1354 char *s = SvPV(sv, len);
1355 if (isIDFIRST(*s)) {
1356 sv_setpvn(TARG, "-", 1);
1359 else if (*s == '+' || *s == '-') {
1361 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1363 else if (IN_UTF8 && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
1364 sv_setpvn(TARG, "-", 1);
1368 sv_setnv(TARG, -SvNV(sv));
1379 djSP; tryAMAGICunSET(not);
1380 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1386 djSP; dTARGET; tryAMAGICun(compl);
1390 if (PL_op->op_private & HINT_INTEGER)
1396 register char *tmps;
1397 register long *tmpl;
1402 tmps = SvPV_force(TARG, len);
1405 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1408 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1412 for ( ; anum > 0; anum--, tmps++)
1421 /* integer versions of some of the above */
1425 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1428 SETi( left * right );
1435 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1439 DIE(aTHX_ "Illegal division by zero");
1440 value = POPi / value;
1448 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1452 DIE(aTHX_ "Illegal modulus zero");
1453 SETi( left % right );
1460 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1463 SETi( left + right );
1470 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1473 SETi( left - right );
1480 djSP; tryAMAGICbinSET(lt,0);
1483 SETs(boolSV(left < right));
1490 djSP; tryAMAGICbinSET(gt,0);
1493 SETs(boolSV(left > right));
1500 djSP; tryAMAGICbinSET(le,0);
1503 SETs(boolSV(left <= right));
1510 djSP; tryAMAGICbinSET(ge,0);
1513 SETs(boolSV(left >= right));
1520 djSP; tryAMAGICbinSET(eq,0);
1523 SETs(boolSV(left == right));
1530 djSP; tryAMAGICbinSET(ne,0);
1533 SETs(boolSV(left != right));
1540 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1547 else if (left < right)
1558 djSP; dTARGET; tryAMAGICun(neg);
1563 /* High falutin' math. */
1567 djSP; dTARGET; tryAMAGICbin(atan2,0);
1570 SETn(Perl_atan2(left, right));
1577 djSP; dTARGET; tryAMAGICun(sin);
1581 value = Perl_sin(value);
1589 djSP; dTARGET; tryAMAGICun(cos);
1593 value = Perl_cos(value);
1599 /* Support Configure command-line overrides for rand() functions.
1600 After 5.005, perhaps we should replace this by Configure support
1601 for drand48(), random(), or rand(). For 5.005, though, maintain
1602 compatibility by calling rand() but allow the user to override it.
1603 See INSTALL for details. --Andy Dougherty 15 July 1998
1605 /* Now it's after 5.005, and Configure supports drand48() and random(),
1606 in addition to rand(). So the overrides should not be needed any more.
1607 --Jarkko Hietaniemi 27 September 1998
1610 #ifndef HAS_DRAND48_PROTO
1611 extern double drand48 (void);
1624 if (!PL_srand_called) {
1625 (void)seedDrand01((Rand_seed_t)seed());
1626 PL_srand_called = TRUE;
1641 (void)seedDrand01((Rand_seed_t)anum);
1642 PL_srand_called = TRUE;
1651 * This is really just a quick hack which grabs various garbage
1652 * values. It really should be a real hash algorithm which
1653 * spreads the effect of every input bit onto every output bit,
1654 * if someone who knows about such things would bother to write it.
1655 * Might be a good idea to add that function to CORE as well.
1656 * No numbers below come from careful analysis or anything here,
1657 * except they are primes and SEED_C1 > 1E6 to get a full-width
1658 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1659 * probably be bigger too.
1662 # define SEED_C1 1000003
1663 #define SEED_C4 73819
1665 # define SEED_C1 25747
1666 #define SEED_C4 20639
1670 #define SEED_C5 26107
1673 #ifndef PERL_NO_DEV_RANDOM
1678 # include <starlet.h>
1679 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1680 * in 100-ns units, typically incremented ever 10 ms. */
1681 unsigned int when[2];
1683 # ifdef HAS_GETTIMEOFDAY
1684 struct timeval when;
1690 /* This test is an escape hatch, this symbol isn't set by Configure. */
1691 #ifndef PERL_NO_DEV_RANDOM
1692 #ifndef PERL_RANDOM_DEVICE
1693 /* /dev/random isn't used by default because reads from it will block
1694 * if there isn't enough entropy available. You can compile with
1695 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1696 * is enough real entropy to fill the seed. */
1697 # define PERL_RANDOM_DEVICE "/dev/urandom"
1699 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1701 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1710 _ckvmssts(sys$gettim(when));
1711 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1713 # ifdef HAS_GETTIMEOFDAY
1714 gettimeofday(&when,(struct timezone *) 0);
1715 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1718 u = (U32)SEED_C1 * when;
1721 u += SEED_C3 * (U32)getpid();
1722 u += SEED_C4 * (U32)(UV)PL_stack_sp;
1723 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1724 u += SEED_C5 * (U32)(UV)&when;
1731 djSP; dTARGET; tryAMAGICun(exp);
1735 value = Perl_exp(value);
1743 djSP; dTARGET; tryAMAGICun(log);
1748 RESTORE_NUMERIC_STANDARD();
1749 DIE(aTHX_ "Can't take log of %g", value);
1751 value = Perl_log(value);
1759 djSP; dTARGET; tryAMAGICun(sqrt);
1764 RESTORE_NUMERIC_STANDARD();
1765 DIE(aTHX_ "Can't take sqrt of %g", value);
1767 value = Perl_sqrt(value);
1780 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1786 (void)Perl_modf(value, &value);
1788 (void)Perl_modf(-value, &value);
1803 djSP; dTARGET; tryAMAGICun(abs);
1808 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1809 (iv = SvIVX(TOPs)) != IV_MIN) {
1831 XPUSHn(scan_hex(tmps, 99, &argtype));
1844 while (*tmps && isSPACE(*tmps))
1849 value = scan_hex(++tmps, 99, &argtype);
1850 else if (*tmps == 'b')
1851 value = scan_bin(++tmps, 99, &argtype);
1853 value = scan_oct(tmps, 99, &argtype);
1865 SETi( sv_len_utf8(TOPs) );
1869 SETi( sv_len(TOPs) );
1883 I32 lvalue = PL_op->op_flags & OPf_MOD;
1885 I32 arybase = PL_curcop->cop_arybase;
1889 SvTAINTED_off(TARG); /* decontaminate */
1893 repl = SvPV(sv, repl_len);
1900 tmps = SvPV(sv, curlen);
1902 utfcurlen = sv_len_utf8(sv);
1903 if (utfcurlen == curlen)
1911 if (pos >= arybase) {
1929 else if (len >= 0) {
1931 if (rem > (I32)curlen)
1945 if (ckWARN(WARN_SUBSTR) || lvalue || repl)
1946 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
1951 sv_pos_u2b(sv, &pos, &rem);
1953 sv_setpvn(TARG, tmps, rem);
1954 if (lvalue) { /* it's an lvalue! */
1955 if (!SvGMAGICAL(sv)) {
1959 if (ckWARN(WARN_SUBSTR))
1960 Perl_warner(aTHX_ WARN_SUBSTR,
1961 "Attempt to use reference as lvalue in substr");
1963 if (SvOK(sv)) /* is it defined ? */
1964 (void)SvPOK_only(sv);
1966 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
1969 if (SvTYPE(TARG) < SVt_PVLV) {
1970 sv_upgrade(TARG, SVt_PVLV);
1971 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
1975 if (LvTARG(TARG) != sv) {
1977 SvREFCNT_dec(LvTARG(TARG));
1978 LvTARG(TARG) = SvREFCNT_inc(sv);
1980 LvTARGOFF(TARG) = pos;
1981 LvTARGLEN(TARG) = rem;
1984 sv_insert(sv, pos, rem, repl, repl_len);
1987 PUSHs(TARG); /* avoid SvSETMAGIC here */
1994 register I32 size = POPi;
1995 register I32 offset = POPi;
1996 register SV *src = POPs;
1997 I32 lvalue = PL_op->op_flags & OPf_MOD;
1999 SvTAINTED_off(TARG); /* decontaminate */
2000 if (lvalue) { /* it's an lvalue! */
2001 if (SvTYPE(TARG) < SVt_PVLV) {
2002 sv_upgrade(TARG, SVt_PVLV);
2003 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
2006 if (LvTARG(TARG) != src) {
2008 SvREFCNT_dec(LvTARG(TARG));
2009 LvTARG(TARG) = SvREFCNT_inc(src);
2011 LvTARGOFF(TARG) = offset;
2012 LvTARGLEN(TARG) = size;
2015 sv_setuv(TARG, do_vecget(src, offset, size));
2030 I32 arybase = PL_curcop->cop_arybase;
2035 offset = POPi - arybase;
2038 tmps = SvPV(big, biglen);
2039 if (IN_UTF8 && offset > 0)
2040 sv_pos_u2b(big, &offset, 0);
2043 else if (offset > biglen)
2045 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2046 (unsigned char*)tmps + biglen, little, 0)))
2049 retval = tmps2 - tmps;
2050 if (IN_UTF8 && retval > 0)
2051 sv_pos_b2u(big, &retval);
2052 PUSHi(retval + arybase);
2067 I32 arybase = PL_curcop->cop_arybase;
2073 tmps2 = SvPV(little, llen);
2074 tmps = SvPV(big, blen);
2078 if (IN_UTF8 && offset > 0)
2079 sv_pos_u2b(big, &offset, 0);
2080 offset = offset - arybase + llen;
2084 else if (offset > blen)
2086 if (!(tmps2 = rninstr(tmps, tmps + offset,
2087 tmps2, tmps2 + llen)))
2090 retval = tmps2 - tmps;
2091 if (IN_UTF8 && retval > 0)
2092 sv_pos_b2u(big, &retval);
2093 PUSHi(retval + arybase);
2099 djSP; dMARK; dORIGMARK; dTARGET;
2100 do_sprintf(TARG, SP-MARK, MARK+1);
2101 TAINT_IF(SvTAINTED(TARG));
2112 U8 *tmps = (U8*)POPpx;
2115 if (IN_UTF8 && (*tmps & 0x80))
2116 value = utf8_to_uv(tmps, &retlen);
2118 value = (UV)(*tmps & 255);
2129 (void)SvUPGRADE(TARG,SVt_PV);
2131 if (IN_UTF8 && value >= 128) {
2134 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
2135 SvCUR_set(TARG, tmps - SvPVX(TARG));
2137 (void)SvPOK_only(TARG);
2147 (void)SvPOK_only(TARG);
2154 djSP; dTARGET; dPOPTOPssrl;
2157 char *tmps = SvPV(left, n_a);
2159 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
2161 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
2165 "The crypt() function is unimplemented due to excessive paranoia.");
2178 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2182 UV uv = utf8_to_uv(s, &ulen);
2184 if (PL_op->op_private & OPpLOCALE) {
2187 uv = toTITLE_LC_uni(uv);
2190 uv = toTITLE_utf8(s);
2192 tend = uv_to_utf8(tmpbuf, uv);
2194 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2196 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2197 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2201 s = (U8*)SvPV_force(sv, slen);
2202 Copy(tmpbuf, s, ulen, U8);
2206 if (!SvPADTMP(sv)) {
2212 s = (U8*)SvPV_force(sv, slen);
2214 if (PL_op->op_private & OPpLOCALE) {
2217 *s = toUPPER_LC(*s);
2235 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2239 UV uv = utf8_to_uv(s, &ulen);
2241 if (PL_op->op_private & OPpLOCALE) {
2244 uv = toLOWER_LC_uni(uv);
2247 uv = toLOWER_utf8(s);
2249 tend = uv_to_utf8(tmpbuf, uv);
2251 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2253 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2254 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2258 s = (U8*)SvPV_force(sv, slen);
2259 Copy(tmpbuf, s, ulen, U8);
2263 if (!SvPADTMP(sv)) {
2269 s = (U8*)SvPV_force(sv, slen);
2271 if (PL_op->op_private & OPpLOCALE) {
2274 *s = toLOWER_LC(*s);
2299 s = (U8*)SvPV(sv,len);
2301 sv_setpvn(TARG, "", 0);
2305 (void)SvUPGRADE(TARG, SVt_PV);
2306 SvGROW(TARG, (len * 2) + 1);
2307 (void)SvPOK_only(TARG);
2308 d = (U8*)SvPVX(TARG);
2310 if (PL_op->op_private & OPpLOCALE) {
2314 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2320 d = uv_to_utf8(d, toUPPER_utf8( s ));
2325 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2330 if (!SvPADTMP(sv)) {
2336 s = (U8*)SvPV_force(sv, len);
2338 register U8 *send = s + len;
2340 if (PL_op->op_private & OPpLOCALE) {
2343 for (; s < send; s++)
2344 *s = toUPPER_LC(*s);
2347 for (; s < send; s++)
2370 s = (U8*)SvPV(sv,len);
2372 sv_setpvn(TARG, "", 0);
2376 (void)SvUPGRADE(TARG, SVt_PV);
2377 SvGROW(TARG, (len * 2) + 1);
2378 (void)SvPOK_only(TARG);
2379 d = (U8*)SvPVX(TARG);
2381 if (PL_op->op_private & OPpLOCALE) {
2385 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2391 d = uv_to_utf8(d, toLOWER_utf8(s));
2396 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2401 if (!SvPADTMP(sv)) {
2408 s = (U8*)SvPV_force(sv, len);
2410 register U8 *send = s + len;
2412 if (PL_op->op_private & OPpLOCALE) {
2415 for (; s < send; s++)
2416 *s = toLOWER_LC(*s);
2419 for (; s < send; s++)
2434 register char *s = SvPV(sv,len);
2438 (void)SvUPGRADE(TARG, SVt_PV);
2439 SvGROW(TARG, (len * 2) + 1);
2444 STRLEN ulen = UTF8SKIP(s);
2467 SvCUR_set(TARG, d - SvPVX(TARG));
2468 (void)SvPOK_only(TARG);
2471 sv_setpvn(TARG, s, len);
2473 if (SvSMAGICAL(TARG))
2482 djSP; dMARK; dORIGMARK;
2484 register AV* av = (AV*)POPs;
2485 register I32 lval = PL_op->op_flags & OPf_MOD;
2486 I32 arybase = PL_curcop->cop_arybase;
2489 if (SvTYPE(av) == SVt_PVAV) {
2490 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2492 for (svp = MARK + 1; svp <= SP; svp++) {
2497 if (max > AvMAX(av))
2500 while (++MARK <= SP) {
2501 elem = SvIVx(*MARK);
2505 svp = av_fetch(av, elem, lval);
2507 if (!svp || *svp == &PL_sv_undef)
2508 DIE(aTHX_ PL_no_aelem, elem);
2509 if (PL_op->op_private & OPpLVAL_INTRO)
2510 save_aelem(av, elem, svp);
2512 *MARK = svp ? *svp : &PL_sv_undef;
2515 if (GIMME != G_ARRAY) {
2523 /* Associative arrays. */
2528 HV *hash = (HV*)POPs;
2530 I32 gimme = GIMME_V;
2531 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2534 /* might clobber stack_sp */
2535 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2540 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2541 if (gimme == G_ARRAY) {
2544 /* might clobber stack_sp */
2546 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
2551 else if (gimme == G_SCALAR)
2570 I32 gimme = GIMME_V;
2571 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2575 if (PL_op->op_private & OPpSLICE) {
2579 hvtype = SvTYPE(hv);
2580 while (++MARK <= SP) {
2581 if (hvtype == SVt_PVHV)
2582 sv = hv_delete_ent(hv, *MARK, discard, 0);
2584 DIE(aTHX_ "Not a HASH reference");
2585 *MARK = sv ? sv : &PL_sv_undef;
2589 else if (gimme == G_SCALAR) {
2598 if (SvTYPE(hv) == SVt_PVHV)
2599 sv = hv_delete_ent(hv, keysv, discard, 0);
2601 DIE(aTHX_ "Not a HASH reference");
2615 if (SvTYPE(hv) == SVt_PVHV) {
2616 if (hv_exists_ent(hv, tmpsv, 0))
2619 else if (SvTYPE(hv) == SVt_PVAV) {
2620 if (avhv_exists_ent((AV*)hv, tmpsv, 0))
2624 DIE(aTHX_ "Not a HASH reference");
2631 djSP; dMARK; dORIGMARK;
2632 register HV *hv = (HV*)POPs;
2633 register I32 lval = PL_op->op_flags & OPf_MOD;
2634 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2636 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2637 DIE(aTHX_ "Can't localize pseudo-hash element");
2639 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2640 while (++MARK <= SP) {
2644 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2645 svp = he ? &HeVAL(he) : 0;
2648 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2651 if (!svp || *svp == &PL_sv_undef) {
2653 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
2655 if (PL_op->op_private & OPpLVAL_INTRO)
2656 save_helem(hv, keysv, svp);
2658 *MARK = svp ? *svp : &PL_sv_undef;
2661 if (GIMME != G_ARRAY) {
2669 /* List operators. */
2674 if (GIMME != G_ARRAY) {
2676 *MARK = *SP; /* unwanted list, return last item */
2678 *MARK = &PL_sv_undef;
2687 SV **lastrelem = PL_stack_sp;
2688 SV **lastlelem = PL_stack_base + POPMARK;
2689 SV **firstlelem = PL_stack_base + POPMARK + 1;
2690 register SV **firstrelem = lastlelem + 1;
2691 I32 arybase = PL_curcop->cop_arybase;
2692 I32 lval = PL_op->op_flags & OPf_MOD;
2693 I32 is_something_there = lval;
2695 register I32 max = lastrelem - lastlelem;
2696 register SV **lelem;
2699 if (GIMME != G_ARRAY) {
2700 ix = SvIVx(*lastlelem);
2705 if (ix < 0 || ix >= max)
2706 *firstlelem = &PL_sv_undef;
2708 *firstlelem = firstrelem[ix];
2714 SP = firstlelem - 1;
2718 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2724 if (ix < 0 || ix >= max)
2725 *lelem = &PL_sv_undef;
2727 is_something_there = TRUE;
2728 if (!(*lelem = firstrelem[ix]))
2729 *lelem = &PL_sv_undef;
2732 if (is_something_there)
2735 SP = firstlelem - 1;
2741 djSP; dMARK; dORIGMARK;
2742 I32 items = SP - MARK;
2743 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2744 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2751 djSP; dMARK; dORIGMARK;
2752 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2756 SV *val = NEWSV(46, 0);
2758 sv_setsv(val, *++MARK);
2759 else if (ckWARN(WARN_UNSAFE))
2760 Perl_warner(aTHX_ WARN_UNSAFE, "Odd number of elements in hash assignment");
2761 (void)hv_store_ent(hv,key,val,0);
2770 djSP; dMARK; dORIGMARK;
2771 register AV *ary = (AV*)*++MARK;
2775 register I32 offset;
2776 register I32 length;
2783 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2784 *MARK-- = SvTIED_obj((SV*)ary, mg);
2788 call_method("SPLICE",GIMME_V);
2797 offset = i = SvIVx(*MARK);
2799 offset += AvFILLp(ary) + 1;
2801 offset -= PL_curcop->cop_arybase;
2803 DIE(aTHX_ PL_no_aelem, i);
2805 length = SvIVx(*MARK++);
2807 length += AvFILLp(ary) - offset + 1;
2813 length = AvMAX(ary) + 1; /* close enough to infinity */
2817 length = AvMAX(ary) + 1;
2819 if (offset > AvFILLp(ary) + 1)
2820 offset = AvFILLp(ary) + 1;
2821 after = AvFILLp(ary) + 1 - (offset + length);
2822 if (after < 0) { /* not that much array */
2823 length += after; /* offset+length now in array */
2829 /* At this point, MARK .. SP-1 is our new LIST */
2832 diff = newlen - length;
2833 if (newlen && !AvREAL(ary) && AvREIFY(ary))
2836 if (diff < 0) { /* shrinking the area */
2838 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2839 Copy(MARK, tmparyval, newlen, SV*);
2842 MARK = ORIGMARK + 1;
2843 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2844 MEXTEND(MARK, length);
2845 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2847 EXTEND_MORTAL(length);
2848 for (i = length, dst = MARK; i; i--) {
2849 sv_2mortal(*dst); /* free them eventualy */
2856 *MARK = AvARRAY(ary)[offset+length-1];
2859 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2860 SvREFCNT_dec(*dst++); /* free them now */
2863 AvFILLp(ary) += diff;
2865 /* pull up or down? */
2867 if (offset < after) { /* easier to pull up */
2868 if (offset) { /* esp. if nothing to pull */
2869 src = &AvARRAY(ary)[offset-1];
2870 dst = src - diff; /* diff is negative */
2871 for (i = offset; i > 0; i--) /* can't trust Copy */
2875 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
2879 if (after) { /* anything to pull down? */
2880 src = AvARRAY(ary) + offset + length;
2881 dst = src + diff; /* diff is negative */
2882 Move(src, dst, after, SV*);
2884 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
2885 /* avoid later double free */
2889 dst[--i] = &PL_sv_undef;
2892 for (src = tmparyval, dst = AvARRAY(ary) + offset;
2894 *dst = NEWSV(46, 0);
2895 sv_setsv(*dst++, *src++);
2897 Safefree(tmparyval);
2900 else { /* no, expanding (or same) */
2902 New(452, tmparyval, length, SV*); /* so remember deletion */
2903 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
2906 if (diff > 0) { /* expanding */
2908 /* push up or down? */
2910 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
2914 Move(src, dst, offset, SV*);
2916 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
2918 AvFILLp(ary) += diff;
2921 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
2922 av_extend(ary, AvFILLp(ary) + diff);
2923 AvFILLp(ary) += diff;
2926 dst = AvARRAY(ary) + AvFILLp(ary);
2928 for (i = after; i; i--) {
2935 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
2936 *dst = NEWSV(46, 0);
2937 sv_setsv(*dst++, *src++);
2939 MARK = ORIGMARK + 1;
2940 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2942 Copy(tmparyval, MARK, length, SV*);
2944 EXTEND_MORTAL(length);
2945 for (i = length, dst = MARK; i; i--) {
2946 sv_2mortal(*dst); /* free them eventualy */
2950 Safefree(tmparyval);
2954 else if (length--) {
2955 *MARK = tmparyval[length];
2958 while (length-- > 0)
2959 SvREFCNT_dec(tmparyval[length]);
2961 Safefree(tmparyval);
2964 *MARK = &PL_sv_undef;
2972 djSP; dMARK; dORIGMARK; dTARGET;
2973 register AV *ary = (AV*)*++MARK;
2974 register SV *sv = &PL_sv_undef;
2977 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2978 *MARK-- = SvTIED_obj((SV*)ary, mg);
2982 call_method("PUSH",G_SCALAR|G_DISCARD);
2987 /* Why no pre-extend of ary here ? */
2988 for (++MARK; MARK <= SP; MARK++) {
2991 sv_setsv(sv, *MARK);
2996 PUSHi( AvFILL(ary) + 1 );
3004 SV *sv = av_pop(av);
3006 (void)sv_2mortal(sv);
3015 SV *sv = av_shift(av);
3020 (void)sv_2mortal(sv);
3027 djSP; dMARK; dORIGMARK; dTARGET;
3028 register AV *ary = (AV*)*++MARK;
3033 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3034 *MARK-- = SvTIED_obj((SV*)ary, mg);
3038 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3043 av_unshift(ary, SP - MARK);
3046 sv_setsv(sv, *++MARK);
3047 (void)av_store(ary, i++, sv);
3051 PUSHi( AvFILL(ary) + 1 );
3061 if (GIMME == G_ARRAY) {
3072 register char *down;
3078 do_join(TARG, &PL_sv_no, MARK, SP);
3080 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3081 up = SvPV_force(TARG, len);
3083 if (IN_UTF8) { /* first reverse each character */
3084 U8* s = (U8*)SvPVX(TARG);
3085 U8* send = (U8*)(s + len);
3094 down = (char*)(s - 1);
3095 if (s > send || !((*down & 0xc0) == 0x80)) {
3096 if (ckWARN_d(WARN_UTF8))
3097 Perl_warner(aTHX_ WARN_UTF8,
3098 "Malformed UTF-8 character");
3110 down = SvPVX(TARG) + len - 1;
3116 (void)SvPOK_only(TARG);
3125 S_mul128(pTHX_ SV *sv, U8 m)
3128 char *s = SvPV(sv, len);
3132 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
3133 SV *tmpNew = newSVpvn("0000000000", 10);
3135 sv_catsv(tmpNew, sv);
3136 SvREFCNT_dec(sv); /* free old sv */
3141 while (!*t) /* trailing '\0'? */
3144 i = ((*t - '0') << 7) + m;
3145 *(t--) = '0' + (i % 10);
3151 /* Explosives and implosives. */
3153 #if 'I' == 73 && 'J' == 74
3154 /* On an ASCII/ISO kind of system */
3155 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
3158 Some other sort of character set - use memchr() so we don't match
3161 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
3169 I32 gimme = GIMME_V;
3173 register char *pat = SvPV(left, llen);
3174 register char *s = SvPV(right, rlen);
3175 char *strend = s + rlen;
3177 register char *patend = pat + llen;
3182 /* These must not be in registers: */
3199 register U32 culong;
3202 #ifdef PERL_NATINT_PACK
3203 int natint; /* native integer */
3204 int unatint; /* unsigned native integer */
3207 if (gimme != G_ARRAY) { /* arrange to do first one only */
3209 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3210 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
3212 while (isDIGIT(*patend) || *patend == '*')
3218 while (pat < patend) {
3220 datumtype = *pat++ & 0xFF;
3221 #ifdef PERL_NATINT_PACK
3224 if (isSPACE(datumtype))
3227 char *natstr = "sSiIlL";
3229 if (strchr(natstr, datumtype)) {
3230 #ifdef PERL_NATINT_PACK
3236 Perl_croak(aTHX_ "'!' allowed only after types %s", natstr);
3240 else if (*pat == '*') {
3241 len = strend - strbeg; /* long enough */
3244 else if (isDIGIT(*pat)) {
3246 while (isDIGIT(*pat)) {
3247 len = (len * 10) + (*pat++ - '0');
3249 Perl_croak(aTHX_ "Repeat count in unpack overflows");
3253 len = (datumtype != '@');
3256 Perl_croak(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
3257 case ',': /* grandfather in commas but with a warning */
3258 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
3259 Perl_warner(aTHX_ WARN_UNSAFE, "Invalid type in unpack: '%c'", (int)datumtype);
3262 if (len == 1 && pat[-1] != '1')
3271 if (len > strend - strbeg)
3272 DIE(aTHX_ "@ outside of string");
3276 if (len > s - strbeg)
3277 DIE(aTHX_ "X outside of string");
3281 if (len > strend - s)
3282 DIE(aTHX_ "x outside of string");
3287 DIE(aTHX_ "# must follow a numeric type");
3288 if (*pat != 'a' && *pat != 'A' && *pat != 'Z')
3289 DIE(aTHX_ "# must be followed by a, A or Z");
3292 pat++; /* ignore '*' for compatibility with pack */
3294 DIE(aTHX_ "# cannot take a count" );
3300 if (len > strend - s)
3303 goto uchar_checksum;
3304 sv = NEWSV(35, len);
3305 sv_setpvn(sv, s, len);
3307 if (datumtype == 'A' || datumtype == 'Z') {
3308 aptr = s; /* borrow register */
3309 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
3314 else { /* 'A' strips both nulls and spaces */
3315 s = SvPVX(sv) + len - 1;
3316 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3320 SvCUR_set(sv, s - SvPVX(sv));
3321 s = aptr; /* unborrow register */
3323 XPUSHs(sv_2mortal(sv));
3327 if (pat[-1] == '*' || len > (strend - s) * 8)
3328 len = (strend - s) * 8;
3331 Newz(601, PL_bitcount, 256, char);
3332 for (bits = 1; bits < 256; bits++) {
3333 if (bits & 1) PL_bitcount[bits]++;
3334 if (bits & 2) PL_bitcount[bits]++;
3335 if (bits & 4) PL_bitcount[bits]++;
3336 if (bits & 8) PL_bitcount[bits]++;
3337 if (bits & 16) PL_bitcount[bits]++;
3338 if (bits & 32) PL_bitcount[bits]++;
3339 if (bits & 64) PL_bitcount[bits]++;
3340 if (bits & 128) PL_bitcount[bits]++;
3344 culong += PL_bitcount[*(unsigned char*)s++];
3349 if (datumtype == 'b') {
3351 if (bits & 1) culong++;
3357 if (bits & 128) culong++;
3364 sv = NEWSV(35, len + 1);
3367 aptr = pat; /* borrow register */
3369 if (datumtype == 'b') {
3371 for (len = 0; len < aint; len++) {
3372 if (len & 7) /*SUPPRESS 595*/
3376 *pat++ = '0' + (bits & 1);
3381 for (len = 0; len < aint; len++) {
3386 *pat++ = '0' + ((bits & 128) != 0);
3390 pat = aptr; /* unborrow register */
3391 XPUSHs(sv_2mortal(sv));
3395 if (pat[-1] == '*' || len > (strend - s) * 2)
3396 len = (strend - s) * 2;
3397 sv = NEWSV(35, len + 1);
3400 aptr = pat; /* borrow register */
3402 if (datumtype == 'h') {
3404 for (len = 0; len < aint; len++) {
3409 *pat++ = PL_hexdigit[bits & 15];
3414 for (len = 0; len < aint; len++) {
3419 *pat++ = PL_hexdigit[(bits >> 4) & 15];
3423 pat = aptr; /* unborrow register */
3424 XPUSHs(sv_2mortal(sv));
3427 if (len > strend - s)
3432 if (aint >= 128) /* fake up signed chars */
3442 if (aint >= 128) /* fake up signed chars */
3445 sv_setiv(sv, (IV)aint);
3446 PUSHs(sv_2mortal(sv));
3451 if (len > strend - s)
3466 sv_setiv(sv, (IV)auint);
3467 PUSHs(sv_2mortal(sv));
3472 if (len > strend - s)
3475 while (len-- > 0 && s < strend) {
3476 auint = utf8_to_uv((U8*)s, &along);
3479 cdouble += (NV)auint;
3487 while (len-- > 0 && s < strend) {
3488 auint = utf8_to_uv((U8*)s, &along);
3491 sv_setuv(sv, (UV)auint);
3492 PUSHs(sv_2mortal(sv));
3497 #if SHORTSIZE == SIZE16
3498 along = (strend - s) / SIZE16;
3500 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
3505 #if SHORTSIZE != SIZE16
3509 COPYNN(s, &ashort, sizeof(short));
3520 #if SHORTSIZE > SIZE16
3532 #if SHORTSIZE != SIZE16
3536 COPYNN(s, &ashort, sizeof(short));
3539 sv_setiv(sv, (IV)ashort);
3540 PUSHs(sv_2mortal(sv));
3548 #if SHORTSIZE > SIZE16
3554 sv_setiv(sv, (IV)ashort);
3555 PUSHs(sv_2mortal(sv));
3563 #if SHORTSIZE == SIZE16
3564 along = (strend - s) / SIZE16;
3566 unatint = natint && datumtype == 'S';
3567 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
3572 #if SHORTSIZE != SIZE16
3574 unsigned short aushort;
3576 COPYNN(s, &aushort, sizeof(unsigned short));
3577 s += sizeof(unsigned short);
3585 COPY16(s, &aushort);
3588 if (datumtype == 'n')
3589 aushort = PerlSock_ntohs(aushort);
3592 if (datumtype == 'v')
3593 aushort = vtohs(aushort);
3602 #if SHORTSIZE != SIZE16
3604 unsigned short aushort;
3606 COPYNN(s, &aushort, sizeof(unsigned short));
3607 s += sizeof(unsigned short);
3609 sv_setiv(sv, (UV)aushort);
3610 PUSHs(sv_2mortal(sv));
3617 COPY16(s, &aushort);
3621 if (datumtype == 'n')
3622 aushort = PerlSock_ntohs(aushort);
3625 if (datumtype == 'v')
3626 aushort = vtohs(aushort);
3628 sv_setiv(sv, (UV)aushort);
3629 PUSHs(sv_2mortal(sv));
3635 along = (strend - s) / sizeof(int);
3640 Copy(s, &aint, 1, int);
3643 cdouble += (NV)aint;
3652 Copy(s, &aint, 1, int);
3656 /* Without the dummy below unpack("i", pack("i",-1))
3657 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3658 * cc with optimization turned on.
3660 * The bug was detected in
3661 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
3662 * with optimization (-O4) turned on.
3663 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
3664 * does not have this problem even with -O4.
3666 * This bug was reported as DECC_BUGS 1431
3667 * and tracked internally as GEM_BUGS 7775.
3669 * The bug is fixed in
3670 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
3671 * UNIX V4.0F support: DEC C V5.9-006 or later
3672 * UNIX V4.0E support: DEC C V5.8-011 or later
3675 * See also few lines later for the same bug.
3678 sv_setiv(sv, (IV)aint) :
3680 sv_setiv(sv, (IV)aint);
3681 PUSHs(sv_2mortal(sv));
3686 along = (strend - s) / sizeof(unsigned int);
3691 Copy(s, &auint, 1, unsigned int);
3692 s += sizeof(unsigned int);
3694 cdouble += (NV)auint;
3703 Copy(s, &auint, 1, unsigned int);
3704 s += sizeof(unsigned int);
3707 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
3708 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
3709 * See details few lines earlier. */
3711 sv_setuv(sv, (UV)auint) :
3713 sv_setuv(sv, (UV)auint);
3714 PUSHs(sv_2mortal(sv));
3719 #if LONGSIZE == SIZE32
3720 along = (strend - s) / SIZE32;
3722 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
3727 #if LONGSIZE != SIZE32
3731 COPYNN(s, &along, sizeof(long));
3734 cdouble += (NV)along;
3744 #if LONGSIZE > SIZE32
3745 if (along > 2147483647)
3746 along -= 4294967296;
3750 cdouble += (NV)along;
3759 #if LONGSIZE != SIZE32
3763 COPYNN(s, &along, sizeof(long));
3766 sv_setiv(sv, (IV)along);
3767 PUSHs(sv_2mortal(sv));
3775 #if LONGSIZE > SIZE32
3776 if (along > 2147483647)
3777 along -= 4294967296;
3781 sv_setiv(sv, (IV)along);
3782 PUSHs(sv_2mortal(sv));
3790 #if LONGSIZE == SIZE32
3791 along = (strend - s) / SIZE32;
3793 unatint = natint && datumtype == 'L';
3794 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
3799 #if LONGSIZE != SIZE32
3801 unsigned long aulong;
3803 COPYNN(s, &aulong, sizeof(unsigned long));
3804 s += sizeof(unsigned long);
3806 cdouble += (NV)aulong;
3818 if (datumtype == 'N')
3819 aulong = PerlSock_ntohl(aulong);
3822 if (datumtype == 'V')
3823 aulong = vtohl(aulong);
3826 cdouble += (NV)aulong;
3835 #if LONGSIZE != SIZE32
3837 unsigned long aulong;
3839 COPYNN(s, &aulong, sizeof(unsigned long));
3840 s += sizeof(unsigned long);
3842 sv_setuv(sv, (UV)aulong);
3843 PUSHs(sv_2mortal(sv));
3853 if (datumtype == 'N')
3854 aulong = PerlSock_ntohl(aulong);
3857 if (datumtype == 'V')
3858 aulong = vtohl(aulong);
3861 sv_setuv(sv, (UV)aulong);
3862 PUSHs(sv_2mortal(sv));
3868 along = (strend - s) / sizeof(char*);
3874 if (sizeof(char*) > strend - s)
3877 Copy(s, &aptr, 1, char*);
3883 PUSHs(sv_2mortal(sv));
3893 while ((len > 0) && (s < strend)) {
3894 auv = (auv << 7) | (*s & 0x7f);
3895 if (!(*s++ & 0x80)) {
3899 PUSHs(sv_2mortal(sv));
3903 else if (++bytes >= sizeof(UV)) { /* promote to string */
3907 sv = Perl_newSVpvf(aTHX_ "%.*Vu", (int)TYPE_DIGITS(UV), auv);
3908 while (s < strend) {
3909 sv = mul128(sv, *s & 0x7f);
3910 if (!(*s++ & 0x80)) {
3919 PUSHs(sv_2mortal(sv));
3924 if ((s >= strend) && bytes)
3925 Perl_croak(aTHX_ "Unterminated compressed integer");
3930 if (sizeof(char*) > strend - s)
3933 Copy(s, &aptr, 1, char*);
3938 sv_setpvn(sv, aptr, len);
3939 PUSHs(sv_2mortal(sv));
3943 along = (strend - s) / sizeof(Quad_t);
3949 if (s + sizeof(Quad_t) > strend)
3952 Copy(s, &aquad, 1, Quad_t);
3953 s += sizeof(Quad_t);
3956 if (aquad >= IV_MIN && aquad <= IV_MAX)
3957 sv_setiv(sv, (IV)aquad);
3959 sv_setnv(sv, (NV)aquad);
3960 PUSHs(sv_2mortal(sv));
3964 along = (strend - s) / sizeof(Quad_t);
3970 if (s + sizeof(Uquad_t) > strend)
3973 Copy(s, &auquad, 1, Uquad_t);
3974 s += sizeof(Uquad_t);
3977 if (auquad <= UV_MAX)
3978 sv_setuv(sv, (UV)auquad);
3980 sv_setnv(sv, (NV)auquad);
3981 PUSHs(sv_2mortal(sv));
3985 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
3988 along = (strend - s) / sizeof(float);
3993 Copy(s, &afloat, 1, float);
4002 Copy(s, &afloat, 1, float);
4005 sv_setnv(sv, (NV)afloat);
4006 PUSHs(sv_2mortal(sv));
4012 along = (strend - s) / sizeof(double);
4017 Copy(s, &adouble, 1, double);
4018 s += sizeof(double);
4026 Copy(s, &adouble, 1, double);
4027 s += sizeof(double);
4029 sv_setnv(sv, (NV)adouble);
4030 PUSHs(sv_2mortal(sv));
4036 * Initialise the decode mapping. By using a table driven
4037 * algorithm, the code will be character-set independent
4038 * (and just as fast as doing character arithmetic)
4040 if (PL_uudmap['M'] == 0) {
4043 for (i = 0; i < sizeof(PL_uuemap); i += 1)
4044 PL_uudmap[PL_uuemap[i]] = i;
4046 * Because ' ' and '`' map to the same value,
4047 * we need to decode them both the same.
4052 along = (strend - s) * 3 / 4;
4053 sv = NEWSV(42, along);
4056 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
4061 len = PL_uudmap[*s++] & 077;
4063 if (s < strend && ISUUCHAR(*s))
4064 a = PL_uudmap[*s++] & 077;
4067 if (s < strend && ISUUCHAR(*s))
4068 b = PL_uudmap[*s++] & 077;
4071 if (s < strend && ISUUCHAR(*s))
4072 c = PL_uudmap[*s++] & 077;
4075 if (s < strend && ISUUCHAR(*s))
4076 d = PL_uudmap[*s++] & 077;
4079 hunk[0] = (a << 2) | (b >> 4);
4080 hunk[1] = (b << 4) | (c >> 2);
4081 hunk[2] = (c << 6) | d;
4082 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
4087 else if (s[1] == '\n') /* possible checksum byte */
4090 XPUSHs(sv_2mortal(sv));
4095 if (strchr("fFdD", datumtype) ||
4096 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
4100 while (checksum >= 16) {
4104 while (checksum >= 4) {
4110 along = (1 << checksum) - 1;
4111 while (cdouble < 0.0)
4113 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
4114 sv_setnv(sv, cdouble);
4117 if (checksum < 32) {
4118 aulong = (1 << checksum) - 1;
4121 sv_setuv(sv, (UV)culong);
4123 XPUSHs(sv_2mortal(sv));
4127 if (SP == oldsp && gimme == G_SCALAR)
4128 PUSHs(&PL_sv_undef);
4133 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
4137 *hunk = PL_uuemap[len];
4138 sv_catpvn(sv, hunk, 1);
4141 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4142 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
4143 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
4144 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
4145 sv_catpvn(sv, hunk, 4);
4150 char r = (len > 1 ? s[1] : '\0');
4151 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4152 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
4153 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
4154 hunk[3] = PL_uuemap[0];
4155 sv_catpvn(sv, hunk, 4);
4157 sv_catpvn(sv, "\n", 1);
4161 S_is_an_int(pTHX_ char *s, STRLEN l)
4164 SV *result = newSVpvn(s, l);
4165 char *result_c = SvPV(result, n_a); /* convenience */
4166 char *out = result_c;
4176 SvREFCNT_dec(result);
4199 SvREFCNT_dec(result);
4205 SvCUR_set(result, out - result_c);
4209 /* pnum must be '\0' terminated */
4211 S_div128(pTHX_ SV *pnum, bool *done)
4214 char *s = SvPV(pnum, len);
4223 i = m * 10 + (*t - '0');
4225 r = (i >> 7); /* r < 10 */
4232 SvCUR_set(pnum, (STRLEN) (t - s));
4239 djSP; dMARK; dORIGMARK; dTARGET;
4240 register SV *cat = TARG;
4243 register char *pat = SvPVx(*++MARK, fromlen);
4244 register char *patend = pat + fromlen;
4249 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4250 static char *space10 = " ";
4252 /* These must not be in registers: */
4267 #ifdef PERL_NATINT_PACK
4268 int natint; /* native integer */
4273 sv_setpvn(cat, "", 0);
4274 while (pat < patend) {
4275 SV *lengthcode = Nullsv;
4276 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
4277 datumtype = *pat++ & 0xFF;
4278 #ifdef PERL_NATINT_PACK
4281 if (isSPACE(datumtype))
4284 char *natstr = "sSiIlL";
4286 if (strchr(natstr, datumtype)) {
4287 #ifdef PERL_NATINT_PACK
4293 Perl_croak(aTHX_ "'!' allowed only after types %s", natstr);
4296 len = strchr("@Xxu", datumtype) ? 0 : items;
4299 else if (isDIGIT(*pat)) {
4301 while (isDIGIT(*pat)) {
4302 len = (len * 10) + (*pat++ - '0');
4304 Perl_croak(aTHX_ "Repeat count in pack overflows");
4311 if (*pat != 'a' && *pat != 'A' && *pat != 'Z' || pat[1] != '*')
4312 DIE(aTHX_ "# must be followed by a*, A* or Z*");
4313 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
4314 ? *MARK : &PL_sv_no)));
4318 Perl_croak(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
4319 case ',': /* grandfather in commas but with a warning */
4320 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
4321 Perl_warner(aTHX_ WARN_UNSAFE,
4322 "Invalid type in pack: '%c'", (int)datumtype);
4325 DIE(aTHX_ "%% may only be used in unpack");
4336 if (SvCUR(cat) < len)
4337 DIE(aTHX_ "X outside of string");
4344 sv_catpvn(cat, null10, 10);
4347 sv_catpvn(cat, null10, len);
4353 aptr = SvPV(fromstr, fromlen);
4357 sv_catpvn(cat, aptr, len);
4359 sv_catpvn(cat, aptr, fromlen);
4361 if (datumtype == 'A') {
4363 sv_catpvn(cat, space10, 10);
4366 sv_catpvn(cat, space10, len);
4370 sv_catpvn(cat, null10, 10);
4373 sv_catpvn(cat, null10, len);
4380 char *savepat = pat;
4385 aptr = SvPV(fromstr, fromlen);
4390 SvCUR(cat) += (len+7)/8;
4391 SvGROW(cat, SvCUR(cat) + 1);
4392 aptr = SvPVX(cat) + aint;
4397 if (datumtype == 'B') {
4398 for (len = 0; len++ < aint;) {
4399 items |= *pat++ & 1;
4403 *aptr++ = items & 0xff;
4409 for (len = 0; len++ < aint;) {
4415 *aptr++ = items & 0xff;
4421 if (datumtype == 'B')
4422 items <<= 7 - (aint & 7);
4424 items >>= 7 - (aint & 7);
4425 *aptr++ = items & 0xff;
4427 pat = SvPVX(cat) + SvCUR(cat);
4438 char *savepat = pat;
4443 aptr = SvPV(fromstr, fromlen);
4448 SvCUR(cat) += (len+1)/2;
4449 SvGROW(cat, SvCUR(cat) + 1);
4450 aptr = SvPVX(cat) + aint;
4455 if (datumtype == 'H') {
4456 for (len = 0; len++ < aint;) {
4458 items |= ((*pat++ & 15) + 9) & 15;
4460 items |= *pat++ & 15;
4464 *aptr++ = items & 0xff;
4470 for (len = 0; len++ < aint;) {
4472 items |= (((*pat++ & 15) + 9) & 15) << 4;
4474 items |= (*pat++ & 15) << 4;
4478 *aptr++ = items & 0xff;
4484 *aptr++ = items & 0xff;
4485 pat = SvPVX(cat) + SvCUR(cat);
4497 aint = SvIV(fromstr);
4499 sv_catpvn(cat, &achar, sizeof(char));
4505 auint = SvUV(fromstr);
4506 SvGROW(cat, SvCUR(cat) + 10);
4507 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4512 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4517 afloat = (float)SvNV(fromstr);
4518 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4525 adouble = (double)SvNV(fromstr);
4526 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4532 ashort = (I16)SvIV(fromstr);
4534 ashort = PerlSock_htons(ashort);
4536 CAT16(cat, &ashort);
4542 ashort = (I16)SvIV(fromstr);
4544 ashort = htovs(ashort);
4546 CAT16(cat, &ashort);
4550 #if SHORTSIZE != SIZE16
4552 unsigned short aushort;
4556 aushort = SvUV(fromstr);
4557 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
4567 aushort = (U16)SvUV(fromstr);
4568 CAT16(cat, &aushort);
4574 #if SHORTSIZE != SIZE16
4580 ashort = SvIV(fromstr);
4581 sv_catpvn(cat, (char *)&ashort, sizeof(short));
4589 ashort = (I16)SvIV(fromstr);
4590 CAT16(cat, &ashort);
4597 auint = SvUV(fromstr);
4598 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4604 adouble = Perl_floor(SvNV(fromstr));
4607 Perl_croak(aTHX_ "Cannot compress negative numbers");
4613 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
4614 adouble <= UV_MAX_cxux
4621 char buf[1 + sizeof(UV)];
4622 char *in = buf + sizeof(buf);
4623 UV auv = U_V(adouble);
4626 *--in = (auv & 0x7f) | 0x80;
4629 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4630 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4632 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4633 char *from, *result, *in;
4638 /* Copy string and check for compliance */
4639 from = SvPV(fromstr, len);
4640 if ((norm = is_an_int(from, len)) == NULL)
4641 Perl_croak(aTHX_ "can compress only unsigned integer");
4643 New('w', result, len, char);
4647 *--in = div128(norm, &done) | 0x80;
4648 result[len - 1] &= 0x7F; /* clear continue bit */
4649 sv_catpvn(cat, in, (result + len) - in);
4651 SvREFCNT_dec(norm); /* free norm */
4653 else if (SvNOKp(fromstr)) {
4654 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4655 char *in = buf + sizeof(buf);
4658 double next = floor(adouble / 128);
4659 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4660 if (--in < buf) /* this cannot happen ;-) */
4661 Perl_croak(aTHX_ "Cannot compress integer");
4663 } while (adouble > 0);
4664 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4665 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4668 Perl_croak(aTHX_ "Cannot compress non integer");
4674 aint = SvIV(fromstr);
4675 sv_catpvn(cat, (char*)&aint, sizeof(int));
4681 aulong = SvUV(fromstr);
4683 aulong = PerlSock_htonl(aulong);
4685 CAT32(cat, &aulong);
4691 aulong = SvUV(fromstr);
4693 aulong = htovl(aulong);
4695 CAT32(cat, &aulong);
4699 #if LONGSIZE != SIZE32
4701 unsigned long aulong;
4705 aulong = SvUV(fromstr);
4706 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
4714 aulong = SvUV(fromstr);
4715 CAT32(cat, &aulong);
4720 #if LONGSIZE != SIZE32
4726 along = SvIV(fromstr);
4727 sv_catpvn(cat, (char *)&along, sizeof(long));
4735 along = SvIV(fromstr);
4744 auquad = (Uquad_t)SvUV(fromstr);
4745 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
4751 aquad = (Quad_t)SvIV(fromstr);
4752 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
4755 #endif /* HAS_QUAD */
4757 len = 1; /* assume SV is correct length */
4762 if (fromstr == &PL_sv_undef)
4766 /* XXX better yet, could spirit away the string to
4767 * a safe spot and hang on to it until the result
4768 * of pack() (and all copies of the result) are
4771 if (ckWARN(WARN_UNSAFE) && (SvTEMP(fromstr) || SvPADTMP(fromstr)))
4772 Perl_warner(aTHX_ WARN_UNSAFE,
4773 "Attempt to pack pointer to temporary value");
4774 if (SvPOK(fromstr) || SvNIOK(fromstr))
4775 aptr = SvPV(fromstr,n_a);
4777 aptr = SvPV_force(fromstr,n_a);
4779 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4784 aptr = SvPV(fromstr, fromlen);
4785 SvGROW(cat, fromlen * 4 / 3);
4790 while (fromlen > 0) {
4797 doencodes(cat, aptr, todo);
4816 register I32 limit = POPi; /* note, negative is forever */
4819 register char *s = SvPV(sv, len);
4820 char *strend = s + len;
4822 register REGEXP *rx;
4826 I32 maxiters = (strend - s) + 10;
4829 I32 origlimit = limit;
4832 AV *oldstack = PL_curstack;
4833 I32 gimme = GIMME_V;
4834 I32 oldsave = PL_savestack_ix;
4835 I32 make_mortal = 1;
4836 MAGIC *mg = (MAGIC *) NULL;
4839 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4844 DIE(aTHX_ "panic: do_split");
4845 rx = pm->op_pmregexp;
4847 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4848 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4850 if (pm->op_pmreplroot)
4851 ary = GvAVn((GV*)pm->op_pmreplroot);
4852 else if (gimme != G_ARRAY)
4854 ary = (AV*)PL_curpad[0];
4856 ary = GvAVn(PL_defgv);
4857 #endif /* USE_THREADS */
4860 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4866 if (mg = SvTIED_mg((SV*)ary, 'P')) {
4868 XPUSHs(SvTIED_obj((SV*)ary, mg));
4873 for (i = AvFILLp(ary); i >= 0; i--)
4874 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4876 /* temporarily switch stacks */
4877 SWITCHSTACK(PL_curstack, ary);
4881 base = SP - PL_stack_base;
4883 if (pm->op_pmflags & PMf_SKIPWHITE) {
4884 if (pm->op_pmflags & PMf_LOCALE) {
4885 while (isSPACE_LC(*s))
4893 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4894 SAVEINT(PL_multiline);
4895 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4899 limit = maxiters + 2;
4900 if (pm->op_pmflags & PMf_WHITE) {
4903 while (m < strend &&
4904 !((pm->op_pmflags & PMf_LOCALE)
4905 ? isSPACE_LC(*m) : isSPACE(*m)))
4910 dstr = NEWSV(30, m-s);
4911 sv_setpvn(dstr, s, m-s);
4917 while (s < strend &&
4918 ((pm->op_pmflags & PMf_LOCALE)
4919 ? isSPACE_LC(*s) : isSPACE(*s)))
4923 else if (strEQ("^", rx->precomp)) {
4926 for (m = s; m < strend && *m != '\n'; m++) ;
4930 dstr = NEWSV(30, m-s);
4931 sv_setpvn(dstr, s, m-s);
4938 else if ((rx->reganch & RE_USE_INTUIT) && !rx->nparens
4939 && (rx->reganch & ROPT_CHECK_ALL)
4940 && !(rx->reganch & ROPT_ANCH)) {
4941 int tail = (rx->reganch & RE_INTUIT_TAIL);
4942 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
4946 if (len == 1 && !tail) {
4950 for (m = s; m < strend && *m != c; m++) ;
4953 dstr = NEWSV(30, m-s);
4954 sv_setpvn(dstr, s, m-s);
4963 while (s < strend && --limit &&
4964 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
4965 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
4968 dstr = NEWSV(31, m-s);
4969 sv_setpvn(dstr, s, m-s);
4973 s = m + len; /* Fake \n at the end */
4978 maxiters += (strend - s) * rx->nparens;
4979 while (s < strend && --limit
4980 /* && (!rx->check_substr
4981 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
4983 */ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
4984 1 /* minend */, sv, NULL, 0))
4986 TAINT_IF(RX_MATCH_TAINTED(rx));
4987 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
4992 strend = s + (strend - m);
4994 m = rx->startp[0] + orig;
4995 dstr = NEWSV(32, m-s);
4996 sv_setpvn(dstr, s, m-s);
5001 for (i = 1; i <= rx->nparens; i++) {
5002 s = rx->startp[i] + orig;
5003 m = rx->endp[i] + orig;
5005 dstr = NEWSV(33, m-s);
5006 sv_setpvn(dstr, s, m-s);
5009 dstr = NEWSV(33, 0);
5015 s = rx->endp[0] + orig;
5019 LEAVE_SCOPE(oldsave);
5020 iters = (SP - PL_stack_base) - base;
5021 if (iters > maxiters)
5022 DIE(aTHX_ "Split loop");
5024 /* keep field after final delim? */
5025 if (s < strend || (iters && origlimit)) {
5026 dstr = NEWSV(34, strend-s);
5027 sv_setpvn(dstr, s, strend-s);
5033 else if (!origlimit) {
5034 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
5040 SWITCHSTACK(ary, oldstack);
5041 if (SvSMAGICAL(ary)) {
5046 if (gimme == G_ARRAY) {
5048 Copy(AvARRAY(ary), SP + 1, iters, SV*);
5056 call_method("PUSH",G_SCALAR|G_DISCARD);
5059 if (gimme == G_ARRAY) {
5060 /* EXTEND should not be needed - we just popped them */
5062 for (i=0; i < iters; i++) {
5063 SV **svp = av_fetch(ary, i, FALSE);
5064 PUSHs((svp) ? *svp : &PL_sv_undef);
5071 if (gimme == G_ARRAY)
5074 if (iters || !pm->op_pmreplroot) {
5084 Perl_unlock_condpair(pTHX_ void *svv)
5087 MAGIC *mg = mg_find((SV*)svv, 'm');
5090 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
5091 MUTEX_LOCK(MgMUTEXP(mg));
5092 if (MgOWNER(mg) != thr)
5093 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
5095 COND_SIGNAL(MgOWNERCONDP(mg));
5096 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: unlock 0x%lx\n",
5097 (unsigned long)thr, (unsigned long)svv);)
5098 MUTEX_UNLOCK(MgMUTEXP(mg));
5100 #endif /* USE_THREADS */
5113 mg = condpair_magic(sv);
5114 MUTEX_LOCK(MgMUTEXP(mg));
5115 if (MgOWNER(mg) == thr)
5116 MUTEX_UNLOCK(MgMUTEXP(mg));
5119 COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
5121 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: pp_lock lock 0x%lx\n",
5122 (unsigned long)thr, (unsigned long)sv);)
5123 MUTEX_UNLOCK(MgMUTEXP(mg));
5124 SAVEDESTRUCTOR(Perl_unlock_condpair, sv);
5126 #endif /* USE_THREADS */
5127 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5128 || SvTYPE(retsv) == SVt_PVCV) {
5129 retsv = refto(retsv);
5140 if (PL_op->op_private & OPpLVAL_INTRO)
5141 PUSHs(*save_threadsv(PL_op->op_targ));
5143 PUSHs(THREADSV(PL_op->op_targ));
5146 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
5147 #endif /* USE_THREADS */