3 * Copyright (c) 1991-2000, 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 */
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)) {
208 if (!SvOK(sv) && sv != &PL_sv_undef) {
209 /* If this is a 'my' scalar and flag is set then vivify
212 if (PL_op->op_private & OPpDEREF) {
215 if (cUNOP->op_targ) {
217 SV *namesv = PL_curpad[cUNOP->op_targ];
218 name = SvPV(namesv, len);
219 gv = (GV*)NEWSV(0,0);
220 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
223 name = CopSTASHPV(PL_curcop);
226 sv_upgrade(sv, SVt_RV);
232 if (PL_op->op_flags & OPf_REF ||
233 PL_op->op_private & HINT_STRICT_REFS)
234 DIE(aTHX_ PL_no_usym, "a symbol");
235 if (ckWARN(WARN_UNINITIALIZED))
240 if ((PL_op->op_flags & OPf_SPECIAL) &&
241 !(PL_op->op_flags & OPf_MOD))
243 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
248 if (PL_op->op_private & HINT_STRICT_REFS)
249 DIE(aTHX_ PL_no_symref, sym, "a symbol");
250 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
254 if (PL_op->op_private & OPpLVAL_INTRO)
255 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
266 tryAMAGICunDEREF(to_sv);
269 switch (SvTYPE(sv)) {
273 DIE(aTHX_ "Not a SCALAR reference");
281 if (SvTYPE(gv) != SVt_PVGV) {
282 if (SvGMAGICAL(sv)) {
288 if (PL_op->op_flags & OPf_REF ||
289 PL_op->op_private & HINT_STRICT_REFS)
290 DIE(aTHX_ PL_no_usym, "a SCALAR");
291 if (ckWARN(WARN_UNINITIALIZED))
296 if ((PL_op->op_flags & OPf_SPECIAL) &&
297 !(PL_op->op_flags & OPf_MOD))
299 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
304 if (PL_op->op_private & HINT_STRICT_REFS)
305 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
306 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
311 if (PL_op->op_flags & OPf_MOD) {
312 if (PL_op->op_private & OPpLVAL_INTRO)
313 sv = save_scalar((GV*)TOPs);
314 else if (PL_op->op_private & OPpDEREF)
315 vivify_ref(sv, PL_op->op_private & OPpDEREF);
325 SV *sv = AvARYLEN(av);
327 AvARYLEN(av) = sv = NEWSV(0,0);
328 sv_upgrade(sv, SVt_IV);
329 sv_magic(sv, (SV*)av, '#', Nullch, 0);
337 djSP; dTARGET; dPOPss;
339 if (PL_op->op_flags & OPf_MOD) {
340 if (SvTYPE(TARG) < SVt_PVLV) {
341 sv_upgrade(TARG, SVt_PVLV);
342 sv_magic(TARG, Nullsv, '.', Nullch, 0);
346 if (LvTARG(TARG) != sv) {
348 SvREFCNT_dec(LvTARG(TARG));
349 LvTARG(TARG) = SvREFCNT_inc(sv);
351 PUSHs(TARG); /* no SvSETMAGIC */
357 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
358 mg = mg_find(sv, 'g');
359 if (mg && mg->mg_len >= 0) {
363 PUSHi(i + PL_curcop->cop_arybase);
377 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
378 /* (But not in defined().) */
379 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
382 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
383 if ((PL_op->op_private & OPpLVAL_INTRO) && !CvLVALUE(cv))
384 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
387 cv = (CV*)&PL_sv_undef;
401 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
402 char *s = SvPVX(TOPs);
403 if (strnEQ(s, "CORE::", 6)) {
406 code = keyword(s + 6, SvCUR(TOPs) - 6);
407 if (code < 0) { /* Overridable. */
408 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
409 int i = 0, n = 0, seen_question = 0;
411 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
413 while (i < MAXO) { /* The slow way. */
414 if (strEQ(s + 6, PL_op_name[i])
415 || strEQ(s + 6, PL_op_desc[i]))
421 goto nonesuch; /* Should not happen... */
423 oa = PL_opargs[i] >> OASHIFT;
425 if (oa & OA_OPTIONAL) {
429 else if (n && str[0] == ';' && seen_question)
430 goto set; /* XXXX system, exec */
431 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
432 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
435 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
436 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
440 ret = sv_2mortal(newSVpvn(str, n - 1));
442 else if (code) /* Non-Overridable */
444 else { /* None such */
446 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
450 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
452 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
461 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
463 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
479 if (GIMME != G_ARRAY) {
483 *MARK = &PL_sv_undef;
484 *MARK = refto(*MARK);
488 EXTEND_MORTAL(SP - MARK);
490 *MARK = refto(*MARK);
495 S_refto(pTHX_ SV *sv)
499 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
502 if (!(sv = LvTARG(sv)))
505 (void)SvREFCNT_inc(sv);
507 else if (SvTYPE(sv) == SVt_PVAV) {
508 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
511 (void)SvREFCNT_inc(sv);
513 else if (SvPADTMP(sv))
517 (void)SvREFCNT_inc(sv);
520 sv_upgrade(rv, SVt_RV);
534 if (sv && SvGMAGICAL(sv))
537 if (!sv || !SvROK(sv))
541 pv = sv_reftype(sv,TRUE);
542 PUSHp(pv, strlen(pv));
552 stash = CopSTASH(PL_curcop);
556 char *ptr = SvPV(ssv,len);
557 if (ckWARN(WARN_MISC) && len == 0)
558 Perl_warner(aTHX_ WARN_MISC,
559 "Explicit blessing to '' (assuming package main)");
560 stash = gv_stashpvn(ptr, len, TRUE);
563 (void)sv_bless(TOPs, stash);
577 elem = SvPV(sv, n_a);
581 switch (elem ? *elem : '\0')
584 if (strEQ(elem, "ARRAY"))
585 tmpRef = (SV*)GvAV(gv);
588 if (strEQ(elem, "CODE"))
589 tmpRef = (SV*)GvCVu(gv);
592 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
593 tmpRef = (SV*)GvIOp(gv);
596 if (strEQ(elem, "GLOB"))
600 if (strEQ(elem, "HASH"))
601 tmpRef = (SV*)GvHV(gv);
604 if (strEQ(elem, "IO"))
605 tmpRef = (SV*)GvIOp(gv);
608 if (strEQ(elem, "NAME"))
609 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
612 if (strEQ(elem, "PACKAGE"))
613 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
616 if (strEQ(elem, "SCALAR"))
630 /* Pattern matching */
635 register unsigned char *s;
638 register I32 *sfirst;
642 if (sv == PL_lastscream) {
648 SvSCREAM_off(PL_lastscream);
649 SvREFCNT_dec(PL_lastscream);
651 PL_lastscream = SvREFCNT_inc(sv);
654 s = (unsigned char*)(SvPV(sv, len));
658 if (pos > PL_maxscream) {
659 if (PL_maxscream < 0) {
660 PL_maxscream = pos + 80;
661 New(301, PL_screamfirst, 256, I32);
662 New(302, PL_screamnext, PL_maxscream, I32);
665 PL_maxscream = pos + pos / 4;
666 Renew(PL_screamnext, PL_maxscream, I32);
670 sfirst = PL_screamfirst;
671 snext = PL_screamnext;
673 if (!sfirst || !snext)
674 DIE(aTHX_ "do_study: out of memory");
676 for (ch = 256; ch; --ch)
683 snext[pos] = sfirst[ch] - pos;
690 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
699 if (PL_op->op_flags & OPf_STACKED)
705 TARG = sv_newmortal();
710 /* Lvalue operators. */
722 djSP; dMARK; dTARGET;
732 SETi(do_chomp(TOPs));
738 djSP; dMARK; dTARGET;
739 register I32 count = 0;
742 count += do_chomp(POPs);
753 if (!sv || !SvANY(sv))
755 switch (SvTYPE(sv)) {
757 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
761 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
765 if (CvROOT(sv) || CvXSUB(sv))
782 if (!PL_op->op_private) {
791 if (SvTHINKFIRST(sv))
794 switch (SvTYPE(sv)) {
804 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
805 Perl_warner(aTHX_ WARN_MISC, "Constant subroutine %s undefined",
806 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
810 /* let user-undef'd sub keep its identity */
811 GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
818 SvSetMagicSV(sv, &PL_sv_undef);
822 Newz(602, gp, 1, GP);
823 GvGP(sv) = gp_ref(gp);
824 GvSV(sv) = NEWSV(72,0);
825 GvLINE(sv) = CopLINE(PL_curcop);
831 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
834 SvPV_set(sv, Nullch);
847 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
848 DIE(aTHX_ PL_no_modify);
849 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
850 SvIVX(TOPs) != IV_MIN)
853 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
864 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
865 DIE(aTHX_ PL_no_modify);
866 sv_setsv(TARG, TOPs);
867 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
868 SvIVX(TOPs) != IV_MAX)
871 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
885 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
886 DIE(aTHX_ PL_no_modify);
887 sv_setsv(TARG, TOPs);
888 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
889 SvIVX(TOPs) != IV_MIN)
892 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
901 /* Ordinary operators. */
905 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
908 SETn( Perl_pow( left, right) );
915 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
918 SETn( left * right );
925 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
930 DIE(aTHX_ "Illegal division by zero");
932 /* insure that 20./5. == 4. */
935 if ((NV)I_V(left) == left &&
936 (NV)I_V(right) == right &&
937 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
941 value = left / right;
945 value = left / right;
954 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
964 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
966 right = (right_neg = (i < 0)) ? -i : i;
971 right_neg = dright < 0;
976 if (!use_double && SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
978 left = (left_neg = (i < 0)) ? -i : i;
986 left_neg = dleft < 0;
995 /* Somehow U_V is pessimized even if CASTFLAGS is 0 */
997 # define CAST_D2UV(d) U_V(d)
999 # define CAST_D2UV(d) ((UV)(d))
1001 /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
1002 * or, in other words, precision of UV more than of NV.
1003 * But in fact the approach below turned out to be an
1004 * optimization - floor() may be slow */
1005 if (dright <= UV_MAX && dleft <= UV_MAX) {
1006 right = CAST_D2UV(dright);
1007 left = CAST_D2UV(dleft);
1012 /* Backward-compatibility clause: */
1013 dright = Perl_floor(dright + 0.5);
1014 dleft = Perl_floor(dleft + 0.5);
1017 DIE(aTHX_ "Illegal modulus zero");
1019 dans = Perl_fmod(dleft, dright);
1020 if ((left_neg != right_neg) && dans)
1021 dans = dright - dans;
1024 sv_setnv(TARG, dans);
1031 DIE(aTHX_ "Illegal modulus zero");
1034 if ((left_neg != right_neg) && ans)
1037 /* XXX may warn: unary minus operator applied to unsigned type */
1038 /* could change -foo to be (~foo)+1 instead */
1039 if (ans <= ~((UV)IV_MAX)+1)
1040 sv_setiv(TARG, ~ans+1);
1042 sv_setnv(TARG, -(NV)ans);
1045 sv_setuv(TARG, ans);
1054 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1056 register I32 count = POPi;
1057 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1059 I32 items = SP - MARK;
1062 max = items * count;
1071 repeatcpy((char*)(MARK + items), (char*)MARK,
1072 items * sizeof(SV*), count - 1);
1075 else if (count <= 0)
1078 else { /* Note: mark already snarfed by pp_list */
1081 bool isutf = SvUTF8(tmpstr) ? TRUE : FALSE;
1083 SvSetSV(TARG, tmpstr);
1084 SvPV_force(TARG, len);
1089 SvGROW(TARG, (count * len) + 1);
1090 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1091 SvCUR(TARG) *= count;
1093 *SvEND(TARG) = '\0';
1096 (void)SvPOK_only_UTF8(TARG);
1098 (void)SvPOK_only(TARG);
1107 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1110 SETn( left - right );
1117 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1120 if (PL_op->op_private & HINT_INTEGER) {
1134 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1137 if (PL_op->op_private & HINT_INTEGER) {
1151 djSP; tryAMAGICbinSET(lt,0);
1154 SETs(boolSV(TOPn < value));
1161 djSP; tryAMAGICbinSET(gt,0);
1164 SETs(boolSV(TOPn > value));
1171 djSP; tryAMAGICbinSET(le,0);
1174 SETs(boolSV(TOPn <= value));
1181 djSP; tryAMAGICbinSET(ge,0);
1184 SETs(boolSV(TOPn >= value));
1191 djSP; tryAMAGICbinSET(ne,0);
1194 SETs(boolSV(TOPn != value));
1201 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1207 if (Perl_isnan(left) || Perl_isnan(right)) {
1211 value = (left > right) - (left < right);
1215 else if (left < right)
1217 else if (left > right)
1231 djSP; tryAMAGICbinSET(slt,0);
1234 int cmp = ((PL_op->op_private & OPpLOCALE)
1235 ? sv_cmp_locale(left, right)
1236 : sv_cmp(left, right));
1237 SETs(boolSV(cmp < 0));
1244 djSP; tryAMAGICbinSET(sgt,0);
1247 int cmp = ((PL_op->op_private & OPpLOCALE)
1248 ? sv_cmp_locale(left, right)
1249 : sv_cmp(left, right));
1250 SETs(boolSV(cmp > 0));
1257 djSP; tryAMAGICbinSET(sle,0);
1260 int cmp = ((PL_op->op_private & OPpLOCALE)
1261 ? sv_cmp_locale(left, right)
1262 : sv_cmp(left, right));
1263 SETs(boolSV(cmp <= 0));
1270 djSP; tryAMAGICbinSET(sge,0);
1273 int cmp = ((PL_op->op_private & OPpLOCALE)
1274 ? sv_cmp_locale(left, right)
1275 : sv_cmp(left, right));
1276 SETs(boolSV(cmp >= 0));
1283 djSP; tryAMAGICbinSET(seq,0);
1286 SETs(boolSV(sv_eq(left, right)));
1293 djSP; tryAMAGICbinSET(sne,0);
1296 SETs(boolSV(!sv_eq(left, right)));
1303 djSP; dTARGET; tryAMAGICbin(scmp,0);
1306 int cmp = ((PL_op->op_private & OPpLOCALE)
1307 ? sv_cmp_locale(left, right)
1308 : sv_cmp(left, right));
1316 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1319 if (SvNIOKp(left) || SvNIOKp(right)) {
1320 if (PL_op->op_private & HINT_INTEGER) {
1321 IV i = SvIV(left) & SvIV(right);
1325 UV u = SvUV(left) & SvUV(right);
1330 do_vop(PL_op->op_type, TARG, left, right);
1339 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1342 if (SvNIOKp(left) || SvNIOKp(right)) {
1343 if (PL_op->op_private & HINT_INTEGER) {
1344 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1348 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1353 do_vop(PL_op->op_type, TARG, left, right);
1362 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1365 if (SvNIOKp(left) || SvNIOKp(right)) {
1366 if (PL_op->op_private & HINT_INTEGER) {
1367 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1371 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1376 do_vop(PL_op->op_type, TARG, left, right);
1385 djSP; dTARGET; tryAMAGICun(neg);
1390 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv)) {
1392 if (SvIVX(sv) == IV_MIN) {
1393 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
1396 else if (SvUVX(sv) <= IV_MAX) {
1401 else if (SvIVX(sv) != IV_MIN) {
1408 else if (SvPOKp(sv)) {
1410 char *s = SvPV(sv, len);
1411 if (isIDFIRST(*s)) {
1412 sv_setpvn(TARG, "-", 1);
1415 else if (*s == '+' || *s == '-') {
1417 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1419 else if (DO_UTF8(sv) && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
1420 sv_setpvn(TARG, "-", 1);
1424 sv_setnv(TARG, -SvNV(sv));
1435 djSP; tryAMAGICunSET(not);
1436 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1442 djSP; dTARGET; tryAMAGICun(compl);
1446 if (PL_op->op_private & HINT_INTEGER) {
1456 register char *tmps;
1457 register long *tmpl;
1462 tmps = SvPV_force(TARG, len);
1465 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1468 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1472 for ( ; anum > 0; anum--, tmps++)
1481 /* integer versions of some of the above */
1485 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1488 SETi( left * right );
1495 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1499 DIE(aTHX_ "Illegal division by zero");
1500 value = POPi / value;
1508 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1512 DIE(aTHX_ "Illegal modulus zero");
1513 SETi( left % right );
1520 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1523 SETi( left + right );
1530 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1533 SETi( left - right );
1540 djSP; tryAMAGICbinSET(lt,0);
1543 SETs(boolSV(left < right));
1550 djSP; tryAMAGICbinSET(gt,0);
1553 SETs(boolSV(left > right));
1560 djSP; tryAMAGICbinSET(le,0);
1563 SETs(boolSV(left <= right));
1570 djSP; tryAMAGICbinSET(ge,0);
1573 SETs(boolSV(left >= right));
1580 djSP; tryAMAGICbinSET(eq,0);
1583 SETs(boolSV(left == right));
1590 djSP; tryAMAGICbinSET(ne,0);
1593 SETs(boolSV(left != right));
1600 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1607 else if (left < right)
1618 djSP; dTARGET; tryAMAGICun(neg);
1623 /* High falutin' math. */
1627 djSP; dTARGET; tryAMAGICbin(atan2,0);
1630 SETn(Perl_atan2(left, right));
1637 djSP; dTARGET; tryAMAGICun(sin);
1641 value = Perl_sin(value);
1649 djSP; dTARGET; tryAMAGICun(cos);
1653 value = Perl_cos(value);
1659 /* Support Configure command-line overrides for rand() functions.
1660 After 5.005, perhaps we should replace this by Configure support
1661 for drand48(), random(), or rand(). For 5.005, though, maintain
1662 compatibility by calling rand() but allow the user to override it.
1663 See INSTALL for details. --Andy Dougherty 15 July 1998
1665 /* Now it's after 5.005, and Configure supports drand48() and random(),
1666 in addition to rand(). So the overrides should not be needed any more.
1667 --Jarkko Hietaniemi 27 September 1998
1670 #ifndef HAS_DRAND48_PROTO
1671 extern double drand48 (void);
1684 if (!PL_srand_called) {
1685 (void)seedDrand01((Rand_seed_t)seed());
1686 PL_srand_called = TRUE;
1701 (void)seedDrand01((Rand_seed_t)anum);
1702 PL_srand_called = TRUE;
1711 * This is really just a quick hack which grabs various garbage
1712 * values. It really should be a real hash algorithm which
1713 * spreads the effect of every input bit onto every output bit,
1714 * if someone who knows about such things would bother to write it.
1715 * Might be a good idea to add that function to CORE as well.
1716 * No numbers below come from careful analysis or anything here,
1717 * except they are primes and SEED_C1 > 1E6 to get a full-width
1718 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1719 * probably be bigger too.
1722 # define SEED_C1 1000003
1723 #define SEED_C4 73819
1725 # define SEED_C1 25747
1726 #define SEED_C4 20639
1730 #define SEED_C5 26107
1733 #ifndef PERL_NO_DEV_RANDOM
1738 # include <starlet.h>
1739 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1740 * in 100-ns units, typically incremented ever 10 ms. */
1741 unsigned int when[2];
1743 # ifdef HAS_GETTIMEOFDAY
1744 struct timeval when;
1750 /* This test is an escape hatch, this symbol isn't set by Configure. */
1751 #ifndef PERL_NO_DEV_RANDOM
1752 #ifndef PERL_RANDOM_DEVICE
1753 /* /dev/random isn't used by default because reads from it will block
1754 * if there isn't enough entropy available. You can compile with
1755 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1756 * is enough real entropy to fill the seed. */
1757 # define PERL_RANDOM_DEVICE "/dev/urandom"
1759 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1761 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1770 _ckvmssts(sys$gettim(when));
1771 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1773 # ifdef HAS_GETTIMEOFDAY
1774 gettimeofday(&when,(struct timezone *) 0);
1775 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1778 u = (U32)SEED_C1 * when;
1781 u += SEED_C3 * (U32)PerlProc_getpid();
1782 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
1783 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1784 u += SEED_C5 * (U32)PTR2UV(&when);
1791 djSP; dTARGET; tryAMAGICun(exp);
1795 value = Perl_exp(value);
1803 djSP; dTARGET; tryAMAGICun(log);
1808 RESTORE_NUMERIC_STANDARD();
1809 DIE(aTHX_ "Can't take log of %g", value);
1811 value = Perl_log(value);
1819 djSP; dTARGET; tryAMAGICun(sqrt);
1824 RESTORE_NUMERIC_STANDARD();
1825 DIE(aTHX_ "Can't take sqrt of %g", value);
1827 value = Perl_sqrt(value);
1840 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1846 (void)Perl_modf(value, &value);
1848 (void)Perl_modf(-value, &value);
1863 djSP; dTARGET; tryAMAGICun(abs);
1868 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1869 (iv = SvIVX(TOPs)) != IV_MIN) {
1891 argtype = 1; /* allow underscores */
1892 XPUSHn(scan_hex(tmps, 99, &argtype));
1905 while (*tmps && isSPACE(*tmps))
1909 argtype = 1; /* allow underscores */
1911 value = scan_hex(++tmps, 99, &argtype);
1912 else if (*tmps == 'b')
1913 value = scan_bin(++tmps, 99, &argtype);
1915 value = scan_oct(tmps, 99, &argtype);
1928 SETi(sv_len_utf8(sv));
1944 I32 lvalue = PL_op->op_flags & OPf_MOD;
1946 I32 arybase = PL_curcop->cop_arybase;
1950 SvTAINTED_off(TARG); /* decontaminate */
1951 SvUTF8_off(TARG); /* decontaminate */
1955 repl = SvPV(sv, repl_len);
1962 tmps = SvPV(sv, curlen);
1964 utfcurlen = sv_len_utf8(sv);
1965 if (utfcurlen == curlen)
1973 if (pos >= arybase) {
1991 else if (len >= 0) {
1993 if (rem > (I32)curlen)
2008 Perl_croak(aTHX_ "substr outside of string");
2009 if (ckWARN(WARN_SUBSTR))
2010 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
2015 sv_pos_u2b(sv, &pos, &rem);
2017 sv_setpvn(TARG, tmps, rem);
2021 sv_insert(sv, pos, rem, repl, repl_len);
2022 else if (lvalue) { /* it's an lvalue! */
2023 if (!SvGMAGICAL(sv)) {
2027 if (ckWARN(WARN_SUBSTR))
2028 Perl_warner(aTHX_ WARN_SUBSTR,
2029 "Attempt to use reference as lvalue in substr");
2031 if (SvOK(sv)) /* is it defined ? */
2032 (void)SvPOK_only_UTF8(sv);
2034 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
2037 if (SvTYPE(TARG) < SVt_PVLV) {
2038 sv_upgrade(TARG, SVt_PVLV);
2039 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
2043 if (LvTARG(TARG) != sv) {
2045 SvREFCNT_dec(LvTARG(TARG));
2046 LvTARG(TARG) = SvREFCNT_inc(sv);
2048 LvTARGOFF(TARG) = pos;
2049 LvTARGLEN(TARG) = rem;
2053 PUSHs(TARG); /* avoid SvSETMAGIC here */
2060 register I32 size = POPi;
2061 register I32 offset = POPi;
2062 register SV *src = POPs;
2063 I32 lvalue = PL_op->op_flags & OPf_MOD;
2065 SvTAINTED_off(TARG); /* decontaminate */
2066 if (lvalue) { /* it's an lvalue! */
2067 if (SvTYPE(TARG) < SVt_PVLV) {
2068 sv_upgrade(TARG, SVt_PVLV);
2069 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
2072 if (LvTARG(TARG) != src) {
2074 SvREFCNT_dec(LvTARG(TARG));
2075 LvTARG(TARG) = SvREFCNT_inc(src);
2077 LvTARGOFF(TARG) = offset;
2078 LvTARGLEN(TARG) = size;
2081 sv_setuv(TARG, do_vecget(src, offset, size));
2096 I32 arybase = PL_curcop->cop_arybase;
2101 offset = POPi - arybase;
2104 tmps = SvPV(big, biglen);
2105 if (offset > 0 && DO_UTF8(big))
2106 sv_pos_u2b(big, &offset, 0);
2109 else if (offset > biglen)
2111 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2112 (unsigned char*)tmps + biglen, little, 0)))
2115 retval = tmps2 - tmps;
2116 if (retval > 0 && DO_UTF8(big))
2117 sv_pos_b2u(big, &retval);
2118 PUSHi(retval + arybase);
2133 I32 arybase = PL_curcop->cop_arybase;
2139 tmps2 = SvPV(little, llen);
2140 tmps = SvPV(big, blen);
2144 if (offset > 0 && DO_UTF8(big))
2145 sv_pos_u2b(big, &offset, 0);
2146 offset = offset - arybase + llen;
2150 else if (offset > blen)
2152 if (!(tmps2 = rninstr(tmps, tmps + offset,
2153 tmps2, tmps2 + llen)))
2156 retval = tmps2 - tmps;
2157 if (retval > 0 && DO_UTF8(big))
2158 sv_pos_b2u(big, &retval);
2159 PUSHi(retval + arybase);
2165 djSP; dMARK; dORIGMARK; dTARGET;
2166 do_sprintf(TARG, SP-MARK, MARK+1);
2167 TAINT_IF(SvTAINTED(TARG));
2179 U8 *tmps = (U8*)SvPVx(tmpsv,n_a);
2182 if ((*tmps & 0x80) && DO_UTF8(tmpsv))
2183 value = utf8_to_uv(tmps, &retlen);
2185 value = (UV)(*tmps & 255);
2196 (void)SvUPGRADE(TARG,SVt_PV);
2198 if (value > 255 && !IN_BYTE) {
2199 SvGROW(TARG, UTF8_MAXLEN+1);
2201 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
2202 SvCUR_set(TARG, tmps - SvPVX(TARG));
2204 (void)SvPOK_only(TARG);
2215 SvUTF8_off(TARG); /* decontaminate */
2216 (void)SvPOK_only(TARG);
2223 djSP; dTARGET; dPOPTOPssrl;
2226 char *tmps = SvPV(left, n_a);
2228 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
2230 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
2234 "The crypt() function is unimplemented due to excessive paranoia.");
2247 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2249 U8 tmpbuf[UTF8_MAXLEN];
2251 UV uv = utf8_to_uv(s, &ulen);
2253 if (PL_op->op_private & OPpLOCALE) {
2256 uv = toTITLE_LC_uni(uv);
2259 uv = toTITLE_utf8(s);
2261 tend = uv_to_utf8(tmpbuf, uv);
2263 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
2265 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2266 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2271 s = (U8*)SvPV_force(sv, slen);
2272 Copy(tmpbuf, s, ulen, U8);
2276 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2278 SvUTF8_off(TARG); /* decontaminate */
2283 s = (U8*)SvPV_force(sv, slen);
2285 if (PL_op->op_private & OPpLOCALE) {
2288 *s = toUPPER_LC(*s);
2306 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2308 U8 tmpbuf[UTF8_MAXLEN];
2310 UV uv = utf8_to_uv(s, &ulen);
2312 if (PL_op->op_private & OPpLOCALE) {
2315 uv = toLOWER_LC_uni(uv);
2318 uv = toLOWER_utf8(s);
2320 tend = uv_to_utf8(tmpbuf, uv);
2322 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
2324 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2325 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2330 s = (U8*)SvPV_force(sv, slen);
2331 Copy(tmpbuf, s, ulen, U8);
2335 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2337 SvUTF8_off(TARG); /* decontaminate */
2342 s = (U8*)SvPV_force(sv, slen);
2344 if (PL_op->op_private & OPpLOCALE) {
2347 *s = toLOWER_LC(*s);
2371 s = (U8*)SvPV(sv,len);
2373 SvUTF8_off(TARG); /* decontaminate */
2374 sv_setpvn(TARG, "", 0);
2378 (void)SvUPGRADE(TARG, SVt_PV);
2379 SvGROW(TARG, (len * 2) + 1);
2380 (void)SvPOK_only(TARG);
2381 d = (U8*)SvPVX(TARG);
2383 if (PL_op->op_private & OPpLOCALE) {
2387 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2393 d = uv_to_utf8(d, toUPPER_utf8( s ));
2399 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2404 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2406 SvUTF8_off(TARG); /* decontaminate */
2411 s = (U8*)SvPV_force(sv, len);
2413 register U8 *send = s + len;
2415 if (PL_op->op_private & OPpLOCALE) {
2418 for (; s < send; s++)
2419 *s = toUPPER_LC(*s);
2422 for (; s < send; s++)
2445 s = (U8*)SvPV(sv,len);
2447 SvUTF8_off(TARG); /* decontaminate */
2448 sv_setpvn(TARG, "", 0);
2452 (void)SvUPGRADE(TARG, SVt_PV);
2453 SvGROW(TARG, (len * 2) + 1);
2454 (void)SvPOK_only(TARG);
2455 d = (U8*)SvPVX(TARG);
2457 if (PL_op->op_private & OPpLOCALE) {
2461 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2467 d = uv_to_utf8(d, toLOWER_utf8(s));
2473 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2478 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2480 SvUTF8_off(TARG); /* decontaminate */
2486 s = (U8*)SvPV_force(sv, len);
2488 register U8 *send = s + len;
2490 if (PL_op->op_private & OPpLOCALE) {
2493 for (; s < send; s++)
2494 *s = toLOWER_LC(*s);
2497 for (; s < send; s++)
2512 register char *s = SvPV(sv,len);
2515 SvUTF8_off(TARG); /* decontaminate */
2517 (void)SvUPGRADE(TARG, SVt_PV);
2518 SvGROW(TARG, (len * 2) + 1);
2523 STRLEN ulen = UTF8SKIP(s);
2547 SvCUR_set(TARG, d - SvPVX(TARG));
2548 (void)SvPOK_only(TARG);
2551 sv_setpvn(TARG, s, len);
2553 if (SvSMAGICAL(TARG))
2562 djSP; dMARK; dORIGMARK;
2564 register AV* av = (AV*)POPs;
2565 register I32 lval = PL_op->op_flags & OPf_MOD;
2566 I32 arybase = PL_curcop->cop_arybase;
2569 if (SvTYPE(av) == SVt_PVAV) {
2570 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2572 for (svp = MARK + 1; svp <= SP; svp++) {
2577 if (max > AvMAX(av))
2580 while (++MARK <= SP) {
2581 elem = SvIVx(*MARK);
2585 svp = av_fetch(av, elem, lval);
2587 if (!svp || *svp == &PL_sv_undef)
2588 DIE(aTHX_ PL_no_aelem, elem);
2589 if (PL_op->op_private & OPpLVAL_INTRO)
2590 save_aelem(av, elem, svp);
2592 *MARK = svp ? *svp : &PL_sv_undef;
2595 if (GIMME != G_ARRAY) {
2603 /* Associative arrays. */
2608 HV *hash = (HV*)POPs;
2610 I32 gimme = GIMME_V;
2611 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2614 /* might clobber stack_sp */
2615 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2620 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2621 if (gimme == G_ARRAY) {
2624 /* might clobber stack_sp */
2626 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
2631 else if (gimme == G_SCALAR)
2650 I32 gimme = GIMME_V;
2651 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2655 if (PL_op->op_private & OPpSLICE) {
2659 hvtype = SvTYPE(hv);
2660 if (hvtype == SVt_PVHV) { /* hash element */
2661 while (++MARK <= SP) {
2662 sv = hv_delete_ent(hv, *MARK, discard, 0);
2663 *MARK = sv ? sv : &PL_sv_undef;
2666 else if (hvtype == SVt_PVAV) {
2667 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2668 while (++MARK <= SP) {
2669 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
2670 *MARK = sv ? sv : &PL_sv_undef;
2673 else { /* pseudo-hash element */
2674 while (++MARK <= SP) {
2675 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
2676 *MARK = sv ? sv : &PL_sv_undef;
2681 DIE(aTHX_ "Not a HASH reference");
2684 else if (gimme == G_SCALAR) {
2693 if (SvTYPE(hv) == SVt_PVHV)
2694 sv = hv_delete_ent(hv, keysv, discard, 0);
2695 else if (SvTYPE(hv) == SVt_PVAV) {
2696 if (PL_op->op_flags & OPf_SPECIAL)
2697 sv = av_delete((AV*)hv, SvIV(keysv), discard);
2699 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
2702 DIE(aTHX_ "Not a HASH reference");
2717 if (PL_op->op_private & OPpEXISTS_SUB) {
2721 cv = sv_2cv(sv, &hv, &gv, FALSE);
2724 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
2730 if (SvTYPE(hv) == SVt_PVHV) {
2731 if (hv_exists_ent(hv, tmpsv, 0))
2734 else if (SvTYPE(hv) == SVt_PVAV) {
2735 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2736 if (av_exists((AV*)hv, SvIV(tmpsv)))
2739 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
2743 DIE(aTHX_ "Not a HASH reference");
2750 djSP; dMARK; dORIGMARK;
2751 register HV *hv = (HV*)POPs;
2752 register I32 lval = PL_op->op_flags & OPf_MOD;
2753 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2755 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2756 DIE(aTHX_ "Can't localize pseudo-hash element");
2758 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2759 while (++MARK <= SP) {
2763 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2764 svp = he ? &HeVAL(he) : 0;
2767 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2770 if (!svp || *svp == &PL_sv_undef) {
2772 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
2774 if (PL_op->op_private & OPpLVAL_INTRO)
2775 save_helem(hv, keysv, svp);
2777 *MARK = svp ? *svp : &PL_sv_undef;
2780 if (GIMME != G_ARRAY) {
2788 /* List operators. */
2793 if (GIMME != G_ARRAY) {
2795 *MARK = *SP; /* unwanted list, return last item */
2797 *MARK = &PL_sv_undef;
2806 SV **lastrelem = PL_stack_sp;
2807 SV **lastlelem = PL_stack_base + POPMARK;
2808 SV **firstlelem = PL_stack_base + POPMARK + 1;
2809 register SV **firstrelem = lastlelem + 1;
2810 I32 arybase = PL_curcop->cop_arybase;
2811 I32 lval = PL_op->op_flags & OPf_MOD;
2812 I32 is_something_there = lval;
2814 register I32 max = lastrelem - lastlelem;
2815 register SV **lelem;
2818 if (GIMME != G_ARRAY) {
2819 ix = SvIVx(*lastlelem);
2824 if (ix < 0 || ix >= max)
2825 *firstlelem = &PL_sv_undef;
2827 *firstlelem = firstrelem[ix];
2833 SP = firstlelem - 1;
2837 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2843 if (ix < 0 || ix >= max)
2844 *lelem = &PL_sv_undef;
2846 is_something_there = TRUE;
2847 if (!(*lelem = firstrelem[ix]))
2848 *lelem = &PL_sv_undef;
2851 if (is_something_there)
2854 SP = firstlelem - 1;
2860 djSP; dMARK; dORIGMARK;
2861 I32 items = SP - MARK;
2862 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2863 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2870 djSP; dMARK; dORIGMARK;
2871 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2875 SV *val = NEWSV(46, 0);
2877 sv_setsv(val, *++MARK);
2878 else if (ckWARN(WARN_MISC))
2879 Perl_warner(aTHX_ WARN_MISC, "Odd number of elements in hash assignment");
2880 (void)hv_store_ent(hv,key,val,0);
2889 djSP; dMARK; dORIGMARK;
2890 register AV *ary = (AV*)*++MARK;
2894 register I32 offset;
2895 register I32 length;
2902 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
2903 *MARK-- = SvTIED_obj((SV*)ary, mg);
2907 call_method("SPLICE",GIMME_V);
2916 offset = i = SvIVx(*MARK);
2918 offset += AvFILLp(ary) + 1;
2920 offset -= PL_curcop->cop_arybase;
2922 DIE(aTHX_ PL_no_aelem, i);
2924 length = SvIVx(*MARK++);
2926 length += AvFILLp(ary) - offset + 1;
2932 length = AvMAX(ary) + 1; /* close enough to infinity */
2936 length = AvMAX(ary) + 1;
2938 if (offset > AvFILLp(ary) + 1)
2939 offset = AvFILLp(ary) + 1;
2940 after = AvFILLp(ary) + 1 - (offset + length);
2941 if (after < 0) { /* not that much array */
2942 length += after; /* offset+length now in array */
2948 /* At this point, MARK .. SP-1 is our new LIST */
2951 diff = newlen - length;
2952 if (newlen && !AvREAL(ary) && AvREIFY(ary))
2955 if (diff < 0) { /* shrinking the area */
2957 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2958 Copy(MARK, tmparyval, newlen, SV*);
2961 MARK = ORIGMARK + 1;
2962 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2963 MEXTEND(MARK, length);
2964 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2966 EXTEND_MORTAL(length);
2967 for (i = length, dst = MARK; i; i--) {
2968 sv_2mortal(*dst); /* free them eventualy */
2975 *MARK = AvARRAY(ary)[offset+length-1];
2978 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2979 SvREFCNT_dec(*dst++); /* free them now */
2982 AvFILLp(ary) += diff;
2984 /* pull up or down? */
2986 if (offset < after) { /* easier to pull up */
2987 if (offset) { /* esp. if nothing to pull */
2988 src = &AvARRAY(ary)[offset-1];
2989 dst = src - diff; /* diff is negative */
2990 for (i = offset; i > 0; i--) /* can't trust Copy */
2994 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
2998 if (after) { /* anything to pull down? */
2999 src = AvARRAY(ary) + offset + length;
3000 dst = src + diff; /* diff is negative */
3001 Move(src, dst, after, SV*);
3003 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
3004 /* avoid later double free */
3008 dst[--i] = &PL_sv_undef;
3011 for (src = tmparyval, dst = AvARRAY(ary) + offset;
3013 *dst = NEWSV(46, 0);
3014 sv_setsv(*dst++, *src++);
3016 Safefree(tmparyval);
3019 else { /* no, expanding (or same) */
3021 New(452, tmparyval, length, SV*); /* so remember deletion */
3022 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
3025 if (diff > 0) { /* expanding */
3027 /* push up or down? */
3029 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
3033 Move(src, dst, offset, SV*);
3035 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
3037 AvFILLp(ary) += diff;
3040 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
3041 av_extend(ary, AvFILLp(ary) + diff);
3042 AvFILLp(ary) += diff;
3045 dst = AvARRAY(ary) + AvFILLp(ary);
3047 for (i = after; i; i--) {
3054 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
3055 *dst = NEWSV(46, 0);
3056 sv_setsv(*dst++, *src++);
3058 MARK = ORIGMARK + 1;
3059 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3061 Copy(tmparyval, MARK, length, SV*);
3063 EXTEND_MORTAL(length);
3064 for (i = length, dst = MARK; i; i--) {
3065 sv_2mortal(*dst); /* free them eventualy */
3069 Safefree(tmparyval);
3073 else if (length--) {
3074 *MARK = tmparyval[length];
3077 while (length-- > 0)
3078 SvREFCNT_dec(tmparyval[length]);
3080 Safefree(tmparyval);
3083 *MARK = &PL_sv_undef;
3091 djSP; dMARK; dORIGMARK; dTARGET;
3092 register AV *ary = (AV*)*++MARK;
3093 register SV *sv = &PL_sv_undef;
3096 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3097 *MARK-- = SvTIED_obj((SV*)ary, mg);
3101 call_method("PUSH",G_SCALAR|G_DISCARD);
3106 /* Why no pre-extend of ary here ? */
3107 for (++MARK; MARK <= SP; MARK++) {
3110 sv_setsv(sv, *MARK);
3115 PUSHi( AvFILL(ary) + 1 );
3123 SV *sv = av_pop(av);
3125 (void)sv_2mortal(sv);
3134 SV *sv = av_shift(av);
3139 (void)sv_2mortal(sv);
3146 djSP; dMARK; dORIGMARK; dTARGET;
3147 register AV *ary = (AV*)*++MARK;
3152 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3153 *MARK-- = SvTIED_obj((SV*)ary, mg);
3157 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3162 av_unshift(ary, SP - MARK);
3165 sv_setsv(sv, *++MARK);
3166 (void)av_store(ary, i++, sv);
3170 PUSHi( AvFILL(ary) + 1 );
3180 if (GIMME == G_ARRAY) {
3187 /* safe as long as stack cannot get extended in the above */
3192 register char *down;
3197 SvUTF8_off(TARG); /* decontaminate */
3199 do_join(TARG, &PL_sv_no, MARK, SP);
3201 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3202 up = SvPV_force(TARG, len);
3204 if (DO_UTF8(TARG)) { /* first reverse each character */
3205 U8* s = (U8*)SvPVX(TARG);
3206 U8* send = (U8*)(s + len);
3215 down = (char*)(s - 1);
3216 if (s > send || !((*down & 0xc0) == 0x80)) {
3217 if (ckWARN_d(WARN_UTF8))
3218 Perl_warner(aTHX_ WARN_UTF8,
3219 "Malformed UTF-8 character");
3231 down = SvPVX(TARG) + len - 1;
3237 (void)SvPOK_only(TARG);
3246 S_mul128(pTHX_ SV *sv, U8 m)
3249 char *s = SvPV(sv, len);
3253 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
3254 SV *tmpNew = newSVpvn("0000000000", 10);
3256 sv_catsv(tmpNew, sv);
3257 SvREFCNT_dec(sv); /* free old sv */
3262 while (!*t) /* trailing '\0'? */
3265 i = ((*t - '0') << 7) + m;
3266 *(t--) = '0' + (i % 10);
3272 /* Explosives and implosives. */
3274 #if 'I' == 73 && 'J' == 74
3275 /* On an ASCII/ISO kind of system */
3276 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
3279 Some other sort of character set - use memchr() so we don't match
3282 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
3289 I32 start_sp_offset = SP - PL_stack_base;
3290 I32 gimme = GIMME_V;
3294 register char *pat = SvPV(left, llen);
3295 register char *s = SvPV(right, rlen);
3296 char *strend = s + rlen;
3298 register char *patend = pat + llen;
3304 /* These must not be in registers: */
3321 register U32 culong;
3325 #ifdef PERL_NATINT_PACK
3326 int natint; /* native integer */
3327 int unatint; /* unsigned native integer */
3330 if (gimme != G_ARRAY) { /* arrange to do first one only */
3332 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3333 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
3335 while (isDIGIT(*patend) || *patend == '*')
3341 while (pat < patend) {
3343 datumtype = *pat++ & 0xFF;
3344 #ifdef PERL_NATINT_PACK
3347 if (isSPACE(datumtype))
3349 if (datumtype == '#') {
3350 while (pat < patend && *pat != '\n')
3355 char *natstr = "sSiIlL";
3357 if (strchr(natstr, datumtype)) {
3358 #ifdef PERL_NATINT_PACK
3364 DIE(aTHX_ "'!' allowed only after types %s", natstr);
3369 else if (*pat == '*') {
3370 len = strend - strbeg; /* long enough */
3374 else if (isDIGIT(*pat)) {
3376 while (isDIGIT(*pat)) {
3377 len = (len * 10) + (*pat++ - '0');
3379 DIE(aTHX_ "Repeat count in unpack overflows");
3383 len = (datumtype != '@');
3387 DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
3388 case ',': /* grandfather in commas but with a warning */
3389 if (commas++ == 0 && ckWARN(WARN_UNPACK))
3390 Perl_warner(aTHX_ WARN_UNPACK,
3391 "Invalid type in unpack: '%c'", (int)datumtype);
3394 if (len == 1 && pat[-1] != '1')
3403 if (len > strend - strbeg)
3404 DIE(aTHX_ "@ outside of string");
3408 if (len > s - strbeg)
3409 DIE(aTHX_ "X outside of string");
3413 if (len > strend - s)
3414 DIE(aTHX_ "x outside of string");
3418 if (start_sp_offset >= SP - PL_stack_base)
3419 DIE(aTHX_ "/ must follow a numeric type");
3422 pat++; /* ignore '*' for compatibility with pack */
3424 DIE(aTHX_ "/ cannot take a count" );
3431 if (len > strend - s)
3434 goto uchar_checksum;
3435 sv = NEWSV(35, len);
3436 sv_setpvn(sv, s, len);
3438 if (datumtype == 'A' || datumtype == 'Z') {
3439 aptr = s; /* borrow register */
3440 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
3445 else { /* 'A' strips both nulls and spaces */
3446 s = SvPVX(sv) + len - 1;
3447 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3451 SvCUR_set(sv, s - SvPVX(sv));
3452 s = aptr; /* unborrow register */
3454 XPUSHs(sv_2mortal(sv));
3458 if (star || len > (strend - s) * 8)
3459 len = (strend - s) * 8;
3462 Newz(601, PL_bitcount, 256, char);
3463 for (bits = 1; bits < 256; bits++) {
3464 if (bits & 1) PL_bitcount[bits]++;
3465 if (bits & 2) PL_bitcount[bits]++;
3466 if (bits & 4) PL_bitcount[bits]++;
3467 if (bits & 8) PL_bitcount[bits]++;
3468 if (bits & 16) PL_bitcount[bits]++;
3469 if (bits & 32) PL_bitcount[bits]++;
3470 if (bits & 64) PL_bitcount[bits]++;
3471 if (bits & 128) PL_bitcount[bits]++;
3475 culong += PL_bitcount[*(unsigned char*)s++];
3480 if (datumtype == 'b') {
3482 if (bits & 1) culong++;
3488 if (bits & 128) culong++;
3495 sv = NEWSV(35, len + 1);
3499 if (datumtype == 'b') {
3501 for (len = 0; len < aint; len++) {
3502 if (len & 7) /*SUPPRESS 595*/
3506 *str++ = '0' + (bits & 1);
3511 for (len = 0; len < aint; len++) {
3516 *str++ = '0' + ((bits & 128) != 0);
3520 XPUSHs(sv_2mortal(sv));
3524 if (star || len > (strend - s) * 2)
3525 len = (strend - s) * 2;
3526 sv = NEWSV(35, len + 1);
3530 if (datumtype == 'h') {
3532 for (len = 0; len < aint; len++) {
3537 *str++ = PL_hexdigit[bits & 15];
3542 for (len = 0; len < aint; len++) {
3547 *str++ = PL_hexdigit[(bits >> 4) & 15];
3551 XPUSHs(sv_2mortal(sv));
3554 if (len > strend - s)
3559 if (aint >= 128) /* fake up signed chars */
3569 if (aint >= 128) /* fake up signed chars */
3572 sv_setiv(sv, (IV)aint);
3573 PUSHs(sv_2mortal(sv));
3578 if (len > strend - s)
3593 sv_setiv(sv, (IV)auint);
3594 PUSHs(sv_2mortal(sv));
3599 if (len > strend - s)
3602 while (len-- > 0 && s < strend) {
3603 auint = utf8_to_uv((U8*)s, &along);
3606 cdouble += (NV)auint;
3614 while (len-- > 0 && s < strend) {
3615 auint = utf8_to_uv((U8*)s, &along);
3618 sv_setuv(sv, (UV)auint);
3619 PUSHs(sv_2mortal(sv));
3624 #if SHORTSIZE == SIZE16
3625 along = (strend - s) / SIZE16;
3627 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
3632 #if SHORTSIZE != SIZE16
3636 COPYNN(s, &ashort, sizeof(short));
3647 #if SHORTSIZE > SIZE16
3659 #if SHORTSIZE != SIZE16
3663 COPYNN(s, &ashort, sizeof(short));
3666 sv_setiv(sv, (IV)ashort);
3667 PUSHs(sv_2mortal(sv));
3675 #if SHORTSIZE > SIZE16
3681 sv_setiv(sv, (IV)ashort);
3682 PUSHs(sv_2mortal(sv));
3690 #if SHORTSIZE == SIZE16
3691 along = (strend - s) / SIZE16;
3693 unatint = natint && datumtype == 'S';
3694 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
3699 #if SHORTSIZE != SIZE16
3701 unsigned short aushort;
3703 COPYNN(s, &aushort, sizeof(unsigned short));
3704 s += sizeof(unsigned short);
3712 COPY16(s, &aushort);
3715 if (datumtype == 'n')
3716 aushort = PerlSock_ntohs(aushort);
3719 if (datumtype == 'v')
3720 aushort = vtohs(aushort);
3729 #if SHORTSIZE != SIZE16
3731 unsigned short aushort;
3733 COPYNN(s, &aushort, sizeof(unsigned short));
3734 s += sizeof(unsigned short);
3736 sv_setiv(sv, (UV)aushort);
3737 PUSHs(sv_2mortal(sv));
3744 COPY16(s, &aushort);
3748 if (datumtype == 'n')
3749 aushort = PerlSock_ntohs(aushort);
3752 if (datumtype == 'v')
3753 aushort = vtohs(aushort);
3755 sv_setiv(sv, (UV)aushort);
3756 PUSHs(sv_2mortal(sv));
3762 along = (strend - s) / sizeof(int);
3767 Copy(s, &aint, 1, int);
3770 cdouble += (NV)aint;
3779 Copy(s, &aint, 1, int);
3783 /* Without the dummy below unpack("i", pack("i",-1))
3784 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3785 * cc with optimization turned on.
3787 * The bug was detected in
3788 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
3789 * with optimization (-O4) turned on.
3790 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
3791 * does not have this problem even with -O4.
3793 * This bug was reported as DECC_BUGS 1431
3794 * and tracked internally as GEM_BUGS 7775.
3796 * The bug is fixed in
3797 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
3798 * UNIX V4.0F support: DEC C V5.9-006 or later
3799 * UNIX V4.0E support: DEC C V5.8-011 or later
3802 * See also few lines later for the same bug.
3805 sv_setiv(sv, (IV)aint) :
3807 sv_setiv(sv, (IV)aint);
3808 PUSHs(sv_2mortal(sv));
3813 along = (strend - s) / sizeof(unsigned int);
3818 Copy(s, &auint, 1, unsigned int);
3819 s += sizeof(unsigned int);
3821 cdouble += (NV)auint;
3830 Copy(s, &auint, 1, unsigned int);
3831 s += sizeof(unsigned int);
3834 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
3835 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
3836 * See details few lines earlier. */
3838 sv_setuv(sv, (UV)auint) :
3840 sv_setuv(sv, (UV)auint);
3841 PUSHs(sv_2mortal(sv));
3846 #if LONGSIZE == SIZE32
3847 along = (strend - s) / SIZE32;
3849 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
3854 #if LONGSIZE != SIZE32
3858 COPYNN(s, &along, sizeof(long));
3861 cdouble += (NV)along;
3871 #if LONGSIZE > SIZE32
3872 if (along > 2147483647)
3873 along -= 4294967296;
3877 cdouble += (NV)along;
3886 #if LONGSIZE != SIZE32
3890 COPYNN(s, &along, sizeof(long));
3893 sv_setiv(sv, (IV)along);
3894 PUSHs(sv_2mortal(sv));
3902 #if LONGSIZE > SIZE32
3903 if (along > 2147483647)
3904 along -= 4294967296;
3908 sv_setiv(sv, (IV)along);
3909 PUSHs(sv_2mortal(sv));
3917 #if LONGSIZE == SIZE32
3918 along = (strend - s) / SIZE32;
3920 unatint = natint && datumtype == 'L';
3921 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
3926 #if LONGSIZE != SIZE32
3928 unsigned long aulong;
3930 COPYNN(s, &aulong, sizeof(unsigned long));
3931 s += sizeof(unsigned long);
3933 cdouble += (NV)aulong;
3945 if (datumtype == 'N')
3946 aulong = PerlSock_ntohl(aulong);
3949 if (datumtype == 'V')
3950 aulong = vtohl(aulong);
3953 cdouble += (NV)aulong;
3962 #if LONGSIZE != SIZE32
3964 unsigned long aulong;
3966 COPYNN(s, &aulong, sizeof(unsigned long));
3967 s += sizeof(unsigned long);
3969 sv_setuv(sv, (UV)aulong);
3970 PUSHs(sv_2mortal(sv));
3980 if (datumtype == 'N')
3981 aulong = PerlSock_ntohl(aulong);
3984 if (datumtype == 'V')
3985 aulong = vtohl(aulong);
3988 sv_setuv(sv, (UV)aulong);
3989 PUSHs(sv_2mortal(sv));
3995 along = (strend - s) / sizeof(char*);
4001 if (sizeof(char*) > strend - s)
4004 Copy(s, &aptr, 1, char*);
4010 PUSHs(sv_2mortal(sv));
4020 while ((len > 0) && (s < strend)) {
4021 auv = (auv << 7) | (*s & 0x7f);
4022 if (!(*s++ & 0x80)) {
4026 PUSHs(sv_2mortal(sv));
4030 else if (++bytes >= sizeof(UV)) { /* promote to string */
4034 sv = Perl_newSVpvf(aTHX_ "%.*Vu", (int)TYPE_DIGITS(UV), auv);
4035 while (s < strend) {
4036 sv = mul128(sv, *s & 0x7f);
4037 if (!(*s++ & 0x80)) {
4046 PUSHs(sv_2mortal(sv));
4051 if ((s >= strend) && bytes)
4052 DIE(aTHX_ "Unterminated compressed integer");
4057 if (sizeof(char*) > strend - s)
4060 Copy(s, &aptr, 1, char*);
4065 sv_setpvn(sv, aptr, len);
4066 PUSHs(sv_2mortal(sv));
4070 along = (strend - s) / sizeof(Quad_t);
4076 if (s + sizeof(Quad_t) > strend)
4079 Copy(s, &aquad, 1, Quad_t);
4080 s += sizeof(Quad_t);
4083 if (aquad >= IV_MIN && aquad <= IV_MAX)
4084 sv_setiv(sv, (IV)aquad);
4086 sv_setnv(sv, (NV)aquad);
4087 PUSHs(sv_2mortal(sv));
4091 along = (strend - s) / sizeof(Quad_t);
4097 if (s + sizeof(Uquad_t) > strend)
4100 Copy(s, &auquad, 1, Uquad_t);
4101 s += sizeof(Uquad_t);
4104 if (auquad <= UV_MAX)
4105 sv_setuv(sv, (UV)auquad);
4107 sv_setnv(sv, (NV)auquad);
4108 PUSHs(sv_2mortal(sv));
4112 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
4115 along = (strend - s) / sizeof(float);
4120 Copy(s, &afloat, 1, float);
4129 Copy(s, &afloat, 1, float);
4132 sv_setnv(sv, (NV)afloat);
4133 PUSHs(sv_2mortal(sv));
4139 along = (strend - s) / sizeof(double);
4144 Copy(s, &adouble, 1, double);
4145 s += sizeof(double);
4153 Copy(s, &adouble, 1, double);
4154 s += sizeof(double);
4156 sv_setnv(sv, (NV)adouble);
4157 PUSHs(sv_2mortal(sv));
4163 * Initialise the decode mapping. By using a table driven
4164 * algorithm, the code will be character-set independent
4165 * (and just as fast as doing character arithmetic)
4167 if (PL_uudmap['M'] == 0) {
4170 for (i = 0; i < sizeof(PL_uuemap); i += 1)
4171 PL_uudmap[(U8)PL_uuemap[i]] = i;
4173 * Because ' ' and '`' map to the same value,
4174 * we need to decode them both the same.
4179 along = (strend - s) * 3 / 4;
4180 sv = NEWSV(42, along);
4183 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
4188 len = PL_uudmap[*(U8*)s++] & 077;
4190 if (s < strend && ISUUCHAR(*s))
4191 a = PL_uudmap[*(U8*)s++] & 077;
4194 if (s < strend && ISUUCHAR(*s))
4195 b = PL_uudmap[*(U8*)s++] & 077;
4198 if (s < strend && ISUUCHAR(*s))
4199 c = PL_uudmap[*(U8*)s++] & 077;
4202 if (s < strend && ISUUCHAR(*s))
4203 d = PL_uudmap[*(U8*)s++] & 077;
4206 hunk[0] = (a << 2) | (b >> 4);
4207 hunk[1] = (b << 4) | (c >> 2);
4208 hunk[2] = (c << 6) | d;
4209 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
4214 else if (s[1] == '\n') /* possible checksum byte */
4217 XPUSHs(sv_2mortal(sv));
4222 if (strchr("fFdD", datumtype) ||
4223 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
4227 while (checksum >= 16) {
4231 while (checksum >= 4) {
4237 along = (1 << checksum) - 1;
4238 while (cdouble < 0.0)
4240 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
4241 sv_setnv(sv, cdouble);
4244 if (checksum < 32) {
4245 aulong = (1 << checksum) - 1;
4248 sv_setuv(sv, (UV)culong);
4250 XPUSHs(sv_2mortal(sv));
4254 if (SP - PL_stack_base == start_sp_offset && gimme == G_SCALAR)
4255 PUSHs(&PL_sv_undef);
4260 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
4264 *hunk = PL_uuemap[len];
4265 sv_catpvn(sv, hunk, 1);
4268 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4269 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
4270 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
4271 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
4272 sv_catpvn(sv, hunk, 4);
4277 char r = (len > 1 ? s[1] : '\0');
4278 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4279 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
4280 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
4281 hunk[3] = PL_uuemap[0];
4282 sv_catpvn(sv, hunk, 4);
4284 sv_catpvn(sv, "\n", 1);
4288 S_is_an_int(pTHX_ char *s, STRLEN l)
4291 SV *result = newSVpvn(s, l);
4292 char *result_c = SvPV(result, n_a); /* convenience */
4293 char *out = result_c;
4303 SvREFCNT_dec(result);
4326 SvREFCNT_dec(result);
4332 SvCUR_set(result, out - result_c);
4336 /* pnum must be '\0' terminated */
4338 S_div128(pTHX_ SV *pnum, bool *done)
4341 char *s = SvPV(pnum, len);
4350 i = m * 10 + (*t - '0');
4352 r = (i >> 7); /* r < 10 */
4359 SvCUR_set(pnum, (STRLEN) (t - s));
4366 djSP; dMARK; dORIGMARK; dTARGET;
4367 register SV *cat = TARG;
4370 register char *pat = SvPVx(*++MARK, fromlen);
4371 register char *patend = pat + fromlen;
4376 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4377 static char *space10 = " ";
4379 /* These must not be in registers: */
4394 #ifdef PERL_NATINT_PACK
4395 int natint; /* native integer */
4400 sv_setpvn(cat, "", 0);
4401 while (pat < patend) {
4402 SV *lengthcode = Nullsv;
4403 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
4404 datumtype = *pat++ & 0xFF;
4405 #ifdef PERL_NATINT_PACK
4408 if (isSPACE(datumtype))
4410 if (datumtype == '#') {
4411 while (pat < patend && *pat != '\n')
4416 char *natstr = "sSiIlL";
4418 if (strchr(natstr, datumtype)) {
4419 #ifdef PERL_NATINT_PACK
4425 DIE(aTHX_ "'!' allowed only after types %s", natstr);
4428 len = strchr("@Xxu", datumtype) ? 0 : items;
4431 else if (isDIGIT(*pat)) {
4433 while (isDIGIT(*pat)) {
4434 len = (len * 10) + (*pat++ - '0');
4436 DIE(aTHX_ "Repeat count in pack overflows");
4443 if ((*pat != 'a' && *pat != 'A' && *pat != 'Z') || pat[1] != '*')
4444 DIE(aTHX_ "/ must be followed by a*, A* or Z*");
4445 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
4446 ? *MARK : &PL_sv_no)
4447 + (*pat == 'Z' ? 1 : 0)));
4451 DIE(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
4452 case ',': /* grandfather in commas but with a warning */
4453 if (commas++ == 0 && ckWARN(WARN_PACK))
4454 Perl_warner(aTHX_ WARN_PACK,
4455 "Invalid type in pack: '%c'", (int)datumtype);
4458 DIE(aTHX_ "%% may only be used in unpack");
4469 if (SvCUR(cat) < len)
4470 DIE(aTHX_ "X outside of string");
4477 sv_catpvn(cat, null10, 10);
4480 sv_catpvn(cat, null10, len);
4486 aptr = SvPV(fromstr, fromlen);
4487 if (pat[-1] == '*') {
4489 if (datumtype == 'Z')
4492 if (fromlen >= len) {
4493 sv_catpvn(cat, aptr, len);
4494 if (datumtype == 'Z')
4495 *(SvEND(cat)-1) = '\0';
4498 sv_catpvn(cat, aptr, fromlen);
4500 if (datumtype == 'A') {
4502 sv_catpvn(cat, space10, 10);
4505 sv_catpvn(cat, space10, len);
4509 sv_catpvn(cat, null10, 10);
4512 sv_catpvn(cat, null10, len);
4524 str = SvPV(fromstr, fromlen);
4528 SvCUR(cat) += (len+7)/8;
4529 SvGROW(cat, SvCUR(cat) + 1);
4530 aptr = SvPVX(cat) + aint;
4535 if (datumtype == 'B') {
4536 for (len = 0; len++ < aint;) {
4537 items |= *str++ & 1;
4541 *aptr++ = items & 0xff;
4547 for (len = 0; len++ < aint;) {
4553 *aptr++ = items & 0xff;
4559 if (datumtype == 'B')
4560 items <<= 7 - (aint & 7);
4562 items >>= 7 - (aint & 7);
4563 *aptr++ = items & 0xff;
4565 str = SvPVX(cat) + SvCUR(cat);
4580 str = SvPV(fromstr, fromlen);
4584 SvCUR(cat) += (len+1)/2;
4585 SvGROW(cat, SvCUR(cat) + 1);
4586 aptr = SvPVX(cat) + aint;
4591 if (datumtype == 'H') {
4592 for (len = 0; len++ < aint;) {
4594 items |= ((*str++ & 15) + 9) & 15;
4596 items |= *str++ & 15;
4600 *aptr++ = items & 0xff;
4606 for (len = 0; len++ < aint;) {
4608 items |= (((*str++ & 15) + 9) & 15) << 4;
4610 items |= (*str++ & 15) << 4;
4614 *aptr++ = items & 0xff;
4620 *aptr++ = items & 0xff;
4621 str = SvPVX(cat) + SvCUR(cat);
4632 aint = SvIV(fromstr);
4634 sv_catpvn(cat, &achar, sizeof(char));
4640 auint = SvUV(fromstr);
4641 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN);
4642 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4647 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4652 afloat = (float)SvNV(fromstr);
4653 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4660 adouble = (double)SvNV(fromstr);
4661 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4667 ashort = (I16)SvIV(fromstr);
4669 ashort = PerlSock_htons(ashort);
4671 CAT16(cat, &ashort);
4677 ashort = (I16)SvIV(fromstr);
4679 ashort = htovs(ashort);
4681 CAT16(cat, &ashort);
4685 #if SHORTSIZE != SIZE16
4687 unsigned short aushort;
4691 aushort = SvUV(fromstr);
4692 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
4702 aushort = (U16)SvUV(fromstr);
4703 CAT16(cat, &aushort);
4709 #if SHORTSIZE != SIZE16
4715 ashort = SvIV(fromstr);
4716 sv_catpvn(cat, (char *)&ashort, sizeof(short));
4724 ashort = (I16)SvIV(fromstr);
4725 CAT16(cat, &ashort);
4732 auint = SvUV(fromstr);
4733 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4739 adouble = Perl_floor(SvNV(fromstr));
4742 DIE(aTHX_ "Cannot compress negative numbers");
4745 #if UVSIZE > 4 && UVSIZE >= NVSIZE
4746 adouble <= 0xffffffff
4748 # ifdef CXUX_BROKEN_CONSTANT_CONVERT
4749 adouble <= UV_MAX_cxux
4756 char buf[1 + sizeof(UV)];
4757 char *in = buf + sizeof(buf);
4758 UV auv = U_V(adouble);
4761 *--in = (auv & 0x7f) | 0x80;
4764 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4765 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4767 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4768 char *from, *result, *in;
4773 /* Copy string and check for compliance */
4774 from = SvPV(fromstr, len);
4775 if ((norm = is_an_int(from, len)) == NULL)
4776 DIE(aTHX_ "can compress only unsigned integer");
4778 New('w', result, len, char);
4782 *--in = div128(norm, &done) | 0x80;
4783 result[len - 1] &= 0x7F; /* clear continue bit */
4784 sv_catpvn(cat, in, (result + len) - in);
4786 SvREFCNT_dec(norm); /* free norm */
4788 else if (SvNOKp(fromstr)) {
4789 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4790 char *in = buf + sizeof(buf);
4793 double next = floor(adouble / 128);
4794 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4795 if (--in < buf) /* this cannot happen ;-) */
4796 DIE(aTHX_ "Cannot compress integer");
4798 } while (adouble > 0);
4799 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4800 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4803 DIE(aTHX_ "Cannot compress non integer");
4809 aint = SvIV(fromstr);
4810 sv_catpvn(cat, (char*)&aint, sizeof(int));
4816 aulong = SvUV(fromstr);
4818 aulong = PerlSock_htonl(aulong);
4820 CAT32(cat, &aulong);
4826 aulong = SvUV(fromstr);
4828 aulong = htovl(aulong);
4830 CAT32(cat, &aulong);
4834 #if LONGSIZE != SIZE32
4836 unsigned long aulong;
4840 aulong = SvUV(fromstr);
4841 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
4849 aulong = SvUV(fromstr);
4850 CAT32(cat, &aulong);
4855 #if LONGSIZE != SIZE32
4861 along = SvIV(fromstr);
4862 sv_catpvn(cat, (char *)&along, sizeof(long));
4870 along = SvIV(fromstr);
4879 auquad = (Uquad_t)SvUV(fromstr);
4880 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
4886 aquad = (Quad_t)SvIV(fromstr);
4887 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
4892 len = 1; /* assume SV is correct length */
4897 if (fromstr == &PL_sv_undef)
4901 /* XXX better yet, could spirit away the string to
4902 * a safe spot and hang on to it until the result
4903 * of pack() (and all copies of the result) are
4906 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
4907 || (SvPADTMP(fromstr)
4908 && !SvREADONLY(fromstr))))
4910 Perl_warner(aTHX_ WARN_PACK,
4911 "Attempt to pack pointer to temporary value");
4913 if (SvPOK(fromstr) || SvNIOK(fromstr))
4914 aptr = SvPV(fromstr,n_a);
4916 aptr = SvPV_force(fromstr,n_a);
4918 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4923 aptr = SvPV(fromstr, fromlen);
4924 SvGROW(cat, fromlen * 4 / 3);
4929 while (fromlen > 0) {
4936 doencodes(cat, aptr, todo);
4955 register I32 limit = POPi; /* note, negative is forever */
4958 register char *s = SvPV(sv, len);
4959 char *strend = s + len;
4961 register REGEXP *rx;
4965 I32 maxiters = (strend - s) + 10;
4968 I32 origlimit = limit;
4971 AV *oldstack = PL_curstack;
4972 I32 gimme = GIMME_V;
4973 I32 oldsave = PL_savestack_ix;
4974 I32 make_mortal = 1;
4975 MAGIC *mg = (MAGIC *) NULL;
4978 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4983 DIE(aTHX_ "panic: do_split");
4984 rx = pm->op_pmregexp;
4986 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4987 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4989 if (pm->op_pmreplroot) {
4991 ary = GvAVn((GV*)PL_curpad[(PADOFFSET)pm->op_pmreplroot]);
4993 ary = GvAVn((GV*)pm->op_pmreplroot);
4996 else if (gimme != G_ARRAY)
4998 ary = (AV*)PL_curpad[0];
5000 ary = GvAVn(PL_defgv);
5001 #endif /* USE_THREADS */
5004 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
5010 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
5012 XPUSHs(SvTIED_obj((SV*)ary, mg));
5018 for (i = AvFILLp(ary); i >= 0; i--)
5019 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5021 /* temporarily switch stacks */
5022 SWITCHSTACK(PL_curstack, ary);
5026 base = SP - PL_stack_base;
5028 if (pm->op_pmflags & PMf_SKIPWHITE) {
5029 if (pm->op_pmflags & PMf_LOCALE) {
5030 while (isSPACE_LC(*s))
5038 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
5039 SAVEINT(PL_multiline);
5040 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
5044 limit = maxiters + 2;
5045 if (pm->op_pmflags & PMf_WHITE) {
5048 while (m < strend &&
5049 !((pm->op_pmflags & PMf_LOCALE)
5050 ? isSPACE_LC(*m) : isSPACE(*m)))
5055 dstr = NEWSV(30, m-s);
5056 sv_setpvn(dstr, s, m-s);
5062 while (s < strend &&
5063 ((pm->op_pmflags & PMf_LOCALE)
5064 ? isSPACE_LC(*s) : isSPACE(*s)))
5068 else if (strEQ("^", rx->precomp)) {
5071 for (m = s; m < strend && *m != '\n'; m++) ;
5075 dstr = NEWSV(30, m-s);
5076 sv_setpvn(dstr, s, m-s);
5083 else if ((rx->reganch & RE_USE_INTUIT) && !rx->nparens
5084 && (rx->reganch & ROPT_CHECK_ALL)
5085 && !(rx->reganch & ROPT_ANCH)) {
5086 int tail = (rx->reganch & RE_INTUIT_TAIL);
5087 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
5091 if (len == 1 && !tail) {
5095 for (m = s; m < strend && *m != c; m++) ;
5098 dstr = NEWSV(30, m-s);
5099 sv_setpvn(dstr, s, m-s);
5108 while (s < strend && --limit &&
5109 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
5110 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
5113 dstr = NEWSV(31, m-s);
5114 sv_setpvn(dstr, s, m-s);
5118 s = m + len; /* Fake \n at the end */
5123 maxiters += (strend - s) * rx->nparens;
5124 while (s < strend && --limit
5125 /* && (!rx->check_substr
5126 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
5128 */ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
5129 1 /* minend */, sv, NULL, 0))
5131 TAINT_IF(RX_MATCH_TAINTED(rx));
5132 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
5137 strend = s + (strend - m);
5139 m = rx->startp[0] + orig;
5140 dstr = NEWSV(32, m-s);
5141 sv_setpvn(dstr, s, m-s);
5146 for (i = 1; i <= rx->nparens; i++) {
5147 s = rx->startp[i] + orig;
5148 m = rx->endp[i] + orig;
5150 dstr = NEWSV(33, m-s);
5151 sv_setpvn(dstr, s, m-s);
5154 dstr = NEWSV(33, 0);
5160 s = rx->endp[0] + orig;
5164 LEAVE_SCOPE(oldsave);
5165 iters = (SP - PL_stack_base) - base;
5166 if (iters > maxiters)
5167 DIE(aTHX_ "Split loop");
5169 /* keep field after final delim? */
5170 if (s < strend || (iters && origlimit)) {
5171 dstr = NEWSV(34, strend-s);
5172 sv_setpvn(dstr, s, strend-s);
5178 else if (!origlimit) {
5179 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
5185 SWITCHSTACK(ary, oldstack);
5186 if (SvSMAGICAL(ary)) {
5191 if (gimme == G_ARRAY) {
5193 Copy(AvARRAY(ary), SP + 1, iters, SV*);
5201 call_method("PUSH",G_SCALAR|G_DISCARD);
5204 if (gimme == G_ARRAY) {
5205 /* EXTEND should not be needed - we just popped them */
5207 for (i=0; i < iters; i++) {
5208 SV **svp = av_fetch(ary, i, FALSE);
5209 PUSHs((svp) ? *svp : &PL_sv_undef);
5216 if (gimme == G_ARRAY)
5219 if (iters || !pm->op_pmreplroot) {
5229 Perl_unlock_condpair(pTHX_ void *svv)
5232 MAGIC *mg = mg_find((SV*)svv, 'm');
5235 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
5236 MUTEX_LOCK(MgMUTEXP(mg));
5237 if (MgOWNER(mg) != thr)
5238 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
5240 COND_SIGNAL(MgOWNERCONDP(mg));
5241 DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": unlock 0x%"UVxf"\n",
5242 PTR2UV(thr), PTR2UV(svv));)
5243 MUTEX_UNLOCK(MgMUTEXP(mg));
5245 #endif /* USE_THREADS */
5258 mg = condpair_magic(sv);
5259 MUTEX_LOCK(MgMUTEXP(mg));
5260 if (MgOWNER(mg) == thr)
5261 MUTEX_UNLOCK(MgMUTEXP(mg));
5264 COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
5266 DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": pp_lock lock 0x%"UVxf"\n",
5267 PTR2UV(thr), PTR2UV(sv));)
5268 MUTEX_UNLOCK(MgMUTEXP(mg));
5269 SAVEDESTRUCTOR_X(Perl_unlock_condpair, sv);
5271 #endif /* USE_THREADS */
5272 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5273 || SvTYPE(retsv) == SVt_PVCV) {
5274 retsv = refto(retsv);
5285 if (PL_op->op_private & OPpLVAL_INTRO)
5286 PUSHs(*save_threadsv(PL_op->op_targ));
5288 PUSHs(THREADSV(PL_op->op_targ));
5291 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
5292 #endif /* USE_THREADS */