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 */
85 /* XXX I can't imagine anyone who doesn't have this actually _needs_
86 it, since pid_t is an integral type.
89 #ifdef NEED_GETPID_PROTO
90 extern Pid_t getpid (void);
96 if (GIMME_V == G_SCALAR)
111 if (PL_op->op_private & OPpLVAL_INTRO)
112 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
114 if (PL_op->op_flags & OPf_REF) {
118 if (GIMME == G_SCALAR)
119 Perl_croak(aTHX_ "Can't return array to lvalue scalar context");
123 if (GIMME == G_ARRAY) {
124 I32 maxarg = AvFILL((AV*)TARG) + 1;
126 if (SvMAGICAL(TARG)) {
128 for (i=0; i < maxarg; i++) {
129 SV **svp = av_fetch((AV*)TARG, i, FALSE);
130 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
134 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
139 SV* sv = sv_newmortal();
140 I32 maxarg = AvFILL((AV*)TARG) + 1;
141 sv_setiv(sv, maxarg);
153 if (PL_op->op_private & OPpLVAL_INTRO)
154 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
155 if (PL_op->op_flags & OPf_REF)
158 if (GIMME == G_SCALAR)
159 Perl_croak(aTHX_ "Can't return hash to lvalue scalar context");
163 if (gimme == G_ARRAY) {
166 else if (gimme == G_SCALAR) {
167 SV* sv = sv_newmortal();
168 if (HvFILL((HV*)TARG))
169 Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
170 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
180 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
191 tryAMAGICunDEREF(to_gv);
194 if (SvTYPE(sv) == SVt_PVIO) {
195 GV *gv = (GV*) sv_newmortal();
196 gv_init(gv, 0, "", 0, 0);
197 GvIOp(gv) = (IO *)sv;
198 (void)SvREFCNT_inc(sv);
201 else if (SvTYPE(sv) != SVt_PVGV)
202 DIE(aTHX_ "Not a GLOB reference");
205 if (SvTYPE(sv) != SVt_PVGV) {
209 if (SvGMAGICAL(sv)) {
214 if (!SvOK(sv) && sv != &PL_sv_undef) {
215 /* If this is a 'my' scalar and flag is set then vivify
218 if (PL_op->op_private & OPpDEREF) {
221 if (cUNOP->op_targ) {
223 SV *namesv = PL_curpad[cUNOP->op_targ];
224 name = SvPV(namesv, len);
225 gv = (GV*)NEWSV(0,0);
226 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
229 name = CopSTASHPV(PL_curcop);
232 sv_upgrade(sv, SVt_RV);
238 if (PL_op->op_flags & OPf_REF ||
239 PL_op->op_private & HINT_STRICT_REFS)
240 DIE(aTHX_ PL_no_usym, "a symbol");
241 if (ckWARN(WARN_UNINITIALIZED))
246 if ((PL_op->op_flags & OPf_SPECIAL) &&
247 !(PL_op->op_flags & OPf_MOD))
249 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
251 && (!is_gv_magical(sym,len,0)
252 || !(sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV))))
258 if (PL_op->op_private & HINT_STRICT_REFS)
259 DIE(aTHX_ PL_no_symref, sym, "a symbol");
260 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
264 if (PL_op->op_private & OPpLVAL_INTRO)
265 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
276 tryAMAGICunDEREF(to_sv);
279 switch (SvTYPE(sv)) {
283 DIE(aTHX_ "Not a SCALAR reference");
291 if (SvTYPE(gv) != SVt_PVGV) {
292 if (SvGMAGICAL(sv)) {
298 if (PL_op->op_flags & OPf_REF ||
299 PL_op->op_private & HINT_STRICT_REFS)
300 DIE(aTHX_ PL_no_usym, "a SCALAR");
301 if (ckWARN(WARN_UNINITIALIZED))
306 if ((PL_op->op_flags & OPf_SPECIAL) &&
307 !(PL_op->op_flags & OPf_MOD))
309 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
311 && (!is_gv_magical(sym,len,0)
312 || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV))))
318 if (PL_op->op_private & HINT_STRICT_REFS)
319 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
320 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
325 if (PL_op->op_flags & OPf_MOD) {
326 if (PL_op->op_private & OPpLVAL_INTRO)
327 sv = save_scalar((GV*)TOPs);
328 else if (PL_op->op_private & OPpDEREF)
329 vivify_ref(sv, PL_op->op_private & OPpDEREF);
339 SV *sv = AvARYLEN(av);
341 AvARYLEN(av) = sv = NEWSV(0,0);
342 sv_upgrade(sv, SVt_IV);
343 sv_magic(sv, (SV*)av, '#', Nullch, 0);
351 djSP; dTARGET; dPOPss;
353 if (PL_op->op_flags & OPf_MOD || LVRET) {
354 if (SvTYPE(TARG) < SVt_PVLV) {
355 sv_upgrade(TARG, SVt_PVLV);
356 sv_magic(TARG, Nullsv, '.', Nullch, 0);
360 if (LvTARG(TARG) != sv) {
362 SvREFCNT_dec(LvTARG(TARG));
363 LvTARG(TARG) = SvREFCNT_inc(sv);
365 PUSHs(TARG); /* no SvSETMAGIC */
371 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
372 mg = mg_find(sv, 'g');
373 if (mg && mg->mg_len >= 0) {
377 PUSHi(i + PL_curcop->cop_arybase);
391 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
392 /* (But not in defined().) */
393 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
396 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
397 if ((PL_op->op_private & OPpLVAL_INTRO)) {
398 if (gv && GvCV(gv) == cv && (gv = gv_autoload4(GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), FALSE)))
401 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
405 cv = (CV*)&PL_sv_undef;
419 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
420 char *s = SvPVX(TOPs);
421 if (strnEQ(s, "CORE::", 6)) {
424 code = keyword(s + 6, SvCUR(TOPs) - 6);
425 if (code < 0) { /* Overridable. */
426 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
427 int i = 0, n = 0, seen_question = 0;
429 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
431 while (i < MAXO) { /* The slow way. */
432 if (strEQ(s + 6, PL_op_name[i])
433 || strEQ(s + 6, PL_op_desc[i]))
439 goto nonesuch; /* Should not happen... */
441 oa = PL_opargs[i] >> OASHIFT;
443 if (oa & OA_OPTIONAL) {
447 else if (n && str[0] == ';' && seen_question)
448 goto set; /* XXXX system, exec */
449 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
450 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
453 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
454 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
458 ret = sv_2mortal(newSVpvn(str, n - 1));
460 else if (code) /* Non-Overridable */
462 else { /* None such */
464 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
468 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
470 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
479 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
481 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
497 if (GIMME != G_ARRAY) {
501 *MARK = &PL_sv_undef;
502 *MARK = refto(*MARK);
506 EXTEND_MORTAL(SP - MARK);
508 *MARK = refto(*MARK);
513 S_refto(pTHX_ SV *sv)
517 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
520 if (!(sv = LvTARG(sv)))
523 (void)SvREFCNT_inc(sv);
525 else if (SvTYPE(sv) == SVt_PVAV) {
526 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
529 (void)SvREFCNT_inc(sv);
531 else if (SvPADTMP(sv))
535 (void)SvREFCNT_inc(sv);
538 sv_upgrade(rv, SVt_RV);
552 if (sv && SvGMAGICAL(sv))
555 if (!sv || !SvROK(sv))
559 pv = sv_reftype(sv,TRUE);
560 PUSHp(pv, strlen(pv));
570 stash = CopSTASH(PL_curcop);
574 char *ptr = SvPV(ssv,len);
575 if (ckWARN(WARN_MISC) && len == 0)
576 Perl_warner(aTHX_ WARN_MISC,
577 "Explicit blessing to '' (assuming package main)");
578 stash = gv_stashpvn(ptr, len, TRUE);
581 (void)sv_bless(TOPs, stash);
595 elem = SvPV(sv, n_a);
599 switch (elem ? *elem : '\0')
602 if (strEQ(elem, "ARRAY"))
603 tmpRef = (SV*)GvAV(gv);
606 if (strEQ(elem, "CODE"))
607 tmpRef = (SV*)GvCVu(gv);
610 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
611 tmpRef = (SV*)GvIOp(gv);
614 if (strEQ(elem, "GLOB"))
618 if (strEQ(elem, "HASH"))
619 tmpRef = (SV*)GvHV(gv);
622 if (strEQ(elem, "IO"))
623 tmpRef = (SV*)GvIOp(gv);
626 if (strEQ(elem, "NAME"))
627 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
630 if (strEQ(elem, "PACKAGE"))
631 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
634 if (strEQ(elem, "SCALAR"))
648 /* Pattern matching */
653 register unsigned char *s;
656 register I32 *sfirst;
660 if (sv == PL_lastscream) {
666 SvSCREAM_off(PL_lastscream);
667 SvREFCNT_dec(PL_lastscream);
669 PL_lastscream = SvREFCNT_inc(sv);
672 s = (unsigned char*)(SvPV(sv, len));
676 if (pos > PL_maxscream) {
677 if (PL_maxscream < 0) {
678 PL_maxscream = pos + 80;
679 New(301, PL_screamfirst, 256, I32);
680 New(302, PL_screamnext, PL_maxscream, I32);
683 PL_maxscream = pos + pos / 4;
684 Renew(PL_screamnext, PL_maxscream, I32);
688 sfirst = PL_screamfirst;
689 snext = PL_screamnext;
691 if (!sfirst || !snext)
692 DIE(aTHX_ "do_study: out of memory");
694 for (ch = 256; ch; --ch)
701 snext[pos] = sfirst[ch] - pos;
708 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
717 if (PL_op->op_flags & OPf_STACKED)
723 TARG = sv_newmortal();
728 /* Lvalue operators. */
740 djSP; dMARK; dTARGET; dORIGMARK;
742 do_chop(TARG, *++MARK);
750 SETi(do_chomp(TOPs));
756 djSP; dMARK; dTARGET;
757 register I32 count = 0;
760 count += do_chomp(POPs);
771 if (!sv || !SvANY(sv))
773 switch (SvTYPE(sv)) {
775 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
779 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
783 if (CvROOT(sv) || CvXSUB(sv))
800 if (!PL_op->op_private) {
809 if (SvTHINKFIRST(sv))
812 switch (SvTYPE(sv)) {
822 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
823 Perl_warner(aTHX_ WARN_MISC, "Constant subroutine %s undefined",
824 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
828 /* let user-undef'd sub keep its identity */
829 GV* gv = CvGV((CV*)sv);
836 SvSetMagicSV(sv, &PL_sv_undef);
840 Newz(602, gp, 1, GP);
841 GvGP(sv) = gp_ref(gp);
842 GvSV(sv) = NEWSV(72,0);
843 GvLINE(sv) = CopLINE(PL_curcop);
849 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
852 SvPV_set(sv, Nullch);
865 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
866 DIE(aTHX_ PL_no_modify);
867 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
868 SvIVX(TOPs) != IV_MIN)
871 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
882 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
883 DIE(aTHX_ PL_no_modify);
884 sv_setsv(TARG, TOPs);
885 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
886 SvIVX(TOPs) != IV_MAX)
889 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
903 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
904 DIE(aTHX_ PL_no_modify);
905 sv_setsv(TARG, TOPs);
906 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
907 SvIVX(TOPs) != IV_MIN)
910 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
919 /* Ordinary operators. */
923 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
926 SETn( Perl_pow( left, right) );
933 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
936 SETn( left * right );
943 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
948 DIE(aTHX_ "Illegal division by zero");
950 /* insure that 20./5. == 4. */
953 if ((NV)I_V(left) == left &&
954 (NV)I_V(right) == right &&
955 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
959 value = left / right;
963 value = left / right;
972 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
982 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
984 right = (right_neg = (i < 0)) ? -i : i;
989 right_neg = dright < 0;
994 if (!use_double && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
996 left = (left_neg = (i < 0)) ? -i : i;
1004 left_neg = dleft < 0;
1013 /* Somehow U_V is pessimized even if CASTFLAGS is 0 */
1015 # define CAST_D2UV(d) U_V(d)
1017 # define CAST_D2UV(d) ((UV)(d))
1019 /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
1020 * or, in other words, precision of UV more than of NV.
1021 * But in fact the approach below turned out to be an
1022 * optimization - floor() may be slow */
1023 if (dright <= UV_MAX && dleft <= UV_MAX) {
1024 right = CAST_D2UV(dright);
1025 left = CAST_D2UV(dleft);
1030 /* Backward-compatibility clause: */
1031 dright = Perl_floor(dright + 0.5);
1032 dleft = Perl_floor(dleft + 0.5);
1035 DIE(aTHX_ "Illegal modulus zero");
1037 dans = Perl_fmod(dleft, dright);
1038 if ((left_neg != right_neg) && dans)
1039 dans = dright - dans;
1042 sv_setnv(TARG, dans);
1049 DIE(aTHX_ "Illegal modulus zero");
1052 if ((left_neg != right_neg) && ans)
1055 /* XXX may warn: unary minus operator applied to unsigned type */
1056 /* could change -foo to be (~foo)+1 instead */
1057 if (ans <= ~((UV)IV_MAX)+1)
1058 sv_setiv(TARG, ~ans+1);
1060 sv_setnv(TARG, -(NV)ans);
1063 sv_setuv(TARG, ans);
1072 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1074 register IV count = POPi;
1075 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1077 I32 items = SP - MARK;
1080 max = items * count;
1089 repeatcpy((char*)(MARK + items), (char*)MARK,
1090 items * sizeof(SV*), count - 1);
1093 else if (count <= 0)
1096 else { /* Note: mark already snarfed by pp_list */
1101 SvSetSV(TARG, tmpstr);
1102 SvPV_force(TARG, len);
1103 isutf = DO_UTF8(TARG);
1108 SvGROW(TARG, (count * len) + 1);
1109 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1110 SvCUR(TARG) *= count;
1112 *SvEND(TARG) = '\0';
1115 (void)SvPOK_only_UTF8(TARG);
1117 (void)SvPOK_only(TARG);
1126 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1129 SETn( left - right );
1136 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1139 if (PL_op->op_private & HINT_INTEGER) {
1153 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1156 if (PL_op->op_private & HINT_INTEGER) {
1170 djSP; tryAMAGICbinSET(lt,0);
1173 SETs(boolSV(TOPn < value));
1180 djSP; tryAMAGICbinSET(gt,0);
1183 SETs(boolSV(TOPn > value));
1190 djSP; tryAMAGICbinSET(le,0);
1193 SETs(boolSV(TOPn <= value));
1200 djSP; tryAMAGICbinSET(ge,0);
1203 SETs(boolSV(TOPn >= value));
1210 djSP; tryAMAGICbinSET(ne,0);
1213 SETs(boolSV(TOPn != value));
1220 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1226 if (Perl_isnan(left) || Perl_isnan(right)) {
1230 value = (left > right) - (left < right);
1234 else if (left < right)
1236 else if (left > right)
1250 djSP; tryAMAGICbinSET(slt,0);
1253 int cmp = ((PL_op->op_private & OPpLOCALE)
1254 ? sv_cmp_locale(left, right)
1255 : sv_cmp(left, right));
1256 SETs(boolSV(cmp < 0));
1263 djSP; tryAMAGICbinSET(sgt,0);
1266 int cmp = ((PL_op->op_private & OPpLOCALE)
1267 ? sv_cmp_locale(left, right)
1268 : sv_cmp(left, right));
1269 SETs(boolSV(cmp > 0));
1276 djSP; tryAMAGICbinSET(sle,0);
1279 int cmp = ((PL_op->op_private & OPpLOCALE)
1280 ? sv_cmp_locale(left, right)
1281 : sv_cmp(left, right));
1282 SETs(boolSV(cmp <= 0));
1289 djSP; tryAMAGICbinSET(sge,0);
1292 int cmp = ((PL_op->op_private & OPpLOCALE)
1293 ? sv_cmp_locale(left, right)
1294 : sv_cmp(left, right));
1295 SETs(boolSV(cmp >= 0));
1302 djSP; tryAMAGICbinSET(seq,0);
1305 SETs(boolSV(sv_eq(left, right)));
1312 djSP; tryAMAGICbinSET(sne,0);
1315 SETs(boolSV(!sv_eq(left, right)));
1322 djSP; dTARGET; tryAMAGICbin(scmp,0);
1325 int cmp = ((PL_op->op_private & OPpLOCALE)
1326 ? sv_cmp_locale(left, right)
1327 : sv_cmp(left, right));
1335 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1338 if (SvNIOKp(left) || SvNIOKp(right)) {
1339 if (PL_op->op_private & HINT_INTEGER) {
1340 IV i = SvIV(left) & SvIV(right);
1344 UV u = SvUV(left) & SvUV(right);
1349 do_vop(PL_op->op_type, TARG, left, right);
1358 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1361 if (SvNIOKp(left) || SvNIOKp(right)) {
1362 if (PL_op->op_private & HINT_INTEGER) {
1363 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1367 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1372 do_vop(PL_op->op_type, TARG, left, right);
1381 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1384 if (SvNIOKp(left) || SvNIOKp(right)) {
1385 if (PL_op->op_private & HINT_INTEGER) {
1386 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1390 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1395 do_vop(PL_op->op_type, TARG, left, right);
1404 djSP; dTARGET; tryAMAGICun(neg);
1409 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv)) {
1411 if (SvIVX(sv) == IV_MIN) {
1412 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
1415 else if (SvUVX(sv) <= IV_MAX) {
1420 else if (SvIVX(sv) != IV_MIN) {
1427 else if (SvPOKp(sv)) {
1429 char *s = SvPV(sv, len);
1430 if (isIDFIRST(*s)) {
1431 sv_setpvn(TARG, "-", 1);
1434 else if (*s == '+' || *s == '-') {
1436 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1438 else if (DO_UTF8(sv) && UTF8_IS_START(*s) && isIDFIRST_utf8((U8*)s)) {
1439 sv_setpvn(TARG, "-", 1);
1443 sv_setnv(TARG, -SvNV(sv));
1454 djSP; tryAMAGICunSET(not);
1455 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1461 djSP; dTARGET; tryAMAGICun(compl);
1465 if (PL_op->op_private & HINT_INTEGER) {
1480 tmps = (U8*)SvPV_force(TARG, len);
1483 /* Calculate exact length, let's not estimate. */
1492 while (tmps < send) {
1493 UV c = utf8_to_uv(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
1494 tmps += UTF8SKIP(tmps);
1495 targlen += UNISKIP(~c);
1501 /* Now rewind strings and write them. */
1505 Newz(0, result, targlen + 1, U8);
1506 while (tmps < send) {
1507 UV c = utf8_to_uv(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV);
1508 tmps += UTF8SKIP(tmps);
1509 result = uv_to_utf8(result, ~c);
1513 sv_setpvn(TARG, (char*)result, targlen);
1517 Newz(0, result, nchar + 1, U8);
1518 while (tmps < send) {
1519 U8 c = (U8)utf8_to_uv(tmps, 0, &l, UTF8_ALLOW_ANY);
1520 tmps += UTF8SKIP(tmps);
1525 sv_setpvn(TARG, (char*)result, nchar);
1533 register long *tmpl;
1534 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1537 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1542 for ( ; anum > 0; anum--, tmps++)
1551 /* integer versions of some of the above */
1555 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1558 SETi( left * right );
1565 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1569 DIE(aTHX_ "Illegal division by zero");
1570 value = POPi / value;
1578 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1582 DIE(aTHX_ "Illegal modulus zero");
1583 SETi( left % right );
1590 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1593 SETi( left + right );
1600 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1603 SETi( left - right );
1610 djSP; tryAMAGICbinSET(lt,0);
1613 SETs(boolSV(left < right));
1620 djSP; tryAMAGICbinSET(gt,0);
1623 SETs(boolSV(left > right));
1630 djSP; tryAMAGICbinSET(le,0);
1633 SETs(boolSV(left <= right));
1640 djSP; tryAMAGICbinSET(ge,0);
1643 SETs(boolSV(left >= right));
1650 djSP; tryAMAGICbinSET(eq,0);
1653 SETs(boolSV(left == right));
1660 djSP; tryAMAGICbinSET(ne,0);
1663 SETs(boolSV(left != right));
1670 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1677 else if (left < right)
1688 djSP; dTARGET; tryAMAGICun(neg);
1693 /* High falutin' math. */
1697 djSP; dTARGET; tryAMAGICbin(atan2,0);
1700 SETn(Perl_atan2(left, right));
1707 djSP; dTARGET; tryAMAGICun(sin);
1711 value = Perl_sin(value);
1719 djSP; dTARGET; tryAMAGICun(cos);
1723 value = Perl_cos(value);
1729 /* Support Configure command-line overrides for rand() functions.
1730 After 5.005, perhaps we should replace this by Configure support
1731 for drand48(), random(), or rand(). For 5.005, though, maintain
1732 compatibility by calling rand() but allow the user to override it.
1733 See INSTALL for details. --Andy Dougherty 15 July 1998
1735 /* Now it's after 5.005, and Configure supports drand48() and random(),
1736 in addition to rand(). So the overrides should not be needed any more.
1737 --Jarkko Hietaniemi 27 September 1998
1740 #ifndef HAS_DRAND48_PROTO
1741 extern double drand48 (void);
1754 if (!PL_srand_called) {
1755 (void)seedDrand01((Rand_seed_t)seed());
1756 PL_srand_called = TRUE;
1771 (void)seedDrand01((Rand_seed_t)anum);
1772 PL_srand_called = TRUE;
1781 * This is really just a quick hack which grabs various garbage
1782 * values. It really should be a real hash algorithm which
1783 * spreads the effect of every input bit onto every output bit,
1784 * if someone who knows about such things would bother to write it.
1785 * Might be a good idea to add that function to CORE as well.
1786 * No numbers below come from careful analysis or anything here,
1787 * except they are primes and SEED_C1 > 1E6 to get a full-width
1788 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1789 * probably be bigger too.
1792 # define SEED_C1 1000003
1793 #define SEED_C4 73819
1795 # define SEED_C1 25747
1796 #define SEED_C4 20639
1800 #define SEED_C5 26107
1802 #ifndef PERL_NO_DEV_RANDOM
1807 # include <starlet.h>
1808 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1809 * in 100-ns units, typically incremented ever 10 ms. */
1810 unsigned int when[2];
1812 # ifdef HAS_GETTIMEOFDAY
1813 struct timeval when;
1819 /* This test is an escape hatch, this symbol isn't set by Configure. */
1820 #ifndef PERL_NO_DEV_RANDOM
1821 #ifndef PERL_RANDOM_DEVICE
1822 /* /dev/random isn't used by default because reads from it will block
1823 * if there isn't enough entropy available. You can compile with
1824 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1825 * is enough real entropy to fill the seed. */
1826 # define PERL_RANDOM_DEVICE "/dev/urandom"
1828 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1830 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1839 _ckvmssts(sys$gettim(when));
1840 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1842 # ifdef HAS_GETTIMEOFDAY
1843 gettimeofday(&when,(struct timezone *) 0);
1844 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1847 u = (U32)SEED_C1 * when;
1850 u += SEED_C3 * (U32)PerlProc_getpid();
1851 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
1852 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1853 u += SEED_C5 * (U32)PTR2UV(&when);
1860 djSP; dTARGET; tryAMAGICun(exp);
1864 value = Perl_exp(value);
1872 djSP; dTARGET; tryAMAGICun(log);
1877 SET_NUMERIC_STANDARD();
1878 DIE(aTHX_ "Can't take log of %g", value);
1880 value = Perl_log(value);
1888 djSP; dTARGET; tryAMAGICun(sqrt);
1893 SET_NUMERIC_STANDARD();
1894 DIE(aTHX_ "Can't take sqrt of %g", value);
1896 value = Perl_sqrt(value);
1909 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1915 #if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
1916 (void)Perl_modf(value, &value);
1918 double tmp = (double)value;
1919 (void)Perl_modf(tmp, &tmp);
1924 #if defined(HAS_MODFL) || defined(LONG_DOUBLE_EQUALS_DOUBLE)
1925 (void)Perl_modf(-value, &value);
1928 double tmp = (double)value;
1929 (void)Perl_modf(-tmp, &tmp);
1945 djSP; dTARGET; tryAMAGICun(abs);
1950 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1951 (iv = SvIVX(TOPs)) != IV_MIN) {
1973 argtype = 1; /* allow underscores */
1974 XPUSHn(scan_hex(tmps, 99, &argtype));
1987 while (*tmps && isSPACE(*tmps))
1991 argtype = 1; /* allow underscores */
1993 value = scan_hex(++tmps, 99, &argtype);
1994 else if (*tmps == 'b')
1995 value = scan_bin(++tmps, 99, &argtype);
1997 value = scan_oct(tmps, 99, &argtype);
2010 SETi(sv_len_utf8(sv));
2026 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2028 I32 arybase = PL_curcop->cop_arybase;
2031 int num_args = PL_op->op_private & 7;
2033 SvTAINTED_off(TARG); /* decontaminate */
2034 SvUTF8_off(TARG); /* decontaminate */
2038 repl = SvPV(sv, repl_len);
2045 tmps = SvPV(sv, curlen);
2047 utfcurlen = sv_len_utf8(sv);
2048 if (utfcurlen == curlen)
2056 if (pos >= arybase) {
2074 else if (len >= 0) {
2076 if (rem > (I32)curlen)
2091 Perl_croak(aTHX_ "substr outside of string");
2092 if (ckWARN(WARN_SUBSTR))
2093 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
2100 sv_pos_u2b(sv, &pos, &rem);
2102 sv_setpvn(TARG, tmps, rem);
2106 sv_insert(sv, pos, rem, repl, repl_len);
2107 else if (lvalue) { /* it's an lvalue! */
2108 if (!SvGMAGICAL(sv)) {
2112 if (ckWARN(WARN_SUBSTR))
2113 Perl_warner(aTHX_ WARN_SUBSTR,
2114 "Attempt to use reference as lvalue in substr");
2116 if (SvOK(sv)) /* is it defined ? */
2117 (void)SvPOK_only_UTF8(sv);
2119 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
2122 if (SvTYPE(TARG) < SVt_PVLV) {
2123 sv_upgrade(TARG, SVt_PVLV);
2124 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
2128 if (LvTARG(TARG) != sv) {
2130 SvREFCNT_dec(LvTARG(TARG));
2131 LvTARG(TARG) = SvREFCNT_inc(sv);
2133 LvTARGOFF(TARG) = upos;
2134 LvTARGLEN(TARG) = urem;
2138 PUSHs(TARG); /* avoid SvSETMAGIC here */
2145 register IV size = POPi;
2146 register IV offset = POPi;
2147 register SV *src = POPs;
2148 I32 lvalue = PL_op->op_flags & OPf_MOD || LVRET;
2150 SvTAINTED_off(TARG); /* decontaminate */
2151 if (lvalue) { /* it's an lvalue! */
2152 if (SvTYPE(TARG) < SVt_PVLV) {
2153 sv_upgrade(TARG, SVt_PVLV);
2154 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
2157 if (LvTARG(TARG) != src) {
2159 SvREFCNT_dec(LvTARG(TARG));
2160 LvTARG(TARG) = SvREFCNT_inc(src);
2162 LvTARGOFF(TARG) = offset;
2163 LvTARGLEN(TARG) = size;
2166 sv_setuv(TARG, do_vecget(src, offset, size));
2181 I32 arybase = PL_curcop->cop_arybase;
2186 offset = POPi - arybase;
2189 tmps = SvPV(big, biglen);
2190 if (offset > 0 && DO_UTF8(big))
2191 sv_pos_u2b(big, &offset, 0);
2194 else if (offset > biglen)
2196 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2197 (unsigned char*)tmps + biglen, little, 0)))
2200 retval = tmps2 - tmps;
2201 if (retval > 0 && DO_UTF8(big))
2202 sv_pos_b2u(big, &retval);
2203 PUSHi(retval + arybase);
2218 I32 arybase = PL_curcop->cop_arybase;
2224 tmps2 = SvPV(little, llen);
2225 tmps = SvPV(big, blen);
2229 if (offset > 0 && DO_UTF8(big))
2230 sv_pos_u2b(big, &offset, 0);
2231 offset = offset - arybase + llen;
2235 else if (offset > blen)
2237 if (!(tmps2 = rninstr(tmps, tmps + offset,
2238 tmps2, tmps2 + llen)))
2241 retval = tmps2 - tmps;
2242 if (retval > 0 && DO_UTF8(big))
2243 sv_pos_b2u(big, &retval);
2244 PUSHi(retval + arybase);
2250 djSP; dMARK; dORIGMARK; dTARGET;
2251 do_sprintf(TARG, SP-MARK, MARK+1);
2252 TAINT_IF(SvTAINTED(TARG));
2263 U8 *s = (U8*)SvPVx(argsv, len);
2265 XPUSHu(DO_UTF8(argsv) ? utf8_to_uv_simple(s, 0) : (*s & 0xff));
2275 (void)SvUPGRADE(TARG,SVt_PV);
2277 if (value > 255 && !IN_BYTE) {
2278 SvGROW(TARG, UTF8_MAXLEN+1);
2280 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
2281 SvCUR_set(TARG, tmps - SvPVX(TARG));
2283 (void)SvPOK_only(TARG);
2294 (void)SvPOK_only(TARG);
2301 djSP; dTARGET; dPOPTOPssrl;
2304 char *tmps = SvPV(left, n_a);
2306 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
2308 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
2312 "The crypt() function is unimplemented due to excessive paranoia.");
2325 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && UTF8_IS_START(*s)) {
2327 U8 tmpbuf[UTF8_MAXLEN+1];
2329 UV uv = utf8_to_uv(s, slen, &ulen, 0);
2331 if (PL_op->op_private & OPpLOCALE) {
2334 uv = toTITLE_LC_uni(uv);
2337 uv = toTITLE_utf8(s);
2339 tend = uv_to_utf8(tmpbuf, uv);
2341 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
2343 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2344 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2349 s = (U8*)SvPV_force(sv, slen);
2350 Copy(tmpbuf, s, ulen, U8);
2354 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2356 SvUTF8_off(TARG); /* decontaminate */
2361 s = (U8*)SvPV_force(sv, slen);
2363 if (PL_op->op_private & OPpLOCALE) {
2366 *s = toUPPER_LC(*s);
2384 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && UTF8_IS_START(*s)) {
2386 U8 tmpbuf[UTF8_MAXLEN+1];
2388 UV uv = utf8_to_uv(s, slen, &ulen, 0);
2390 if (PL_op->op_private & OPpLOCALE) {
2393 uv = toLOWER_LC_uni(uv);
2396 uv = toLOWER_utf8(s);
2398 tend = uv_to_utf8(tmpbuf, uv);
2400 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
2402 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2403 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2408 s = (U8*)SvPV_force(sv, slen);
2409 Copy(tmpbuf, s, ulen, U8);
2413 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2415 SvUTF8_off(TARG); /* decontaminate */
2420 s = (U8*)SvPV_force(sv, slen);
2422 if (PL_op->op_private & OPpLOCALE) {
2425 *s = toLOWER_LC(*s);
2449 s = (U8*)SvPV(sv,len);
2451 SvUTF8_off(TARG); /* decontaminate */
2452 sv_setpvn(TARG, "", 0);
2456 (void)SvUPGRADE(TARG, SVt_PV);
2457 SvGROW(TARG, (len * 2) + 1);
2458 (void)SvPOK_only(TARG);
2459 d = (U8*)SvPVX(TARG);
2461 if (PL_op->op_private & OPpLOCALE) {
2465 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, len, &ulen, 0)));
2471 d = uv_to_utf8(d, toUPPER_utf8( s ));
2477 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2482 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2484 SvUTF8_off(TARG); /* decontaminate */
2489 s = (U8*)SvPV_force(sv, len);
2491 register U8 *send = s + len;
2493 if (PL_op->op_private & OPpLOCALE) {
2496 for (; s < send; s++)
2497 *s = toUPPER_LC(*s);
2500 for (; s < send; s++)
2523 s = (U8*)SvPV(sv,len);
2525 SvUTF8_off(TARG); /* decontaminate */
2526 sv_setpvn(TARG, "", 0);
2530 (void)SvUPGRADE(TARG, SVt_PV);
2531 SvGROW(TARG, (len * 2) + 1);
2532 (void)SvPOK_only(TARG);
2533 d = (U8*)SvPVX(TARG);
2535 if (PL_op->op_private & OPpLOCALE) {
2539 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, len, &ulen, 0)));
2545 d = uv_to_utf8(d, toLOWER_utf8(s));
2551 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2556 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2558 SvUTF8_off(TARG); /* decontaminate */
2564 s = (U8*)SvPV_force(sv, len);
2566 register U8 *send = s + len;
2568 if (PL_op->op_private & OPpLOCALE) {
2571 for (; s < send; s++)
2572 *s = toLOWER_LC(*s);
2575 for (; s < send; s++)
2590 register char *s = SvPV(sv,len);
2593 SvUTF8_off(TARG); /* decontaminate */
2595 (void)SvUPGRADE(TARG, SVt_PV);
2596 SvGROW(TARG, (len * 2) + 1);
2600 if (UTF8_IS_CONTINUED(*s)) {
2601 STRLEN ulen = UTF8SKIP(s);
2625 SvCUR_set(TARG, d - SvPVX(TARG));
2626 (void)SvPOK_only_UTF8(TARG);
2629 sv_setpvn(TARG, s, len);
2631 if (SvSMAGICAL(TARG))
2640 djSP; dMARK; dORIGMARK;
2642 register AV* av = (AV*)POPs;
2643 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
2644 I32 arybase = PL_curcop->cop_arybase;
2647 if (SvTYPE(av) == SVt_PVAV) {
2648 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2650 for (svp = MARK + 1; svp <= SP; svp++) {
2655 if (max > AvMAX(av))
2658 while (++MARK <= SP) {
2659 elem = SvIVx(*MARK);
2663 svp = av_fetch(av, elem, lval);
2665 if (!svp || *svp == &PL_sv_undef)
2666 DIE(aTHX_ PL_no_aelem, elem);
2667 if (PL_op->op_private & OPpLVAL_INTRO)
2668 save_aelem(av, elem, svp);
2670 *MARK = svp ? *svp : &PL_sv_undef;
2673 if (GIMME != G_ARRAY) {
2681 /* Associative arrays. */
2686 HV *hash = (HV*)POPs;
2688 I32 gimme = GIMME_V;
2689 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2692 /* might clobber stack_sp */
2693 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2698 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2699 if (gimme == G_ARRAY) {
2702 /* might clobber stack_sp */
2704 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
2709 else if (gimme == G_SCALAR)
2728 I32 gimme = GIMME_V;
2729 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2733 if (PL_op->op_private & OPpSLICE) {
2737 hvtype = SvTYPE(hv);
2738 if (hvtype == SVt_PVHV) { /* hash element */
2739 while (++MARK <= SP) {
2740 sv = hv_delete_ent(hv, *MARK, discard, 0);
2741 *MARK = sv ? sv : &PL_sv_undef;
2744 else if (hvtype == SVt_PVAV) {
2745 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2746 while (++MARK <= SP) {
2747 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
2748 *MARK = sv ? sv : &PL_sv_undef;
2751 else { /* pseudo-hash element */
2752 while (++MARK <= SP) {
2753 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
2754 *MARK = sv ? sv : &PL_sv_undef;
2759 DIE(aTHX_ "Not a HASH reference");
2762 else if (gimme == G_SCALAR) {
2771 if (SvTYPE(hv) == SVt_PVHV)
2772 sv = hv_delete_ent(hv, keysv, discard, 0);
2773 else if (SvTYPE(hv) == SVt_PVAV) {
2774 if (PL_op->op_flags & OPf_SPECIAL)
2775 sv = av_delete((AV*)hv, SvIV(keysv), discard);
2777 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
2780 DIE(aTHX_ "Not a HASH reference");
2795 if (PL_op->op_private & OPpEXISTS_SUB) {
2799 cv = sv_2cv(sv, &hv, &gv, FALSE);
2802 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
2808 if (SvTYPE(hv) == SVt_PVHV) {
2809 if (hv_exists_ent(hv, tmpsv, 0))
2812 else if (SvTYPE(hv) == SVt_PVAV) {
2813 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2814 if (av_exists((AV*)hv, SvIV(tmpsv)))
2817 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
2821 DIE(aTHX_ "Not a HASH reference");
2828 djSP; dMARK; dORIGMARK;
2829 register HV *hv = (HV*)POPs;
2830 register I32 lval = (PL_op->op_flags & OPf_MOD || LVRET);
2831 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2833 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2834 DIE(aTHX_ "Can't localize pseudo-hash element");
2836 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2837 while (++MARK <= SP) {
2841 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2842 svp = he ? &HeVAL(he) : 0;
2845 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2848 if (!svp || *svp == &PL_sv_undef) {
2850 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
2852 if (PL_op->op_private & OPpLVAL_INTRO)
2853 save_helem(hv, keysv, svp);
2855 *MARK = svp ? *svp : &PL_sv_undef;
2858 if (GIMME != G_ARRAY) {
2866 /* List operators. */
2871 if (GIMME != G_ARRAY) {
2873 *MARK = *SP; /* unwanted list, return last item */
2875 *MARK = &PL_sv_undef;
2884 SV **lastrelem = PL_stack_sp;
2885 SV **lastlelem = PL_stack_base + POPMARK;
2886 SV **firstlelem = PL_stack_base + POPMARK + 1;
2887 register SV **firstrelem = lastlelem + 1;
2888 I32 arybase = PL_curcop->cop_arybase;
2889 I32 lval = PL_op->op_flags & OPf_MOD;
2890 I32 is_something_there = lval;
2892 register I32 max = lastrelem - lastlelem;
2893 register SV **lelem;
2896 if (GIMME != G_ARRAY) {
2897 ix = SvIVx(*lastlelem);
2902 if (ix < 0 || ix >= max)
2903 *firstlelem = &PL_sv_undef;
2905 *firstlelem = firstrelem[ix];
2911 SP = firstlelem - 1;
2915 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2921 if (ix < 0 || ix >= max)
2922 *lelem = &PL_sv_undef;
2924 is_something_there = TRUE;
2925 if (!(*lelem = firstrelem[ix]))
2926 *lelem = &PL_sv_undef;
2929 if (is_something_there)
2932 SP = firstlelem - 1;
2938 djSP; dMARK; dORIGMARK;
2939 I32 items = SP - MARK;
2940 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2941 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2948 djSP; dMARK; dORIGMARK;
2949 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2953 SV *val = NEWSV(46, 0);
2955 sv_setsv(val, *++MARK);
2956 else if (ckWARN(WARN_MISC))
2957 Perl_warner(aTHX_ WARN_MISC, "Odd number of elements in hash assignment");
2958 (void)hv_store_ent(hv,key,val,0);
2967 djSP; dMARK; dORIGMARK;
2968 register AV *ary = (AV*)*++MARK;
2972 register I32 offset;
2973 register I32 length;
2980 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
2981 *MARK-- = SvTIED_obj((SV*)ary, mg);
2985 call_method("SPLICE",GIMME_V);
2994 offset = i = SvIVx(*MARK);
2996 offset += AvFILLp(ary) + 1;
2998 offset -= PL_curcop->cop_arybase;
3000 DIE(aTHX_ PL_no_aelem, i);
3002 length = SvIVx(*MARK++);
3004 length += AvFILLp(ary) - offset + 1;
3010 length = AvMAX(ary) + 1; /* close enough to infinity */
3014 length = AvMAX(ary) + 1;
3016 if (offset > AvFILLp(ary) + 1)
3017 offset = AvFILLp(ary) + 1;
3018 after = AvFILLp(ary) + 1 - (offset + length);
3019 if (after < 0) { /* not that much array */
3020 length += after; /* offset+length now in array */
3026 /* At this point, MARK .. SP-1 is our new LIST */
3029 diff = newlen - length;
3030 if (newlen && !AvREAL(ary) && AvREIFY(ary))
3033 if (diff < 0) { /* shrinking the area */
3035 New(451, tmparyval, newlen, SV*); /* so remember insertion */
3036 Copy(MARK, tmparyval, newlen, SV*);
3039 MARK = ORIGMARK + 1;
3040 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3041 MEXTEND(MARK, length);
3042 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
3044 EXTEND_MORTAL(length);
3045 for (i = length, dst = MARK; i; i--) {
3046 sv_2mortal(*dst); /* free them eventualy */
3053 *MARK = AvARRAY(ary)[offset+length-1];
3056 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
3057 SvREFCNT_dec(*dst++); /* free them now */
3060 AvFILLp(ary) += diff;
3062 /* pull up or down? */
3064 if (offset < after) { /* easier to pull up */
3065 if (offset) { /* esp. if nothing to pull */
3066 src = &AvARRAY(ary)[offset-1];
3067 dst = src - diff; /* diff is negative */
3068 for (i = offset; i > 0; i--) /* can't trust Copy */
3072 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
3076 if (after) { /* anything to pull down? */
3077 src = AvARRAY(ary) + offset + length;
3078 dst = src + diff; /* diff is negative */
3079 Move(src, dst, after, SV*);
3081 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
3082 /* avoid later double free */
3086 dst[--i] = &PL_sv_undef;
3089 for (src = tmparyval, dst = AvARRAY(ary) + offset;
3091 *dst = NEWSV(46, 0);
3092 sv_setsv(*dst++, *src++);
3094 Safefree(tmparyval);
3097 else { /* no, expanding (or same) */
3099 New(452, tmparyval, length, SV*); /* so remember deletion */
3100 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
3103 if (diff > 0) { /* expanding */
3105 /* push up or down? */
3107 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
3111 Move(src, dst, offset, SV*);
3113 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
3115 AvFILLp(ary) += diff;
3118 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
3119 av_extend(ary, AvFILLp(ary) + diff);
3120 AvFILLp(ary) += diff;
3123 dst = AvARRAY(ary) + AvFILLp(ary);
3125 for (i = after; i; i--) {
3132 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
3133 *dst = NEWSV(46, 0);
3134 sv_setsv(*dst++, *src++);
3136 MARK = ORIGMARK + 1;
3137 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3139 Copy(tmparyval, MARK, length, SV*);
3141 EXTEND_MORTAL(length);
3142 for (i = length, dst = MARK; i; i--) {
3143 sv_2mortal(*dst); /* free them eventualy */
3147 Safefree(tmparyval);
3151 else if (length--) {
3152 *MARK = tmparyval[length];
3155 while (length-- > 0)
3156 SvREFCNT_dec(tmparyval[length]);
3158 Safefree(tmparyval);
3161 *MARK = &PL_sv_undef;
3169 djSP; dMARK; dORIGMARK; dTARGET;
3170 register AV *ary = (AV*)*++MARK;
3171 register SV *sv = &PL_sv_undef;
3174 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3175 *MARK-- = SvTIED_obj((SV*)ary, mg);
3179 call_method("PUSH",G_SCALAR|G_DISCARD);
3184 /* Why no pre-extend of ary here ? */
3185 for (++MARK; MARK <= SP; MARK++) {
3188 sv_setsv(sv, *MARK);
3193 PUSHi( AvFILL(ary) + 1 );
3201 SV *sv = av_pop(av);
3203 (void)sv_2mortal(sv);
3212 SV *sv = av_shift(av);
3217 (void)sv_2mortal(sv);
3224 djSP; dMARK; dORIGMARK; dTARGET;
3225 register AV *ary = (AV*)*++MARK;
3230 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
3231 *MARK-- = SvTIED_obj((SV*)ary, mg);
3235 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3240 av_unshift(ary, SP - MARK);
3243 sv_setsv(sv, *++MARK);
3244 (void)av_store(ary, i++, sv);
3248 PUSHi( AvFILL(ary) + 1 );
3258 if (GIMME == G_ARRAY) {
3265 /* safe as long as stack cannot get extended in the above */
3270 register char *down;
3275 SvUTF8_off(TARG); /* decontaminate */
3277 do_join(TARG, &PL_sv_no, MARK, SP);
3279 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3280 up = SvPV_force(TARG, len);
3282 if (DO_UTF8(TARG)) { /* first reverse each character */
3283 U8* s = (U8*)SvPVX(TARG);
3284 U8* send = (U8*)(s + len);
3286 if (UTF8_IS_ASCII(*s)) {
3291 if (!utf8_to_uv_simple(s, 0))
3295 down = (char*)(s - 1);
3296 /* reverse this character */
3306 down = SvPVX(TARG) + len - 1;
3312 (void)SvPOK_only_UTF8(TARG);
3321 S_mul128(pTHX_ SV *sv, U8 m)
3324 char *s = SvPV(sv, len);
3328 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
3329 SV *tmpNew = newSVpvn("0000000000", 10);
3331 sv_catsv(tmpNew, sv);
3332 SvREFCNT_dec(sv); /* free old sv */
3337 while (!*t) /* trailing '\0'? */
3340 i = ((*t - '0') << 7) + m;
3341 *(t--) = '0' + (i % 10);
3347 /* Explosives and implosives. */
3349 #if 'I' == 73 && 'J' == 74
3350 /* On an ASCII/ISO kind of system */
3351 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
3354 Some other sort of character set - use memchr() so we don't match
3357 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
3364 I32 start_sp_offset = SP - PL_stack_base;
3365 I32 gimme = GIMME_V;
3369 register char *pat = SvPV(left, llen);
3370 register char *s = SvPV(right, rlen);
3371 char *strend = s + rlen;
3373 register char *patend = pat + llen;
3379 /* These must not be in registers: */
3396 register U32 culong;
3400 #ifdef PERL_NATINT_PACK
3401 int natint; /* native integer */
3402 int unatint; /* unsigned native integer */
3405 if (gimme != G_ARRAY) { /* arrange to do first one only */
3407 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3408 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
3410 while (isDIGIT(*patend) || *patend == '*')
3416 while (pat < patend) {
3418 datumtype = *pat++ & 0xFF;
3419 #ifdef PERL_NATINT_PACK
3422 if (isSPACE(datumtype))
3424 if (datumtype == '#') {
3425 while (pat < patend && *pat != '\n')
3430 char *natstr = "sSiIlL";
3432 if (strchr(natstr, datumtype)) {
3433 #ifdef PERL_NATINT_PACK
3439 DIE(aTHX_ "'!' allowed only after types %s", natstr);
3444 else if (*pat == '*') {
3445 len = strend - strbeg; /* long enough */
3449 else if (isDIGIT(*pat)) {
3451 while (isDIGIT(*pat)) {
3452 len = (len * 10) + (*pat++ - '0');
3454 DIE(aTHX_ "Repeat count in unpack overflows");
3458 len = (datumtype != '@');
3462 DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
3463 case ',': /* grandfather in commas but with a warning */
3464 if (commas++ == 0 && ckWARN(WARN_UNPACK))
3465 Perl_warner(aTHX_ WARN_UNPACK,
3466 "Invalid type in unpack: '%c'", (int)datumtype);
3469 if (len == 1 && pat[-1] != '1')
3478 if (len > strend - strbeg)
3479 DIE(aTHX_ "@ outside of string");
3483 if (len > s - strbeg)
3484 DIE(aTHX_ "X outside of string");
3488 if (len > strend - s)
3489 DIE(aTHX_ "x outside of string");
3493 if (start_sp_offset >= SP - PL_stack_base)
3494 DIE(aTHX_ "/ must follow a numeric type");
3497 pat++; /* ignore '*' for compatibility with pack */
3499 DIE(aTHX_ "/ cannot take a count" );
3506 if (len > strend - s)
3509 goto uchar_checksum;
3510 sv = NEWSV(35, len);
3511 sv_setpvn(sv, s, len);
3513 if (datumtype == 'A' || datumtype == 'Z') {
3514 aptr = s; /* borrow register */
3515 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
3520 else { /* 'A' strips both nulls and spaces */
3521 s = SvPVX(sv) + len - 1;
3522 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3526 SvCUR_set(sv, s - SvPVX(sv));
3527 s = aptr; /* unborrow register */
3529 XPUSHs(sv_2mortal(sv));
3533 if (star || len > (strend - s) * 8)
3534 len = (strend - s) * 8;
3537 Newz(601, PL_bitcount, 256, char);
3538 for (bits = 1; bits < 256; bits++) {
3539 if (bits & 1) PL_bitcount[bits]++;
3540 if (bits & 2) PL_bitcount[bits]++;
3541 if (bits & 4) PL_bitcount[bits]++;
3542 if (bits & 8) PL_bitcount[bits]++;
3543 if (bits & 16) PL_bitcount[bits]++;
3544 if (bits & 32) PL_bitcount[bits]++;
3545 if (bits & 64) PL_bitcount[bits]++;
3546 if (bits & 128) PL_bitcount[bits]++;
3550 culong += PL_bitcount[*(unsigned char*)s++];
3555 if (datumtype == 'b') {
3557 if (bits & 1) culong++;
3563 if (bits & 128) culong++;
3570 sv = NEWSV(35, len + 1);
3574 if (datumtype == 'b') {
3576 for (len = 0; len < aint; len++) {
3577 if (len & 7) /*SUPPRESS 595*/
3581 *str++ = '0' + (bits & 1);
3586 for (len = 0; len < aint; len++) {
3591 *str++ = '0' + ((bits & 128) != 0);
3595 XPUSHs(sv_2mortal(sv));
3599 if (star || len > (strend - s) * 2)
3600 len = (strend - s) * 2;
3601 sv = NEWSV(35, len + 1);
3605 if (datumtype == 'h') {
3607 for (len = 0; len < aint; len++) {
3612 *str++ = PL_hexdigit[bits & 15];
3617 for (len = 0; len < aint; len++) {
3622 *str++ = PL_hexdigit[(bits >> 4) & 15];
3626 XPUSHs(sv_2mortal(sv));
3629 if (len > strend - s)
3634 if (aint >= 128) /* fake up signed chars */
3644 if (aint >= 128) /* fake up signed chars */
3647 sv_setiv(sv, (IV)aint);
3648 PUSHs(sv_2mortal(sv));
3653 if (len > strend - s)
3668 sv_setiv(sv, (IV)auint);
3669 PUSHs(sv_2mortal(sv));
3674 if (len > strend - s)
3677 while (len-- > 0 && s < strend) {
3679 auint = utf8_to_uv((U8*)s, strend - s, &alen, 0);
3683 cdouble += (NV)auint;
3691 while (len-- > 0 && s < strend) {
3693 auint = utf8_to_uv((U8*)s, strend - s, &alen, 0);
3697 sv_setuv(sv, (UV)auint);
3698 PUSHs(sv_2mortal(sv));
3703 #if SHORTSIZE == SIZE16
3704 along = (strend - s) / SIZE16;
3706 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
3711 #if SHORTSIZE != SIZE16
3715 COPYNN(s, &ashort, sizeof(short));
3726 #if SHORTSIZE > SIZE16
3738 #if SHORTSIZE != SIZE16
3742 COPYNN(s, &ashort, sizeof(short));
3745 sv_setiv(sv, (IV)ashort);
3746 PUSHs(sv_2mortal(sv));
3754 #if SHORTSIZE > SIZE16
3760 sv_setiv(sv, (IV)ashort);
3761 PUSHs(sv_2mortal(sv));
3769 #if SHORTSIZE == SIZE16
3770 along = (strend - s) / SIZE16;
3772 unatint = natint && datumtype == 'S';
3773 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
3778 #if SHORTSIZE != SIZE16
3780 unsigned short aushort;
3782 COPYNN(s, &aushort, sizeof(unsigned short));
3783 s += sizeof(unsigned short);
3791 COPY16(s, &aushort);
3794 if (datumtype == 'n')
3795 aushort = PerlSock_ntohs(aushort);
3798 if (datumtype == 'v')
3799 aushort = vtohs(aushort);
3808 #if SHORTSIZE != SIZE16
3810 unsigned short aushort;
3812 COPYNN(s, &aushort, sizeof(unsigned short));
3813 s += sizeof(unsigned short);
3815 sv_setiv(sv, (UV)aushort);
3816 PUSHs(sv_2mortal(sv));
3823 COPY16(s, &aushort);
3827 if (datumtype == 'n')
3828 aushort = PerlSock_ntohs(aushort);
3831 if (datumtype == 'v')
3832 aushort = vtohs(aushort);
3834 sv_setiv(sv, (UV)aushort);
3835 PUSHs(sv_2mortal(sv));
3841 along = (strend - s) / sizeof(int);
3846 Copy(s, &aint, 1, int);
3849 cdouble += (NV)aint;
3858 Copy(s, &aint, 1, int);
3862 /* Without the dummy below unpack("i", pack("i",-1))
3863 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3864 * cc with optimization turned on.
3866 * The bug was detected in
3867 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
3868 * with optimization (-O4) turned on.
3869 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
3870 * does not have this problem even with -O4.
3872 * This bug was reported as DECC_BUGS 1431
3873 * and tracked internally as GEM_BUGS 7775.
3875 * The bug is fixed in
3876 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
3877 * UNIX V4.0F support: DEC C V5.9-006 or later
3878 * UNIX V4.0E support: DEC C V5.8-011 or later
3881 * See also few lines later for the same bug.
3884 sv_setiv(sv, (IV)aint) :
3886 sv_setiv(sv, (IV)aint);
3887 PUSHs(sv_2mortal(sv));
3892 along = (strend - s) / sizeof(unsigned int);
3897 Copy(s, &auint, 1, unsigned int);
3898 s += sizeof(unsigned int);
3900 cdouble += (NV)auint;
3909 Copy(s, &auint, 1, unsigned int);
3910 s += sizeof(unsigned int);
3913 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
3914 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
3915 * See details few lines earlier. */
3917 sv_setuv(sv, (UV)auint) :
3919 sv_setuv(sv, (UV)auint);
3920 PUSHs(sv_2mortal(sv));
3925 #if LONGSIZE == SIZE32
3926 along = (strend - s) / SIZE32;
3928 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
3933 #if LONGSIZE != SIZE32
3936 COPYNN(s, &along, sizeof(long));
3939 cdouble += (NV)along;
3948 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
3952 #if LONGSIZE > SIZE32
3953 if (along > 2147483647)
3954 along -= 4294967296;
3958 cdouble += (NV)along;
3967 #if LONGSIZE != SIZE32
3970 COPYNN(s, &along, sizeof(long));
3973 sv_setiv(sv, (IV)along);
3974 PUSHs(sv_2mortal(sv));
3981 #if LONGSIZE > SIZE32 && INTSIZE == SIZE32
3985 #if LONGSIZE > SIZE32
3986 if (along > 2147483647)
3987 along -= 4294967296;
3991 sv_setiv(sv, (IV)along);
3992 PUSHs(sv_2mortal(sv));
4000 #if LONGSIZE == SIZE32
4001 along = (strend - s) / SIZE32;
4003 unatint = natint && datumtype == 'L';
4004 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
4009 #if LONGSIZE != SIZE32
4011 unsigned long aulong;
4013 COPYNN(s, &aulong, sizeof(unsigned long));
4014 s += sizeof(unsigned long);
4016 cdouble += (NV)aulong;
4028 if (datumtype == 'N')
4029 aulong = PerlSock_ntohl(aulong);
4032 if (datumtype == 'V')
4033 aulong = vtohl(aulong);
4036 cdouble += (NV)aulong;
4045 #if LONGSIZE != SIZE32
4047 unsigned long aulong;
4049 COPYNN(s, &aulong, sizeof(unsigned long));
4050 s += sizeof(unsigned long);
4052 sv_setuv(sv, (UV)aulong);
4053 PUSHs(sv_2mortal(sv));
4063 if (datumtype == 'N')
4064 aulong = PerlSock_ntohl(aulong);
4067 if (datumtype == 'V')
4068 aulong = vtohl(aulong);
4071 sv_setuv(sv, (UV)aulong);
4072 PUSHs(sv_2mortal(sv));
4078 along = (strend - s) / sizeof(char*);
4084 if (sizeof(char*) > strend - s)
4087 Copy(s, &aptr, 1, char*);
4093 PUSHs(sv_2mortal(sv));
4103 while ((len > 0) && (s < strend)) {
4104 auv = (auv << 7) | (*s & 0x7f);
4105 if (UTF8_IS_ASCII(*s++)) {
4109 PUSHs(sv_2mortal(sv));
4113 else if (++bytes >= sizeof(UV)) { /* promote to string */
4117 sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
4118 while (s < strend) {
4119 sv = mul128(sv, *s & 0x7f);
4120 if (!(*s++ & 0x80)) {
4129 PUSHs(sv_2mortal(sv));
4134 if ((s >= strend) && bytes)
4135 DIE(aTHX_ "Unterminated compressed integer");
4140 if (sizeof(char*) > strend - s)
4143 Copy(s, &aptr, 1, char*);
4148 sv_setpvn(sv, aptr, len);
4149 PUSHs(sv_2mortal(sv));
4153 along = (strend - s) / sizeof(Quad_t);
4159 if (s + sizeof(Quad_t) > strend)
4162 Copy(s, &aquad, 1, Quad_t);
4163 s += sizeof(Quad_t);
4166 if (aquad >= IV_MIN && aquad <= IV_MAX)
4167 sv_setiv(sv, (IV)aquad);
4169 sv_setnv(sv, (NV)aquad);
4170 PUSHs(sv_2mortal(sv));
4174 along = (strend - s) / sizeof(Quad_t);
4180 if (s + sizeof(Uquad_t) > strend)
4183 Copy(s, &auquad, 1, Uquad_t);
4184 s += sizeof(Uquad_t);
4187 if (auquad <= UV_MAX)
4188 sv_setuv(sv, (UV)auquad);
4190 sv_setnv(sv, (NV)auquad);
4191 PUSHs(sv_2mortal(sv));
4195 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
4198 along = (strend - s) / sizeof(float);
4203 Copy(s, &afloat, 1, float);
4212 Copy(s, &afloat, 1, float);
4215 sv_setnv(sv, (NV)afloat);
4216 PUSHs(sv_2mortal(sv));
4222 along = (strend - s) / sizeof(double);
4227 Copy(s, &adouble, 1, double);
4228 s += sizeof(double);
4236 Copy(s, &adouble, 1, double);
4237 s += sizeof(double);
4239 sv_setnv(sv, (NV)adouble);
4240 PUSHs(sv_2mortal(sv));
4246 * Initialise the decode mapping. By using a table driven
4247 * algorithm, the code will be character-set independent
4248 * (and just as fast as doing character arithmetic)
4250 if (PL_uudmap['M'] == 0) {
4253 for (i = 0; i < sizeof(PL_uuemap); i += 1)
4254 PL_uudmap[(U8)PL_uuemap[i]] = i;
4256 * Because ' ' and '`' map to the same value,
4257 * we need to decode them both the same.
4262 along = (strend - s) * 3 / 4;
4263 sv = NEWSV(42, along);
4266 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
4271 len = PL_uudmap[*(U8*)s++] & 077;
4273 if (s < strend && ISUUCHAR(*s))
4274 a = PL_uudmap[*(U8*)s++] & 077;
4277 if (s < strend && ISUUCHAR(*s))
4278 b = PL_uudmap[*(U8*)s++] & 077;
4281 if (s < strend && ISUUCHAR(*s))
4282 c = PL_uudmap[*(U8*)s++] & 077;
4285 if (s < strend && ISUUCHAR(*s))
4286 d = PL_uudmap[*(U8*)s++] & 077;
4289 hunk[0] = (a << 2) | (b >> 4);
4290 hunk[1] = (b << 4) | (c >> 2);
4291 hunk[2] = (c << 6) | d;
4292 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
4297 else if (s[1] == '\n') /* possible checksum byte */
4300 XPUSHs(sv_2mortal(sv));
4305 if (strchr("fFdD", datumtype) ||
4306 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
4310 while (checksum >= 16) {
4314 while (checksum >= 4) {
4320 along = (1 << checksum) - 1;
4321 while (cdouble < 0.0)
4323 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
4324 sv_setnv(sv, cdouble);
4327 if (checksum < 32) {
4328 aulong = (1 << checksum) - 1;
4331 sv_setuv(sv, (UV)culong);
4333 XPUSHs(sv_2mortal(sv));
4337 if (SP - PL_stack_base == start_sp_offset && gimme == G_SCALAR)
4338 PUSHs(&PL_sv_undef);
4343 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
4347 *hunk = PL_uuemap[len];
4348 sv_catpvn(sv, hunk, 1);
4351 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4352 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
4353 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
4354 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
4355 sv_catpvn(sv, hunk, 4);
4360 char r = (len > 1 ? s[1] : '\0');
4361 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4362 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
4363 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
4364 hunk[3] = PL_uuemap[0];
4365 sv_catpvn(sv, hunk, 4);
4367 sv_catpvn(sv, "\n", 1);
4371 S_is_an_int(pTHX_ char *s, STRLEN l)
4374 SV *result = newSVpvn(s, l);
4375 char *result_c = SvPV(result, n_a); /* convenience */
4376 char *out = result_c;
4386 SvREFCNT_dec(result);
4409 SvREFCNT_dec(result);
4415 SvCUR_set(result, out - result_c);
4419 /* pnum must be '\0' terminated */
4421 S_div128(pTHX_ SV *pnum, bool *done)
4424 char *s = SvPV(pnum, len);
4433 i = m * 10 + (*t - '0');
4435 r = (i >> 7); /* r < 10 */
4442 SvCUR_set(pnum, (STRLEN) (t - s));
4449 djSP; dMARK; dORIGMARK; dTARGET;
4450 register SV *cat = TARG;
4453 register char *pat = SvPVx(*++MARK, fromlen);
4455 register char *patend = pat + fromlen;
4460 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4461 static char *space10 = " ";
4463 /* These must not be in registers: */
4478 #ifdef PERL_NATINT_PACK
4479 int natint; /* native integer */
4484 sv_setpvn(cat, "", 0);
4486 while (pat < patend) {
4487 SV *lengthcode = Nullsv;
4488 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
4489 datumtype = *pat++ & 0xFF;
4490 #ifdef PERL_NATINT_PACK
4493 if (isSPACE(datumtype)) {
4497 if (datumtype == 'U' && pat == patcopy+1)
4499 if (datumtype == '#') {
4500 while (pat < patend && *pat != '\n')
4505 char *natstr = "sSiIlL";
4507 if (strchr(natstr, datumtype)) {
4508 #ifdef PERL_NATINT_PACK
4514 DIE(aTHX_ "'!' allowed only after types %s", natstr);
4517 len = strchr("@Xxu", datumtype) ? 0 : items;
4520 else if (isDIGIT(*pat)) {
4522 while (isDIGIT(*pat)) {
4523 len = (len * 10) + (*pat++ - '0');
4525 DIE(aTHX_ "Repeat count in pack overflows");
4532 if ((*pat != 'a' && *pat != 'A' && *pat != 'Z') || pat[1] != '*')
4533 DIE(aTHX_ "/ must be followed by a*, A* or Z*");
4534 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
4535 ? *MARK : &PL_sv_no)
4536 + (*pat == 'Z' ? 1 : 0)));
4540 DIE(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
4541 case ',': /* grandfather in commas but with a warning */
4542 if (commas++ == 0 && ckWARN(WARN_PACK))
4543 Perl_warner(aTHX_ WARN_PACK,
4544 "Invalid type in pack: '%c'", (int)datumtype);
4547 DIE(aTHX_ "%% may only be used in unpack");
4558 if (SvCUR(cat) < len)
4559 DIE(aTHX_ "X outside of string");
4566 sv_catpvn(cat, null10, 10);
4569 sv_catpvn(cat, null10, len);
4575 aptr = SvPV(fromstr, fromlen);
4576 if (pat[-1] == '*') {
4578 if (datumtype == 'Z')
4581 if (fromlen >= len) {
4582 sv_catpvn(cat, aptr, len);
4583 if (datumtype == 'Z')
4584 *(SvEND(cat)-1) = '\0';
4587 sv_catpvn(cat, aptr, fromlen);
4589 if (datumtype == 'A') {
4591 sv_catpvn(cat, space10, 10);
4594 sv_catpvn(cat, space10, len);
4598 sv_catpvn(cat, null10, 10);
4601 sv_catpvn(cat, null10, len);
4613 str = SvPV(fromstr, fromlen);
4617 SvCUR(cat) += (len+7)/8;
4618 SvGROW(cat, SvCUR(cat) + 1);
4619 aptr = SvPVX(cat) + aint;
4624 if (datumtype == 'B') {
4625 for (len = 0; len++ < aint;) {
4626 items |= *str++ & 1;
4630 *aptr++ = items & 0xff;
4636 for (len = 0; len++ < aint;) {
4642 *aptr++ = items & 0xff;
4648 if (datumtype == 'B')
4649 items <<= 7 - (aint & 7);
4651 items >>= 7 - (aint & 7);
4652 *aptr++ = items & 0xff;
4654 str = SvPVX(cat) + SvCUR(cat);
4669 str = SvPV(fromstr, fromlen);
4673 SvCUR(cat) += (len+1)/2;
4674 SvGROW(cat, SvCUR(cat) + 1);
4675 aptr = SvPVX(cat) + aint;
4680 if (datumtype == 'H') {
4681 for (len = 0; len++ < aint;) {
4683 items |= ((*str++ & 15) + 9) & 15;
4685 items |= *str++ & 15;
4689 *aptr++ = items & 0xff;
4695 for (len = 0; len++ < aint;) {
4697 items |= (((*str++ & 15) + 9) & 15) << 4;
4699 items |= (*str++ & 15) << 4;
4703 *aptr++ = items & 0xff;
4709 *aptr++ = items & 0xff;
4710 str = SvPVX(cat) + SvCUR(cat);
4721 aint = SvIV(fromstr);
4723 sv_catpvn(cat, &achar, sizeof(char));
4729 auint = SvUV(fromstr);
4730 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN + 1);
4731 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4736 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4741 afloat = (float)SvNV(fromstr);
4742 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4749 adouble = (double)SvNV(fromstr);
4750 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4756 ashort = (I16)SvIV(fromstr);
4758 ashort = PerlSock_htons(ashort);
4760 CAT16(cat, &ashort);
4766 ashort = (I16)SvIV(fromstr);
4768 ashort = htovs(ashort);
4770 CAT16(cat, &ashort);
4774 #if SHORTSIZE != SIZE16
4776 unsigned short aushort;
4780 aushort = SvUV(fromstr);
4781 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
4791 aushort = (U16)SvUV(fromstr);
4792 CAT16(cat, &aushort);
4798 #if SHORTSIZE != SIZE16
4804 ashort = SvIV(fromstr);
4805 sv_catpvn(cat, (char *)&ashort, sizeof(short));
4813 ashort = (I16)SvIV(fromstr);
4814 CAT16(cat, &ashort);
4821 auint = SvUV(fromstr);
4822 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4828 adouble = Perl_floor(SvNV(fromstr));
4831 DIE(aTHX_ "Cannot compress negative numbers");
4834 #if UVSIZE > 4 && UVSIZE >= NVSIZE
4835 adouble <= 0xffffffff
4837 # ifdef CXUX_BROKEN_CONSTANT_CONVERT
4838 adouble <= UV_MAX_cxux
4845 char buf[1 + sizeof(UV)];
4846 char *in = buf + sizeof(buf);
4847 UV auv = U_V(adouble);
4850 *--in = (auv & 0x7f) | 0x80;
4853 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4854 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4856 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4857 char *from, *result, *in;
4862 /* Copy string and check for compliance */
4863 from = SvPV(fromstr, len);
4864 if ((norm = is_an_int(from, len)) == NULL)
4865 DIE(aTHX_ "can compress only unsigned integer");
4867 New('w', result, len, char);
4871 *--in = div128(norm, &done) | 0x80;
4872 result[len - 1] &= 0x7F; /* clear continue bit */
4873 sv_catpvn(cat, in, (result + len) - in);
4875 SvREFCNT_dec(norm); /* free norm */
4877 else if (SvNOKp(fromstr)) {
4878 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4879 char *in = buf + sizeof(buf);
4882 double next = floor(adouble / 128);
4883 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4884 if (in <= buf) /* this cannot happen ;-) */
4885 DIE(aTHX_ "Cannot compress integer");
4888 } while (adouble > 0);
4889 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4890 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4893 DIE(aTHX_ "Cannot compress non integer");
4899 aint = SvIV(fromstr);
4900 sv_catpvn(cat, (char*)&aint, sizeof(int));
4906 aulong = SvUV(fromstr);
4908 aulong = PerlSock_htonl(aulong);
4910 CAT32(cat, &aulong);
4916 aulong = SvUV(fromstr);
4918 aulong = htovl(aulong);
4920 CAT32(cat, &aulong);
4924 #if LONGSIZE != SIZE32
4926 unsigned long aulong;
4930 aulong = SvUV(fromstr);
4931 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
4939 aulong = SvUV(fromstr);
4940 CAT32(cat, &aulong);
4945 #if LONGSIZE != SIZE32
4951 along = SvIV(fromstr);
4952 sv_catpvn(cat, (char *)&along, sizeof(long));
4960 along = SvIV(fromstr);
4969 auquad = (Uquad_t)SvUV(fromstr);
4970 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
4976 aquad = (Quad_t)SvIV(fromstr);
4977 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
4982 len = 1; /* assume SV is correct length */
4987 if (fromstr == &PL_sv_undef)
4991 /* XXX better yet, could spirit away the string to
4992 * a safe spot and hang on to it until the result
4993 * of pack() (and all copies of the result) are
4996 if (ckWARN(WARN_PACK) && (SvTEMP(fromstr)
4997 || (SvPADTMP(fromstr)
4998 && !SvREADONLY(fromstr))))
5000 Perl_warner(aTHX_ WARN_PACK,
5001 "Attempt to pack pointer to temporary value");
5003 if (SvPOK(fromstr) || SvNIOK(fromstr))
5004 aptr = SvPV(fromstr,n_a);
5006 aptr = SvPV_force(fromstr,n_a);
5008 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
5013 aptr = SvPV(fromstr, fromlen);
5014 SvGROW(cat, fromlen * 4 / 3);
5019 while (fromlen > 0) {
5026 doencodes(cat, aptr, todo);
5045 register IV limit = POPi; /* note, negative is forever */
5048 register char *s = SvPV(sv, len);
5049 bool do_utf8 = DO_UTF8(sv);
5050 char *strend = s + len;
5052 register REGEXP *rx;
5056 STRLEN slen = do_utf8 ? utf8_length((U8*)s, (U8*)strend) : (strend - s);
5057 I32 maxiters = slen + 10;
5060 I32 origlimit = limit;
5063 AV *oldstack = PL_curstack;
5064 I32 gimme = GIMME_V;
5065 I32 oldsave = PL_savestack_ix;
5066 I32 make_mortal = 1;
5067 MAGIC *mg = (MAGIC *) NULL;
5070 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
5075 DIE(aTHX_ "panic: pp_split");
5076 rx = pm->op_pmregexp;
5078 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
5079 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
5081 if (pm->op_pmreplroot) {
5083 ary = GvAVn((GV*)PL_curpad[(PADOFFSET)pm->op_pmreplroot]);
5085 ary = GvAVn((GV*)pm->op_pmreplroot);
5088 else if (gimme != G_ARRAY)
5090 ary = (AV*)PL_curpad[0];
5092 ary = GvAVn(PL_defgv);
5093 #endif /* USE_THREADS */
5096 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
5102 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
5104 XPUSHs(SvTIED_obj((SV*)ary, mg));
5110 for (i = AvFILLp(ary); i >= 0; i--)
5111 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
5113 /* temporarily switch stacks */
5114 SWITCHSTACK(PL_curstack, ary);
5118 base = SP - PL_stack_base;
5120 if (pm->op_pmflags & PMf_SKIPWHITE) {
5121 if (pm->op_pmflags & PMf_LOCALE) {
5122 while (isSPACE_LC(*s))
5130 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
5131 SAVEINT(PL_multiline);
5132 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
5136 limit = maxiters + 2;
5137 if (pm->op_pmflags & PMf_WHITE) {
5140 while (m < strend &&
5141 !((pm->op_pmflags & PMf_LOCALE)
5142 ? isSPACE_LC(*m) : isSPACE(*m)))
5147 dstr = NEWSV(30, m-s);
5148 sv_setpvn(dstr, s, m-s);
5152 (void)SvUTF8_on(dstr);
5156 while (s < strend &&
5157 ((pm->op_pmflags & PMf_LOCALE)
5158 ? isSPACE_LC(*s) : isSPACE(*s)))
5162 else if (strEQ("^", rx->precomp)) {
5165 for (m = s; m < strend && *m != '\n'; m++) ;
5169 dstr = NEWSV(30, m-s);
5170 sv_setpvn(dstr, s, m-s);
5174 (void)SvUTF8_on(dstr);
5179 else if ((rx->reganch & RE_USE_INTUIT) && !rx->nparens
5180 && (rx->reganch & ROPT_CHECK_ALL)
5181 && !(rx->reganch & ROPT_ANCH)) {
5182 int tail = (rx->reganch & RE_INTUIT_TAIL);
5183 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
5186 if (len == 1 && !(rx->reganch & ROPT_UTF8) && !tail) {
5188 char c = *SvPV(csv, n_a);
5191 for (m = s; m < strend && *m != c; m++) ;
5194 dstr = NEWSV(30, m-s);
5195 sv_setpvn(dstr, s, m-s);
5199 (void)SvUTF8_on(dstr);
5201 /* The rx->minlen is in characters but we want to step
5202 * s ahead by bytes. */
5204 s = (char*)utf8_hop((U8*)m, len);
5206 s = m + len; /* Fake \n at the end */
5211 while (s < strend && --limit &&
5212 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
5213 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
5216 dstr = NEWSV(31, m-s);
5217 sv_setpvn(dstr, s, m-s);
5221 (void)SvUTF8_on(dstr);
5223 /* The rx->minlen is in characters but we want to step
5224 * s ahead by bytes. */
5226 s = (char*)utf8_hop((U8*)m, len);
5228 s = m + len; /* Fake \n at the end */
5233 maxiters += slen * rx->nparens;
5234 while (s < strend && --limit
5235 /* && (!rx->check_substr
5236 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
5238 */ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
5239 1 /* minend */, sv, NULL, 0))
5241 TAINT_IF(RX_MATCH_TAINTED(rx));
5242 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
5247 strend = s + (strend - m);
5249 m = rx->startp[0] + orig;
5250 dstr = NEWSV(32, m-s);
5251 sv_setpvn(dstr, s, m-s);
5255 (void)SvUTF8_on(dstr);
5258 for (i = 1; i <= rx->nparens; i++) {
5259 s = rx->startp[i] + orig;
5260 m = rx->endp[i] + orig;
5262 dstr = NEWSV(33, m-s);
5263 sv_setpvn(dstr, s, m-s);
5266 dstr = NEWSV(33, 0);
5270 (void)SvUTF8_on(dstr);
5274 s = rx->endp[0] + orig;
5278 LEAVE_SCOPE(oldsave);
5279 iters = (SP - PL_stack_base) - base;
5280 if (iters > maxiters)
5281 DIE(aTHX_ "Split loop");
5283 /* keep field after final delim? */
5284 if (s < strend || (iters && origlimit)) {
5285 STRLEN l = strend - s;
5286 dstr = NEWSV(34, l);
5287 sv_setpvn(dstr, s, l);
5291 (void)SvUTF8_on(dstr);
5295 else if (!origlimit) {
5296 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
5302 SWITCHSTACK(ary, oldstack);
5303 if (SvSMAGICAL(ary)) {
5308 if (gimme == G_ARRAY) {
5310 Copy(AvARRAY(ary), SP + 1, iters, SV*);
5318 call_method("PUSH",G_SCALAR|G_DISCARD);
5321 if (gimme == G_ARRAY) {
5322 /* EXTEND should not be needed - we just popped them */
5324 for (i=0; i < iters; i++) {
5325 SV **svp = av_fetch(ary, i, FALSE);
5326 PUSHs((svp) ? *svp : &PL_sv_undef);
5333 if (gimme == G_ARRAY)
5336 if (iters || !pm->op_pmreplroot) {
5346 Perl_unlock_condpair(pTHX_ void *svv)
5348 MAGIC *mg = mg_find((SV*)svv, 'm');
5351 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
5352 MUTEX_LOCK(MgMUTEXP(mg));
5353 if (MgOWNER(mg) != thr)
5354 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
5356 COND_SIGNAL(MgOWNERCONDP(mg));
5357 DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": unlock 0x%"UVxf"\n",
5358 PTR2UV(thr), PTR2UV(svv));)
5359 MUTEX_UNLOCK(MgMUTEXP(mg));
5361 #endif /* USE_THREADS */
5370 #endif /* USE_THREADS */
5371 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5372 || SvTYPE(retsv) == SVt_PVCV) {
5373 retsv = refto(retsv);
5384 if (PL_op->op_private & OPpLVAL_INTRO)
5385 PUSHs(*save_threadsv(PL_op->op_targ));
5387 PUSHs(THREADSV(PL_op->op_targ));
5390 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
5391 #endif /* USE_THREADS */