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)) {
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 (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 */
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';
1095 (void)SvPOK_only(TARG);
1104 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1107 SETn( left - right );
1114 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1117 if (PL_op->op_private & HINT_INTEGER) {
1131 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1134 if (PL_op->op_private & HINT_INTEGER) {
1148 djSP; tryAMAGICbinSET(lt,0);
1151 SETs(boolSV(TOPn < value));
1158 djSP; tryAMAGICbinSET(gt,0);
1161 SETs(boolSV(TOPn > value));
1168 djSP; tryAMAGICbinSET(le,0);
1171 SETs(boolSV(TOPn <= value));
1178 djSP; tryAMAGICbinSET(ge,0);
1181 SETs(boolSV(TOPn >= value));
1188 djSP; tryAMAGICbinSET(ne,0);
1191 SETs(boolSV(TOPn != value));
1198 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1202 #ifdef __osf__ /* XXX fix in 5.6.1 --jhi */
1203 #if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
1204 #define Perl_isnan isnanl
1206 #define Perl_isnan isnan
1210 #ifdef __osf__ /* XXX fix in 5.6.1 --jhi */
1211 if (Perl_isnan(left) || Perl_isnan(right)) {
1215 value = (left > right) - (left < right);
1219 else if (left < right)
1221 else if (left > right)
1235 djSP; tryAMAGICbinSET(slt,0);
1238 int cmp = ((PL_op->op_private & OPpLOCALE)
1239 ? sv_cmp_locale(left, right)
1240 : sv_cmp(left, right));
1241 SETs(boolSV(cmp < 0));
1248 djSP; tryAMAGICbinSET(sgt,0);
1251 int cmp = ((PL_op->op_private & OPpLOCALE)
1252 ? sv_cmp_locale(left, right)
1253 : sv_cmp(left, right));
1254 SETs(boolSV(cmp > 0));
1261 djSP; tryAMAGICbinSET(sle,0);
1264 int cmp = ((PL_op->op_private & OPpLOCALE)
1265 ? sv_cmp_locale(left, right)
1266 : sv_cmp(left, right));
1267 SETs(boolSV(cmp <= 0));
1274 djSP; tryAMAGICbinSET(sge,0);
1277 int cmp = ((PL_op->op_private & OPpLOCALE)
1278 ? sv_cmp_locale(left, right)
1279 : sv_cmp(left, right));
1280 SETs(boolSV(cmp >= 0));
1287 djSP; tryAMAGICbinSET(seq,0);
1290 SETs(boolSV(sv_eq(left, right)));
1297 djSP; tryAMAGICbinSET(sne,0);
1300 SETs(boolSV(!sv_eq(left, right)));
1307 djSP; dTARGET; tryAMAGICbin(scmp,0);
1310 int cmp = ((PL_op->op_private & OPpLOCALE)
1311 ? sv_cmp_locale(left, right)
1312 : sv_cmp(left, right));
1320 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1323 if (SvNIOKp(left) || SvNIOKp(right)) {
1324 if (PL_op->op_private & HINT_INTEGER) {
1325 IV i = SvIV(left) & SvIV(right);
1329 UV u = SvUV(left) & SvUV(right);
1334 do_vop(PL_op->op_type, TARG, left, right);
1343 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1346 if (SvNIOKp(left) || SvNIOKp(right)) {
1347 if (PL_op->op_private & HINT_INTEGER) {
1348 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1352 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1357 do_vop(PL_op->op_type, TARG, left, right);
1366 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1369 if (SvNIOKp(left) || SvNIOKp(right)) {
1370 if (PL_op->op_private & HINT_INTEGER) {
1371 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1375 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1380 do_vop(PL_op->op_type, TARG, left, right);
1389 djSP; dTARGET; tryAMAGICun(neg);
1394 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv)) {
1396 if (SvIVX(sv) == IV_MIN) {
1397 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
1400 else if (SvUVX(sv) <= IV_MAX) {
1405 else if (SvIVX(sv) != IV_MIN) {
1412 else if (SvPOKp(sv)) {
1414 char *s = SvPV(sv, len);
1415 if (isIDFIRST(*s)) {
1416 sv_setpvn(TARG, "-", 1);
1419 else if (*s == '+' || *s == '-') {
1421 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1423 else if (DO_UTF8(sv) && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
1424 sv_setpvn(TARG, "-", 1);
1428 sv_setnv(TARG, -SvNV(sv));
1439 djSP; tryAMAGICunSET(not);
1440 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1446 djSP; dTARGET; tryAMAGICun(compl);
1450 if (PL_op->op_private & HINT_INTEGER) {
1460 register char *tmps;
1461 register long *tmpl;
1466 tmps = SvPV_force(TARG, len);
1469 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1472 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1476 for ( ; anum > 0; anum--, tmps++)
1485 /* integer versions of some of the above */
1489 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1492 SETi( left * right );
1499 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1503 DIE(aTHX_ "Illegal division by zero");
1504 value = POPi / value;
1512 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1516 DIE(aTHX_ "Illegal modulus zero");
1517 SETi( left % right );
1524 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1527 SETi( left + right );
1534 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1537 SETi( left - right );
1544 djSP; tryAMAGICbinSET(lt,0);
1547 SETs(boolSV(left < right));
1554 djSP; tryAMAGICbinSET(gt,0);
1557 SETs(boolSV(left > right));
1564 djSP; tryAMAGICbinSET(le,0);
1567 SETs(boolSV(left <= right));
1574 djSP; tryAMAGICbinSET(ge,0);
1577 SETs(boolSV(left >= right));
1584 djSP; tryAMAGICbinSET(eq,0);
1587 SETs(boolSV(left == right));
1594 djSP; tryAMAGICbinSET(ne,0);
1597 SETs(boolSV(left != right));
1604 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1611 else if (left < right)
1622 djSP; dTARGET; tryAMAGICun(neg);
1627 /* High falutin' math. */
1631 djSP; dTARGET; tryAMAGICbin(atan2,0);
1634 SETn(Perl_atan2(left, right));
1641 djSP; dTARGET; tryAMAGICun(sin);
1645 value = Perl_sin(value);
1653 djSP; dTARGET; tryAMAGICun(cos);
1657 value = Perl_cos(value);
1663 /* Support Configure command-line overrides for rand() functions.
1664 After 5.005, perhaps we should replace this by Configure support
1665 for drand48(), random(), or rand(). For 5.005, though, maintain
1666 compatibility by calling rand() but allow the user to override it.
1667 See INSTALL for details. --Andy Dougherty 15 July 1998
1669 /* Now it's after 5.005, and Configure supports drand48() and random(),
1670 in addition to rand(). So the overrides should not be needed any more.
1671 --Jarkko Hietaniemi 27 September 1998
1674 #ifndef HAS_DRAND48_PROTO
1675 extern double drand48 (void);
1688 if (!PL_srand_called) {
1689 (void)seedDrand01((Rand_seed_t)seed());
1690 PL_srand_called = TRUE;
1705 (void)seedDrand01((Rand_seed_t)anum);
1706 PL_srand_called = TRUE;
1715 * This is really just a quick hack which grabs various garbage
1716 * values. It really should be a real hash algorithm which
1717 * spreads the effect of every input bit onto every output bit,
1718 * if someone who knows about such things would bother to write it.
1719 * Might be a good idea to add that function to CORE as well.
1720 * No numbers below come from careful analysis or anything here,
1721 * except they are primes and SEED_C1 > 1E6 to get a full-width
1722 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1723 * probably be bigger too.
1726 # define SEED_C1 1000003
1727 #define SEED_C4 73819
1729 # define SEED_C1 25747
1730 #define SEED_C4 20639
1734 #define SEED_C5 26107
1737 #ifndef PERL_NO_DEV_RANDOM
1742 # include <starlet.h>
1743 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1744 * in 100-ns units, typically incremented ever 10 ms. */
1745 unsigned int when[2];
1747 # ifdef HAS_GETTIMEOFDAY
1748 struct timeval when;
1754 /* This test is an escape hatch, this symbol isn't set by Configure. */
1755 #ifndef PERL_NO_DEV_RANDOM
1756 #ifndef PERL_RANDOM_DEVICE
1757 /* /dev/random isn't used by default because reads from it will block
1758 * if there isn't enough entropy available. You can compile with
1759 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1760 * is enough real entropy to fill the seed. */
1761 # define PERL_RANDOM_DEVICE "/dev/urandom"
1763 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1765 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1774 _ckvmssts(sys$gettim(when));
1775 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1777 # ifdef HAS_GETTIMEOFDAY
1778 gettimeofday(&when,(struct timezone *) 0);
1779 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1782 u = (U32)SEED_C1 * when;
1785 u += SEED_C3 * (U32)PerlProc_getpid();
1786 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
1787 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1788 u += SEED_C5 * (U32)PTR2UV(&when);
1795 djSP; dTARGET; tryAMAGICun(exp);
1799 value = Perl_exp(value);
1807 djSP; dTARGET; tryAMAGICun(log);
1812 RESTORE_NUMERIC_STANDARD();
1813 DIE(aTHX_ "Can't take log of %g", value);
1815 value = Perl_log(value);
1823 djSP; dTARGET; tryAMAGICun(sqrt);
1828 RESTORE_NUMERIC_STANDARD();
1829 DIE(aTHX_ "Can't take sqrt of %g", value);
1831 value = Perl_sqrt(value);
1844 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1850 (void)Perl_modf(value, &value);
1852 (void)Perl_modf(-value, &value);
1867 djSP; dTARGET; tryAMAGICun(abs);
1872 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1873 (iv = SvIVX(TOPs)) != IV_MIN) {
1895 XPUSHn(scan_hex(tmps, 99, &argtype));
1908 while (*tmps && isSPACE(*tmps))
1913 value = scan_hex(++tmps, 99, &argtype);
1914 else if (*tmps == 'b')
1915 value = scan_bin(++tmps, 99, &argtype);
1917 value = scan_oct(tmps, 99, &argtype);
1930 SETi(sv_len_utf8(sv));
1946 I32 lvalue = PL_op->op_flags & OPf_MOD;
1948 I32 arybase = PL_curcop->cop_arybase;
1952 SvTAINTED_off(TARG); /* decontaminate */
1953 SvUTF8_off(TARG); /* decontaminate */
1957 repl = SvPV(sv, repl_len);
1964 tmps = SvPV(sv, curlen);
1966 utfcurlen = sv_len_utf8(sv);
1967 if (utfcurlen == curlen)
1975 if (pos >= arybase) {
1993 else if (len >= 0) {
1995 if (rem > (I32)curlen)
2010 Perl_croak(aTHX_ "substr outside of string");
2011 if (ckWARN(WARN_SUBSTR))
2012 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
2017 sv_pos_u2b(sv, &pos, &rem);
2021 sv_setpvn(TARG, tmps, rem);
2023 sv_insert(sv, pos, rem, repl, repl_len);
2024 else if (lvalue) { /* it's an lvalue! */
2025 if (!SvGMAGICAL(sv)) {
2029 if (ckWARN(WARN_SUBSTR))
2030 Perl_warner(aTHX_ WARN_SUBSTR,
2031 "Attempt to use reference as lvalue in substr");
2033 if (SvOK(sv)) /* is it defined ? */
2034 (void)SvPOK_only(sv);
2036 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
2039 if (SvTYPE(TARG) < SVt_PVLV) {
2040 sv_upgrade(TARG, SVt_PVLV);
2041 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
2045 if (LvTARG(TARG) != sv) {
2047 SvREFCNT_dec(LvTARG(TARG));
2048 LvTARG(TARG) = SvREFCNT_inc(sv);
2050 LvTARGOFF(TARG) = pos;
2051 LvTARGLEN(TARG) = rem;
2055 PUSHs(TARG); /* avoid SvSETMAGIC here */
2062 register I32 size = POPi;
2063 register I32 offset = POPi;
2064 register SV *src = POPs;
2065 I32 lvalue = PL_op->op_flags & OPf_MOD;
2067 SvTAINTED_off(TARG); /* decontaminate */
2068 if (lvalue) { /* it's an lvalue! */
2069 if (SvTYPE(TARG) < SVt_PVLV) {
2070 sv_upgrade(TARG, SVt_PVLV);
2071 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
2074 if (LvTARG(TARG) != src) {
2076 SvREFCNT_dec(LvTARG(TARG));
2077 LvTARG(TARG) = SvREFCNT_inc(src);
2079 LvTARGOFF(TARG) = offset;
2080 LvTARGLEN(TARG) = size;
2083 sv_setuv(TARG, do_vecget(src, offset, size));
2098 I32 arybase = PL_curcop->cop_arybase;
2103 offset = POPi - arybase;
2106 tmps = SvPV(big, biglen);
2107 if (offset > 0 && DO_UTF8(big))
2108 sv_pos_u2b(big, &offset, 0);
2111 else if (offset > biglen)
2113 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2114 (unsigned char*)tmps + biglen, little, 0)))
2117 retval = tmps2 - tmps;
2118 if (retval > 0 && DO_UTF8(big))
2119 sv_pos_b2u(big, &retval);
2120 PUSHi(retval + arybase);
2135 I32 arybase = PL_curcop->cop_arybase;
2141 tmps2 = SvPV(little, llen);
2142 tmps = SvPV(big, blen);
2146 if (offset > 0 && DO_UTF8(big))
2147 sv_pos_u2b(big, &offset, 0);
2148 offset = offset - arybase + llen;
2152 else if (offset > blen)
2154 if (!(tmps2 = rninstr(tmps, tmps + offset,
2155 tmps2, tmps2 + llen)))
2158 retval = tmps2 - tmps;
2159 if (retval > 0 && DO_UTF8(big))
2160 sv_pos_b2u(big, &retval);
2161 PUSHi(retval + arybase);
2167 djSP; dMARK; dORIGMARK; dTARGET;
2168 do_sprintf(TARG, SP-MARK, MARK+1);
2169 TAINT_IF(SvTAINTED(TARG));
2181 U8 *tmps = (U8*)SvPVx(tmpsv,n_a);
2184 if ((*tmps & 0x80) && DO_UTF8(tmpsv))
2185 value = utf8_to_uv(tmps, &retlen);
2187 value = (UV)(*tmps & 255);
2198 (void)SvUPGRADE(TARG,SVt_PV);
2200 if (value > 255 && !IN_BYTE) {
2201 SvGROW(TARG, UTF8_MAXLEN+1);
2203 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
2204 SvCUR_set(TARG, tmps - SvPVX(TARG));
2206 (void)SvPOK_only(TARG);
2217 SvUTF8_off(TARG); /* decontaminate */
2218 (void)SvPOK_only(TARG);
2225 djSP; dTARGET; dPOPTOPssrl;
2228 char *tmps = SvPV(left, n_a);
2230 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
2232 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
2236 "The crypt() function is unimplemented due to excessive paranoia.");
2249 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2251 U8 tmpbuf[UTF8_MAXLEN];
2253 UV uv = utf8_to_uv(s, &ulen);
2255 if (PL_op->op_private & OPpLOCALE) {
2258 uv = toTITLE_LC_uni(uv);
2261 uv = toTITLE_utf8(s);
2263 tend = uv_to_utf8(tmpbuf, uv);
2265 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
2267 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2268 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2273 s = (U8*)SvPV_force(sv, slen);
2274 Copy(tmpbuf, s, ulen, U8);
2278 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2280 SvUTF8_off(TARG); /* decontaminate */
2285 s = (U8*)SvPV_force(sv, slen);
2287 if (PL_op->op_private & OPpLOCALE) {
2290 *s = toUPPER_LC(*s);
2308 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2310 U8 tmpbuf[UTF8_MAXLEN];
2312 UV uv = utf8_to_uv(s, &ulen);
2314 if (PL_op->op_private & OPpLOCALE) {
2317 uv = toLOWER_LC_uni(uv);
2320 uv = toLOWER_utf8(s);
2322 tend = uv_to_utf8(tmpbuf, uv);
2324 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
2326 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2327 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2332 s = (U8*)SvPV_force(sv, slen);
2333 Copy(tmpbuf, s, ulen, U8);
2337 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2339 SvUTF8_off(TARG); /* decontaminate */
2344 s = (U8*)SvPV_force(sv, slen);
2346 if (PL_op->op_private & OPpLOCALE) {
2349 *s = toLOWER_LC(*s);
2373 s = (U8*)SvPV(sv,len);
2375 SvUTF8_off(TARG); /* decontaminate */
2376 sv_setpvn(TARG, "", 0);
2380 (void)SvUPGRADE(TARG, SVt_PV);
2381 SvGROW(TARG, (len * 2) + 1);
2382 (void)SvPOK_only(TARG);
2383 d = (U8*)SvPVX(TARG);
2385 if (PL_op->op_private & OPpLOCALE) {
2389 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2395 d = uv_to_utf8(d, toUPPER_utf8( s ));
2401 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2406 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2408 SvUTF8_off(TARG); /* decontaminate */
2413 s = (U8*)SvPV_force(sv, len);
2415 register U8 *send = s + len;
2417 if (PL_op->op_private & OPpLOCALE) {
2420 for (; s < send; s++)
2421 *s = toUPPER_LC(*s);
2424 for (; s < send; s++)
2447 s = (U8*)SvPV(sv,len);
2449 SvUTF8_off(TARG); /* decontaminate */
2450 sv_setpvn(TARG, "", 0);
2454 (void)SvUPGRADE(TARG, SVt_PV);
2455 SvGROW(TARG, (len * 2) + 1);
2456 (void)SvPOK_only(TARG);
2457 d = (U8*)SvPVX(TARG);
2459 if (PL_op->op_private & OPpLOCALE) {
2463 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2469 d = uv_to_utf8(d, toLOWER_utf8(s));
2475 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2480 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
2482 SvUTF8_off(TARG); /* decontaminate */
2488 s = (U8*)SvPV_force(sv, len);
2490 register U8 *send = s + len;
2492 if (PL_op->op_private & OPpLOCALE) {
2495 for (; s < send; s++)
2496 *s = toLOWER_LC(*s);
2499 for (; s < send; s++)
2514 register char *s = SvPV(sv,len);
2517 SvUTF8_off(TARG); /* decontaminate */
2519 (void)SvUPGRADE(TARG, SVt_PV);
2520 SvGROW(TARG, (len * 2) + 1);
2525 STRLEN ulen = UTF8SKIP(s);
2549 SvCUR_set(TARG, d - SvPVX(TARG));
2550 (void)SvPOK_only(TARG);
2553 sv_setpvn(TARG, s, len);
2555 if (SvSMAGICAL(TARG))
2564 djSP; dMARK; dORIGMARK;
2566 register AV* av = (AV*)POPs;
2567 register I32 lval = PL_op->op_flags & OPf_MOD;
2568 I32 arybase = PL_curcop->cop_arybase;
2571 if (SvTYPE(av) == SVt_PVAV) {
2572 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2574 for (svp = MARK + 1; svp <= SP; svp++) {
2579 if (max > AvMAX(av))
2582 while (++MARK <= SP) {
2583 elem = SvIVx(*MARK);
2587 svp = av_fetch(av, elem, lval);
2589 if (!svp || *svp == &PL_sv_undef)
2590 DIE(aTHX_ PL_no_aelem, elem);
2591 if (PL_op->op_private & OPpLVAL_INTRO)
2592 save_aelem(av, elem, svp);
2594 *MARK = svp ? *svp : &PL_sv_undef;
2597 if (GIMME != G_ARRAY) {
2605 /* Associative arrays. */
2610 HV *hash = (HV*)POPs;
2612 I32 gimme = GIMME_V;
2613 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2616 /* might clobber stack_sp */
2617 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2622 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2623 if (gimme == G_ARRAY) {
2626 /* might clobber stack_sp */
2628 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
2633 else if (gimme == G_SCALAR)
2652 I32 gimme = GIMME_V;
2653 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2657 if (PL_op->op_private & OPpSLICE) {
2661 hvtype = SvTYPE(hv);
2662 if (hvtype == SVt_PVHV) { /* hash element */
2663 while (++MARK <= SP) {
2664 sv = hv_delete_ent(hv, *MARK, discard, 0);
2665 *MARK = sv ? sv : &PL_sv_undef;
2668 else if (hvtype == SVt_PVAV) {
2669 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2670 while (++MARK <= SP) {
2671 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
2672 *MARK = sv ? sv : &PL_sv_undef;
2675 else { /* pseudo-hash element */
2676 while (++MARK <= SP) {
2677 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
2678 *MARK = sv ? sv : &PL_sv_undef;
2683 DIE(aTHX_ "Not a HASH reference");
2686 else if (gimme == G_SCALAR) {
2695 if (SvTYPE(hv) == SVt_PVHV)
2696 sv = hv_delete_ent(hv, keysv, discard, 0);
2697 else if (SvTYPE(hv) == SVt_PVAV) {
2698 if (PL_op->op_flags & OPf_SPECIAL)
2699 sv = av_delete((AV*)hv, SvIV(keysv), discard);
2701 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
2704 DIE(aTHX_ "Not a HASH reference");
2719 if (PL_op->op_private & OPpEXISTS_SUB) {
2723 cv = sv_2cv(sv, &hv, &gv, FALSE);
2726 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
2732 if (SvTYPE(hv) == SVt_PVHV) {
2733 if (hv_exists_ent(hv, tmpsv, 0))
2736 else if (SvTYPE(hv) == SVt_PVAV) {
2737 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2738 if (av_exists((AV*)hv, SvIV(tmpsv)))
2741 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
2745 DIE(aTHX_ "Not a HASH reference");
2752 djSP; dMARK; dORIGMARK;
2753 register HV *hv = (HV*)POPs;
2754 register I32 lval = PL_op->op_flags & OPf_MOD;
2755 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2757 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2758 DIE(aTHX_ "Can't localize pseudo-hash element");
2760 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2761 while (++MARK <= SP) {
2765 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2766 svp = he ? &HeVAL(he) : 0;
2769 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2772 if (!svp || *svp == &PL_sv_undef) {
2774 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
2776 if (PL_op->op_private & OPpLVAL_INTRO)
2777 save_helem(hv, keysv, svp);
2779 *MARK = svp ? *svp : &PL_sv_undef;
2782 if (GIMME != G_ARRAY) {
2790 /* List operators. */
2795 if (GIMME != G_ARRAY) {
2797 *MARK = *SP; /* unwanted list, return last item */
2799 *MARK = &PL_sv_undef;
2808 SV **lastrelem = PL_stack_sp;
2809 SV **lastlelem = PL_stack_base + POPMARK;
2810 SV **firstlelem = PL_stack_base + POPMARK + 1;
2811 register SV **firstrelem = lastlelem + 1;
2812 I32 arybase = PL_curcop->cop_arybase;
2813 I32 lval = PL_op->op_flags & OPf_MOD;
2814 I32 is_something_there = lval;
2816 register I32 max = lastrelem - lastlelem;
2817 register SV **lelem;
2820 if (GIMME != G_ARRAY) {
2821 ix = SvIVx(*lastlelem);
2826 if (ix < 0 || ix >= max)
2827 *firstlelem = &PL_sv_undef;
2829 *firstlelem = firstrelem[ix];
2835 SP = firstlelem - 1;
2839 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2845 if (ix < 0 || ix >= max)
2846 *lelem = &PL_sv_undef;
2848 is_something_there = TRUE;
2849 if (!(*lelem = firstrelem[ix]))
2850 *lelem = &PL_sv_undef;
2853 if (is_something_there)
2856 SP = firstlelem - 1;
2862 djSP; dMARK; dORIGMARK;
2863 I32 items = SP - MARK;
2864 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2865 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2872 djSP; dMARK; dORIGMARK;
2873 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2877 SV *val = NEWSV(46, 0);
2879 sv_setsv(val, *++MARK);
2880 else if (ckWARN(WARN_MISC))
2881 Perl_warner(aTHX_ WARN_MISC, "Odd number of elements in hash assignment");
2882 (void)hv_store_ent(hv,key,val,0);
2891 djSP; dMARK; dORIGMARK;
2892 register AV *ary = (AV*)*++MARK;
2896 register I32 offset;
2897 register I32 length;
2904 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2905 *MARK-- = SvTIED_obj((SV*)ary, mg);
2909 call_method("SPLICE",GIMME_V);
2918 offset = i = SvIVx(*MARK);
2920 offset += AvFILLp(ary) + 1;
2922 offset -= PL_curcop->cop_arybase;
2924 DIE(aTHX_ PL_no_aelem, i);
2926 length = SvIVx(*MARK++);
2928 length += AvFILLp(ary) - offset + 1;
2934 length = AvMAX(ary) + 1; /* close enough to infinity */
2938 length = AvMAX(ary) + 1;
2940 if (offset > AvFILLp(ary) + 1)
2941 offset = AvFILLp(ary) + 1;
2942 after = AvFILLp(ary) + 1 - (offset + length);
2943 if (after < 0) { /* not that much array */
2944 length += after; /* offset+length now in array */
2950 /* At this point, MARK .. SP-1 is our new LIST */
2953 diff = newlen - length;
2954 if (newlen && !AvREAL(ary) && AvREIFY(ary))
2957 if (diff < 0) { /* shrinking the area */
2959 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2960 Copy(MARK, tmparyval, newlen, SV*);
2963 MARK = ORIGMARK + 1;
2964 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2965 MEXTEND(MARK, length);
2966 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2968 EXTEND_MORTAL(length);
2969 for (i = length, dst = MARK; i; i--) {
2970 sv_2mortal(*dst); /* free them eventualy */
2977 *MARK = AvARRAY(ary)[offset+length-1];
2980 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2981 SvREFCNT_dec(*dst++); /* free them now */
2984 AvFILLp(ary) += diff;
2986 /* pull up or down? */
2988 if (offset < after) { /* easier to pull up */
2989 if (offset) { /* esp. if nothing to pull */
2990 src = &AvARRAY(ary)[offset-1];
2991 dst = src - diff; /* diff is negative */
2992 for (i = offset; i > 0; i--) /* can't trust Copy */
2996 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
3000 if (after) { /* anything to pull down? */
3001 src = AvARRAY(ary) + offset + length;
3002 dst = src + diff; /* diff is negative */
3003 Move(src, dst, after, SV*);
3005 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
3006 /* avoid later double free */
3010 dst[--i] = &PL_sv_undef;
3013 for (src = tmparyval, dst = AvARRAY(ary) + offset;
3015 *dst = NEWSV(46, 0);
3016 sv_setsv(*dst++, *src++);
3018 Safefree(tmparyval);
3021 else { /* no, expanding (or same) */
3023 New(452, tmparyval, length, SV*); /* so remember deletion */
3024 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
3027 if (diff > 0) { /* expanding */
3029 /* push up or down? */
3031 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
3035 Move(src, dst, offset, SV*);
3037 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
3039 AvFILLp(ary) += diff;
3042 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
3043 av_extend(ary, AvFILLp(ary) + diff);
3044 AvFILLp(ary) += diff;
3047 dst = AvARRAY(ary) + AvFILLp(ary);
3049 for (i = after; i; i--) {
3056 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
3057 *dst = NEWSV(46, 0);
3058 sv_setsv(*dst++, *src++);
3060 MARK = ORIGMARK + 1;
3061 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3063 Copy(tmparyval, MARK, length, SV*);
3065 EXTEND_MORTAL(length);
3066 for (i = length, dst = MARK; i; i--) {
3067 sv_2mortal(*dst); /* free them eventualy */
3071 Safefree(tmparyval);
3075 else if (length--) {
3076 *MARK = tmparyval[length];
3079 while (length-- > 0)
3080 SvREFCNT_dec(tmparyval[length]);
3082 Safefree(tmparyval);
3085 *MARK = &PL_sv_undef;
3093 djSP; dMARK; dORIGMARK; dTARGET;
3094 register AV *ary = (AV*)*++MARK;
3095 register SV *sv = &PL_sv_undef;
3098 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3099 *MARK-- = SvTIED_obj((SV*)ary, mg);
3103 call_method("PUSH",G_SCALAR|G_DISCARD);
3108 /* Why no pre-extend of ary here ? */
3109 for (++MARK; MARK <= SP; MARK++) {
3112 sv_setsv(sv, *MARK);
3117 PUSHi( AvFILL(ary) + 1 );
3125 SV *sv = av_pop(av);
3127 (void)sv_2mortal(sv);
3136 SV *sv = av_shift(av);
3141 (void)sv_2mortal(sv);
3148 djSP; dMARK; dORIGMARK; dTARGET;
3149 register AV *ary = (AV*)*++MARK;
3154 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3155 *MARK-- = SvTIED_obj((SV*)ary, mg);
3159 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3164 av_unshift(ary, SP - MARK);
3167 sv_setsv(sv, *++MARK);
3168 (void)av_store(ary, i++, sv);
3172 PUSHi( AvFILL(ary) + 1 );
3182 if (GIMME == G_ARRAY) {
3189 /* safe as long as stack cannot get extended in the above */
3194 register char *down;
3199 SvUTF8_off(TARG); /* decontaminate */
3201 do_join(TARG, &PL_sv_no, MARK, SP);
3203 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3204 up = SvPV_force(TARG, len);
3206 if (DO_UTF8(TARG)) { /* first reverse each character */
3207 U8* s = (U8*)SvPVX(TARG);
3208 U8* send = (U8*)(s + len);
3217 down = (char*)(s - 1);
3218 if (s > send || !((*down & 0xc0) == 0x80)) {
3219 if (ckWARN_d(WARN_UTF8))
3220 Perl_warner(aTHX_ WARN_UTF8,
3221 "Malformed UTF-8 character");
3233 down = SvPVX(TARG) + len - 1;
3239 (void)SvPOK_only(TARG);
3248 S_mul128(pTHX_ SV *sv, U8 m)
3251 char *s = SvPV(sv, len);
3255 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
3256 SV *tmpNew = newSVpvn("0000000000", 10);
3258 sv_catsv(tmpNew, sv);
3259 SvREFCNT_dec(sv); /* free old sv */
3264 while (!*t) /* trailing '\0'? */
3267 i = ((*t - '0') << 7) + m;
3268 *(t--) = '0' + (i % 10);
3274 /* Explosives and implosives. */
3276 #if 'I' == 73 && 'J' == 74
3277 /* On an ASCII/ISO kind of system */
3278 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
3281 Some other sort of character set - use memchr() so we don't match
3284 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
3291 I32 start_sp_offset = SP - PL_stack_base;
3292 I32 gimme = GIMME_V;
3296 register char *pat = SvPV(left, llen);
3297 register char *s = SvPV(right, rlen);
3298 char *strend = s + rlen;
3300 register char *patend = pat + llen;
3306 /* These must not be in registers: */
3323 register U32 culong;
3327 #ifdef PERL_NATINT_PACK
3328 int natint; /* native integer */
3329 int unatint; /* unsigned native integer */
3332 if (gimme != G_ARRAY) { /* arrange to do first one only */
3334 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3335 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
3337 while (isDIGIT(*patend) || *patend == '*')
3343 while (pat < patend) {
3345 datumtype = *pat++ & 0xFF;
3346 #ifdef PERL_NATINT_PACK
3349 if (isSPACE(datumtype))
3351 if (datumtype == '#') {
3352 while (pat < patend && *pat != '\n')
3357 char *natstr = "sSiIlL";
3359 if (strchr(natstr, datumtype)) {
3360 #ifdef PERL_NATINT_PACK
3366 DIE(aTHX_ "'!' allowed only after types %s", natstr);
3371 else if (*pat == '*') {
3372 len = strend - strbeg; /* long enough */
3376 else if (isDIGIT(*pat)) {
3378 while (isDIGIT(*pat)) {
3379 len = (len * 10) + (*pat++ - '0');
3381 DIE(aTHX_ "Repeat count in unpack overflows");
3385 len = (datumtype != '@');
3389 DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
3390 case ',': /* grandfather in commas but with a warning */
3391 if (commas++ == 0 && ckWARN(WARN_UNPACK))
3392 Perl_warner(aTHX_ WARN_UNPACK,
3393 "Invalid type in unpack: '%c'", (int)datumtype);
3396 if (len == 1 && pat[-1] != '1')
3405 if (len > strend - strbeg)
3406 DIE(aTHX_ "@ outside of string");
3410 if (len > s - strbeg)
3411 DIE(aTHX_ "X outside of string");
3415 if (len > strend - s)
3416 DIE(aTHX_ "x outside of string");
3420 if (start_sp_offset >= SP - PL_stack_base)
3421 DIE(aTHX_ "/ must follow a numeric type");
3424 pat++; /* ignore '*' for compatibility with pack */
3426 DIE(aTHX_ "/ cannot take a count" );
3433 if (len > strend - s)
3436 goto uchar_checksum;
3437 sv = NEWSV(35, len);
3438 sv_setpvn(sv, s, len);
3440 if (datumtype == 'A' || datumtype == 'Z') {
3441 aptr = s; /* borrow register */
3442 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
3447 else { /* 'A' strips both nulls and spaces */
3448 s = SvPVX(sv) + len - 1;
3449 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3453 SvCUR_set(sv, s - SvPVX(sv));
3454 s = aptr; /* unborrow register */
3456 XPUSHs(sv_2mortal(sv));
3460 if (star || len > (strend - s) * 8)
3461 len = (strend - s) * 8;
3464 Newz(601, PL_bitcount, 256, char);
3465 for (bits = 1; bits < 256; bits++) {
3466 if (bits & 1) PL_bitcount[bits]++;
3467 if (bits & 2) PL_bitcount[bits]++;
3468 if (bits & 4) PL_bitcount[bits]++;
3469 if (bits & 8) PL_bitcount[bits]++;
3470 if (bits & 16) PL_bitcount[bits]++;
3471 if (bits & 32) PL_bitcount[bits]++;
3472 if (bits & 64) PL_bitcount[bits]++;
3473 if (bits & 128) PL_bitcount[bits]++;
3477 culong += PL_bitcount[*(unsigned char*)s++];
3482 if (datumtype == 'b') {
3484 if (bits & 1) culong++;
3490 if (bits & 128) culong++;
3497 sv = NEWSV(35, len + 1);
3501 if (datumtype == 'b') {
3503 for (len = 0; len < aint; len++) {
3504 if (len & 7) /*SUPPRESS 595*/
3508 *str++ = '0' + (bits & 1);
3513 for (len = 0; len < aint; len++) {
3518 *str++ = '0' + ((bits & 128) != 0);
3522 XPUSHs(sv_2mortal(sv));
3526 if (star || len > (strend - s) * 2)
3527 len = (strend - s) * 2;
3528 sv = NEWSV(35, len + 1);
3532 if (datumtype == 'h') {
3534 for (len = 0; len < aint; len++) {
3539 *str++ = PL_hexdigit[bits & 15];
3544 for (len = 0; len < aint; len++) {
3549 *str++ = PL_hexdigit[(bits >> 4) & 15];
3553 XPUSHs(sv_2mortal(sv));
3556 if (len > strend - s)
3561 if (aint >= 128) /* fake up signed chars */
3571 if (aint >= 128) /* fake up signed chars */
3574 sv_setiv(sv, (IV)aint);
3575 PUSHs(sv_2mortal(sv));
3580 if (len > strend - s)
3595 sv_setiv(sv, (IV)auint);
3596 PUSHs(sv_2mortal(sv));
3601 if (len > strend - s)
3604 while (len-- > 0 && s < strend) {
3605 auint = utf8_to_uv((U8*)s, &along);
3608 cdouble += (NV)auint;
3616 while (len-- > 0 && s < strend) {
3617 auint = utf8_to_uv((U8*)s, &along);
3620 sv_setuv(sv, (UV)auint);
3621 PUSHs(sv_2mortal(sv));
3626 #if SHORTSIZE == SIZE16
3627 along = (strend - s) / SIZE16;
3629 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
3634 #if SHORTSIZE != SIZE16
3638 COPYNN(s, &ashort, sizeof(short));
3649 #if SHORTSIZE > SIZE16
3661 #if SHORTSIZE != SIZE16
3665 COPYNN(s, &ashort, sizeof(short));
3668 sv_setiv(sv, (IV)ashort);
3669 PUSHs(sv_2mortal(sv));
3677 #if SHORTSIZE > SIZE16
3683 sv_setiv(sv, (IV)ashort);
3684 PUSHs(sv_2mortal(sv));
3692 #if SHORTSIZE == SIZE16
3693 along = (strend - s) / SIZE16;
3695 unatint = natint && datumtype == 'S';
3696 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
3701 #if SHORTSIZE != SIZE16
3703 unsigned short aushort;
3705 COPYNN(s, &aushort, sizeof(unsigned short));
3706 s += sizeof(unsigned short);
3714 COPY16(s, &aushort);
3717 if (datumtype == 'n')
3718 aushort = PerlSock_ntohs(aushort);
3721 if (datumtype == 'v')
3722 aushort = vtohs(aushort);
3731 #if SHORTSIZE != SIZE16
3733 unsigned short aushort;
3735 COPYNN(s, &aushort, sizeof(unsigned short));
3736 s += sizeof(unsigned short);
3738 sv_setiv(sv, (UV)aushort);
3739 PUSHs(sv_2mortal(sv));
3746 COPY16(s, &aushort);
3750 if (datumtype == 'n')
3751 aushort = PerlSock_ntohs(aushort);
3754 if (datumtype == 'v')
3755 aushort = vtohs(aushort);
3757 sv_setiv(sv, (UV)aushort);
3758 PUSHs(sv_2mortal(sv));
3764 along = (strend - s) / sizeof(int);
3769 Copy(s, &aint, 1, int);
3772 cdouble += (NV)aint;
3781 Copy(s, &aint, 1, int);
3785 /* Without the dummy below unpack("i", pack("i",-1))
3786 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3787 * cc with optimization turned on.
3789 * The bug was detected in
3790 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
3791 * with optimization (-O4) turned on.
3792 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
3793 * does not have this problem even with -O4.
3795 * This bug was reported as DECC_BUGS 1431
3796 * and tracked internally as GEM_BUGS 7775.
3798 * The bug is fixed in
3799 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
3800 * UNIX V4.0F support: DEC C V5.9-006 or later
3801 * UNIX V4.0E support: DEC C V5.8-011 or later
3804 * See also few lines later for the same bug.
3807 sv_setiv(sv, (IV)aint) :
3809 sv_setiv(sv, (IV)aint);
3810 PUSHs(sv_2mortal(sv));
3815 along = (strend - s) / sizeof(unsigned int);
3820 Copy(s, &auint, 1, unsigned int);
3821 s += sizeof(unsigned int);
3823 cdouble += (NV)auint;
3832 Copy(s, &auint, 1, unsigned int);
3833 s += sizeof(unsigned int);
3836 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
3837 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
3838 * See details few lines earlier. */
3840 sv_setuv(sv, (UV)auint) :
3842 sv_setuv(sv, (UV)auint);
3843 PUSHs(sv_2mortal(sv));
3848 #if LONGSIZE == SIZE32
3849 along = (strend - s) / SIZE32;
3851 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
3856 #if LONGSIZE != SIZE32
3860 COPYNN(s, &along, sizeof(long));
3863 cdouble += (NV)along;
3873 #if LONGSIZE > SIZE32
3874 if (along > 2147483647)
3875 along -= 4294967296;
3879 cdouble += (NV)along;
3888 #if LONGSIZE != SIZE32
3892 COPYNN(s, &along, sizeof(long));
3895 sv_setiv(sv, (IV)along);
3896 PUSHs(sv_2mortal(sv));
3904 #if LONGSIZE > SIZE32
3905 if (along > 2147483647)
3906 along -= 4294967296;
3910 sv_setiv(sv, (IV)along);
3911 PUSHs(sv_2mortal(sv));
3919 #if LONGSIZE == SIZE32
3920 along = (strend - s) / SIZE32;
3922 unatint = natint && datumtype == 'L';
3923 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
3928 #if LONGSIZE != SIZE32
3930 unsigned long aulong;
3932 COPYNN(s, &aulong, sizeof(unsigned long));
3933 s += sizeof(unsigned long);
3935 cdouble += (NV)aulong;
3947 if (datumtype == 'N')
3948 aulong = PerlSock_ntohl(aulong);
3951 if (datumtype == 'V')
3952 aulong = vtohl(aulong);
3955 cdouble += (NV)aulong;
3964 #if LONGSIZE != SIZE32
3966 unsigned long aulong;
3968 COPYNN(s, &aulong, sizeof(unsigned long));
3969 s += sizeof(unsigned long);
3971 sv_setuv(sv, (UV)aulong);
3972 PUSHs(sv_2mortal(sv));
3982 if (datumtype == 'N')
3983 aulong = PerlSock_ntohl(aulong);
3986 if (datumtype == 'V')
3987 aulong = vtohl(aulong);
3990 sv_setuv(sv, (UV)aulong);
3991 PUSHs(sv_2mortal(sv));
3997 along = (strend - s) / sizeof(char*);
4003 if (sizeof(char*) > strend - s)
4006 Copy(s, &aptr, 1, char*);
4012 PUSHs(sv_2mortal(sv));
4022 while ((len > 0) && (s < strend)) {
4023 auv = (auv << 7) | (*s & 0x7f);
4024 if (!(*s++ & 0x80)) {
4028 PUSHs(sv_2mortal(sv));
4032 else if (++bytes >= sizeof(UV)) { /* promote to string */
4036 sv = Perl_newSVpvf(aTHX_ "%.*Vu", (int)TYPE_DIGITS(UV), auv);
4037 while (s < strend) {
4038 sv = mul128(sv, *s & 0x7f);
4039 if (!(*s++ & 0x80)) {
4048 PUSHs(sv_2mortal(sv));
4053 if ((s >= strend) && bytes)
4054 DIE(aTHX_ "Unterminated compressed integer");
4059 if (sizeof(char*) > strend - s)
4062 Copy(s, &aptr, 1, char*);
4067 sv_setpvn(sv, aptr, len);
4068 PUSHs(sv_2mortal(sv));
4072 along = (strend - s) / sizeof(Quad_t);
4078 if (s + sizeof(Quad_t) > strend)
4081 Copy(s, &aquad, 1, Quad_t);
4082 s += sizeof(Quad_t);
4085 if (aquad >= IV_MIN && aquad <= IV_MAX)
4086 sv_setiv(sv, (IV)aquad);
4088 sv_setnv(sv, (NV)aquad);
4089 PUSHs(sv_2mortal(sv));
4093 along = (strend - s) / sizeof(Quad_t);
4099 if (s + sizeof(Uquad_t) > strend)
4102 Copy(s, &auquad, 1, Uquad_t);
4103 s += sizeof(Uquad_t);
4106 if (auquad <= UV_MAX)
4107 sv_setuv(sv, (UV)auquad);
4109 sv_setnv(sv, (NV)auquad);
4110 PUSHs(sv_2mortal(sv));
4114 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
4117 along = (strend - s) / sizeof(float);
4122 Copy(s, &afloat, 1, float);
4131 Copy(s, &afloat, 1, float);
4134 sv_setnv(sv, (NV)afloat);
4135 PUSHs(sv_2mortal(sv));
4141 along = (strend - s) / sizeof(double);
4146 Copy(s, &adouble, 1, double);
4147 s += sizeof(double);
4155 Copy(s, &adouble, 1, double);
4156 s += sizeof(double);
4158 sv_setnv(sv, (NV)adouble);
4159 PUSHs(sv_2mortal(sv));
4165 * Initialise the decode mapping. By using a table driven
4166 * algorithm, the code will be character-set independent
4167 * (and just as fast as doing character arithmetic)
4169 if (PL_uudmap['M'] == 0) {
4172 for (i = 0; i < sizeof(PL_uuemap); i += 1)
4173 PL_uudmap[PL_uuemap[i]] = i;
4175 * Because ' ' and '`' map to the same value,
4176 * we need to decode them both the same.
4181 along = (strend - s) * 3 / 4;
4182 sv = NEWSV(42, along);
4185 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
4190 len = PL_uudmap[*s++] & 077;
4192 if (s < strend && ISUUCHAR(*s))
4193 a = PL_uudmap[*s++] & 077;
4196 if (s < strend && ISUUCHAR(*s))
4197 b = PL_uudmap[*s++] & 077;
4200 if (s < strend && ISUUCHAR(*s))
4201 c = PL_uudmap[*s++] & 077;
4204 if (s < strend && ISUUCHAR(*s))
4205 d = PL_uudmap[*s++] & 077;
4208 hunk[0] = (a << 2) | (b >> 4);
4209 hunk[1] = (b << 4) | (c >> 2);
4210 hunk[2] = (c << 6) | d;
4211 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
4216 else if (s[1] == '\n') /* possible checksum byte */
4219 XPUSHs(sv_2mortal(sv));
4224 if (strchr("fFdD", datumtype) ||
4225 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
4229 while (checksum >= 16) {
4233 while (checksum >= 4) {
4239 along = (1 << checksum) - 1;
4240 while (cdouble < 0.0)
4242 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
4243 sv_setnv(sv, cdouble);
4246 if (checksum < 32) {
4247 aulong = (1 << checksum) - 1;
4250 sv_setuv(sv, (UV)culong);
4252 XPUSHs(sv_2mortal(sv));
4256 if (SP - PL_stack_base == start_sp_offset && gimme == G_SCALAR)
4257 PUSHs(&PL_sv_undef);
4262 S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
4266 *hunk = PL_uuemap[len];
4267 sv_catpvn(sv, hunk, 1);
4270 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4271 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
4272 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
4273 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
4274 sv_catpvn(sv, hunk, 4);
4279 char r = (len > 1 ? s[1] : '\0');
4280 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4281 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
4282 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
4283 hunk[3] = PL_uuemap[0];
4284 sv_catpvn(sv, hunk, 4);
4286 sv_catpvn(sv, "\n", 1);
4290 S_is_an_int(pTHX_ char *s, STRLEN l)
4293 SV *result = newSVpvn(s, l);
4294 char *result_c = SvPV(result, n_a); /* convenience */
4295 char *out = result_c;
4305 SvREFCNT_dec(result);
4328 SvREFCNT_dec(result);
4334 SvCUR_set(result, out - result_c);
4338 /* pnum must be '\0' terminated */
4340 S_div128(pTHX_ SV *pnum, bool *done)
4343 char *s = SvPV(pnum, len);
4352 i = m * 10 + (*t - '0');
4354 r = (i >> 7); /* r < 10 */
4361 SvCUR_set(pnum, (STRLEN) (t - s));
4368 djSP; dMARK; dORIGMARK; dTARGET;
4369 register SV *cat = TARG;
4372 register char *pat = SvPVx(*++MARK, fromlen);
4373 register char *patend = pat + fromlen;
4378 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4379 static char *space10 = " ";
4381 /* These must not be in registers: */
4396 #ifdef PERL_NATINT_PACK
4397 int natint; /* native integer */
4402 sv_setpvn(cat, "", 0);
4403 while (pat < patend) {
4404 SV *lengthcode = Nullsv;
4405 #define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
4406 datumtype = *pat++ & 0xFF;
4407 #ifdef PERL_NATINT_PACK
4410 if (isSPACE(datumtype))
4412 if (datumtype == '#') {
4413 while (pat < patend && *pat != '\n')
4418 char *natstr = "sSiIlL";
4420 if (strchr(natstr, datumtype)) {
4421 #ifdef PERL_NATINT_PACK
4427 DIE(aTHX_ "'!' allowed only after types %s", natstr);
4430 len = strchr("@Xxu", datumtype) ? 0 : items;
4433 else if (isDIGIT(*pat)) {
4435 while (isDIGIT(*pat)) {
4436 len = (len * 10) + (*pat++ - '0');
4438 DIE(aTHX_ "Repeat count in pack overflows");
4445 if (*pat != 'a' && *pat != 'A' && *pat != 'Z' || pat[1] != '*')
4446 DIE(aTHX_ "/ must be followed by a*, A* or Z*");
4447 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
4448 ? *MARK : &PL_sv_no)));
4452 DIE(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
4453 case ',': /* grandfather in commas but with a warning */
4454 if (commas++ == 0 && ckWARN(WARN_PACK))
4455 Perl_warner(aTHX_ WARN_PACK,
4456 "Invalid type in pack: '%c'", (int)datumtype);
4459 DIE(aTHX_ "%% may only be used in unpack");
4470 if (SvCUR(cat) < len)
4471 DIE(aTHX_ "X outside of string");
4478 sv_catpvn(cat, null10, 10);
4481 sv_catpvn(cat, null10, len);
4487 aptr = SvPV(fromstr, fromlen);
4488 if (pat[-1] == '*') {
4490 if (datumtype == 'Z')
4493 if (fromlen >= len) {
4494 sv_catpvn(cat, aptr, len);
4495 if (datumtype == 'Z')
4496 *(SvEND(cat)-1) = '\0';
4499 sv_catpvn(cat, aptr, fromlen);
4501 if (datumtype == 'A') {
4503 sv_catpvn(cat, space10, 10);
4506 sv_catpvn(cat, space10, len);
4510 sv_catpvn(cat, null10, 10);
4513 sv_catpvn(cat, null10, len);
4525 str = SvPV(fromstr, fromlen);
4529 SvCUR(cat) += (len+7)/8;
4530 SvGROW(cat, SvCUR(cat) + 1);
4531 aptr = SvPVX(cat) + aint;
4536 if (datumtype == 'B') {
4537 for (len = 0; len++ < aint;) {
4538 items |= *str++ & 1;
4542 *aptr++ = items & 0xff;
4548 for (len = 0; len++ < aint;) {
4554 *aptr++ = items & 0xff;
4560 if (datumtype == 'B')
4561 items <<= 7 - (aint & 7);
4563 items >>= 7 - (aint & 7);
4564 *aptr++ = items & 0xff;
4566 str = SvPVX(cat) + SvCUR(cat);
4581 str = SvPV(fromstr, fromlen);
4585 SvCUR(cat) += (len+1)/2;
4586 SvGROW(cat, SvCUR(cat) + 1);
4587 aptr = SvPVX(cat) + aint;
4592 if (datumtype == 'H') {
4593 for (len = 0; len++ < aint;) {
4595 items |= ((*str++ & 15) + 9) & 15;
4597 items |= *str++ & 15;
4601 *aptr++ = items & 0xff;
4607 for (len = 0; len++ < aint;) {
4609 items |= (((*str++ & 15) + 9) & 15) << 4;
4611 items |= (*str++ & 15) << 4;
4615 *aptr++ = items & 0xff;
4621 *aptr++ = items & 0xff;
4622 str = SvPVX(cat) + SvCUR(cat);
4633 aint = SvIV(fromstr);
4635 sv_catpvn(cat, &achar, sizeof(char));
4641 auint = SvUV(fromstr);
4642 SvGROW(cat, SvCUR(cat) + UTF8_MAXLEN);
4643 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4648 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4653 afloat = (float)SvNV(fromstr);
4654 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4661 adouble = (double)SvNV(fromstr);
4662 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4668 ashort = (I16)SvIV(fromstr);
4670 ashort = PerlSock_htons(ashort);
4672 CAT16(cat, &ashort);
4678 ashort = (I16)SvIV(fromstr);
4680 ashort = htovs(ashort);
4682 CAT16(cat, &ashort);
4686 #if SHORTSIZE != SIZE16
4688 unsigned short aushort;
4692 aushort = SvUV(fromstr);
4693 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
4703 aushort = (U16)SvUV(fromstr);
4704 CAT16(cat, &aushort);
4710 #if SHORTSIZE != SIZE16
4716 ashort = SvIV(fromstr);
4717 sv_catpvn(cat, (char *)&ashort, sizeof(short));
4725 ashort = (I16)SvIV(fromstr);
4726 CAT16(cat, &ashort);
4733 auint = SvUV(fromstr);
4734 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4740 adouble = Perl_floor(SvNV(fromstr));
4743 DIE(aTHX_ "Cannot compress negative numbers");
4746 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
4747 adouble <= UV_MAX_cxux
4753 char buf[1 + sizeof(UV)];
4754 char *in = buf + sizeof(buf);
4755 UV auv = U_V(adouble);
4758 *--in = (auv & 0x7f) | 0x80;
4761 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4762 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4764 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4765 char *from, *result, *in;
4770 /* Copy string and check for compliance */
4771 from = SvPV(fromstr, len);
4772 if ((norm = is_an_int(from, len)) == NULL)
4773 DIE(aTHX_ "can compress only unsigned integer");
4775 New('w', result, len, char);
4779 *--in = div128(norm, &done) | 0x80;
4780 result[len - 1] &= 0x7F; /* clear continue bit */
4781 sv_catpvn(cat, in, (result + len) - in);
4783 SvREFCNT_dec(norm); /* free norm */
4785 else if (SvNOKp(fromstr)) {
4786 char buf[sizeof(doub