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 /* variations on pp_null */
116 /* XXX I can't imagine anyone who doesn't have this actually _needs_
117 it, since pid_t is an integral type.
120 #ifdef NEED_GETPID_PROTO
121 extern Pid_t getpid (void);
127 if (GIMME_V == G_SCALAR)
128 XPUSHs(&PL_sv_undef);
142 if (PL_op->op_private & OPpLVAL_INTRO)
143 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
145 if (PL_op->op_flags & OPf_REF) {
149 if (GIMME == G_ARRAY) {
150 I32 maxarg = AvFILL((AV*)TARG) + 1;
152 if (SvMAGICAL(TARG)) {
154 for (i=0; i < maxarg; i++) {
155 SV **svp = av_fetch((AV*)TARG, i, FALSE);
156 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
160 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
165 SV* sv = sv_newmortal();
166 I32 maxarg = AvFILL((AV*)TARG) + 1;
167 sv_setiv(sv, maxarg);
179 if (PL_op->op_private & OPpLVAL_INTRO)
180 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
181 if (PL_op->op_flags & OPf_REF)
184 if (gimme == G_ARRAY) {
185 RETURNOP(do_kv(ARGS));
187 else if (gimme == G_SCALAR) {
188 SV* sv = sv_newmortal();
189 if (HvFILL((HV*)TARG))
190 sv_setpvf(sv, "%ld/%ld",
191 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
201 DIE("NOT IMPL LINE %d",__LINE__);
212 tryAMAGICunDEREF(to_gv);
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) {
229 if (SvGMAGICAL(sv)) {
235 if (PL_op->op_flags & OPf_REF ||
236 PL_op->op_private & HINT_STRICT_REFS)
237 DIE(PL_no_usym, "a symbol");
238 if (ckWARN(WARN_UNINITIALIZED))
239 warner(WARN_UNINITIALIZED, PL_warn_uninit);
243 if ((PL_op->op_flags & OPf_SPECIAL) &&
244 !(PL_op->op_flags & OPf_MOD))
246 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
251 if (PL_op->op_private & HINT_STRICT_REFS)
252 DIE(PL_no_symref, sym, "a symbol");
253 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
257 if (PL_op->op_private & OPpLVAL_INTRO)
258 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
269 tryAMAGICunDEREF(to_sv);
272 switch (SvTYPE(sv)) {
276 DIE("Not a SCALAR reference");
284 if (SvTYPE(gv) != SVt_PVGV) {
285 if (SvGMAGICAL(sv)) {
291 if (PL_op->op_flags & OPf_REF ||
292 PL_op->op_private & HINT_STRICT_REFS)
293 DIE(PL_no_usym, "a SCALAR");
294 if (ckWARN(WARN_UNINITIALIZED))
295 warner(WARN_UNINITIALIZED, PL_warn_uninit);
299 if ((PL_op->op_flags & OPf_SPECIAL) &&
300 !(PL_op->op_flags & OPf_MOD))
302 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
307 if (PL_op->op_private & HINT_STRICT_REFS)
308 DIE(PL_no_symref, sym, "a SCALAR");
309 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
314 if (PL_op->op_flags & OPf_MOD) {
315 if (PL_op->op_private & OPpLVAL_INTRO)
316 sv = save_scalar((GV*)TOPs);
317 else if (PL_op->op_private & OPpDEREF)
318 vivify_ref(sv, PL_op->op_private & OPpDEREF);
328 SV *sv = AvARYLEN(av);
330 AvARYLEN(av) = sv = NEWSV(0,0);
331 sv_upgrade(sv, SVt_IV);
332 sv_magic(sv, (SV*)av, '#', Nullch, 0);
340 djSP; dTARGET; dPOPss;
342 if (PL_op->op_flags & OPf_MOD) {
343 if (SvTYPE(TARG) < SVt_PVLV) {
344 sv_upgrade(TARG, SVt_PVLV);
345 sv_magic(TARG, Nullsv, '.', Nullch, 0);
349 if (LvTARG(TARG) != sv) {
351 SvREFCNT_dec(LvTARG(TARG));
352 LvTARG(TARG) = SvREFCNT_inc(sv);
354 PUSHs(TARG); /* no SvSETMAGIC */
360 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
361 mg = mg_find(sv, 'g');
362 if (mg && mg->mg_len >= 0) {
366 PUSHi(i + PL_curcop->cop_arybase);
380 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
381 /* (But not in defined().) */
382 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
385 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
388 cv = (CV*)&PL_sv_undef;
402 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
403 char *s = SvPVX(TOPs);
404 if (strnEQ(s, "CORE::", 6)) {
407 code = keyword(s + 6, SvCUR(TOPs) - 6);
408 if (code < 0) { /* Overridable. */
409 #define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
410 int i = 0, n = 0, seen_question = 0;
412 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
414 while (i < MAXO) { /* The slow way. */
415 if (strEQ(s + 6, PL_op_name[i])
416 || strEQ(s + 6, PL_op_desc[i]))
422 goto nonesuch; /* Should not happen... */
424 oa = PL_opargs[i] >> OASHIFT;
426 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(newSVpv(str, n - 1));
441 } else if (code) /* Non-Overridable */
443 else { /* None such */
445 croak("Cannot find an opnumber for \"%s\"", s+6);
449 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
451 ret = sv_2mortal(newSVpv(SvPVX(cv), SvCUR(cv)));
460 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
462 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
478 if (GIMME != G_ARRAY) {
482 *MARK = &PL_sv_undef;
483 *MARK = refto(*MARK);
487 EXTEND_MORTAL(SP - MARK);
489 *MARK = refto(*MARK);
498 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
501 if (!(sv = LvTARG(sv)))
504 else if (SvPADTMP(sv))
508 (void)SvREFCNT_inc(sv);
511 sv_upgrade(rv, SVt_RV);
525 if (sv && SvGMAGICAL(sv))
528 if (!sv || !SvROK(sv))
532 pv = sv_reftype(sv,TRUE);
533 PUSHp(pv, strlen(pv));
543 stash = PL_curcop->cop_stash;
547 char *ptr = SvPV(ssv,len);
548 if (ckWARN(WARN_UNSAFE) && len == 0)
550 "Explicit blessing to '' (assuming package main)");
551 stash = gv_stashpvn(ptr, len, TRUE);
554 (void)sv_bless(TOPs, stash);
568 elem = SvPV(sv, n_a);
572 switch (elem ? *elem : '\0')
575 if (strEQ(elem, "ARRAY"))
576 tmpRef = (SV*)GvAV(gv);
579 if (strEQ(elem, "CODE"))
580 tmpRef = (SV*)GvCVu(gv);
583 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
584 tmpRef = (SV*)GvIOp(gv);
587 if (strEQ(elem, "GLOB"))
591 if (strEQ(elem, "HASH"))
592 tmpRef = (SV*)GvHV(gv);
595 if (strEQ(elem, "IO"))
596 tmpRef = (SV*)GvIOp(gv);
599 if (strEQ(elem, "NAME"))
600 sv = newSVpv(GvNAME(gv), GvNAMELEN(gv));
603 if (strEQ(elem, "PACKAGE"))
604 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
607 if (strEQ(elem, "SCALAR"))
621 /* Pattern matching */
626 register UNOP *unop = cUNOP;
627 register unsigned char *s;
630 register I32 *sfirst;
634 if (sv == PL_lastscream) {
640 SvSCREAM_off(PL_lastscream);
641 SvREFCNT_dec(PL_lastscream);
643 PL_lastscream = SvREFCNT_inc(sv);
646 s = (unsigned char*)(SvPV(sv, len));
650 if (pos > PL_maxscream) {
651 if (PL_maxscream < 0) {
652 PL_maxscream = pos + 80;
653 New(301, PL_screamfirst, 256, I32);
654 New(302, PL_screamnext, PL_maxscream, I32);
657 PL_maxscream = pos + pos / 4;
658 Renew(PL_screamnext, PL_maxscream, I32);
662 sfirst = PL_screamfirst;
663 snext = PL_screamnext;
665 if (!sfirst || !snext)
666 DIE("do_study: out of memory");
668 for (ch = 256; ch; --ch)
675 snext[pos] = sfirst[ch] - pos;
682 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
691 if (PL_op->op_flags & OPf_STACKED)
697 TARG = sv_newmortal();
702 /* Lvalue operators. */
714 djSP; dMARK; dTARGET;
724 SETi(do_chomp(TOPs));
730 djSP; dMARK; dTARGET;
731 register I32 count = 0;
734 count += do_chomp(POPs);
745 if (!sv || !SvANY(sv))
747 switch (SvTYPE(sv)) {
749 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
753 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
757 if (CvROOT(sv) || CvXSUB(sv))
774 if (!PL_op->op_private) {
783 if (SvTHINKFIRST(sv)) {
784 if (SvREADONLY(sv)) {
786 if (PL_curcop != &PL_compiling)
793 switch (SvTYPE(sv)) {
803 if (ckWARN(WARN_UNSAFE) && cv_const_sv((CV*)sv))
804 warner(WARN_UNSAFE, "Constant subroutine %s undefined",
805 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
808 { GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
810 CvGV((CV*)sv) = gv; } /* let user-undef'd sub keep its identity */
814 SvSetMagicSV(sv, &PL_sv_undef);
818 Newz(602, gp, 1, GP);
819 GvGP(sv) = gp_ref(gp);
820 GvSV(sv) = NEWSV(72,0);
821 GvLINE(sv) = PL_curcop->cop_line;
827 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
830 SvPV_set(sv, Nullch);
843 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
845 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
846 SvIVX(TOPs) != IV_MIN)
849 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
860 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
862 sv_setsv(TARG, TOPs);
863 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
864 SvIVX(TOPs) != IV_MAX)
867 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
881 if(SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
883 sv_setsv(TARG, TOPs);
884 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
885 SvIVX(TOPs) != IV_MIN)
888 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
897 /* Ordinary operators. */
901 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
904 SETn( pow( left, right) );
911 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
914 SETn( left * right );
921 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
926 DIE("Illegal division by zero");
928 /* insure that 20./5. == 4. */
931 if ((double)I_V(left) == left &&
932 (double)I_V(right) == right &&
933 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
936 value = left / right;
940 value = left / right;
949 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
957 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
959 right = (right_neg = (i < 0)) ? -i : i;
963 right = U_V((right_neg = (n < 0)) ? -n : n);
966 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
968 left = (left_neg = (i < 0)) ? -i : i;
972 left = U_V((left_neg = (n < 0)) ? -n : n);
976 DIE("Illegal modulus zero");
979 if ((left_neg != right_neg) && ans)
982 /* XXX may warn: unary minus operator applied to unsigned type */
983 /* could change -foo to be (~foo)+1 instead */
984 if (ans <= ~((UV)IV_MAX)+1)
985 sv_setiv(TARG, ~ans+1);
987 sv_setnv(TARG, -(double)ans);
998 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
1000 register I32 count = POPi;
1001 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
1003 I32 items = SP - MARK;
1006 max = items * count;
1015 repeatcpy((char*)(MARK + items), (char*)MARK,
1016 items * sizeof(SV*), count - 1);
1019 else if (count <= 0)
1022 else { /* Note: mark already snarfed by pp_list */
1027 if (TARG == tmpstr && SvTHINKFIRST(tmpstr)) {
1028 if (SvREADONLY(tmpstr) && PL_curcop != &PL_compiling)
1029 DIE("Can't x= to readonly value");
1033 SvSetSV(TARG, tmpstr);
1034 SvPV_force(TARG, len);
1039 SvGROW(TARG, (count * len) + 1);
1040 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
1041 SvCUR(TARG) *= count;
1043 *SvEND(TARG) = '\0';
1045 (void)SvPOK_only(TARG);
1054 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1057 SETn( left - right );
1064 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
1067 if (PL_op->op_private & HINT_INTEGER) {
1069 i = BWi(i) << shift;
1083 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
1086 if (PL_op->op_private & HINT_INTEGER) {
1088 i = BWi(i) >> shift;
1102 djSP; tryAMAGICbinSET(lt,0);
1105 SETs(boolSV(TOPn < value));
1112 djSP; tryAMAGICbinSET(gt,0);
1115 SETs(boolSV(TOPn > value));
1122 djSP; tryAMAGICbinSET(le,0);
1125 SETs(boolSV(TOPn <= value));
1132 djSP; tryAMAGICbinSET(ge,0);
1135 SETs(boolSV(TOPn >= value));
1142 djSP; tryAMAGICbinSET(ne,0);
1145 SETs(boolSV(TOPn != value));
1152 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1159 else if (left < right)
1161 else if (left > right)
1174 djSP; tryAMAGICbinSET(slt,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(sgt,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(sle,0);
1203 int cmp = ((PL_op->op_private & OPpLOCALE)
1204 ? sv_cmp_locale(left, right)
1205 : sv_cmp(left, right));
1206 SETs(boolSV(cmp <= 0));
1213 djSP; tryAMAGICbinSET(sge,0);
1216 int cmp = ((PL_op->op_private & OPpLOCALE)
1217 ? sv_cmp_locale(left, right)
1218 : sv_cmp(left, right));
1219 SETs(boolSV(cmp >= 0));
1226 djSP; tryAMAGICbinSET(seq,0);
1229 SETs(boolSV(sv_eq(left, right)));
1236 djSP; tryAMAGICbinSET(sne,0);
1239 SETs(boolSV(!sv_eq(left, right)));
1246 djSP; dTARGET; tryAMAGICbin(scmp,0);
1249 int cmp = ((PL_op->op_private & OPpLOCALE)
1250 ? sv_cmp_locale(left, right)
1251 : sv_cmp(left, right));
1259 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
1262 if (SvNIOKp(left) || SvNIOKp(right)) {
1263 if (PL_op->op_private & HINT_INTEGER) {
1264 IBW value = SvIV(left) & SvIV(right);
1268 UBW value = SvUV(left) & SvUV(right);
1273 do_vop(PL_op->op_type, TARG, left, right);
1282 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
1285 if (SvNIOKp(left) || SvNIOKp(right)) {
1286 if (PL_op->op_private & HINT_INTEGER) {
1287 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1291 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1296 do_vop(PL_op->op_type, TARG, left, right);
1305 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
1308 if (SvNIOKp(left) || SvNIOKp(right)) {
1309 if (PL_op->op_private & HINT_INTEGER) {
1310 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1314 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1319 do_vop(PL_op->op_type, TARG, left, right);
1328 djSP; dTARGET; tryAMAGICun(neg);
1333 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv) && SvIVX(sv) != IV_MIN)
1335 else if (SvNIOKp(sv))
1337 else if (SvPOKp(sv)) {
1339 char *s = SvPV(sv, len);
1340 if (isIDFIRST(*s)) {
1341 sv_setpvn(TARG, "-", 1);
1344 else if (*s == '+' || *s == '-') {
1346 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
1348 else if (IN_UTF8 && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
1349 sv_setpvn(TARG, "-", 1);
1353 sv_setnv(TARG, -SvNV(sv));
1365 djSP; tryAMAGICunSET(not);
1366 #endif /* OVERLOAD */
1367 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
1373 djSP; dTARGET; tryAMAGICun(compl);
1377 if (PL_op->op_private & HINT_INTEGER) {
1378 IBW value = ~SvIV(sv);
1382 UBW value = ~SvUV(sv);
1387 register char *tmps;
1388 register long *tmpl;
1393 tmps = SvPV_force(TARG, len);
1396 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1399 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1403 for ( ; anum > 0; anum--, tmps++)
1412 /* integer versions of some of the above */
1416 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
1419 SETi( left * right );
1426 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
1430 DIE("Illegal division by zero");
1431 value = POPi / value;
1439 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
1443 DIE("Illegal modulus zero");
1444 SETi( left % right );
1451 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
1454 SETi( left + right );
1461 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
1464 SETi( left - right );
1471 djSP; tryAMAGICbinSET(lt,0);
1474 SETs(boolSV(left < right));
1481 djSP; tryAMAGICbinSET(gt,0);
1484 SETs(boolSV(left > right));
1491 djSP; tryAMAGICbinSET(le,0);
1494 SETs(boolSV(left <= right));
1501 djSP; tryAMAGICbinSET(ge,0);
1504 SETs(boolSV(left >= right));
1511 djSP; tryAMAGICbinSET(eq,0);
1514 SETs(boolSV(left == right));
1521 djSP; tryAMAGICbinSET(ne,0);
1524 SETs(boolSV(left != right));
1531 djSP; dTARGET; tryAMAGICbin(ncmp,0);
1538 else if (left < right)
1549 djSP; dTARGET; tryAMAGICun(neg);
1554 /* High falutin' math. */
1558 djSP; dTARGET; tryAMAGICbin(atan2,0);
1561 SETn(atan2(left, right));
1568 djSP; dTARGET; tryAMAGICun(sin);
1580 djSP; dTARGET; tryAMAGICun(cos);
1590 /* Support Configure command-line overrides for rand() functions.
1591 After 5.005, perhaps we should replace this by Configure support
1592 for drand48(), random(), or rand(). For 5.005, though, maintain
1593 compatibility by calling rand() but allow the user to override it.
1594 See INSTALL for details. --Andy Dougherty 15 July 1998
1596 /* Now it's after 5.005, and Configure supports drand48() and random(),
1597 in addition to rand(). So the overrides should not be needed any more.
1598 --Jarkko Hietaniemi 27 September 1998
1601 #ifndef HAS_DRAND48_PROTO
1602 extern double drand48 _((void));
1615 if (!PL_srand_called) {
1616 (void)seedDrand01((Rand_seed_t)seed());
1617 PL_srand_called = TRUE;
1632 (void)seedDrand01((Rand_seed_t)anum);
1633 PL_srand_called = TRUE;
1642 * This is really just a quick hack which grabs various garbage
1643 * values. It really should be a real hash algorithm which
1644 * spreads the effect of every input bit onto every output bit,
1645 * if someone who knows about such things would bother to write it.
1646 * Might be a good idea to add that function to CORE as well.
1647 * No numbers below come from careful analysis or anything here,
1648 * except they are primes and SEED_C1 > 1E6 to get a full-width
1649 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1650 * probably be bigger too.
1653 # define SEED_C1 1000003
1654 #define SEED_C4 73819
1656 # define SEED_C1 25747
1657 #define SEED_C4 20639
1661 #define SEED_C5 26107
1664 #ifndef PERL_NO_DEV_RANDOM
1669 # include <starlet.h>
1670 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1671 * in 100-ns units, typically incremented ever 10 ms. */
1672 unsigned int when[2];
1674 # ifdef HAS_GETTIMEOFDAY
1675 struct timeval when;
1681 /* This test is an escape hatch, this symbol isn't set by Configure. */
1682 #ifndef PERL_NO_DEV_RANDOM
1683 #ifndef PERL_RANDOM_DEVICE
1684 /* /dev/random isn't used by default because reads from it will block
1685 * if there isn't enough entropy available. You can compile with
1686 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1687 * is enough real entropy to fill the seed. */
1688 # define PERL_RANDOM_DEVICE "/dev/urandom"
1690 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1692 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1701 _ckvmssts(sys$gettim(when));
1702 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
1704 # ifdef HAS_GETTIMEOFDAY
1705 gettimeofday(&when,(struct timezone *) 0);
1706 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
1709 u = (U32)SEED_C1 * when;
1712 u += SEED_C3 * (U32)getpid();
1713 u += SEED_C4 * (U32)(UV)PL_stack_sp;
1714 #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
1715 u += SEED_C5 * (U32)(UV)&when;
1722 djSP; dTARGET; tryAMAGICun(exp);
1734 djSP; dTARGET; tryAMAGICun(log);
1739 SET_NUMERIC_STANDARD();
1740 DIE("Can't take log of %g", value);
1750 djSP; dTARGET; tryAMAGICun(sqrt);
1755 SET_NUMERIC_STANDARD();
1756 DIE("Can't take sqrt of %g", value);
1758 value = sqrt(value);
1768 double value = TOPn;
1771 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1777 (void)modf(value, &value);
1779 (void)modf(-value, &value);
1794 djSP; dTARGET; tryAMAGICun(abs);
1796 double value = TOPn;
1799 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1800 (iv = SvIVX(TOPs)) != IV_MIN) {
1822 XPUSHu(scan_hex(tmps, 99, &argtype));
1835 while (*tmps && isSPACE(*tmps))
1840 value = scan_hex(++tmps, 99, &argtype);
1841 else if (*tmps == 'b')
1842 value = scan_bin(++tmps, 99, &argtype);
1844 value = scan_oct(tmps, 99, &argtype);
1856 SETi( sv_len_utf8(TOPs) );
1860 SETi( sv_len(TOPs) );
1874 I32 lvalue = PL_op->op_flags & OPf_MOD;
1876 I32 arybase = PL_curcop->cop_arybase;
1880 SvTAINTED_off(TARG); /* decontaminate */
1884 repl = SvPV(sv, repl_len);
1891 tmps = SvPV(sv, curlen);
1893 utfcurlen = sv_len_utf8(sv);
1894 if (utfcurlen == curlen)
1902 if (pos >= arybase) {
1920 else if (len >= 0) {
1922 if (rem > (I32)curlen)
1936 if (ckWARN(WARN_SUBSTR) || lvalue || repl)
1937 warner(WARN_SUBSTR, "substr outside of string");
1942 sv_pos_u2b(sv, &pos, &rem);
1944 sv_setpvn(TARG, tmps, rem);
1945 if (lvalue) { /* it's an lvalue! */
1946 if (!SvGMAGICAL(sv)) {
1950 if (ckWARN(WARN_SUBSTR))
1952 "Attempt to use reference as lvalue in substr");
1954 if (SvOK(sv)) /* is it defined ? */
1955 (void)SvPOK_only(sv);
1957 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
1960 if (SvTYPE(TARG) < SVt_PVLV) {
1961 sv_upgrade(TARG, SVt_PVLV);
1962 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
1966 if (LvTARG(TARG) != sv) {
1968 SvREFCNT_dec(LvTARG(TARG));
1969 LvTARG(TARG) = SvREFCNT_inc(sv);
1971 LvTARGOFF(TARG) = pos;
1972 LvTARGLEN(TARG) = rem;
1975 sv_insert(sv, pos, rem, repl, repl_len);
1978 PUSHs(TARG); /* avoid SvSETMAGIC here */
1985 register I32 size = POPi;
1986 register I32 offset = POPi;
1987 register SV *src = POPs;
1988 I32 lvalue = PL_op->op_flags & OPf_MOD;
1990 unsigned char *s = (unsigned char*)SvPV(src, srclen);
1991 unsigned long retnum;
1994 SvTAINTED_off(TARG); /* decontaminate */
1995 offset *= size; /* turn into bit offset */
1996 len = (offset + size + 7) / 8;
1997 if (offset < 0 || size < 1)
2000 if (lvalue) { /* it's an lvalue! */
2001 if (SvTYPE(TARG) < SVt_PVLV) {
2002 sv_upgrade(TARG, SVt_PVLV);
2003 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
2007 if (LvTARG(TARG) != src) {
2009 SvREFCNT_dec(LvTARG(TARG));
2010 LvTARG(TARG) = SvREFCNT_inc(src);
2012 LvTARGOFF(TARG) = offset;
2013 LvTARGLEN(TARG) = size;
2021 if (offset >= srclen)
2024 retnum = (unsigned long) s[offset] << 8;
2026 else if (size == 32) {
2027 if (offset >= srclen)
2029 else if (offset + 1 >= srclen)
2030 retnum = (unsigned long) s[offset] << 24;
2031 else if (offset + 2 >= srclen)
2032 retnum = ((unsigned long) s[offset] << 24) +
2033 ((unsigned long) s[offset + 1] << 16);
2035 retnum = ((unsigned long) s[offset] << 24) +
2036 ((unsigned long) s[offset + 1] << 16) +
2037 (s[offset + 2] << 8);
2042 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
2047 else if (size == 16)
2048 retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
2049 else if (size == 32)
2050 retnum = ((unsigned long) s[offset] << 24) +
2051 ((unsigned long) s[offset + 1] << 16) +
2052 (s[offset + 2] << 8) + s[offset+3];
2056 sv_setuv(TARG, (UV)retnum);
2071 I32 arybase = PL_curcop->cop_arybase;
2076 offset = POPi - arybase;
2079 tmps = SvPV(big, biglen);
2080 if (IN_UTF8 && offset > 0)
2081 sv_pos_u2b(big, &offset, 0);
2084 else if (offset > biglen)
2086 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
2087 (unsigned char*)tmps + biglen, little, 0)))
2090 retval = tmps2 - tmps;
2091 if (IN_UTF8 && retval > 0)
2092 sv_pos_b2u(big, &retval);
2093 PUSHi(retval + arybase);
2108 I32 arybase = PL_curcop->cop_arybase;
2114 tmps2 = SvPV(little, llen);
2115 tmps = SvPV(big, blen);
2119 if (IN_UTF8 && offset > 0)
2120 sv_pos_u2b(big, &offset, 0);
2121 offset = offset - arybase + llen;
2125 else if (offset > blen)
2127 if (!(tmps2 = rninstr(tmps, tmps + offset,
2128 tmps2, tmps2 + llen)))
2131 retval = tmps2 - tmps;
2132 if (IN_UTF8 && retval > 0)
2133 sv_pos_b2u(big, &retval);
2134 PUSHi(retval + arybase);
2140 djSP; dMARK; dORIGMARK; dTARGET;
2141 #ifdef USE_LOCALE_NUMERIC
2142 if (PL_op->op_private & OPpLOCALE)
2143 SET_NUMERIC_LOCAL();
2145 SET_NUMERIC_STANDARD();
2147 do_sprintf(TARG, SP-MARK, MARK+1);
2148 TAINT_IF(SvTAINTED(TARG));
2159 U8 *tmps = (U8*)POPpx;
2162 if (IN_UTF8 && (*tmps & 0x80))
2163 value = utf8_to_uv(tmps, &retlen);
2165 value = (UV)(*tmps & 255);
2176 (void)SvUPGRADE(TARG,SVt_PV);
2178 if (IN_UTF8 && value >= 128) {
2181 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
2182 SvCUR_set(TARG, tmps - SvPVX(TARG));
2184 (void)SvPOK_only(TARG);
2194 (void)SvPOK_only(TARG);
2201 djSP; dTARGET; dPOPTOPssrl;
2204 char *tmps = SvPV(left, n_a);
2206 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
2208 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
2212 "The crypt() function is unimplemented due to excessive paranoia.");
2225 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2229 UV uv = utf8_to_uv(s, &ulen);
2231 if (PL_op->op_private & OPpLOCALE) {
2234 uv = toTITLE_LC_uni(uv);
2237 uv = toTITLE_utf8(s);
2239 tend = uv_to_utf8(tmpbuf, uv);
2241 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2243 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2244 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2248 s = (U8*)SvPV_force(sv, slen);
2249 Copy(tmpbuf, s, ulen, U8);
2254 if (!SvPADTMP(sv)) {
2260 s = (U8*)SvPV_force(sv, slen);
2262 if (PL_op->op_private & OPpLOCALE) {
2265 *s = toUPPER_LC(*s);
2281 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
2285 UV uv = utf8_to_uv(s, &ulen);
2287 if (PL_op->op_private & OPpLOCALE) {
2290 uv = toLOWER_LC_uni(uv);
2293 uv = toLOWER_utf8(s);
2295 tend = uv_to_utf8(tmpbuf, uv);
2297 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2299 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2300 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
2304 s = (U8*)SvPV_force(sv, slen);
2305 Copy(tmpbuf, s, ulen, U8);
2310 if (!SvPADTMP(sv)) {
2316 s = (U8*)SvPV_force(sv, slen);
2318 if (PL_op->op_private & OPpLOCALE) {
2321 *s = toLOWER_LC(*s);
2344 s = (U8*)SvPV(sv,len);
2346 sv_setpvn(TARG, "", 0);
2351 (void)SvUPGRADE(TARG, SVt_PV);
2352 SvGROW(TARG, (len * 2) + 1);
2353 (void)SvPOK_only(TARG);
2354 d = (U8*)SvPVX(TARG);
2356 if (PL_op->op_private & OPpLOCALE) {
2360 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2366 d = uv_to_utf8(d, toUPPER_utf8( s ));
2371 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2376 if (!SvPADTMP(sv)) {
2383 s = (U8*)SvPV_force(sv, len);
2385 register U8 *send = s + len;
2387 if (PL_op->op_private & OPpLOCALE) {
2390 for (; s < send; s++)
2391 *s = toUPPER_LC(*s);
2394 for (; s < send; s++)
2414 s = (U8*)SvPV(sv,len);
2416 sv_setpvn(TARG, "", 0);
2421 (void)SvUPGRADE(TARG, SVt_PV);
2422 SvGROW(TARG, (len * 2) + 1);
2423 (void)SvPOK_only(TARG);
2424 d = (U8*)SvPVX(TARG);
2426 if (PL_op->op_private & OPpLOCALE) {
2430 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2436 d = uv_to_utf8(d, toLOWER_utf8(s));
2441 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2446 if (!SvPADTMP(sv)) {
2453 s = (U8*)SvPV_force(sv, len);
2455 register U8 *send = s + len;
2457 if (PL_op->op_private & OPpLOCALE) {
2460 for (; s < send; s++)
2461 *s = toLOWER_LC(*s);
2464 for (; s < send; s++)
2476 register char *s = SvPV(sv,len);
2480 (void)SvUPGRADE(TARG, SVt_PV);
2481 SvGROW(TARG, (len * 2) + 1);
2486 STRLEN ulen = UTF8SKIP(s);
2509 SvCUR_set(TARG, d - SvPVX(TARG));
2510 (void)SvPOK_only(TARG);
2513 sv_setpvn(TARG, s, len);
2522 djSP; dMARK; dORIGMARK;
2524 register AV* av = (AV*)POPs;
2525 register I32 lval = PL_op->op_flags & OPf_MOD;
2526 I32 arybase = PL_curcop->cop_arybase;
2529 if (SvTYPE(av) == SVt_PVAV) {
2530 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
2532 for (svp = MARK + 1; svp <= SP; svp++) {
2537 if (max > AvMAX(av))
2540 while (++MARK <= SP) {
2541 elem = SvIVx(*MARK);
2545 svp = av_fetch(av, elem, lval);
2547 if (!svp || *svp == &PL_sv_undef)
2548 DIE(PL_no_aelem, elem);
2549 if (PL_op->op_private & OPpLVAL_INTRO)
2550 save_aelem(av, elem, svp);
2552 *MARK = svp ? *svp : &PL_sv_undef;
2555 if (GIMME != G_ARRAY) {
2563 /* Associative arrays. */
2568 HV *hash = (HV*)POPs;
2570 I32 gimme = GIMME_V;
2571 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
2574 /* might clobber stack_sp */
2575 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
2580 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2581 if (gimme == G_ARRAY) {
2583 /* might clobber stack_sp */
2584 sv_setsv(TARG, realhv ?
2585 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry));
2590 else if (gimme == G_SCALAR)
2609 I32 gimme = GIMME_V;
2610 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
2614 if (PL_op->op_private & OPpSLICE) {
2618 hvtype = SvTYPE(hv);
2619 while (++MARK <= SP) {
2620 if (hvtype == SVt_PVHV)
2621 sv = hv_delete_ent(hv, *MARK, discard, 0);
2623 DIE("Not a HASH reference");
2624 *MARK = sv ? sv : &PL_sv_undef;
2628 else if (gimme == G_SCALAR) {
2637 if (SvTYPE(hv) == SVt_PVHV)
2638 sv = hv_delete_ent(hv, keysv, discard, 0);
2640 DIE("Not a HASH reference");
2654 if (SvTYPE(hv) == SVt_PVHV) {
2655 if (hv_exists_ent(hv, tmpsv, 0))
2657 } else if (SvTYPE(hv) == SVt_PVAV) {
2658 if (avhv_exists_ent((AV*)hv, tmpsv, 0))
2661 DIE("Not a HASH reference");
2668 djSP; dMARK; dORIGMARK;
2669 register HV *hv = (HV*)POPs;
2670 register I32 lval = PL_op->op_flags & OPf_MOD;
2671 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
2673 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
2674 DIE("Can't localize pseudo-hash element");
2676 if (realhv || SvTYPE(hv) == SVt_PVAV) {
2677 while (++MARK <= SP) {
2681 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
2682 svp = he ? &HeVAL(he) : 0;
2684 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
2687 if (!svp || *svp == &PL_sv_undef) {
2689 DIE(PL_no_helem, SvPV(keysv, n_a));
2691 if (PL_op->op_private & OPpLVAL_INTRO)
2692 save_helem(hv, keysv, svp);
2694 *MARK = svp ? *svp : &PL_sv_undef;
2697 if (GIMME != G_ARRAY) {
2705 /* List operators. */
2710 if (GIMME != G_ARRAY) {
2712 *MARK = *SP; /* unwanted list, return last item */
2714 *MARK = &PL_sv_undef;
2723 SV **lastrelem = PL_stack_sp;
2724 SV **lastlelem = PL_stack_base + POPMARK;
2725 SV **firstlelem = PL_stack_base + POPMARK + 1;
2726 register SV **firstrelem = lastlelem + 1;
2727 I32 arybase = PL_curcop->cop_arybase;
2728 I32 lval = PL_op->op_flags & OPf_MOD;
2729 I32 is_something_there = lval;
2731 register I32 max = lastrelem - lastlelem;
2732 register SV **lelem;
2735 if (GIMME != G_ARRAY) {
2736 ix = SvIVx(*lastlelem);
2741 if (ix < 0 || ix >= max)
2742 *firstlelem = &PL_sv_undef;
2744 *firstlelem = firstrelem[ix];
2750 SP = firstlelem - 1;
2754 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
2759 *lelem = &PL_sv_undef;
2760 else if (!(*lelem = firstrelem[ix]))
2761 *lelem = &PL_sv_undef;
2765 if (ix >= max || !(*lelem = firstrelem[ix]))
2766 *lelem = &PL_sv_undef;
2768 if (!is_something_there && (SvOK(*lelem) || SvGMAGICAL(*lelem)))
2769 is_something_there = TRUE;
2771 if (is_something_there)
2774 SP = firstlelem - 1;
2780 djSP; dMARK; dORIGMARK;
2781 I32 items = SP - MARK;
2782 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2783 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2790 djSP; dMARK; dORIGMARK;
2791 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2795 SV *val = NEWSV(46, 0);
2797 sv_setsv(val, *++MARK);
2798 else if (ckWARN(WARN_UNSAFE))
2799 warner(WARN_UNSAFE, "Odd number of elements in hash assignment");
2800 (void)hv_store_ent(hv,key,val,0);
2809 djSP; dMARK; dORIGMARK;
2810 register AV *ary = (AV*)*++MARK;
2814 register I32 offset;
2815 register I32 length;
2822 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2823 *MARK-- = SvTIED_obj((SV*)ary, mg);
2827 perl_call_method("SPLICE",GIMME_V);
2836 offset = i = SvIVx(*MARK);
2838 offset += AvFILLp(ary) + 1;
2840 offset -= PL_curcop->cop_arybase;
2842 DIE(PL_no_aelem, i);
2844 length = SvIVx(*MARK++);
2846 length += AvFILLp(ary) - offset + 1;
2852 length = AvMAX(ary) + 1; /* close enough to infinity */
2856 length = AvMAX(ary) + 1;
2858 if (offset > AvFILLp(ary) + 1)
2859 offset = AvFILLp(ary) + 1;
2860 after = AvFILLp(ary) + 1 - (offset + length);
2861 if (after < 0) { /* not that much array */
2862 length += after; /* offset+length now in array */
2868 /* At this point, MARK .. SP-1 is our new LIST */
2871 diff = newlen - length;
2872 if (newlen && !AvREAL(ary) && AvREIFY(ary))
2875 if (diff < 0) { /* shrinking the area */
2877 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2878 Copy(MARK, tmparyval, newlen, SV*);
2881 MARK = ORIGMARK + 1;
2882 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2883 MEXTEND(MARK, length);
2884 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2886 EXTEND_MORTAL(length);
2887 for (i = length, dst = MARK; i; i--) {
2888 sv_2mortal(*dst); /* free them eventualy */
2895 *MARK = AvARRAY(ary)[offset+length-1];
2898 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2899 SvREFCNT_dec(*dst++); /* free them now */
2902 AvFILLp(ary) += diff;
2904 /* pull up or down? */
2906 if (offset < after) { /* easier to pull up */
2907 if (offset) { /* esp. if nothing to pull */
2908 src = &AvARRAY(ary)[offset-1];
2909 dst = src - diff; /* diff is negative */
2910 for (i = offset; i > 0; i--) /* can't trust Copy */
2914 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
2918 if (after) { /* anything to pull down? */
2919 src = AvARRAY(ary) + offset + length;
2920 dst = src + diff; /* diff is negative */
2921 Move(src, dst, after, SV*);
2923 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
2924 /* avoid later double free */
2928 dst[--i] = &PL_sv_undef;
2931 for (src = tmparyval, dst = AvARRAY(ary) + offset;
2933 *dst = NEWSV(46, 0);
2934 sv_setsv(*dst++, *src++);
2936 Safefree(tmparyval);
2939 else { /* no, expanding (or same) */
2941 New(452, tmparyval, length, SV*); /* so remember deletion */
2942 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
2945 if (diff > 0) { /* expanding */
2947 /* push up or down? */
2949 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
2953 Move(src, dst, offset, SV*);
2955 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
2957 AvFILLp(ary) += diff;
2960 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
2961 av_extend(ary, AvFILLp(ary) + diff);
2962 AvFILLp(ary) += diff;
2965 dst = AvARRAY(ary) + AvFILLp(ary);
2967 for (i = after; i; i--) {
2974 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
2975 *dst = NEWSV(46, 0);
2976 sv_setsv(*dst++, *src++);
2978 MARK = ORIGMARK + 1;
2979 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2981 Copy(tmparyval, MARK, length, SV*);
2983 EXTEND_MORTAL(length);
2984 for (i = length, dst = MARK; i; i--) {
2985 sv_2mortal(*dst); /* free them eventualy */
2989 Safefree(tmparyval);
2993 else if (length--) {
2994 *MARK = tmparyval[length];
2997 while (length-- > 0)
2998 SvREFCNT_dec(tmparyval[length]);
3000 Safefree(tmparyval);
3003 *MARK = &PL_sv_undef;
3011 djSP; dMARK; dORIGMARK; dTARGET;
3012 register AV *ary = (AV*)*++MARK;
3013 register SV *sv = &PL_sv_undef;
3016 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3017 *MARK-- = SvTIED_obj((SV*)ary, mg);
3021 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
3026 /* Why no pre-extend of ary here ? */
3027 for (++MARK; MARK <= SP; MARK++) {
3030 sv_setsv(sv, *MARK);
3035 PUSHi( AvFILL(ary) + 1 );
3043 SV *sv = av_pop(av);
3045 (void)sv_2mortal(sv);
3054 SV *sv = av_shift(av);
3059 (void)sv_2mortal(sv);
3066 djSP; dMARK; dORIGMARK; dTARGET;
3067 register AV *ary = (AV*)*++MARK;
3072 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3073 *MARK-- = SvTIED_obj((SV*)ary, mg);
3077 perl_call_method("UNSHIFT",G_SCALAR|G_DISCARD);
3082 av_unshift(ary, SP - MARK);
3085 sv_setsv(sv, *++MARK);
3086 (void)av_store(ary, i++, sv);
3090 PUSHi( AvFILL(ary) + 1 );
3100 if (GIMME == G_ARRAY) {
3111 register char *down;
3117 do_join(TARG, &PL_sv_no, MARK, SP);
3119 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
3120 up = SvPV_force(TARG, len);
3122 if (IN_UTF8) { /* first reverse each character */
3123 U8* s = (U8*)SvPVX(TARG);
3124 U8* send = (U8*)(s + len);
3133 down = (char*)(s - 1);
3134 if (s > send || !((*down & 0xc0) == 0x80)) {
3135 warn("Malformed UTF-8 character");
3147 down = SvPVX(TARG) + len - 1;
3153 (void)SvPOK_only(TARG);
3162 mul128(SV *sv, U8 m)
3165 char *s = SvPV(sv, len);
3169 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
3170 SV *tmpNew = newSVpv("0000000000", 10);
3172 sv_catsv(tmpNew, sv);
3173 SvREFCNT_dec(sv); /* free old sv */
3178 while (!*t) /* trailing '\0'? */
3181 i = ((*t - '0') << 7) + m;
3182 *(t--) = '0' + (i % 10);
3188 /* Explosives and implosives. */
3190 #if 'I' == 73 && 'J' == 74
3191 /* On an ASCII/ISO kind of system */
3192 #define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
3195 Some other sort of character set - use memchr() so we don't match
3198 #define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
3206 I32 gimme = GIMME_V;
3210 register char *pat = SvPV(left, llen);
3211 register char *s = SvPV(right, rlen);
3212 char *strend = s + rlen;
3214 register char *patend = pat + llen;
3219 /* These must not be in registers: */
3236 register U32 culong;
3240 if (gimme != G_ARRAY) { /* arrange to do first one only */
3242 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
3243 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
3245 while (isDIGIT(*patend) || *patend == '*')
3251 while (pat < patend) {
3253 datumtype = *pat++ & 0xFF;
3254 if (isSPACE(datumtype))
3258 else if (*pat == '*') {
3259 len = strend - strbeg; /* long enough */
3262 else if (isDIGIT(*pat)) {
3264 while (isDIGIT(*pat))
3265 len = (len * 10) + (*pat++ - '0');
3268 len = (datumtype != '@');
3271 croak("Invalid type in unpack: '%c'", (int)datumtype);
3272 case ',': /* grandfather in commas but with a warning */
3273 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
3274 warner(WARN_UNSAFE, "Invalid type in unpack: '%c'", (int)datumtype);
3277 if (len == 1 && pat[-1] != '1')
3286 if (len > strend - strbeg)
3287 DIE("@ outside of string");
3291 if (len > s - strbeg)
3292 DIE("X outside of string");
3296 if (len > strend - s)
3297 DIE("x outside of string");
3303 if (len > strend - s)
3306 goto uchar_checksum;
3307 sv = NEWSV(35, len);
3308 sv_setpvn(sv, s, len);
3310 if (datumtype == 'A' || datumtype == 'Z') {
3311 aptr = s; /* borrow register */
3312 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
3317 else { /* 'A' strips both nulls and spaces */
3318 s = SvPVX(sv) + len - 1;
3319 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3323 SvCUR_set(sv, s - SvPVX(sv));
3324 s = aptr; /* unborrow register */
3326 XPUSHs(sv_2mortal(sv));
3330 if (pat[-1] == '*' || len > (strend - s) * 8)
3331 len = (strend - s) * 8;
3334 Newz(601, PL_bitcount, 256, char);
3335 for (bits = 1; bits < 256; bits++) {
3336 if (bits & 1) PL_bitcount[bits]++;
3337 if (bits & 2) PL_bitcount[bits]++;
3338 if (bits & 4) PL_bitcount[bits]++;
3339 if (bits & 8) PL_bitcount[bits]++;
3340 if (bits & 16) PL_bitcount[bits]++;
3341 if (bits & 32) PL_bitcount[bits]++;
3342 if (bits & 64) PL_bitcount[bits]++;
3343 if (bits & 128) PL_bitcount[bits]++;
3347 culong += PL_bitcount[*(unsigned char*)s++];
3352 if (datumtype == 'b') {
3354 if (bits & 1) culong++;
3360 if (bits & 128) culong++;
3367 sv = NEWSV(35, len + 1);
3370 aptr = pat; /* borrow register */
3372 if (datumtype == 'b') {
3374 for (len = 0; len < aint; len++) {
3375 if (len & 7) /*SUPPRESS 595*/
3379 *pat++ = '0' + (bits & 1);
3384 for (len = 0; len < aint; len++) {
3389 *pat++ = '0' + ((bits & 128) != 0);
3393 pat = aptr; /* unborrow register */
3394 XPUSHs(sv_2mortal(sv));
3398 if (pat[-1] == '*' || len > (strend - s) * 2)
3399 len = (strend - s) * 2;
3400 sv = NEWSV(35, len + 1);
3403 aptr = pat; /* borrow register */
3405 if (datumtype == 'h') {
3407 for (len = 0; len < aint; len++) {
3412 *pat++ = PL_hexdigit[bits & 15];
3417 for (len = 0; len < aint; len++) {
3422 *pat++ = PL_hexdigit[(bits >> 4) & 15];
3426 pat = aptr; /* unborrow register */
3427 XPUSHs(sv_2mortal(sv));
3430 if (len > strend - s)
3435 if (aint >= 128) /* fake up signed chars */
3445 if (aint >= 128) /* fake up signed chars */
3448 sv_setiv(sv, (IV)aint);
3449 PUSHs(sv_2mortal(sv));
3454 if (len > strend - s)
3469 sv_setiv(sv, (IV)auint);
3470 PUSHs(sv_2mortal(sv));
3475 if (len > strend - s)
3478 while (len-- > 0 && s < strend) {
3479 auint = utf8_to_uv((U8*)s, &along);
3482 cdouble += (double)auint;
3490 while (len-- > 0 && s < strend) {
3491 auint = utf8_to_uv((U8*)s, &along);
3494 sv_setuv(sv, (UV)auint);
3495 PUSHs(sv_2mortal(sv));
3500 along = (strend - s) / SIZE16;
3517 sv_setiv(sv, (IV)ashort);
3518 PUSHs(sv_2mortal(sv));
3525 along = (strend - s) / SIZE16;
3530 COPY16(s, &aushort);
3533 if (datumtype == 'n')
3534 aushort = PerlSock_ntohs(aushort);
3537 if (datumtype == 'v')
3538 aushort = vtohs(aushort);
3547 COPY16(s, &aushort);
3551 if (datumtype == 'n')
3552 aushort = PerlSock_ntohs(aushort);
3555 if (datumtype == 'v')
3556 aushort = vtohs(aushort);
3558 sv_setiv(sv, (IV)aushort);
3559 PUSHs(sv_2mortal(sv));
3564 along = (strend - s) / sizeof(int);
3569 Copy(s, &aint, 1, int);
3572 cdouble += (double)aint;
3581 Copy(s, &aint, 1, int);
3585 /* Without the dummy below unpack("i", pack("i",-1))
3586 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
3587 * cc with optimization turned on */
3589 sv_setiv(sv, (IV)aint) :
3591 sv_setiv(sv, (IV)aint);
3592 PUSHs(sv_2mortal(sv));
3597 along = (strend - s) / sizeof(unsigned int);
3602 Copy(s, &auint, 1, unsigned int);
3603 s += sizeof(unsigned int);
3605 cdouble += (double)auint;
3614 Copy(s, &auint, 1, unsigned int);
3615 s += sizeof(unsigned int);
3618 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
3619 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF for
3620 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (aka V4.0D)
3621 * with optimization turned on.
3622 * (DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (aka V4.0B)
3623 * does not have this problem even with -O4)
3626 sv_setuv(sv, (UV)auint) :
3628 sv_setuv(sv, (UV)auint);
3629 PUSHs(sv_2mortal(sv));
3634 along = (strend - s) / SIZE32;
3642 cdouble += (double)along;
3654 sv_setiv(sv, (IV)along);
3655 PUSHs(sv_2mortal(sv));
3662 along = (strend - s) / SIZE32;
3670 if (datumtype == 'N')
3671 aulong = PerlSock_ntohl(aulong);
3674 if (datumtype == 'V')
3675 aulong = vtohl(aulong);
3678 cdouble += (double)aulong;
3690 if (datumtype == 'N')
3691 aulong = PerlSock_ntohl(aulong);
3694 if (datumtype == 'V')
3695 aulong = vtohl(aulong);
3698 sv_setuv(sv, (UV)aulong);
3699 PUSHs(sv_2mortal(sv));
3704 along = (strend - s) / sizeof(char*);
3710 if (sizeof(char*) > strend - s)
3713 Copy(s, &aptr, 1, char*);
3719 PUSHs(sv_2mortal(sv));
3729 while ((len > 0) && (s < strend)) {
3730 auv = (auv << 7) | (*s & 0x7f);
3731 if (!(*s++ & 0x80)) {
3735 PUSHs(sv_2mortal(sv));
3739 else if (++bytes >= sizeof(UV)) { /* promote to string */
3743 sv = newSVpvf("%.*Vu", (int)TYPE_DIGITS(UV), auv);
3744 while (s < strend) {
3745 sv = mul128(sv, *s & 0x7f);
3746 if (!(*s++ & 0x80)) {
3755 PUSHs(sv_2mortal(sv));
3760 if ((s >= strend) && bytes)
3761 croak("Unterminated compressed integer");
3766 if (sizeof(char*) > strend - s)
3769 Copy(s, &aptr, 1, char*);
3774 sv_setpvn(sv, aptr, len);
3775 PUSHs(sv_2mortal(sv));
3779 along = (strend - s) / sizeof(Quad_t);
3785 if (s + sizeof(Quad_t) > strend)
3788 Copy(s, &aquad, 1, Quad_t);
3789 s += sizeof(Quad_t);
3792 if (aquad >= IV_MIN && aquad <= IV_MAX)
3793 sv_setiv(sv, (IV)aquad);
3795 sv_setnv(sv, (double)aquad);
3796 PUSHs(sv_2mortal(sv));
3800 along = (strend - s) / sizeof(Quad_t);
3806 if (s + sizeof(Uquad_t) > strend)
3809 Copy(s, &auquad, 1, Uquad_t);
3810 s += sizeof(Uquad_t);
3813 if (auquad <= UV_MAX)
3814 sv_setuv(sv, (UV)auquad);
3816 sv_setnv(sv, (double)auquad);
3817 PUSHs(sv_2mortal(sv));
3821 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
3824 along = (strend - s) / sizeof(float);
3829 Copy(s, &afloat, 1, float);
3838 Copy(s, &afloat, 1, float);
3841 sv_setnv(sv, (double)afloat);
3842 PUSHs(sv_2mortal(sv));
3848 along = (strend - s) / sizeof(double);
3853 Copy(s, &adouble, 1, double);
3854 s += sizeof(double);
3862 Copy(s, &adouble, 1, double);
3863 s += sizeof(double);
3865 sv_setnv(sv, (double)adouble);
3866 PUSHs(sv_2mortal(sv));
3872 * Initialise the decode mapping. By using a table driven
3873 * algorithm, the code will be character-set independent
3874 * (and just as fast as doing character arithmetic)
3876 if (PL_uudmap['M'] == 0) {
3879 for (i = 0; i < sizeof(PL_uuemap); i += 1)
3880 PL_uudmap[PL_uuemap[i]] = i;
3882 * Because ' ' and '`' map to the same value,
3883 * we need to decode them both the same.
3888 along = (strend - s) * 3 / 4;
3889 sv = NEWSV(42, along);
3892 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
3897 len = PL_uudmap[*s++] & 077;
3899 if (s < strend && ISUUCHAR(*s))
3900 a = PL_uudmap[*s++] & 077;
3903 if (s < strend && ISUUCHAR(*s))
3904 b = PL_uudmap[*s++] & 077;
3907 if (s < strend && ISUUCHAR(*s))
3908 c = PL_uudmap[*s++] & 077;
3911 if (s < strend && ISUUCHAR(*s))
3912 d = PL_uudmap[*s++] & 077;
3915 hunk[0] = (a << 2) | (b >> 4);
3916 hunk[1] = (b << 4) | (c >> 2);
3917 hunk[2] = (c << 6) | d;
3918 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
3923 else if (s[1] == '\n') /* possible checksum byte */
3926 XPUSHs(sv_2mortal(sv));
3931 if (strchr("fFdD", datumtype) ||
3932 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
3936 while (checksum >= 16) {
3940 while (checksum >= 4) {
3946 along = (1 << checksum) - 1;
3947 while (cdouble < 0.0)
3949 cdouble = modf(cdouble / adouble, &trouble) * adouble;
3950 sv_setnv(sv, cdouble);
3953 if (checksum < 32) {
3954 aulong = (1 << checksum) - 1;
3957 sv_setuv(sv, (UV)culong);
3959 XPUSHs(sv_2mortal(sv));
3963 if (SP == oldsp && gimme == G_SCALAR)
3964 PUSHs(&PL_sv_undef);
3969 doencodes(register SV *sv, register char *s, register I32 len)
3973 *hunk = PL_uuemap[len];
3974 sv_catpvn(sv, hunk, 1);
3977 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
3978 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
3979 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
3980 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
3981 sv_catpvn(sv, hunk, 4);
3986 char r = (len > 1 ? s[1] : '\0');
3987 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
3988 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
3989 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
3990 hunk[3] = PL_uuemap[0];
3991 sv_catpvn(sv, hunk, 4);
3993 sv_catpvn(sv, "\n", 1);
3997 is_an_int(char *s, STRLEN l)
4000 SV *result = newSVpv("", l);
4001 char *result_c = SvPV(result, n_a); /* convenience */
4002 char *out = result_c;
4012 SvREFCNT_dec(result);
4035 SvREFCNT_dec(result);
4041 SvCUR_set(result, out - result_c);
4046 div128(SV *pnum, bool *done)
4047 /* must be '\0' terminated */
4051 char *s = SvPV(pnum, len);
4060 i = m * 10 + (*t - '0');
4062 r = (i >> 7); /* r < 10 */
4069 SvCUR_set(pnum, (STRLEN) (t - s));
4076 djSP; dMARK; dORIGMARK; dTARGET;
4077 register SV *cat = TARG;
4080 register char *pat = SvPVx(*++MARK, fromlen);
4081 register char *patend = pat + fromlen;
4086 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4087 static char *space10 = " ";
4089 /* These must not be in registers: */
4107 sv_setpvn(cat, "", 0);
4108 while (pat < patend) {
4109 #define NEXTFROM (items-- > 0 ? *MARK++ : &PL_sv_no)
4110 datumtype = *pat++ & 0xFF;
4111 if (isSPACE(datumtype))
4114 len = strchr("@Xxu", datumtype) ? 0 : items;
4117 else if (isDIGIT(*pat)) {
4119 while (isDIGIT(*pat))
4120 len = (len * 10) + (*pat++ - '0');
4126 croak("Invalid type in pack: '%c'", (int)datumtype);
4127 case ',': /* grandfather in commas but with a warning */
4128 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
4129 warner(WARN_UNSAFE, "Invalid type in pack: '%c'", (int)datumtype);
4132 DIE("%% may only be used in unpack");
4143 if (SvCUR(cat) < len)
4144 DIE("X outside of string");
4151 sv_catpvn(cat, null10, 10);
4154 sv_catpvn(cat, null10, len);
4160 aptr = SvPV(fromstr, fromlen);
4164 sv_catpvn(cat, aptr, len);
4166 sv_catpvn(cat, aptr, fromlen);
4168 if (datumtype == 'A') {
4170 sv_catpvn(cat, space10, 10);
4173 sv_catpvn(cat, space10, len);
4177 sv_catpvn(cat, null10, 10);
4180 sv_catpvn(cat, null10, len);
4187 char *savepat = pat;
4192 aptr = SvPV(fromstr, fromlen);
4197 SvCUR(cat) += (len+7)/8;
4198 SvGROW(cat, SvCUR(cat) + 1);
4199 aptr = SvPVX(cat) + aint;
4204 if (datumtype == 'B') {
4205 for (len = 0; len++ < aint;) {
4206 items |= *pat++ & 1;
4210 *aptr++ = items & 0xff;
4216 for (len = 0; len++ < aint;) {
4222 *aptr++ = items & 0xff;
4228 if (datumtype == 'B')
4229 items <<= 7 - (aint & 7);
4231 items >>= 7 - (aint & 7);
4232 *aptr++ = items & 0xff;
4234 pat = SvPVX(cat) + SvCUR(cat);
4245 char *savepat = pat;
4250 aptr = SvPV(fromstr, fromlen);
4255 SvCUR(cat) += (len+1)/2;
4256 SvGROW(cat, SvCUR(cat) + 1);
4257 aptr = SvPVX(cat) + aint;
4262 if (datumtype == 'H') {
4263 for (len = 0; len++ < aint;) {
4265 items |= ((*pat++ & 15) + 9) & 15;
4267 items |= *pat++ & 15;
4271 *aptr++ = items & 0xff;
4277 for (len = 0; len++ < aint;) {
4279 items |= (((*pat++ & 15) + 9) & 15) << 4;
4281 items |= (*pat++ & 15) << 4;
4285 *aptr++ = items & 0xff;
4291 *aptr++ = items & 0xff;
4292 pat = SvPVX(cat) + SvCUR(cat);
4304 aint = SvIV(fromstr);
4306 sv_catpvn(cat, &achar, sizeof(char));
4312 auint = SvUV(fromstr);
4313 SvGROW(cat, SvCUR(cat) + 10);
4314 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4319 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4324 afloat = (float)SvNV(fromstr);
4325 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4332 adouble = (double)SvNV(fromstr);
4333 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4339 ashort = (I16)SvIV(fromstr);
4341 ashort = PerlSock_htons(ashort);
4343 CAT16(cat, &ashort);
4349 ashort = (I16)SvIV(fromstr);
4351 ashort = htovs(ashort);
4353 CAT16(cat, &ashort);
4360 ashort = (I16)SvIV(fromstr);
4361 CAT16(cat, &ashort);
4367 auint = SvUV(fromstr);
4368 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4374 adouble = floor(SvNV(fromstr));
4377 croak("Cannot compress negative numbers");
4383 #ifdef CXUX_BROKEN_CONSTANT_CONVERT
4384 adouble <= UV_MAX_cxux
4391 char buf[1 + sizeof(UV)];
4392 char *in = buf + sizeof(buf);
4393 UV auv = U_V(adouble);;
4396 *--in = (auv & 0x7f) | 0x80;
4399 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4400 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4402 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4403 char *from, *result, *in;
4408 /* Copy string and check for compliance */
4409 from = SvPV(fromstr, len);
4410 if ((norm = is_an_int(from, len)) == NULL)
4411 croak("can compress only unsigned integer");
4413 New('w', result, len, char);
4417 *--in = div128(norm, &done) | 0x80;
4418 result[len - 1] &= 0x7F; /* clear continue bit */
4419 sv_catpvn(cat, in, (result + len) - in);
4421 SvREFCNT_dec(norm); /* free norm */
4423 else if (SvNOKp(fromstr)) {
4424 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4425 char *in = buf + sizeof(buf);
4428 double next = floor(adouble / 128);
4429 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4430 if (--in < buf) /* this cannot happen ;-) */
4431 croak ("Cannot compress integer");
4433 } while (adouble > 0);
4434 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4435 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4438 croak("Cannot compress non integer");
4444 aint = SvIV(fromstr);
4445 sv_catpvn(cat, (char*)&aint, sizeof(int));
4451 aulong = SvUV(fromstr);
4453 aulong = PerlSock_htonl(aulong);
4455 CAT32(cat, &aulong);
4461 aulong = SvUV(fromstr);
4463 aulong = htovl(aulong);
4465 CAT32(cat, &aulong);
4471 aulong = SvUV(fromstr);
4472 CAT32(cat, &aulong);
4478 along = SvIV(fromstr);
4486 auquad = (Uquad_t)SvIV(fromstr);
4487 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
4493 aquad = (Quad_t)SvIV(fromstr);
4494 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
4497 #endif /* HAS_QUAD */
4499 len = 1; /* assume SV is correct length */
4504 if (fromstr == &PL_sv_undef)
4508 /* XXX better yet, could spirit away the string to
4509 * a safe spot and hang on to it until the result
4510 * of pack() (and all copies of the result) are
4513 if (ckWARN(WARN_UNSAFE) && (SvTEMP(fromstr) || SvPADTMP(fromstr)))
4515 "Attempt to pack pointer to temporary value");
4516 if (SvPOK(fromstr) || SvNIOK(fromstr))
4517 aptr = SvPV(fromstr,n_a);
4519 aptr = SvPV_force(fromstr,n_a);
4521 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4526 aptr = SvPV(fromstr, fromlen);
4527 SvGROW(cat, fromlen * 4 / 3);
4532 while (fromlen > 0) {
4539 doencodes(cat, aptr, todo);
4558 register I32 limit = POPi; /* note, negative is forever */
4561 register char *s = SvPV(sv, len);
4562 char *strend = s + len;
4564 register REGEXP *rx;
4568 I32 maxiters = (strend - s) + 10;
4571 I32 origlimit = limit;
4574 AV *oldstack = PL_curstack;
4575 I32 gimme = GIMME_V;
4576 I32 oldsave = PL_savestack_ix;
4577 I32 make_mortal = 1;
4578 MAGIC *mg = (MAGIC *) NULL;
4581 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4586 DIE("panic: do_split");
4587 rx = pm->op_pmregexp;
4589 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4590 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4592 if (pm->op_pmreplroot)
4593 ary = GvAVn((GV*)pm->op_pmreplroot);
4594 else if (gimme != G_ARRAY)
4596 ary = (AV*)PL_curpad[0];
4598 ary = GvAVn(PL_defgv);
4599 #endif /* USE_THREADS */
4602 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4608 if (mg = SvTIED_mg((SV*)ary, 'P')) {
4610 XPUSHs(SvTIED_obj((SV*)ary, mg));
4615 for (i = AvFILLp(ary); i >= 0; i--)
4616 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
4618 /* temporarily switch stacks */
4619 SWITCHSTACK(PL_curstack, ary);
4623 base = SP - PL_stack_base;
4625 if (pm->op_pmflags & PMf_SKIPWHITE) {
4626 if (pm->op_pmflags & PMf_LOCALE) {
4627 while (isSPACE_LC(*s))
4635 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
4636 SAVEINT(PL_multiline);
4637 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
4641 limit = maxiters + 2;
4642 if (pm->op_pmflags & PMf_WHITE) {
4645 while (m < strend &&
4646 !((pm->op_pmflags & PMf_LOCALE)
4647 ? isSPACE_LC(*m) : isSPACE(*m)))
4652 dstr = NEWSV(30, m-s);
4653 sv_setpvn(dstr, s, m-s);
4659 while (s < strend &&
4660 ((pm->op_pmflags & PMf_LOCALE)
4661 ? isSPACE_LC(*s) : isSPACE(*s)))
4665 else if (strEQ("^", rx->precomp)) {
4668 for (m = s; m < strend && *m != '\n'; m++) ;
4672 dstr = NEWSV(30, m-s);
4673 sv_setpvn(dstr, s, m-s);
4680 else if (rx->check_substr && !rx->nparens
4681 && (rx->reganch & ROPT_CHECK_ALL)
4682 && !(rx->reganch & ROPT_ANCH)) {
4683 i = SvCUR(rx->check_substr);
4684 if (i == 1 && !SvTAIL(rx->check_substr)) {
4685 i = *SvPVX(rx->check_substr);
4688 for (m = s; m < strend && *m != i; m++) ;
4691 dstr = NEWSV(30, m-s);
4692 sv_setpvn(dstr, s, m-s);
4701 while (s < strend && --limit &&
4702 (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
4703 rx->check_substr, 0)) )
4706 dstr = NEWSV(31, m-s);
4707 sv_setpvn(dstr, s, m-s);
4716 maxiters += (strend - s) * rx->nparens;
4717 while (s < strend && --limit &&
4718 CALLREGEXEC(rx, s, strend, orig, 1, sv, NULL, 0))
4720 TAINT_IF(RX_MATCH_TAINTED(rx));
4722 && rx->subbase != orig) {
4727 strend = s + (strend - m);
4730 dstr = NEWSV(32, m-s);
4731 sv_setpvn(dstr, s, m-s);
4736 for (i = 1; i <= rx->nparens; i++) {
4740 dstr = NEWSV(33, m-s);
4741 sv_setpvn(dstr, s, m-s);
4744 dstr = NEWSV(33, 0);
4754 LEAVE_SCOPE(oldsave);
4755 iters = (SP - PL_stack_base) - base;
4756 if (iters > maxiters)
4759 /* keep field after final delim? */
4760 if (s < strend || (iters && origlimit)) {
4761 dstr = NEWSV(34, strend-s);
4762 sv_setpvn(dstr, s, strend-s);
4768 else if (!origlimit) {
4769 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
4775 SWITCHSTACK(ary, oldstack);
4776 if (SvSMAGICAL(ary)) {
4781 if (gimme == G_ARRAY) {
4783 Copy(AvARRAY(ary), SP + 1, iters, SV*);
4791 perl_call_method("PUSH",G_SCALAR|G_DISCARD);
4794 if (gimme == G_ARRAY) {
4795 /* EXTEND should not be needed - we just popped them */
4797 for (i=0; i < iters; i++) {
4798 SV **svp = av_fetch(ary, i, FALSE);
4799 PUSHs((svp) ? *svp : &PL_sv_undef);
4806 if (gimme == G_ARRAY)
4809 if (iters || !pm->op_pmreplroot) {
4819 unlock_condpair(void *svv)
4822 MAGIC *mg = mg_find((SV*)svv, 'm');
4825 croak("panic: unlock_condpair unlocking non-mutex");
4826 MUTEX_LOCK(MgMUTEXP(mg));
4827 if (MgOWNER(mg) != thr)
4828 croak("panic: unlock_condpair unlocking mutex that we don't own");
4830 COND_SIGNAL(MgOWNERCONDP(mg));
4831 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: unlock 0x%lx\n",
4832 (unsigned long)thr, (unsigned long)svv);)
4833 MUTEX_UNLOCK(MgMUTEXP(mg));
4835 #endif /* USE_THREADS */
4848 mg = condpair_magic(sv);
4849 MUTEX_LOCK(MgMUTEXP(mg));
4850 if (MgOWNER(mg) == thr)
4851 MUTEX_UNLOCK(MgMUTEXP(mg));
4854 COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
4856 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: pp_lock lock 0x%lx\n",
4857 (unsigned long)thr, (unsigned long)sv);)
4858 MUTEX_UNLOCK(MgMUTEXP(mg));
4859 save_destructor(unlock_condpair, sv);
4861 #endif /* USE_THREADS */
4862 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
4863 || SvTYPE(retsv) == SVt_PVCV) {
4864 retsv = refto(retsv);
4875 if (PL_op->op_private & OPpLVAL_INTRO)
4876 PUSHs(*save_threadsv(PL_op->op_targ));
4878 PUSHs(THREADSV(PL_op->op_targ));
4881 DIE("tried to access per-thread data in non-threaded perl");
4882 #endif /* USE_THREADS */