3 * Copyright (c) 1991-1997, 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
19 * The compiler on Concurrent CX/UX systems has a subtle bug which only
20 * seems to show up when compiling pp.c - it generates the wrong double
21 * precision constant value for (double)UV_MAX when used inline in the body
22 * of the code below, so this makes a static variable up front (which the
23 * compiler seems to get correct) and uses it in place of UV_MAX below.
25 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
26 static double UV_MAX_cxux = ((double)UV_MAX);
30 * Types used in bitwise operations.
32 * Normally we'd just use IV and UV. However, some hardware and
33 * software combinations (e.g. Alpha and current OSF/1) don't have a
34 * floating-point type to use for NV that has adequate bits to fully
35 * hold an IV/UV. (In other words, sizeof(long) == sizeof(double).)
37 * It just so happens that "int" is the right size almost everywhere.
43 * Mask used after bitwise operations.
45 * There is at least one realm (Cray word machines) that doesn't
46 * have an integral type (except char) small enough to be represented
47 * in a double without loss; that is, it has no 32-bit type.
49 #if LONGSIZE > 4 && defined(_CRAY) && !defined(_CRAYMPP)
51 # define BW_MASK ((1 << BW_BITS) - 1)
52 # define BW_SIGN (1 << (BW_BITS - 1))
53 # define BWi(i) (((i) & BW_SIGN) ? ((i) | ~BW_MASK) : ((i) & BW_MASK))
54 # define BWu(u) ((u) & BW_MASK)
61 * Offset for integer pack/unpack.
63 * On architectures where I16 and I32 aren't really 16 and 32 bits,
64 * which for now are all Crays, pack and unpack have to play games.
68 * These values are required for portability of pack() output.
69 * If they're not right on your machine, then pack() and unpack()
70 * wouldn't work right anyway; you'll need to apply the Cray hack.
71 * (I'd like to check them with #if, but you can't use sizeof() in
72 * the preprocessor.) --???
75 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
76 defines are now in config.h. --Andy Dougherty April 1998
81 #if BYTEORDER > 0xFFFF && defined(_CRAY) && !defined(_CRAYMPP)
82 # if BYTEORDER == 0x12345678
83 # define OFF16(p) (char*)(p)
84 # define OFF32(p) (char*)(p)
86 # if BYTEORDER == 0x87654321
87 # define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
88 # define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
90 }}}} bad cray byte order
93 # define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
94 # define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
95 # define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
96 # define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
98 # define COPY16(s,p) Copy(s, p, SIZE16, char)
99 # define COPY32(s,p) Copy(s, p, SIZE32, char)
100 # define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
101 # define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
105 static void doencodes _((SV* sv, char* s, I32 len));
106 static SV* refto _((SV* sv));
107 static U32 seed _((void));
110 static bool srand_called = FALSE;
112 /* variations on pp_null */
118 /* XXX I can't imagine anyone who doesn't have this actually _needs_
119 it, since pid_t is an integral type.
122 #ifdef NEED_GETPID_PROTO
123 extern Pid_t getpid (void);
129 if (GIMME_V == G_SCALAR)
130 XPUSHs(&PL_sv_undef);
144 if (PL_op->op_private & OPpLVAL_INTRO)
145 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
147 if (PL_op->op_flags & OPf_REF) {
151 if (GIMME == G_ARRAY) {
152 I32 maxarg = AvFILL((AV*)TARG) + 1;
154 if (SvMAGICAL(TARG)) {
156 for (i=0; i < maxarg; i++) {
157 SV **svp = av_fetch((AV*)TARG, i, FALSE);
158 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
162 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
167 SV* sv = sv_newmortal();
168 I32 maxarg = AvFILL((AV*)TARG) + 1;
169 sv_setiv(sv, maxarg);
181 if (PL_op->op_private & OPpLVAL_INTRO)
182 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
183 if (PL_op->op_flags & OPf_REF)
186 if (gimme == G_ARRAY) {
187 RETURNOP(do_kv(ARGS));
189 else if (gimme == G_SCALAR) {
190 SV* sv = sv_newmortal();
191 if (HvFILL((HV*)TARG))
192 sv_setpvf(sv, "%ld/%ld",
193 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
203 DIE("NOT IMPL LINE %d",__LINE__);
215 if (SvTYPE(sv) == SVt_PVIO) {
216 GV *gv = (GV*) sv_newmortal();
217 gv_init(gv, 0, "", 0, 0);
218 GvIOp(gv) = (IO *)sv;
219 (void)SvREFCNT_inc(sv);
221 } else if (SvTYPE(sv) != SVt_PVGV)
222 DIE("Not a GLOB reference");
225 if (SvTYPE(sv) != SVt_PVGV) {
228 if (SvGMAGICAL(sv)) {
234 if (PL_op->op_flags & OPf_REF ||
235 PL_op->op_private & HINT_STRICT_REFS)
236 DIE(PL_no_usym, "a symbol");
237 if (ckWARN(WARN_UNINITIALIZED))
238 warner(WARN_UNINITIALIZED, PL_warn_uninit);
241 sym = SvPV(sv, PL_na);
242 if (PL_op->op_private & HINT_STRICT_REFS)
243 DIE(PL_no_symref, sym, "a symbol");
244 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
247 if (PL_op->op_private & OPpLVAL_INTRO)
248 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
260 switch (SvTYPE(sv)) {
264 DIE("Not a SCALAR reference");
271 if (SvTYPE(gv) != SVt_PVGV) {
272 if (SvGMAGICAL(sv)) {
278 if (PL_op->op_flags & OPf_REF ||
279 PL_op->op_private & HINT_STRICT_REFS)
280 DIE(PL_no_usym, "a SCALAR");
281 if (ckWARN(WARN_UNINITIALIZED))
282 warner(WARN_UNINITIALIZED, PL_warn_uninit);
285 sym = SvPV(sv, PL_na);
286 if (PL_op->op_private & HINT_STRICT_REFS)
287 DIE(PL_no_symref, sym, "a SCALAR");
288 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
292 if (PL_op->op_flags & OPf_MOD) {
293 if (PL_op->op_private & OPpLVAL_INTRO)
294 sv = save_scalar((GV*)TOPs);
295 else if (PL_op->op_private & OPpDEREF)
296 vivify_ref(sv, PL_op->op_private & OPpDEREF);
306 SV *sv = AvARYLEN(av);
308 AvARYLEN(av) = sv = NEWSV(0,0);
309 sv_upgrade(sv, SVt_IV);
310 sv_magic(sv, (SV*)av, '#', Nullch, 0);
318 djSP; dTARGET; dPOPss;
320 if (PL_op->op_flags & OPf_MOD) {
321 if (SvTYPE(TARG) < SVt_PVLV) {
322 sv_upgrade(TARG, SVt_PVLV);
323 sv_magic(TARG, Nullsv, '.', Nullch, 0);
327 if (LvTARG(TARG) != sv) {
329 SvREFCNT_dec(LvTARG(TARG));
330 LvTARG(TARG) = SvREFCNT_inc(sv);
332 PUSHs(TARG); /* no SvSETMAGIC */
338 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
339 mg = mg_find(sv, 'g');
340 if (mg && mg->mg_len >= 0) {
344 PUSHi(i + PL_curcop->cop_arybase);
358 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
359 /* (But not in defined().) */
360 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
363 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
366 cv = (CV*)&PL_sv_undef;
380 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
381 char *s = SvPVX(TOPs);
382 if (strnEQ(s, "CORE::", 6)) {
385 code = keyword(s + 6, SvCUR(TOPs) - 6);
386 if (code < 0) { /* Overridable. */
387 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
388 int i = 0, n = 0, seen_question = 0;
390 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
392 while (i < MAXO) { /* The slow way. */
393 if (strEQ(s + 6, PL_op_name[i])
394 || strEQ(s + 6, PL_op_desc[i]))
400 goto nonesuch; /* Should not happen... */
402 oa = PL_opargs[i] >> OASHIFT;
404 if (oa & OA_OPTIONAL) {
407 } else if (seen_question)
408 goto set; /* XXXX system, exec */
409 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
410 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
413 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
414 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
418 ret = sv_2mortal(newSVpv(str, n - 1));
419 } else if (code) /* Non-Overridable */
421 else { /* None such */
423 croak("Cannot find an opnumber for \"%s\"", s+6);
427 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
429 ret = sv_2mortal(newSVpv(SvPVX(cv), SvCUR(cv)));
438 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
440 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
456 if (GIMME != G_ARRAY) {
460 *MARK = &PL_sv_undef;
461 *MARK = refto(*MARK);
465 EXTEND_MORTAL(SP - MARK);
467 *MARK = refto(*MARK);
476 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
479 if (!(sv = LvTARG(sv)))
482 else if (SvPADTMP(sv))
486 (void)SvREFCNT_inc(sv);
489 sv_upgrade(rv, SVt_RV);
503 if (sv && SvGMAGICAL(sv))
506 if (!sv || !SvROK(sv))
510 pv = sv_reftype(sv,TRUE);
511 PUSHp(pv, strlen(pv));
521 stash = PL_curcop->cop_stash;
525 char *ptr = SvPV(ssv,len);
526 if (ckWARN(WARN_UNSAFE) && len == 0)
528 "Explicit blessing to '' (assuming package main)");
529 stash = gv_stashpvn(ptr, len, TRUE);
532 (void)sv_bless(TOPs, stash);
545 elem = SvPV(sv, PL_na);
549 switch (elem ? *elem : '\0')
552 if (strEQ(elem, "ARRAY"))
553 tmpRef = (SV*)GvAV(gv);
556 if (strEQ(elem, "CODE"))
557 tmpRef = (SV*)GvCVu(gv);
560 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
561 tmpRef = (SV*)GvIOp(gv);
564 if (strEQ(elem, "GLOB"))
568 if (strEQ(elem, "HASH"))
569 tmpRef = (SV*)GvHV(gv);
572 if (strEQ(elem, "IO"))
573 tmpRef = (SV*)GvIOp(gv);
576 if (strEQ(elem, "NAME"))
577 sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
580 if (strEQ(elem, "PACKAGE"))
581 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
584 if (strEQ(elem, "SCALAR"))
598 /* Pattern matching */
603 register UNOP *unop = cUNOP;
604 register unsigned char *s;
607 register I32 *sfirst;
611 if (sv == PL_lastscream) {
617 SvSCREAM_off(PL_lastscream);
618 SvREFCNT_dec(PL_lastscream);
620 PL_lastscream = SvREFCNT_inc(sv);
623 s = (unsigned char*)(SvPV(sv, len));
627 if (pos > PL_maxscream) {
628 if (PL_maxscream < 0) {
629 PL_maxscream = pos + 80;
630 New(301, PL_screamfirst, 256, I32);
631 New(302, PL_screamnext, PL_maxscream, I32);
634 PL_maxscream = pos + pos / 4;
635 Renew(PL_screamnext, PL_maxscream, I32);
639 sfirst = PL_screamfirst;
640 snext = PL_screamnext;
642 if (!sfirst || !snext)
643 DIE("do_study: out of memory");
645 for (ch = 256; ch; --ch)
652 snext[pos] = sfirst[ch] - pos;
659 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
668 if (PL_op->op_flags & OPf_STACKED)
674 TARG = sv_newmortal();
679 /* Lvalue operators. */
691 djSP; dMARK; dTARGET;
701 SETi(do_chomp(TOPs));
707 djSP; dMARK; dTARGET;
708 register I32 count = 0;
711 count += do_chomp(POPs);
722 if (!sv || !SvANY(sv))
724 switch (SvTYPE(sv)) {
726 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv))
730 if (HvARRAY(sv) || SvGMAGICAL(sv))
734 if (CvROOT(sv) || CvXSUB(sv))
751 if (!PL_op->op_private) {
760 if (SvTHINKFIRST(sv)) {
767 switch (SvTYPE(sv)) {
777 if (ckWARN(WARN_UNSAFE) && cv_const_sv((CV*)sv))
778 warner(WARN_UNSAFE, "Constant subroutine %s undefined",
779 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
782 { GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
784 CvGV((CV*)sv) = gv; } /* let user-undef'd sub keep its identity */
788 SvSetMagicSV(sv, &PL_sv_undef);
792 Newz(602, gp, 1, GP);
793 GvGP(sv) = gp_ref(gp);
794 GvSV(sv) = NEWSV(72,0);
795 GvLINE(sv) = PL_curcop->cop_line;
801 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
804 SvPV_set(sv, Nullch);
817 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
819 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
820 SvIVX(TOPs) != IV_MIN)
823 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
834 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
836 sv_setsv(TARG, TOPs);
837 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
838 SvIVX(TOPs) != IV_MAX)
841 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
855 if(SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
857 sv_setsv(TARG, TOPs);
858 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
859 SvIVX(TOPs) != IV_MIN)
862 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
871 /* Ordinary operators. */
875 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
878 SETn( pow( left, right) );
885 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
888 SETn( left * right );
895 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
900 DIE("Illegal division by zero");
902 /* insure that 20./5. == 4. */
905 if ((double)I_V(left) == left &&
906 (double)I_V(right) == right &&
907 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
910 value = left / right;
914 value = left / right;
923 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
931 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
933 right = (right_neg = (i < 0)) ? -i : i;
937 right = U_V((right_neg = (n < 0)) ? -n : n);
940 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
942 left = (left_neg = (i < 0)) ? -i : i;
946 left = U_V((left_neg = (n < 0)) ? -n : n);
950 DIE("Illegal modulus zero");
953 if ((left_neg != right_neg) && ans)
956 /* XXX may warn: unary minus operator applied to unsigned type */
957 /* could change -foo to be (~foo)+1 instead */
958 if (ans <= ~((UV)IV_MAX)+1)
959 sv_setiv(TARG, ~ans+1);
961 sv_setnv(TARG, -(double)ans);
972 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
974 register I32 count = POPi;
975 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
977 I32 items = SP - MARK;
989 repeatcpy((char*)(MARK + items), (char*)MARK,
990 items * sizeof(SV*), count - 1);
996 else { /* Note: mark already snarfed by pp_list */
1001 if (TARG == tmpstr && SvTHINKFIRST(tmpstr)) {
1002 if (SvREADONLY(tmpstr) && PL_curcop != &PL_compiling)
1003 DIE("Can't x= to readonly value");
1007 SvSetSV(TARG, tmpstr);
1008 SvPV_force(TARG, len);
1013 SvGROW(TARG, (count * len) + 1);
1014 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1015 SvCUR(TARG) *= count;
1017 *SvEND(TARG) = '\0';
1019 (void)SvPOK_only(TARG);
1028 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1031 SETn( left - right );
1038 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1041 if (PL_op->op_private & HINT_INTEGER) {
1043 i = BWi(i) << shift;
1057 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1060 if (PL_op->op_private & HINT_INTEGER) {
1062 i = BWi(i) >> shift;
1076 djSP; tryAMAGICbinSET(lt,0);
1079 SETs(boolSV(TOPn < value));
1086 djSP; tryAMAGICbinSET(gt,0);
1089 SETs(boolSV(TOPn > value));
1096 djSP; tryAMAGICbinSET(le,0);
1099 SETs(boolSV(TOPn <= value));
1106 djSP; tryAMAGICbinSET(ge,0);
1109 SETs(boolSV(TOPn >= value));
1116 djSP; tryAMAGICbinSET(ne,0);
1119 SETs(boolSV(TOPn != value));
1126 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1133 else if (left < right)
1135 else if (left > right)
1148 djSP; tryAMAGICbinSET(slt,0);
1151 int cmp = ((PL_op->op_private & OPpLOCALE)
1152 ? sv_cmp_locale(left, right)
1153 : sv_cmp(left, right));
1154 SETs(boolSV(cmp < 0));
1161 djSP; tryAMAGICbinSET(sgt,0);
1164 int cmp = ((PL_op->op_private & OPpLOCALE)
1165 ? sv_cmp_locale(left, right)
1166 : sv_cmp(left, right));
1167 SETs(boolSV(cmp > 0));
1174 djSP; tryAMAGICbinSET(sle,0);
1177 int cmp = ((PL_op->op_private & OPpLOCALE)
1178 ? sv_cmp_locale(left, right)
1179 : sv_cmp(left, right));
1180 SETs(boolSV(cmp <= 0));
1187 djSP; tryAMAGICbinSET(sge,0);
1190 int cmp = ((PL_op->op_private & OPpLOCALE)
1191 ? sv_cmp_locale(left, right)
1192 : sv_cmp(left, right));
1193 SETs(boolSV(cmp >= 0));
1200 djSP; tryAMAGICbinSET(seq,0);
1203 SETs(boolSV(sv_eq(left, right)));
1210 djSP; tryAMAGICbinSET(sne,0);
1213 SETs(boolSV(!sv_eq(left, right)));
1220 djSP; dTARGET; tryAMAGICbin(scmp,0);
1223 int cmp = ((PL_op->op_private & OPpLOCALE)
1224 ? sv_cmp_locale(left, right)
1225 : sv_cmp(left, right));
1233 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1236 if (SvNIOKp(left) || SvNIOKp(right)) {
1237 if (PL_op->op_private & HINT_INTEGER) {
1238 IBW value = SvIV(left) & SvIV(right);
1242 UBW value = SvUV(left) & SvUV(right);
1247 do_vop(PL_op->op_type, TARG, left, right);
1256 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1259 if (SvNIOKp(left) || SvNIOKp(right)) {
1260 if (PL_op->op_private & HINT_INTEGER) {
1261 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1265 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1270 do_vop(PL_op->op_type, TARG, left, right);
1279 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1282 if (SvNIOKp(left) || SvNIOKp(right)) {
1283 if (PL_op->op_private & HINT_INTEGER) {
1284 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1288 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1293 do_vop(PL_op->op_type, TARG, left, right);
1302 djSP; dTARGET; tryAMAGICun(neg);
1307 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv) && SvIVX(sv) != IV_MIN)
1309 else if (SvNIOKp(sv))
1311 else if (SvPOKp(sv)) {
1313 char *s = SvPV(sv, len);
1314 if (isIDFIRST(*s)) {
1315 sv_setpvn(TARG, "-", 1);
1318 else if (*s == '+' || *s == '-') {
1320 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1322 else if (IN_UTF8 && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
1323 sv_setpvn(TARG, "-", 1);
1327 sv_setnv(TARG, -SvNV(sv));
1339 djSP; tryAMAGICunSET(not);
1340 #endif /* OVERLOAD */
1341 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1347 djSP; dTARGET; tryAMAGICun(compl);
1351 if (PL_op->op_private & HINT_INTEGER) {
1352 IBW value = ~SvIV(sv);
1356 UBW value = ~SvUV(sv);
1361 register char *tmps;
1362 register long *tmpl;
1367 tmps = SvPV_force(TARG, len);
1370 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1373 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1377 for ( ; anum > 0; anum--, tmps++)
1386 /* integer versions of some of the above */
1390 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1393 SETi( left * right );
1400 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1404 DIE("Illegal division by zero");
1405 value = POPi / value;
1413 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1417 DIE("Illegal modulus zero");
1418 SETi( left % right );
1425 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1428 SETi( left + right );
1435 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1438 SETi( left - right );
1445 djSP; tryAMAGICbinSET(lt,0);
1448 SETs(boolSV(left < right));
1455 djSP; tryAMAGICbinSET(gt,0);
1458 SETs(boolSV(left > right));
1465 djSP; tryAMAGICbinSET(le,0);
1468 SETs(boolSV(left <= right));
1475 djSP; tryAMAGICbinSET(ge,0);
1478 SETs(boolSV(left >= right));
1485 djSP; tryAMAGICbinSET(eq,0);
1488 SETs(boolSV(left == right));
1495 djSP; tryAMAGICbinSET(ne,0);
1498 SETs(boolSV(left != right));
1505 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1512 else if (left < right)
1523 djSP; dTARGET; tryAMAGICun(neg);
1528 /* High falutin' math. */
1532 djSP; dTARGET; tryAMAGICbin(atan2,0);
1535 SETn(atan2(left, right));
1542 djSP; dTARGET; tryAMAGICun(sin);
1554 djSP; dTARGET; tryAMAGICun(cos);
1564 /* Support Configure command-line overrides for rand() functions.
1565 After 5.005, perhaps we should replace this by Configure support
1566 for drand48(), random(), or rand(). For 5.005, though, maintain
1567 compatibility by calling rand() but allow the user to override it.
1568 See INSTALL for details. --Andy Dougherty 15 July 1998
1570 /* Now it's after 5.005, and Configure supports drand48() and random(),
1571 in addition to rand(). So the overrides should not be needed any more.
1572 --Jarkko Hietaniemi 27 September 1998
1575 #ifndef HAS_DRAND48_PROTO
1576 extern double drand48 _((void));
1589 if (!srand_called) {
1590 (void)seedDrand01((Rand_seed_t)seed());
1591 srand_called = TRUE;
1606 (void)seedDrand01((Rand_seed_t)anum);
1607 srand_called = TRUE;
1616 * This is really just a quick hack which grabs various garbage
1617 * values. It really should be a real hash algorithm which
1618 * spreads the effect of every input bit onto every output bit,
1619 * if someone who knows about such things would bother to write it.
1620 * Might be a good idea to add that function to CORE as well.
1621 * No numbers below come from careful analysis or anything here,
1622 * except they are primes and SEED_C1 > 1E6 to get a full-width
1623 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1624 * probably be bigger too.
1627 # define SEED_C1 1000003
1628 #define SEED_C4 73819
1630 # define SEED_C1 25747
1631 #define SEED_C4 20639
1635 #define SEED_C5 26107
1638 #ifndef PERL_NO_DEV_RANDOM
1643 # include <starlet.h>
1644 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1645 * in 100-ns units, typically incremented ever 10 ms. */
1646 unsigned int when[2];
1648 # ifdef HAS_GETTIMEOFDAY
1649 struct timeval when;
1655 /* This test is an escape hatch, this symbol isn't set by Configure. */
1656 #ifndef PERL_NO_DEV_RANDOM
1657 #ifndef PERL_RANDOM_DEVICE
1658 /* /dev/random isn't used by default because reads from it will block
1659 * if there isn't enough entropy available. You can compile with
1660 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1661 * is enough real entropy to fill the seed. */
1662 # define PERL_RANDOM_DEVICE "/dev/urandom"
1664 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1666 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1675 _ckvmssts(sys$gettim(when));
1676 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1678 # ifdef HAS_GETTIMEOFDAY
1679 gettimeofday(&when,(struct timezone *) 0);
1680 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1683 u = (U32)SEED_C1 * when;
1686 u += SEED_C3 * (U32)getpid();
1687 u += SEED_C4 * (U32)(UV)PL_stack_sp;
1688 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1689 u += SEED_C5 * (U32)(UV)&when;
1696 djSP; dTARGET; tryAMAGICun(exp);
1708 djSP; dTARGET; tryAMAGICun(log);
1713 SET_NUMERIC_STANDARD();
1714 DIE("Can't take log of %g", value);
1724 djSP; dTARGET; tryAMAGICun(sqrt);
1729 SET_NUMERIC_STANDARD();
1730 DIE("Can't take sqrt of %g", value);
1732 value = sqrt(value);
1742 double value = TOPn;
1745 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1751 (void)modf(value, &value);
1753 (void)modf(-value, &value);
1768 djSP; dTARGET; tryAMAGICun(abs);
1770 double value = TOPn;
1773 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1774 (iv = SvIVX(TOPs)) != IV_MIN) {
1795 XPUSHu(scan_hex(tmps, 99, &argtype));
1807 while (*tmps && isSPACE(*tmps))
1812 value = scan_hex(++tmps, 99, &argtype);
1814 value = scan_oct(tmps, 99, &argtype);
1826 SETi( sv_len_utf8(TOPs) );
1830 SETi( sv_len(TOPs) );
1844 I32 lvalue = PL_op->op_flags & OPf_MOD;
1846 I32 arybase = PL_curcop->cop_arybase;
1850 SvTAINTED_off(TARG); /* decontaminate */
1854 repl = SvPV(sv, repl_len);
1861 tmps = SvPV(sv, curlen);
1863 utfcurlen = sv_len_utf8(sv);
1864 if (utfcurlen == curlen)
1872 if (pos >= arybase) {
1890 else if (len >= 0) {
1892 if (rem > (I32)curlen)
1906 if (ckWARN(WARN_SUBSTR) || lvalue || repl)
1907 warner(WARN_SUBSTR, "substr outside of string");
1912 sv_pos_u2b(sv, &pos, &rem);
1914 sv_setpvn(TARG, tmps, rem);
1915 if (lvalue) { /* it's an lvalue! */
1916 if (!SvGMAGICAL(sv)) {
1918 SvPV_force(sv,PL_na);
1919 if (ckWARN(WARN_SUBSTR))
1921 "Attempt to use reference as lvalue in substr");
1923 if (SvOK(sv)) /* is it defined ? */
1924 (void)SvPOK_only(sv);
1926 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
1929 if (SvTYPE(TARG) < SVt_PVLV) {
1930 sv_upgrade(TARG, SVt_PVLV);
1931 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
1935 if (LvTARG(TARG) != sv) {
1937 SvREFCNT_dec(LvTARG(TARG));
1938 LvTARG(TARG) = SvREFCNT_inc(sv);
1940 LvTARGOFF(TARG) = pos;
1941 LvTARGLEN(TARG) = rem;
1944 sv_insert(sv, pos, rem, repl, repl_len);
1947 PUSHs(TARG); /* avoid SvSETMAGIC here */
1954 register I32 size = POPi;
1955 register I32 offset = POPi;
1956 register SV *src = POPs;
1957 I32 lvalue = PL_op->op_flags & OPf_MOD;
1959 unsigned char *s = (unsigned char*)SvPV(src, srclen);
1960 unsigned long retnum;
1963 SvTAINTED_off(TARG); /* decontaminate */
1964 offset *= size; /* turn into bit offset */
1965 len = (offset + size + 7) / 8;
1966 if (offset < 0 || size < 1)
1969 if (lvalue) { /* it's an lvalue! */
1970 if (SvTYPE(TARG) < SVt_PVLV) {
1971 sv_upgrade(TARG, SVt_PVLV);
1972 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
1976 if (LvTARG(TARG) != src) {
1978 SvREFCNT_dec(LvTARG(TARG));
1979 LvTARG(TARG) = SvREFCNT_inc(src);
1981 LvTARGOFF(TARG) = offset;
1982 LvTARGLEN(TARG) = size;
1990 if (offset >= srclen)
1993 retnum = (unsigned long) s[offset] << 8;
1995 else if (size == 32) {
1996 if (offset >= srclen)
1998 else if (offset + 1 >= srclen)
1999 retnum = (unsigned long) s[offset] << 24;
2000 else if (offset + 2 >= srclen)
2001 retnum = ((unsigned long) s[offset] << 24) +
2002 ((unsigned long) s[offset + 1] << 16);
2004 retnum = ((unsigned long) s[offset] << 24) +
2005 ((unsigned long) s[offset + 1] << 16) +
2006 (s[offset + 2] << 8);
2011 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
2016 else if (size == 16)
2017 retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
2018 else if (size == 32)
2019 retnum = ((unsigned long) s[offset] << 24) +
2020 ((unsigned long) s[offset + 1] << 16) +
2021 (s[offset + 2] << 8) + s[offset+3];
2025 sv_setuv(TARG, (UV)retnum);
2040 I32 arybase = PL_curcop->cop_arybase;
2045 offset = POPi - arybase;
2048 tmps = SvPV(big, biglen);
2049 if (IN_UTF8 && offset > 0)
2050 sv_pos_u2b(big, &offset, 0);
2053 else if (offset > biglen)
2055 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2056 (unsigned char*)tmps + biglen, little, 0)))
2059 retval = tmps2 - tmps;
2060 if (IN_UTF8 && retval > 0)
2061 sv_pos_b2u(big, &retval);
2062 PUSHi(retval + arybase);
2077 I32 arybase = PL_curcop->cop_arybase;
2083 tmps2 = SvPV(little, llen);
2084 tmps = SvPV(big, blen);
2088 if (IN_UTF8 && offset > 0)
2089 sv_pos_u2b(big, &offset, 0);
2090 offset = offset - arybase + llen;
2094 else if (offset > blen)
2096 if (!(tmps2 = rninstr(tmps, tmps + offset,
2097 tmps2, tmps2 + llen)))
2100 retval = tmps2 - tmps;
2101 if (IN_UTF8 && retval > 0)
2102 sv_pos_b2u(big, &retval);
2103 PUSHi(retval + arybase);
2109 djSP; dMARK; dORIGMARK; dTARGET;
2110 #ifdef USE_LOCALE_NUMERIC
2111 if (PL_op->op_private & OPpLOCALE)
2112 SET_NUMERIC_LOCAL();
2114 SET_NUMERIC_STANDARD();
2116 do_sprintf(TARG, SP-MARK, MARK+1);
2117 TAINT_IF(SvTAINTED(TARG));
2127 U8 *tmps = (U8*)POPp;
2130 if (IN_UTF8 && (*tmps & 0x80))
2131 value = utf8_to_uv(tmps, &retlen);
2133 value = (UV)(*tmps & 255);
2144 (void)SvUPGRADE(TARG,SVt_PV);
2146 if (IN_UTF8 && value >= 128) {
2149 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
2150 SvCUR_set(TARG, tmps - SvPVX(TARG));
2152 (void)SvPOK_only(TARG);
2162 (void)SvPOK_only(TARG);
2169 djSP; dTARGET; dPOPTOPssrl;
2171 char *tmps = SvPV(left, PL_na);
2173 sv_setpv(TARG, fcrypt(tmps, SvPV(right, PL_na)));
2175 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, PL_na)));
2179 "The crypt() function is unimplemented due to excessive paranoia.");
2192 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2196 UV uv = utf8_to_uv(s, &ulen);
2198 if (PL_op->op_private & OPpLOCALE) {
2201 uv = toTITLE_LC_uni(uv);
2204 uv = toTITLE_utf8(s);
2206 tend = uv_to_utf8(tmpbuf, uv);
2208 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2210 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2211 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2215 s = (U8*)SvPV_force(sv, slen);
2216 Copy(tmpbuf, s, ulen, U8);
2221 if (!SvPADTMP(sv)) {
2227 s = (U8*)SvPV_force(sv, PL_na);
2229 if (PL_op->op_private & OPpLOCALE) {
2232 *s = toUPPER_LC(*s);
2248 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2252 UV uv = utf8_to_uv(s, &ulen);
2254 if (PL_op->op_private & OPpLOCALE) {
2257 uv = toLOWER_LC_uni(uv);
2260 uv = toLOWER_utf8(s);
2262 tend = uv_to_utf8(tmpbuf, uv);
2264 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2266 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2267 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2271 s = (U8*)SvPV_force(sv, slen);
2272 Copy(tmpbuf, s, ulen, U8);
2277 if (!SvPADTMP(sv)) {
2283 s = (U8*)SvPV_force(sv, PL_na);
2285 if (PL_op->op_private & OPpLOCALE) {
2288 *s = toLOWER_LC(*s);
2311 s = (U8*)SvPV(sv,len);
2313 sv_setpvn(TARG, "", 0);
2318 (void)SvUPGRADE(TARG, SVt_PV);
2319 SvGROW(TARG, (len * 2) + 1);
2320 (void)SvPOK_only(TARG);
2321 d = (U8*)SvPVX(TARG);
2323 if (PL_op->op_private & OPpLOCALE) {
2327 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2333 d = uv_to_utf8(d, toUPPER_utf8( s ));
2338 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2343 if (!SvPADTMP(sv)) {
2350 s = (U8*)SvPV_force(sv, len);
2352 register U8 *send = s + len;
2354 if (PL_op->op_private & OPpLOCALE) {
2357 for (; s < send; s++)
2358 *s = toUPPER_LC(*s);
2361 for (; s < send; s++)
2381 s = (U8*)SvPV(sv,len);
2383 sv_setpvn(TARG, "", 0);
2388 (void)SvUPGRADE(TARG, SVt_PV);
2389 SvGROW(TARG, (len * 2) + 1);
2390 (void)SvPOK_only(TARG);
2391 d = (U8*)SvPVX(TARG);
2393 if (PL_op->op_private & OPpLOCALE) {
2397 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2403 d = uv_to_utf8(d, toLOWER_utf8(s));
2408 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2413 if (!SvPADTMP(sv)) {
2420 s = (U8*)SvPV_force(sv, len);
2422 register U8 *send = s + len;
2424 if (PL_op->op_private & OPpLOCALE) {
2427 for (; s < send; s++)
2428 *s = toLOWER_LC(*s);
2431 for (; s < send; s++)
2443 register char *s = SvPV(sv,len);
2447 (void)SvUPGRADE(TARG, SVt_PV);
2448 SvGROW(TARG, (len * 2) + 1);
2453 STRLEN ulen = UTF8SKIP(s);
2476 SvCUR_set(TARG, d - SvPVX(TARG));
2477 (void)SvPOK_only(TARG);
2480 sv_setpvn(TARG, s, len);
2489 djSP; dMARK; dORIGMARK;
2491 register AV* av = (AV*)POPs;
2492 register I32 lval = PL_op->op_flags & OPf_MOD;
2493 I32 arybase = PL_curcop->cop_arybase;
2496 if (SvTYPE(av) == SVt_PVAV) {
2497 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2499 for (svp = MARK + 1; svp <= SP; svp++) {
2504 if (max > AvMAX(av))
2507 while (++MARK <= SP) {
2508 elem = SvIVx(*MARK);
2512 svp = av_fetch(av, elem, lval);
2514 if (!svp || *svp == &PL_sv_undef)
2515 DIE(PL_no_aelem, elem);
2516 if (PL_op->op_private & OPpLVAL_INTRO)
2517 save_aelem(av, elem, svp);
2519 *MARK = svp ? *svp : &PL_sv_undef;
2522 if (GIMME != G_ARRAY) {
2530 /* Associative arrays. */
2535 HV *hash = (HV*)POPs;
2537 I32 gimme = GIMME_V;
2538 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2541 /* might clobber stack_sp */
2542 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2547 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2548 if (gimme == G_ARRAY) {
2550 /* might clobber stack_sp */
2551 sv_setsv(TARG, realhv ?
2552 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry));
2557 else if (gimme == G_SCALAR)
2576 I32 gimme = GIMME_V;
2577 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2581 if (PL_op->op_private & OPpSLICE) {
2585 hvtype = SvTYPE(hv);
2586 while (++MARK <= SP) {
2587 if (hvtype == SVt_PVHV)
2588 sv = hv_delete_ent(hv, *MARK, discard, 0);
2590 DIE("Not a HASH reference");
2591 *MARK = sv ? sv : &PL_sv_undef;
2595 else if (gimme == G_SCALAR) {
2604 if (SvTYPE(hv) == SVt_PVHV)
2605 sv = hv_delete_ent(hv, keysv, discard, 0);
2607 DIE("Not a HASH reference");
2621 if (SvTYPE(hv) == SVt_PVHV) {
2622 if (hv_exists_ent(hv, tmpsv, 0))
2624 } else if (SvTYPE(hv) == SVt_PVAV) {
2625 if (avhv_exists_ent((AV*)hv, tmpsv, 0))
2628 DIE("Not a HASH reference");
2635 djSP; dMARK; dORIGMARK;
2636 register HV *hv = (HV*)POPs;
2637 register I32 lval = PL_op->op_flags & OPf_MOD;
2638 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2640 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2641 DIE("Can't localize pseudo-hash element");
2643 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2644 while (++MARK <= SP) {
2648 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2649 svp = he ? &HeVAL(he) : 0;
2651 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2654 if (!svp || *svp == &PL_sv_undef)
2655 DIE(PL_no_helem, SvPV(keysv, PL_na));
2656 if (PL_op->op_private & OPpLVAL_INTRO)
2657 save_helem(hv, keysv, svp);
2659 *MARK = svp ? *svp : &PL_sv_undef;
2662 if (GIMME != G_ARRAY) {
2670 /* List operators. */
2675 if (GIMME != G_ARRAY) {
2677 *MARK = *SP; /* unwanted list, return last item */
2679 *MARK = &PL_sv_undef;
2688 SV **lastrelem = PL_stack_sp;
2689 SV **lastlelem = PL_stack_base + POPMARK;
2690 SV **firstlelem = PL_stack_base + POPMARK + 1;
2691 register SV **firstrelem = lastlelem + 1;
2692 I32 arybase = PL_curcop->cop_arybase;
2693 I32 lval = PL_op->op_flags & OPf_MOD;
2694 I32 is_something_there = lval;
2696 register I32 max = lastrelem - lastlelem;
2697 register SV **lelem;
2700 if (GIMME != G_ARRAY) {
2701 ix = SvIVx(*lastlelem);
2706 if (ix < 0 || ix >= max)
2707 *firstlelem = &PL_sv_undef;
2709 *firstlelem = firstrelem[ix];
2715 SP = firstlelem - 1;
2719 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2724 *lelem = &PL_sv_undef;
2725 else if (!(*lelem = firstrelem[ix]))
2726 *lelem = &PL_sv_undef;
2730 if (ix >= max || !(*lelem = firstrelem[ix]))
2731 *lelem = &PL_sv_undef;
2733 if (!is_something_there && (SvOK(*lelem) || SvGMAGICAL(*lelem)))
2734 is_something_there = TRUE;
2736 if (is_something_there)
2739 SP = firstlelem - 1;
2745 djSP; dMARK; dORIGMARK;
2746 I32 items = SP - MARK;
2747 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2748 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2755 djSP; dMARK; dORIGMARK;
2756 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2760 SV *val = NEWSV(46, 0);
2762 sv_setsv(val, *++MARK);
2763 else if (ckWARN(WARN_UNSAFE))
2764 warner(WARN_UNSAFE, "Odd number of elements in hash assignment");
2765 (void)hv_store_ent(hv,key,val,0);
2774 djSP; dMARK; dORIGMARK;
2775 register AV *ary = (AV*)*++MARK;
2779 register I32 offset;
2780 register I32 length;
2787 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2788 *MARK-- = SvTIED_obj((SV*)ary, mg);
2792 perl_call_method("SPLICE",GIMME_V);
2801 offset = i = SvIVx(*MARK);
2803 offset += AvFILLp(ary) + 1;
2805 offset -= PL_curcop->cop_arybase;
2807 DIE(PL_no_aelem, i);
2809 length = SvIVx(*MARK++);
2811 length += AvFILLp(ary) - offset + 1;
2817 length = AvMAX(ary) + 1; /* close enough to infinity */
2821 length = AvMAX(ary) + 1;
2823 if (offset > AvFILLp(ary) + 1)
2824 offset = AvFILLp(ary) + 1;
2825 after = AvFILLp(ary) + 1 - (offset + length);
2826 if (after < 0) { /* not that much array */
2827 length += after; /* offset+length now in array */
2833 /* At this point, MARK .. SP-1 is our new LIST */
2836 diff = newlen - length;
2837 if (newlen && !AvREAL(ary)) {
2841 assert(AvREAL(ary)); /* would leak, so croak */
2844 if (diff < 0) { /* shrinking the area */
2846 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2847 Copy(MARK, tmparyval, newlen, SV*);
2850 MARK = ORIGMARK + 1;
2851 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2852 MEXTEND(MARK, length);
2853 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2855 EXTEND_MORTAL(length);
2856 for (i = length, dst = MARK; i; i--) {
2857 sv_2mortal(*dst); /* free them eventualy */
2864 *MARK = AvARRAY(ary)[offset+length-1];
2867 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2868 SvREFCNT_dec(*dst++); /* free them now */
2871 AvFILLp(ary) += diff;
2873 /* pull up or down? */
2875 if (offset < after) { /* easier to pull up */
2876 if (offset) { /* esp. if nothing to pull */
2877 src = &AvARRAY(ary)[offset-1];
2878 dst = src - diff; /* diff is negative */
2879 for (i = offset; i > 0; i--) /* can't trust Copy */
2883 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
2887 if (after) { /* anything to pull down? */
2888 src = AvARRAY(ary) + offset + length;
2889 dst = src + diff; /* diff is negative */
2890 Move(src, dst, after, SV*);
2892 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
2893 /* avoid later double free */
2897 dst[--i] = &PL_sv_undef;
2900 for (src = tmparyval, dst = AvARRAY(ary) + offset;
2902 *dst = NEWSV(46, 0);
2903 sv_setsv(*dst++, *src++);
2905 Safefree(tmparyval);
2908 else { /* no, expanding (or same) */
2910 New(452, tmparyval, length, SV*); /* so remember deletion */
2911 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
2914 if (diff > 0) { /* expanding */
2916 /* push up or down? */
2918 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
2922 Move(src, dst, offset, SV*);
2924 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
2926 AvFILLp(ary) += diff;
2929 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
2930 av_extend(ary, AvFILLp(ary) + diff);
2931 AvFILLp(ary) += diff;
2934 dst = AvARRAY(ary) + AvFILLp(ary);
2936 for (i = after; i; i--) {
2943 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
2944 *dst = NEWSV(46, 0);
2945 sv_setsv(*dst++, *src++);
2947 MARK = ORIGMARK + 1;
2948 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2950 Copy(tmparyval, MARK, length, SV*);
2952 EXTEND_MORTAL(length);
2953 for (i = length, dst = MARK; i; i--) {
2954 sv_2mortal(*dst); /* free them eventualy */
2958 Safefree(tmparyval);
2962 else if (length--) {
2963 *MARK = tmparyval[length];
2966 while (length-- > 0)
2967 SvREFCNT_dec(tmparyval[length]);
2969 Safefree(tmparyval);
2972 *MARK = &PL_sv_undef;
2980 djSP; dMARK; dORIGMARK; dTARGET;
2981 register AV *ary = (AV*)*++MARK;
2982 register SV *sv = &PL_sv_undef;
2985 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2986 *MARK-- = SvTIED_obj((SV*)ary, mg);
2990 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
2995 /* Why no pre-extend of ary here ? */
2996 for (++MARK; MARK <= SP; MARK++) {
2999 sv_setsv(sv, *MARK);
3004 PUSHi( AvFILL(ary) + 1 );
3012 SV *sv = av_pop(av);
3014 (void)sv_2mortal(sv);
3023 SV *sv = av_shift(av);
3028 (void)sv_2mortal(sv);
3035 djSP; dMARK; dORIGMARK; dTARGET;
3036 register AV *ary = (AV*)*++MARK;
3041 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3042 *MARK-- = SvTIED_obj((SV*)ary, mg);
3046 perl_call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3051 av_unshift(ary, SP - MARK);
3054 sv_setsv(sv, *++MARK);
3055 (void)av_store(ary, i++, sv);
3059 PUSHi( AvFILL(ary) + 1 );
3069 if (GIMME == G_ARRAY) {
3080 register char *down;
3086 do_join(TARG, &PL_sv_no, MARK, SP);
3088 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3089 up = SvPV_force(TARG, len);
3091 if (IN_UTF8) { /* first reverse each character */
3092 U8* s = (U8*)SvPVX(TARG);
3093 U8* send = (U8*)(s + len);
3102 down = (char*)(s - 1);
3103 if (s > send || !((*down & 0xc0) == 0x80)) {
3104 warn("Malformed UTF-8 character");
3116 down = SvPVX(TARG) + len - 1;
3122 (void)SvPOK_only(TARG);
3131 mul128(SV *sv, U8 m)
3134 char *s = SvPV(sv, len);
3138 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
3139 SV *tmpNew = newSVpv("0000000000", 10);
3141 sv_catsv(tmpNew, sv);
3142 SvREFCNT_dec(sv); /* free old sv */
3147 while (!*t) /* trailing '\0'? */
3150 i = ((*t - '0') << 7) + m;
3151 *(t--) = '0' + (i % 10);
3157 /* Explosives and implosives. */
3159 static const char uuemap[] =
3160 "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
3161 static char uudmap[256]; /* Initialised on first use */
3162 #if 'I' == 73 && 'J' == 74
3163 /* On an ASCII/ISO kind of system */
3164 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
3167 Some other sort of character set - use memchr() so we don't match
3170 #define ISUUCHAR(ch) (memchr(uuemap, (ch), sizeof(uuemap)-1) || (ch) == ' ')
3178 I32 gimme = GIMME_V;
3182 register char *pat = SvPV(left, llen);
3183 register char *s = SvPV(right, rlen);
3184 char *strend = s + rlen;
3186 register char *patend = pat + llen;
3191 /* These must not be in registers: */
3202 unsigned Quad_t auquad;
3208 register U32 culong;
3210 static char* bitcount = 0;
3213 if (gimme != G_ARRAY) { /* arrange to do first one only */
3215 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3216 if (strchr("aAbBhHP", *patend) || *pat == '%') {
3218 while (isDIGIT(*patend) || *patend == '*')
3224 while (pat < patend) {
3226 datumtype = *pat++ & 0xFF;
3227 if (isSPACE(datumtype))
3231 else if (*pat == '*') {
3232 len = strend - strbeg; /* long enough */
3235 else if (isDIGIT(*pat)) {
3237 while (isDIGIT(*pat))
3238 len = (len * 10) + (*pat++ - '0');
3241 len = (datumtype != '@');
3244 croak("Invalid type in unpack: '%c'", (int)datumtype);
3245 case ',': /* grandfather in commas but with a warning */
3246 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
3247 warner(WARN_UNSAFE, "Invalid type in unpack: '%c'", (int)datumtype);
3250 if (len == 1 && pat[-1] != '1')
3259 if (len > strend - strbeg)
3260 DIE("@ outside of string");
3264 if (len > s - strbeg)
3265 DIE("X outside of string");
3269 if (len > strend - s)
3270 DIE("x outside of string");
3275 if (len > strend - s)
3278 goto uchar_checksum;
3279 sv = NEWSV(35, len);
3280 sv_setpvn(sv, s, len);
3282 if (datumtype == 'A') {
3283 aptr = s; /* borrow register */
3284 s = SvPVX(sv) + len - 1;
3285 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3288 SvCUR_set(sv, s - SvPVX(sv));
3289 s = aptr; /* unborrow register */
3291 XPUSHs(sv_2mortal(sv));
3295 if (pat[-1] == '*' || len > (strend - s) * 8)
3296 len = (strend - s) * 8;
3299 Newz(601, bitcount, 256, char);
3300 for (bits = 1; bits < 256; bits++) {
3301 if (bits & 1) bitcount[bits]++;
3302 if (bits & 2) bitcount[bits]++;
3303 if (bits & 4) bitcount[bits]++;
3304 if (bits & 8) bitcount[bits]++;
3305 if (bits & 16) bitcount[bits]++;
3306 if (bits & 32) bitcount[bits]++;
3307 if (bits & 64) bitcount[bits]++;
3308 if (bits & 128) bitcount[bits]++;
3312 culong += bitcount[*(unsigned char*)s++];
3317 if (datumtype == 'b') {
3319 if (bits & 1) culong++;
3325 if (bits & 128) culong++;
3332 sv = NEWSV(35, len + 1);
3335 aptr = pat; /* borrow register */
3337 if (datumtype == 'b') {
3339 for (len = 0; len < aint; len++) {
3340 if (len & 7) /*SUPPRESS 595*/
3344 *pat++ = '0' + (bits & 1);
3349 for (len = 0; len < aint; len++) {
3354 *pat++ = '0' + ((bits & 128) != 0);
3358 pat = aptr; /* unborrow register */
3359 XPUSHs(sv_2mortal(sv));
3363 if (pat[-1] == '*' || len > (strend - s) * 2)
3364 len = (strend - s) * 2;
3365 sv = NEWSV(35, len + 1);
3368 aptr = pat; /* borrow register */
3370 if (datumtype == 'h') {
3372 for (len = 0; len < aint; len++) {
3377 *pat++ = PL_hexdigit[bits & 15];
3382 for (len = 0; len < aint; len++) {
3387 *pat++ = PL_hexdigit[(bits >> 4) & 15];
3391 pat = aptr; /* unborrow register */
3392 XPUSHs(sv_2mortal(sv));
3395 if (len > strend - s)
3400 if (aint >= 128) /* fake up signed chars */
3410 if (aint >= 128) /* fake up signed chars */
3413 sv_setiv(sv, (IV)aint);
3414 PUSHs(sv_2mortal(sv));
3419 if (len > strend - s)
3434 sv_setiv(sv, (IV)auint);
3435 PUSHs(sv_2mortal(sv));
3440 if (len > strend - s)
3443 while (len-- > 0 && s < strend) {
3444 auint = utf8_to_uv((U8*)s, &along);
3447 cdouble += (double)auint;
3455 while (len-- > 0 && s < strend) {
3456 auint = utf8_to_uv((U8*)s, &along);
3459 sv_setuv(sv, (UV)auint);
3460 PUSHs(sv_2mortal(sv));
3465 along = (strend - s) / SIZE16;
3482 sv_setiv(sv, (IV)ashort);
3483 PUSHs(sv_2mortal(sv));
3490 along = (strend - s) / SIZE16;
3495 COPY16(s, &aushort);
3498 if (datumtype == 'n')
3499 aushort = PerlSock_ntohs(aushort);
3502 if (datumtype == 'v')
3503 aushort = vtohs(aushort);
3512 COPY16(s, &aushort);
3516 if (datumtype == 'n')
3517 aushort = PerlSock_ntohs(aushort);
3520 if (datumtype == 'v')
3521 aushort = vtohs(aushort);
3523 sv_setiv(sv, (IV)aushort);
3524 PUSHs(sv_2mortal(sv));
3529 along = (strend - s) / sizeof(int);
3534 Copy(s, &aint, 1, int);
3537 cdouble += (double)aint;
3546 Copy(s, &aint, 1, int);
3550 /* Without the dummy below unpack("i", pack("i",-1))
3551 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3552 * cc with optimization turned on */
3554 sv_setiv(sv, (IV)aint) :
3556 sv_setiv(sv, (IV)aint);
3557 PUSHs(sv_2mortal(sv));
3562 along = (strend - s) / sizeof(unsigned int);
3567 Copy(s, &auint, 1, unsigned int);
3568 s += sizeof(unsigned int);
3570 cdouble += (double)auint;
3579 Copy(s, &auint, 1, unsigned int);
3580 s += sizeof(unsigned int);
3582 sv_setuv(sv, (UV)auint);
3583 PUSHs(sv_2mortal(sv));
3588 along = (strend - s) / SIZE32;
3596 cdouble += (double)along;
3608 sv_setiv(sv, (IV)along);
3609 PUSHs(sv_2mortal(sv));
3616 along = (strend - s) / SIZE32;
3624 if (datumtype == 'N')
3625 aulong = PerlSock_ntohl(aulong);
3628 if (datumtype == 'V')
3629 aulong = vtohl(aulong);
3632 cdouble += (double)aulong;
3644 if (datumtype == 'N')
3645 aulong = PerlSock_ntohl(aulong);
3648 if (datumtype == 'V')
3649 aulong = vtohl(aulong);
3652 sv_setuv(sv, (UV)aulong);
3653 PUSHs(sv_2mortal(sv));
3658 along = (strend - s) / sizeof(char*);
3664 if (sizeof(char*) > strend - s)
3667 Copy(s, &aptr, 1, char*);
3673 PUSHs(sv_2mortal(sv));
3683 while ((len > 0) && (s < strend)) {
3684 auv = (auv << 7) | (*s & 0x7f);
3685 if (!(*s++ & 0x80)) {
3689 PUSHs(sv_2mortal(sv));
3693 else if (++bytes >= sizeof(UV)) { /* promote to string */
3696 sv = newSVpvf("%.*Vu", (int)TYPE_DIGITS(UV), auv);
3697 while (s < strend) {
3698 sv = mul128(sv, *s & 0x7f);
3699 if (!(*s++ & 0x80)) {
3704 t = SvPV(sv, PL_na);
3708 PUSHs(sv_2mortal(sv));
3713 if ((s >= strend) && bytes)
3714 croak("Unterminated compressed integer");
3719 if (sizeof(char*) > strend - s)
3722 Copy(s, &aptr, 1, char*);
3727 sv_setpvn(sv, aptr, len);
3728 PUSHs(sv_2mortal(sv));
3732 along = (strend - s) / sizeof(Quad_t);
3738 if (s + sizeof(Quad_t) > strend)
3741 Copy(s, &aquad, 1, Quad_t);
3742 s += sizeof(Quad_t);
3745 if (aquad >= IV_MIN && aquad <= IV_MAX)
3746 sv_setiv(sv, (IV)aquad);
3748 sv_setnv(sv, (double)aquad);
3749 PUSHs(sv_2mortal(sv));
3753 along = (strend - s) / sizeof(Quad_t);
3759 if (s + sizeof(unsigned Quad_t) > strend)
3762 Copy(s, &auquad, 1, unsigned Quad_t);
3763 s += sizeof(unsigned Quad_t);
3766 if (auquad <= UV_MAX)
3767 sv_setuv(sv, (UV)auquad);
3769 sv_setnv(sv, (double)auquad);
3770 PUSHs(sv_2mortal(sv));
3774 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
3777 along = (strend - s) / sizeof(float);
3782 Copy(s, &afloat, 1, float);
3791 Copy(s, &afloat, 1, float);
3794 sv_setnv(sv, (double)afloat);
3795 PUSHs(sv_2mortal(sv));
3801 along = (strend - s) / sizeof(double);
3806 Copy(s, &adouble, 1, double);
3807 s += sizeof(double);
3815 Copy(s, &adouble, 1, double);
3816 s += sizeof(double);
3818 sv_setnv(sv, (double)adouble);
3819 PUSHs(sv_2mortal(sv));
3825 * Initialise the decode mapping. By using a table driven
3826 * algorithm, the code will be character-set independent
3827 * (and just as fast as doing character arithmetic)
3829 if (uudmap['M'] == 0) {
3832 for (i = 0; i < sizeof(uuemap); i += 1)
3833 uudmap[uuemap[i]] = i;
3835 * Because ' ' and '`' map to the same value,
3836 * we need to decode them both the same.
3841 along = (strend - s) * 3 / 4;
3842 sv = NEWSV(42, along);
3845 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
3850 len = uudmap[*s++] & 077;
3852 if (s < strend && ISUUCHAR(*s))
3853 a = uudmap[*s++] & 077;
3856 if (s < strend && ISUUCHAR(*s))
3857 b = uudmap[*s++] & 077;
3860 if (s < strend && ISUUCHAR(*s))
3861 c = uudmap[*s++] & 077;
3864 if (s < strend && ISUUCHAR(*s))
3865 d = uudmap[*s++] & 077;
3868 hunk[0] = (a << 2) | (b >> 4);
3869 hunk[1] = (b << 4) | (c >> 2);
3870 hunk[2] = (c << 6) | d;
3871 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
3876 else if (s[1] == '\n') /* possible checksum byte */
3879 XPUSHs(sv_2mortal(sv));
3884 if (strchr("fFdD", datumtype) ||
3885 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
3889 while (checksum >= 16) {
3893 while (checksum >= 4) {
3899 along = (1 << checksum) - 1;
3900 while (cdouble < 0.0)
3902 cdouble = modf(cdouble / adouble, &trouble) * adouble;
3903 sv_setnv(sv, cdouble);
3906 if (checksum < 32) {
3907 aulong = (1 << checksum) - 1;
3910 sv_setuv(sv, (UV)culong);
3912 XPUSHs(sv_2mortal(sv));
3916 if (SP == oldsp && gimme == G_SCALAR)
3917 PUSHs(&PL_sv_undef);
3922 doencodes(register SV *sv, register char *s, register I32 len)
3926 *hunk = uuemap[len];
3927 sv_catpvn(sv, hunk, 1);
3930 hunk[0] = uuemap[(077 & (*s >> 2))];
3931 hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
3932 hunk[2] = uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
3933 hunk[3] = uuemap[(077 & (s[2] & 077))];
3934 sv_catpvn(sv, hunk, 4);
3939 char r = (len > 1 ? s[1] : '\0');
3940 hunk[0] = uuemap[(077 & (*s >> 2))];
3941 hunk[1] = uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
3942 hunk[2] = uuemap[(077 & ((r << 2) & 074))];
3943 hunk[3] = uuemap[0];
3944 sv_catpvn(sv, hunk, 4);
3946 sv_catpvn(sv, "\n", 1);
3950 is_an_int(char *s, STRLEN l)
3952 SV *result = newSVpv("", l);
3953 char *result_c = SvPV(result, PL_na); /* convenience */
3954 char *out = result_c;
3964 SvREFCNT_dec(result);
3987 SvREFCNT_dec(result);
3993 SvCUR_set(result, out - result_c);
3998 div128(SV *pnum, bool *done)
3999 /* must be '\0' terminated */
4003 char *s = SvPV(pnum, len);
4012 i = m * 10 + (*t - '0');
4014 r = (i >> 7); /* r < 10 */
4021 SvCUR_set(pnum, (STRLEN) (t - s));
4028 djSP; dMARK; dORIGMARK; dTARGET;
4029 register SV *cat = TARG;
4032 register char *pat = SvPVx(*++MARK, fromlen);
4033 register char *patend = pat + fromlen;
4038 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4039 static char *space10 = " ";
4041 /* These must not be in registers: */
4050 unsigned Quad_t auquad;
4059 sv_setpvn(cat, "", 0);
4060 while (pat < patend) {
4061 #define NEXTFROM (items-- > 0 ? *MARK++ : &PL_sv_no)
4062 datumtype = *pat++ & 0xFF;
4063 if (isSPACE(datumtype))
4066 len = strchr("@Xxu", datumtype) ? 0 : items;
4069 else if (isDIGIT(*pat)) {
4071 while (isDIGIT(*pat))
4072 len = (len * 10) + (*pat++ - '0');
4078 croak("Invalid type in pack: '%c'", (int)datumtype);
4079 case ',': /* grandfather in commas but with a warning */
4080 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
4081 warner(WARN_UNSAFE, "Invalid type in pack: '%c'", (int)datumtype);
4084 DIE("%% may only be used in unpack");
4095 if (SvCUR(cat) < len)
4096 DIE("X outside of string");
4103 sv_catpvn(cat, null10, 10);
4106 sv_catpvn(cat, null10, len);
4111 aptr = SvPV(fromstr, fromlen);
4115 sv_catpvn(cat, aptr, len);
4117 sv_catpvn(cat, aptr, fromlen);
4119 if (datumtype == 'A') {
4121 sv_catpvn(cat, space10, 10);
4124 sv_catpvn(cat, space10, len);
4128 sv_catpvn(cat, null10, 10);
4131 sv_catpvn(cat, null10, len);
4138 char *savepat = pat;
4143 aptr = SvPV(fromstr, fromlen);
4148 SvCUR(cat) += (len+7)/8;
4149 SvGROW(cat, SvCUR(cat) + 1);
4150 aptr = SvPVX(cat) + aint;
4155 if (datumtype == 'B') {
4156 for (len = 0; len++ < aint;) {
4157 items |= *pat++ & 1;
4161 *aptr++ = items & 0xff;
4167 for (len = 0; len++ < aint;) {
4173 *aptr++ = items & 0xff;
4179 if (datumtype == 'B')
4180 items <<= 7 - (aint & 7);
4182 items >>= 7 - (aint & 7);
4183 *aptr++ = items & 0xff;
4185 pat = SvPVX(cat) + SvCUR(cat);
4196 char *savepat = pat;
4201 aptr = SvPV(fromstr, fromlen);
4206 SvCUR(cat) += (len+1)/2;
4207 SvGROW(cat, SvCUR(cat) + 1);
4208 aptr = SvPVX(cat) + aint;
4213 if (datumtype == 'H') {
4214 for (len = 0; len++ < aint;) {
4216 items |= ((*pat++ & 15) + 9) & 15;
4218 items |= *pat++ & 15;
4222 *aptr++ = items & 0xff;
4228 for (len = 0; len++ < aint;) {
4230 items |= (((*pat++ & 15) + 9) & 15) << 4;
4232 items |= (*pat++ & 15) << 4;
4236 *aptr++ = items & 0xff;
4242 *aptr++ = items & 0xff;
4243 pat = SvPVX(cat) + SvCUR(cat);
4255 aint = SvIV(fromstr);
4257 sv_catpvn(cat, &achar, sizeof(char));
4263 auint = SvUV(fromstr);
4264 SvGROW(cat, SvCUR(cat) + 10);
4265 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4270 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4275 afloat = (float)SvNV(fromstr);
4276 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4283 adouble = (double)SvNV(fromstr);
4284 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4290 ashort = (I16)SvIV(fromstr);
4292 ashort = PerlSock_htons(ashort);
4294 CAT16(cat, &ashort);
4300 ashort = (I16)SvIV(fromstr);
4302 ashort = htovs(ashort);
4304 CAT16(cat, &ashort);
4311 ashort = (I16)SvIV(fromstr);
4312 CAT16(cat, &ashort);
4318 auint = SvUV(fromstr);
4319 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4325 adouble = floor(SvNV(fromstr));
4328 croak("Cannot compress negative numbers");
4334 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
4335 adouble <= UV_MAX_cxux
4342 char buf[1 + sizeof(UV)];
4343 char *in = buf + sizeof(buf);
4344 UV auv = U_V(adouble);;
4347 *--in = (auv & 0x7f) | 0x80;
4350 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4351 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4353 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4354 char *from, *result, *in;
4359 /* Copy string and check for compliance */
4360 from = SvPV(fromstr, len);
4361 if ((norm = is_an_int(from, len)) == NULL)
4362 croak("can compress only unsigned integer");
4364 New('w', result, len, char);
4368 *--in = div128(norm, &done) | 0x80;
4369 result[len - 1] &= 0x7F; /* clear continue bit */
4370 sv_catpvn(cat, in, (result + len) - in);
4372 SvREFCNT_dec(norm); /* free norm */
4374 else if (SvNOKp(fromstr)) {
4375 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4376 char *in = buf + sizeof(buf);
4379 double next = floor(adouble / 128);
4380 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4381 if (--in < buf) /* this cannot happen ;-) */
4382 croak ("Cannot compress integer");
4384 } while (adouble > 0);
4385 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4386 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4389 croak("Cannot compress non integer");
4395 aint = SvIV(fromstr);
4396 sv_catpvn(cat, (char*)&aint, sizeof(int));
4402 aulong = SvUV(fromstr);
4404 aulong = PerlSock_htonl(aulong);
4406 CAT32(cat, &aulong);
4412 aulong = SvUV(fromstr);
4414 aulong = htovl(aulong);
4416 CAT32(cat, &aulong);
4422 aulong = SvUV(fromstr);
4423 CAT32(cat, &aulong);
4429 along = SvIV(fromstr);
4437 auquad = (unsigned Quad_t)SvIV(fromstr);
4438 sv_catpvn(cat, (char*)&auquad, sizeof(unsigned Quad_t));
4444 aquad = (Quad_t)SvIV(fromstr);
4445 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
4448 #endif /* HAS_QUAD */
4450 len = 1; /* assume SV is correct length */
4455 if (fromstr == &PL_sv_undef)
4458 /* XXX better yet, could spirit away the string to
4459 * a safe spot and hang on to it until the result
4460 * of pack() (and all copies of the result) are
4463 if (ckWARN(WARN_UNSAFE) && (SvTEMP(fromstr) || SvPADTMP(fromstr)))
4465 "Attempt to pack pointer to temporary value");
4466 if (SvPOK(fromstr) || SvNIOK(fromstr))
4467 aptr = SvPV(fromstr,PL_na);
4469 aptr = SvPV_force(fromstr,PL_na);
4471 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4476 aptr = SvPV(fromstr, fromlen);
4477 SvGROW(cat, fromlen * 4 / 3);
4482 while (fromlen > 0) {
4489 doencodes(cat, aptr, todo);
4508 register I32 limit = POPi; /* note, negative is forever */
4511 register char *s = SvPV(sv, len);
4512 char *strend = s + len;
4514 register REGEXP *rx;
4518 I32 maxiters = (strend - s) + 10;
4521 I32 origlimit = limit;
4524 AV *oldstack = PL_curstack;
4525 I32 gimme = GIMME_V;
4526 I32 oldsave = PL_savestack_ix;
4527 I32 make_mortal = 1;
4528 MAGIC *mg = (MAGIC *) NULL;
4531 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4536 DIE("panic: do_split");
4537 rx = pm->op_pmregexp;
4539 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4540 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4542 if (pm->op_pmreplroot)
4543 ary = GvAVn((GV*)pm->op_pmreplroot);
4544 else if (gimme != G_ARRAY)
4546 ary = (AV*)PL_curpad[0];
4548 ary = GvAVn(PL_defgv);
4549 #endif /* USE_THREADS */
4552 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4558 if (mg = SvTIED_mg((SV*)ary, 'P')) {
4560 XPUSHs(SvTIED_obj((SV*)ary, mg));
4565 for (i = AvFILLp(ary); i >= 0; i--)
4566 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4568 /* temporarily switch stacks */
4569 SWITCHSTACK(PL_curstack, ary);
4573 base = SP - PL_stack_base;
4575 if (pm->op_pmflags & PMf_SKIPWHITE) {
4576 if (pm->op_pmflags & PMf_LOCALE) {
4577 while (isSPACE_LC(*s))
4585 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4586 SAVEINT(PL_multiline);
4587 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4591 limit = maxiters + 2;
4592 if (pm->op_pmflags & PMf_WHITE) {
4595 while (m < strend &&
4596 !((pm->op_pmflags & PMf_LOCALE)
4597 ? isSPACE_LC(*m) : isSPACE(*m)))
4602 dstr = NEWSV(30, m-s);
4603 sv_setpvn(dstr, s, m-s);
4609 while (s < strend &&
4610 ((pm->op_pmflags & PMf_LOCALE)
4611 ? isSPACE_LC(*s) : isSPACE(*s)))
4615 else if (strEQ("^", rx->precomp)) {
4618 for (m = s; m < strend && *m != '\n'; m++) ;
4622 dstr = NEWSV(30, m-s);
4623 sv_setpvn(dstr, s, m-s);
4630 else if (rx->check_substr && !rx->nparens
4631 && (rx->reganch & ROPT_CHECK_ALL)
4632 && !(rx->reganch & ROPT_ANCH)) {
4633 i = SvCUR(rx->check_substr);
4634 if (i == 1 && !SvTAIL(rx->check_substr)) {
4635 i = *SvPVX(rx->check_substr);
4638 for (m = s; m < strend && *m != i; m++) ;
4641 dstr = NEWSV(30, m-s);
4642 sv_setpvn(dstr, s, m-s);
4651 while (s < strend && --limit &&
4652 (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
4653 rx->check_substr, 0)) )
4656 dstr = NEWSV(31, m-s);
4657 sv_setpvn(dstr, s, m-s);
4666 maxiters += (strend - s) * rx->nparens;
4667 while (s < strend && --limit &&
4668 CALLREGEXEC(rx, s, strend, orig, 1, Nullsv, NULL, 0))
4670 TAINT_IF(RX_MATCH_TAINTED(rx));
4672 && rx->subbase != orig) {
4677 strend = s + (strend - m);
4680 dstr = NEWSV(32, m-s);
4681 sv_setpvn(dstr, s, m-s);
4686 for (i = 1; i <= rx->nparens; i++) {
4690 dstr = NEWSV(33, m-s);
4691 sv_setpvn(dstr, s, m-s);
4694 dstr = NEWSV(33, 0);
4704 LEAVE_SCOPE(oldsave);
4705 iters = (SP - PL_stack_base) - base;
4706 if (iters > maxiters)
4709 /* keep field after final delim? */
4710 if (s < strend || (iters && origlimit)) {
4711 dstr = NEWSV(34, strend-s);
4712 sv_setpvn(dstr, s, strend-s);
4718 else if (!origlimit) {
4719 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
4725 SWITCHSTACK(ary, oldstack);
4726 if (SvSMAGICAL(ary)) {
4731 if (gimme == G_ARRAY) {
4733 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4741 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
4744 if (gimme == G_ARRAY) {
4745 /* EXTEND should not be needed - we just popped them */
4747 for (i=0; i < iters; i++) {
4748 SV **svp = av_fetch(ary, i, FALSE);
4749 PUSHs((svp) ? *svp : &PL_sv_undef);
4756 if (gimme == G_ARRAY)
4759 if (iters || !pm->op_pmreplroot) {
4769 unlock_condpair(void *svv)
4772 MAGIC *mg = mg_find((SV*)svv, 'm');
4775 croak("panic: unlock_condpair unlocking non-mutex");
4776 MUTEX_LOCK(MgMUTEXP(mg));
4777 if (MgOWNER(mg) != thr)
4778 croak("panic: unlock_condpair unlocking mutex that we don't own");
4780 COND_SIGNAL(MgOWNERCONDP(mg));
4781 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: unlock 0x%lx\n",
4782 (unsigned long)thr, (unsigned long)svv);)
4783 MUTEX_UNLOCK(MgMUTEXP(mg));
4785 #endif /* USE_THREADS */
4798 mg = condpair_magic(sv);
4799 MUTEX_LOCK(MgMUTEXP(mg));
4800 if (MgOWNER(mg) == thr)
4801 MUTEX_UNLOCK(MgMUTEXP(mg));
4804 COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
4806 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: pp_lock lock 0x%lx\n",
4807 (unsigned long)thr, (unsigned long)sv);)
4808 MUTEX_UNLOCK(MgMUTEXP(mg));
4809 save_destructor(unlock_condpair, sv);
4811 #endif /* USE_THREADS */
4812 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4813 || SvTYPE(retsv) == SVt_PVCV) {
4814 retsv = refto(retsv);
4825 if (PL_op->op_private & OPpLVAL_INTRO)
4826 PUSHs(*save_threadsv(PL_op->op_targ));
4828 PUSHs(THREADSV(PL_op->op_targ));
4831 DIE("tried to access per-thread data in non-threaded perl");
4832 #endif /* USE_THREADS */