This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
upgrade to Getopt::Long v2.20 (from Johan Vromans
[perl5.git] / pp.c
CommitLineData
a0d0e21e 1/* pp.c
79072805 2 *
4eb8286e 3 * Copyright (c) 1991-1999, Larry Wall
79072805 4 *
a0d0e21e
LW
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.
79072805 7 *
a0d0e21e
LW
8 */
9
10/*
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
13 */
79072805
LW
14
15#include "EXTERN.h"
864dbfa3 16#define PERL_IN_PP_C
79072805
LW
17#include "perl.h"
18
36477c24 19/*
ef2d312d
TH
20 * The compiler on Concurrent CX/UX systems has a subtle bug which only
21 * seems to show up when compiling pp.c - it generates the wrong double
22 * precision constant value for (double)UV_MAX when used inline in the body
23 * of the code below, so this makes a static variable up front (which the
24 * compiler seems to get correct) and uses it in place of UV_MAX below.
25 */
26#ifdef CXUX_BROKEN_CONSTANT_CONVERT
27static double UV_MAX_cxux = ((double)UV_MAX);
8ec5e241 28#endif
ef2d312d
TH
29
30/*
d0ba1bd2
JH
31 * Types used in bitwise operations.
32 *
33 * Normally we'd just use IV and UV. However, some hardware and
34 * software combinations (e.g. Alpha and current OSF/1) don't have a
35 * floating-point type to use for NV that has adequate bits to fully
36 * hold an IV/UV. (In other words, sizeof(long) == sizeof(double).)
37 *
38 * It just so happens that "int" is the right size almost everywhere.
39 */
40typedef int IBW;
41typedef unsigned UBW;
42
43/*
44 * Mask used after bitwise operations.
45 *
46 * There is at least one realm (Cray word machines) that doesn't
47 * have an integral type (except char) small enough to be represented
48 * in a double without loss; that is, it has no 32-bit type.
49 */
50#if LONGSIZE > 4 && defined(_CRAY) && !defined(_CRAYMPP)
51# define BW_BITS 32
52# define BW_MASK ((1 << BW_BITS) - 1)
53# define BW_SIGN (1 << (BW_BITS - 1))
54# define BWi(i) (((i) & BW_SIGN) ? ((i) | ~BW_MASK) : ((i) & BW_MASK))
55# define BWu(u) ((u) & BW_MASK)
56#else
57# define BWi(i) (i)
58# define BWu(u) (u)
59#endif
60
61/*
96e4d5b1 62 * Offset for integer pack/unpack.
63 *
64 * On architectures where I16 and I32 aren't really 16 and 32 bits,
65 * which for now are all Crays, pack and unpack have to play games.
66 */
67
68/*
69 * These values are required for portability of pack() output.
70 * If they're not right on your machine, then pack() and unpack()
71 * wouldn't work right anyway; you'll need to apply the Cray hack.
72 * (I'd like to check them with #if, but you can't use sizeof() in
dc45a647
MB
73 * the preprocessor.) --???
74 */
75/*
76 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
77 defines are now in config.h. --Andy Dougherty April 1998
96e4d5b1 78 */
79#define SIZE16 2
80#define SIZE32 4
81
9851f69c
JH
82/* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
83 --jhi Feb 1999 */
84
726ea183
JH
85#if SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
86# define PERL_NATINT_PACK
87#endif
88
96e4d5b1 89#if BYTEORDER > 0xFFFF && defined(_CRAY) && !defined(_CRAYMPP)
90# if BYTEORDER == 0x12345678
91# define OFF16(p) (char*)(p)
92# define OFF32(p) (char*)(p)
93# else
94# if BYTEORDER == 0x87654321
95# define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
96# define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
97# else
98 }}}} bad cray byte order
99# endif
100# endif
101# define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
102# define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
ef54e1a4 103# define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
96e4d5b1 104# define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
105# define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
106#else
107# define COPY16(s,p) Copy(s, p, SIZE16, char)
108# define COPY32(s,p) Copy(s, p, SIZE32, char)
ef54e1a4 109# define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
96e4d5b1 110# define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
111# define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
112#endif
113
a0d0e21e 114/* variations on pp_null */
79072805 115
8ac85365
NIS
116#ifdef I_UNISTD
117#include <unistd.h>
118#endif
dfe9444c
AD
119
120/* XXX I can't imagine anyone who doesn't have this actually _needs_
121 it, since pid_t is an integral type.
122 --AD 2/20/1998
123*/
124#ifdef NEED_GETPID_PROTO
125extern Pid_t getpid (void);
8ac85365
NIS
126#endif
127
93a17b20
LW
128PP(pp_stub)
129{
4e35701f 130 djSP;
54310121 131 if (GIMME_V == G_SCALAR)
3280af22 132 XPUSHs(&PL_sv_undef);
93a17b20
LW
133 RETURN;
134}
135
79072805
LW
136PP(pp_scalar)
137{
138 return NORMAL;
139}
140
141/* Pushy stuff. */
142
93a17b20
LW
143PP(pp_padav)
144{
4e35701f 145 djSP; dTARGET;
533c011a
NIS
146 if (PL_op->op_private & OPpLVAL_INTRO)
147 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
85e6fe83 148 EXTEND(SP, 1);
533c011a 149 if (PL_op->op_flags & OPf_REF) {
85e6fe83 150 PUSHs(TARG);
93a17b20 151 RETURN;
85e6fe83
LW
152 }
153 if (GIMME == G_ARRAY) {
154 I32 maxarg = AvFILL((AV*)TARG) + 1;
155 EXTEND(SP, maxarg);
93965878
NIS
156 if (SvMAGICAL(TARG)) {
157 U32 i;
158 for (i=0; i < maxarg; i++) {
159 SV **svp = av_fetch((AV*)TARG, i, FALSE);
3280af22 160 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
93965878
NIS
161 }
162 }
163 else {
164 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
165 }
85e6fe83
LW
166 SP += maxarg;
167 }
168 else {
169 SV* sv = sv_newmortal();
170 I32 maxarg = AvFILL((AV*)TARG) + 1;
171 sv_setiv(sv, maxarg);
172 PUSHs(sv);
173 }
174 RETURN;
93a17b20
LW
175}
176
177PP(pp_padhv)
178{
4e35701f 179 djSP; dTARGET;
54310121 180 I32 gimme;
181
93a17b20 182 XPUSHs(TARG);
533c011a
NIS
183 if (PL_op->op_private & OPpLVAL_INTRO)
184 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
185 if (PL_op->op_flags & OPf_REF)
93a17b20 186 RETURN;
54310121 187 gimme = GIMME_V;
188 if (gimme == G_ARRAY) {
cea2e8a9 189 RETURNOP(do_kv());
85e6fe83 190 }
54310121 191 else if (gimme == G_SCALAR) {
85e6fe83 192 SV* sv = sv_newmortal();
46fc3d4c 193 if (HvFILL((HV*)TARG))
cea2e8a9 194 Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
46fc3d4c 195 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
85e6fe83
LW
196 else
197 sv_setiv(sv, 0);
198 SETs(sv);
85e6fe83 199 }
54310121 200 RETURN;
93a17b20
LW
201}
202
ed6116ce
LW
203PP(pp_padany)
204{
cea2e8a9 205 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
ed6116ce
LW
206}
207
79072805
LW
208/* Translations. */
209
210PP(pp_rv2gv)
211{
853846ea 212 djSP; dTOPss;
8ec5e241 213
ed6116ce 214 if (SvROK(sv)) {
a0d0e21e 215 wasref:
f5284f61
IZ
216 tryAMAGICunDEREF(to_gv);
217
ed6116ce 218 sv = SvRV(sv);
b1dadf13 219 if (SvTYPE(sv) == SVt_PVIO) {
220 GV *gv = (GV*) sv_newmortal();
221 gv_init(gv, 0, "", 0, 0);
222 GvIOp(gv) = (IO *)sv;
3e3baf6d 223 (void)SvREFCNT_inc(sv);
b1dadf13 224 sv = (SV*) gv;
ef54e1a4
JH
225 }
226 else if (SvTYPE(sv) != SVt_PVGV)
cea2e8a9 227 DIE(aTHX_ "Not a GLOB reference");
79072805
LW
228 }
229 else {
93a17b20 230 if (SvTYPE(sv) != SVt_PVGV) {
748a9306 231 char *sym;
2d8e6c8d 232 STRLEN n_a;
748a9306 233
a0d0e21e
LW
234 if (SvGMAGICAL(sv)) {
235 mg_get(sv);
236 if (SvROK(sv))
237 goto wasref;
238 }
239 if (!SvOK(sv)) {
853846ea
NIS
240 /* If this is a 'my' scalar and flag is set then vivify
241 * NI-S 1999/05/07
242 */
1d8d4d2a 243 if (PL_op->op_private & OPpDEREF) {
853846ea 244 GV *gv = (GV *) newSV(0);
1d8d4d2a
NIS
245 STRLEN len = 0;
246 char *name = "";
247 if (cUNOP->op_first->op_type == OP_PADSV) {
248 SV *padname = *av_fetch(PL_comppad_name, cUNOP->op_first->op_targ, 4);
249 name = SvPV(padname,len);
250 }
853846ea
NIS
251 gv_init(gv, PL_curcop->cop_stash, name, len, 0);
252 sv_upgrade(sv, SVt_RV);
253 SvRV(sv) = (SV *) gv;
254 SvROK_on(sv);
1d8d4d2a 255 SvSETMAGIC(sv);
853846ea
NIS
256 goto wasref;
257 }
533c011a
NIS
258 if (PL_op->op_flags & OPf_REF ||
259 PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 260 DIE(aTHX_ PL_no_usym, "a symbol");
599cee73 261 if (ckWARN(WARN_UNINITIALIZED))
cea2e8a9 262 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e
LW
263 RETSETUNDEF;
264 }
2d8e6c8d 265 sym = SvPV(sv, n_a);
35cd451c
GS
266 if ((PL_op->op_flags & OPf_SPECIAL) &&
267 !(PL_op->op_flags & OPf_MOD))
268 {
269 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
270 if (!sv)
271 RETSETUNDEF;
272 }
273 else {
274 if (PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 275 DIE(aTHX_ PL_no_symref, sym, "a symbol");
35cd451c
GS
276 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
277 }
93a17b20 278 }
79072805 279 }
533c011a
NIS
280 if (PL_op->op_private & OPpLVAL_INTRO)
281 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
79072805
LW
282 SETs(sv);
283 RETURN;
284}
285
79072805
LW
286PP(pp_rv2sv)
287{
4e35701f 288 djSP; dTOPss;
79072805 289
ed6116ce 290 if (SvROK(sv)) {
a0d0e21e 291 wasref:
f5284f61
IZ
292 tryAMAGICunDEREF(to_sv);
293
ed6116ce 294 sv = SvRV(sv);
79072805
LW
295 switch (SvTYPE(sv)) {
296 case SVt_PVAV:
297 case SVt_PVHV:
298 case SVt_PVCV:
cea2e8a9 299 DIE(aTHX_ "Not a SCALAR reference");
79072805
LW
300 }
301 }
302 else {
f12c7020 303 GV *gv = (GV*)sv;
748a9306 304 char *sym;
2d8e6c8d 305 STRLEN n_a;
748a9306 306
463ee0b2 307 if (SvTYPE(gv) != SVt_PVGV) {
a0d0e21e
LW
308 if (SvGMAGICAL(sv)) {
309 mg_get(sv);
310 if (SvROK(sv))
311 goto wasref;
312 }
313 if (!SvOK(sv)) {
533c011a
NIS
314 if (PL_op->op_flags & OPf_REF ||
315 PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 316 DIE(aTHX_ PL_no_usym, "a SCALAR");
599cee73 317 if (ckWARN(WARN_UNINITIALIZED))
cea2e8a9 318 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit);
a0d0e21e
LW
319 RETSETUNDEF;
320 }
2d8e6c8d 321 sym = SvPV(sv, n_a);
35cd451c
GS
322 if ((PL_op->op_flags & OPf_SPECIAL) &&
323 !(PL_op->op_flags & OPf_MOD))
324 {
325 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
326 if (!gv)
327 RETSETUNDEF;
328 }
329 else {
330 if (PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 331 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
35cd451c
GS
332 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
333 }
463ee0b2
LW
334 }
335 sv = GvSV(gv);
a0d0e21e 336 }
533c011a
NIS
337 if (PL_op->op_flags & OPf_MOD) {
338 if (PL_op->op_private & OPpLVAL_INTRO)
a0d0e21e 339 sv = save_scalar((GV*)TOPs);
533c011a
NIS
340 else if (PL_op->op_private & OPpDEREF)
341 vivify_ref(sv, PL_op->op_private & OPpDEREF);
79072805 342 }
a0d0e21e 343 SETs(sv);
79072805
LW
344 RETURN;
345}
346
347PP(pp_av2arylen)
348{
4e35701f 349 djSP;
79072805
LW
350 AV *av = (AV*)TOPs;
351 SV *sv = AvARYLEN(av);
352 if (!sv) {
353 AvARYLEN(av) = sv = NEWSV(0,0);
354 sv_upgrade(sv, SVt_IV);
355 sv_magic(sv, (SV*)av, '#', Nullch, 0);
356 }
357 SETs(sv);
358 RETURN;
359}
360
a0d0e21e
LW
361PP(pp_pos)
362{
4e35701f 363 djSP; dTARGET; dPOPss;
8ec5e241 364
533c011a 365 if (PL_op->op_flags & OPf_MOD) {
5f05dabc 366 if (SvTYPE(TARG) < SVt_PVLV) {
367 sv_upgrade(TARG, SVt_PVLV);
368 sv_magic(TARG, Nullsv, '.', Nullch, 0);
369 }
370
371 LvTYPE(TARG) = '.';
6ff81951
GS
372 if (LvTARG(TARG) != sv) {
373 if (LvTARG(TARG))
374 SvREFCNT_dec(LvTARG(TARG));
375 LvTARG(TARG) = SvREFCNT_inc(sv);
376 }
a0d0e21e
LW
377 PUSHs(TARG); /* no SvSETMAGIC */
378 RETURN;
379 }
380 else {
8ec5e241 381 MAGIC* mg;
a0d0e21e
LW
382
383 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
384 mg = mg_find(sv, 'g');
565764a8 385 if (mg && mg->mg_len >= 0) {
a0ed51b3
LW
386 I32 i = mg->mg_len;
387 if (IN_UTF8)
388 sv_pos_b2u(sv, &i);
389 PUSHi(i + PL_curcop->cop_arybase);
a0d0e21e
LW
390 RETURN;
391 }
392 }
393 RETPUSHUNDEF;
394 }
395}
396
79072805
LW
397PP(pp_rv2cv)
398{
4e35701f 399 djSP;
79072805
LW
400 GV *gv;
401 HV *stash;
8990e307 402
4633a7c4
LW
403 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
404 /* (But not in defined().) */
533c011a 405 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
07055b4c
CS
406 if (cv) {
407 if (CvCLONE(cv))
408 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
cd06dffe
GS
409 if ((PL_op->op_private & OPpLVAL_INTRO) && !CvLVALUE(cv))
410 Perl_croak(aTHX_ "Can't modify non-lvalue subroutine call");
07055b4c
CS
411 }
412 else
3280af22 413 cv = (CV*)&PL_sv_undef;
79072805
LW
414 SETs((SV*)cv);
415 RETURN;
416}
417
c07a80fd 418PP(pp_prototype)
419{
4e35701f 420 djSP;
c07a80fd 421 CV *cv;
422 HV *stash;
423 GV *gv;
424 SV *ret;
425
3280af22 426 ret = &PL_sv_undef;
b6c543e3
IZ
427 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
428 char *s = SvPVX(TOPs);
429 if (strnEQ(s, "CORE::", 6)) {
430 int code;
431
432 code = keyword(s + 6, SvCUR(TOPs) - 6);
433 if (code < 0) { /* Overridable. */
434#define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
435 int i = 0, n = 0, seen_question = 0;
436 I32 oa;
437 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
438
439 while (i < MAXO) { /* The slow way. */
22c35a8c
GS
440 if (strEQ(s + 6, PL_op_name[i])
441 || strEQ(s + 6, PL_op_desc[i]))
442 {
b6c543e3 443 goto found;
22c35a8c 444 }
b6c543e3
IZ
445 i++;
446 }
447 goto nonesuch; /* Should not happen... */
448 found:
22c35a8c 449 oa = PL_opargs[i] >> OASHIFT;
b6c543e3
IZ
450 while (oa) {
451 if (oa & OA_OPTIONAL) {
452 seen_question = 1;
453 str[n++] = ';';
ef54e1a4
JH
454 }
455 else if (seen_question)
b6c543e3
IZ
456 goto set; /* XXXX system, exec */
457 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
458 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
459 str[n++] = '\\';
460 }
461 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
462 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
463 oa = oa >> 4;
464 }
465 str[n++] = '\0';
79cb57f6 466 ret = sv_2mortal(newSVpvn(str, n - 1));
ef54e1a4
JH
467 }
468 else if (code) /* Non-Overridable */
b6c543e3
IZ
469 goto set;
470 else { /* None such */
471 nonesuch:
cea2e8a9 472 Perl_croak(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
b6c543e3
IZ
473 }
474 }
475 }
c07a80fd 476 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
5f05dabc 477 if (cv && SvPOK(cv))
79cb57f6 478 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
b6c543e3 479 set:
c07a80fd 480 SETs(ret);
481 RETURN;
482}
483
a0d0e21e
LW
484PP(pp_anoncode)
485{
4e35701f 486 djSP;
533c011a 487 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
a5f75d66 488 if (CvCLONE(cv))
b355b4e0 489 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
5f05dabc 490 EXTEND(SP,1);
748a9306 491 PUSHs((SV*)cv);
a0d0e21e
LW
492 RETURN;
493}
494
495PP(pp_srefgen)
79072805 496{
4e35701f 497 djSP;
71be2cbc 498 *SP = refto(*SP);
79072805 499 RETURN;
8ec5e241 500}
a0d0e21e
LW
501
502PP(pp_refgen)
503{
4e35701f 504 djSP; dMARK;
a0d0e21e 505 if (GIMME != G_ARRAY) {
5f0b1d4e
GS
506 if (++MARK <= SP)
507 *MARK = *SP;
508 else
3280af22 509 *MARK = &PL_sv_undef;
5f0b1d4e
GS
510 *MARK = refto(*MARK);
511 SP = MARK;
512 RETURN;
a0d0e21e 513 }
bbce6d69 514 EXTEND_MORTAL(SP - MARK);
71be2cbc 515 while (++MARK <= SP)
516 *MARK = refto(*MARK);
a0d0e21e 517 RETURN;
79072805
LW
518}
519
76e3520e 520STATIC SV*
cea2e8a9 521S_refto(pTHX_ SV *sv)
71be2cbc 522{
523 SV* rv;
524
525 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
526 if (LvTARGLEN(sv))
68dc0745 527 vivify_defelem(sv);
528 if (!(sv = LvTARG(sv)))
3280af22 529 sv = &PL_sv_undef;
0dd88869 530 else
a6c40364 531 (void)SvREFCNT_inc(sv);
71be2cbc 532 }
533 else if (SvPADTMP(sv))
534 sv = newSVsv(sv);
535 else {
536 SvTEMP_off(sv);
537 (void)SvREFCNT_inc(sv);
538 }
539 rv = sv_newmortal();
540 sv_upgrade(rv, SVt_RV);
541 SvRV(rv) = sv;
542 SvROK_on(rv);
543 return rv;
544}
545
79072805
LW
546PP(pp_ref)
547{
4e35701f 548 djSP; dTARGET;
463ee0b2 549 SV *sv;
79072805
LW
550 char *pv;
551
a0d0e21e 552 sv = POPs;
f12c7020 553
554 if (sv && SvGMAGICAL(sv))
8ec5e241 555 mg_get(sv);
f12c7020 556
a0d0e21e 557 if (!sv || !SvROK(sv))
4633a7c4 558 RETPUSHNO;
79072805 559
ed6116ce 560 sv = SvRV(sv);
a0d0e21e 561 pv = sv_reftype(sv,TRUE);
463ee0b2 562 PUSHp(pv, strlen(pv));
79072805
LW
563 RETURN;
564}
565
566PP(pp_bless)
567{
4e35701f 568 djSP;
463ee0b2 569 HV *stash;
79072805 570
463ee0b2 571 if (MAXARG == 1)
3280af22 572 stash = PL_curcop->cop_stash;
7b8d334a
GS
573 else {
574 SV *ssv = POPs;
575 STRLEN len;
576 char *ptr = SvPV(ssv,len);
599cee73 577 if (ckWARN(WARN_UNSAFE) && len == 0)
cea2e8a9 578 Perl_warner(aTHX_ WARN_UNSAFE,
599cee73 579 "Explicit blessing to '' (assuming package main)");
7b8d334a
GS
580 stash = gv_stashpvn(ptr, len, TRUE);
581 }
a0d0e21e 582
5d3fdfeb 583 (void)sv_bless(TOPs, stash);
79072805
LW
584 RETURN;
585}
586
fb73857a 587PP(pp_gelem)
588{
589 GV *gv;
590 SV *sv;
76e3520e 591 SV *tmpRef;
fb73857a 592 char *elem;
4e35701f 593 djSP;
2d8e6c8d
GS
594 STRLEN n_a;
595
fb73857a 596 sv = POPs;
2d8e6c8d 597 elem = SvPV(sv, n_a);
fb73857a 598 gv = (GV*)POPs;
76e3520e 599 tmpRef = Nullsv;
fb73857a 600 sv = Nullsv;
601 switch (elem ? *elem : '\0')
602 {
603 case 'A':
604 if (strEQ(elem, "ARRAY"))
76e3520e 605 tmpRef = (SV*)GvAV(gv);
fb73857a 606 break;
607 case 'C':
608 if (strEQ(elem, "CODE"))
76e3520e 609 tmpRef = (SV*)GvCVu(gv);
fb73857a 610 break;
611 case 'F':
612 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
76e3520e 613 tmpRef = (SV*)GvIOp(gv);
fb73857a 614 break;
615 case 'G':
616 if (strEQ(elem, "GLOB"))
76e3520e 617 tmpRef = (SV*)gv;
fb73857a 618 break;
619 case 'H':
620 if (strEQ(elem, "HASH"))
76e3520e 621 tmpRef = (SV*)GvHV(gv);
fb73857a 622 break;
623 case 'I':
624 if (strEQ(elem, "IO"))
76e3520e 625 tmpRef = (SV*)GvIOp(gv);
fb73857a 626 break;
627 case 'N':
628 if (strEQ(elem, "NAME"))
79cb57f6 629 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
fb73857a 630 break;
631 case 'P':
632 if (strEQ(elem, "PACKAGE"))
633 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
634 break;
635 case 'S':
636 if (strEQ(elem, "SCALAR"))
76e3520e 637 tmpRef = GvSV(gv);
fb73857a 638 break;
639 }
76e3520e
GS
640 if (tmpRef)
641 sv = newRV(tmpRef);
fb73857a 642 if (sv)
643 sv_2mortal(sv);
644 else
3280af22 645 sv = &PL_sv_undef;
fb73857a 646 XPUSHs(sv);
647 RETURN;
648}
649
a0d0e21e 650/* Pattern matching */
79072805 651
a0d0e21e 652PP(pp_study)
79072805 653{
4e35701f 654 djSP; dPOPss;
a0d0e21e
LW
655 register unsigned char *s;
656 register I32 pos;
657 register I32 ch;
658 register I32 *sfirst;
659 register I32 *snext;
a0d0e21e
LW
660 STRLEN len;
661
3280af22 662 if (sv == PL_lastscream) {
1e422769 663 if (SvSCREAM(sv))
664 RETPUSHYES;
665 }
c07a80fd 666 else {
3280af22
NIS
667 if (PL_lastscream) {
668 SvSCREAM_off(PL_lastscream);
669 SvREFCNT_dec(PL_lastscream);
c07a80fd 670 }
3280af22 671 PL_lastscream = SvREFCNT_inc(sv);
c07a80fd 672 }
1e422769 673
674 s = (unsigned char*)(SvPV(sv, len));
675 pos = len;
676 if (pos <= 0)
677 RETPUSHNO;
3280af22
NIS
678 if (pos > PL_maxscream) {
679 if (PL_maxscream < 0) {
680 PL_maxscream = pos + 80;
681 New(301, PL_screamfirst, 256, I32);
682 New(302, PL_screamnext, PL_maxscream, I32);
79072805
LW
683 }
684 else {
3280af22
NIS
685 PL_maxscream = pos + pos / 4;
686 Renew(PL_screamnext, PL_maxscream, I32);
79072805 687 }
79072805 688 }
a0d0e21e 689
3280af22
NIS
690 sfirst = PL_screamfirst;
691 snext = PL_screamnext;
a0d0e21e
LW
692
693 if (!sfirst || !snext)
cea2e8a9 694 DIE(aTHX_ "do_study: out of memory");
a0d0e21e
LW
695
696 for (ch = 256; ch; --ch)
697 *sfirst++ = -1;
698 sfirst -= 256;
699
700 while (--pos >= 0) {
701 ch = s[pos];
702 if (sfirst[ch] >= 0)
703 snext[pos] = sfirst[ch] - pos;
704 else
705 snext[pos] = -pos;
706 sfirst[ch] = pos;
79072805
LW
707 }
708
c07a80fd 709 SvSCREAM_on(sv);
464e2e8a 710 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
1e422769 711 RETPUSHYES;
79072805
LW
712}
713
a0d0e21e 714PP(pp_trans)
79072805 715{
4e35701f 716 djSP; dTARG;
a0d0e21e
LW
717 SV *sv;
718
533c011a 719 if (PL_op->op_flags & OPf_STACKED)
a0d0e21e 720 sv = POPs;
79072805 721 else {
54b9620d 722 sv = DEFSV;
a0d0e21e 723 EXTEND(SP,1);
79072805 724 }
adbc6bb1 725 TARG = sv_newmortal();
4757a243 726 PUSHi(do_trans(sv));
a0d0e21e 727 RETURN;
79072805
LW
728}
729
a0d0e21e 730/* Lvalue operators. */
79072805 731
a0d0e21e
LW
732PP(pp_schop)
733{
4e35701f 734 djSP; dTARGET;
a0d0e21e
LW
735 do_chop(TARG, TOPs);
736 SETTARG;
737 RETURN;
79072805
LW
738}
739
a0d0e21e 740PP(pp_chop)
79072805 741{
4e35701f 742 djSP; dMARK; dTARGET;
a0d0e21e
LW
743 while (SP > MARK)
744 do_chop(TARG, POPs);
745 PUSHTARG;
746 RETURN;
79072805
LW
747}
748
a0d0e21e 749PP(pp_schomp)
79072805 750{
4e35701f 751 djSP; dTARGET;
a0d0e21e
LW
752 SETi(do_chomp(TOPs));
753 RETURN;
79072805
LW
754}
755
a0d0e21e 756PP(pp_chomp)
79072805 757{
4e35701f 758 djSP; dMARK; dTARGET;
a0d0e21e 759 register I32 count = 0;
8ec5e241 760
a0d0e21e
LW
761 while (SP > MARK)
762 count += do_chomp(POPs);
763 PUSHi(count);
764 RETURN;
79072805
LW
765}
766
a0d0e21e 767PP(pp_defined)
463ee0b2 768{
4e35701f 769 djSP;
a0d0e21e
LW
770 register SV* sv;
771
772 sv = POPs;
773 if (!sv || !SvANY(sv))
774 RETPUSHNO;
775 switch (SvTYPE(sv)) {
776 case SVt_PVAV:
6051dbdb 777 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
a0d0e21e
LW
778 RETPUSHYES;
779 break;
780 case SVt_PVHV:
6051dbdb 781 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
a0d0e21e
LW
782 RETPUSHYES;
783 break;
784 case SVt_PVCV:
785 if (CvROOT(sv) || CvXSUB(sv))
786 RETPUSHYES;
787 break;
788 default:
789 if (SvGMAGICAL(sv))
790 mg_get(sv);
791 if (SvOK(sv))
792 RETPUSHYES;
793 }
794 RETPUSHNO;
463ee0b2
LW
795}
796
a0d0e21e
LW
797PP(pp_undef)
798{
4e35701f 799 djSP;
a0d0e21e
LW
800 SV *sv;
801
533c011a 802 if (!PL_op->op_private) {
774d564b 803 EXTEND(SP, 1);
a0d0e21e 804 RETPUSHUNDEF;
774d564b 805 }
79072805 806
a0d0e21e
LW
807 sv = POPs;
808 if (!sv)
809 RETPUSHUNDEF;
85e6fe83 810
6fc92669
GS
811 if (SvTHINKFIRST(sv))
812 sv_force_normal(sv);
85e6fe83 813
a0d0e21e
LW
814 switch (SvTYPE(sv)) {
815 case SVt_NULL:
816 break;
817 case SVt_PVAV:
818 av_undef((AV*)sv);
819 break;
820 case SVt_PVHV:
821 hv_undef((HV*)sv);
822 break;
823 case SVt_PVCV:
599cee73 824 if (ckWARN(WARN_UNSAFE) && cv_const_sv((CV*)sv))
cea2e8a9 825 Perl_warner(aTHX_ WARN_UNSAFE, "Constant subroutine %s undefined",
54310121 826 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
9607fc9c 827 /* FALL THROUGH */
828 case SVt_PVFM:
6fc92669
GS
829 {
830 /* let user-undef'd sub keep its identity */
831 GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
832 cv_undef((CV*)sv);
833 CvGV((CV*)sv) = gv;
834 }
a0d0e21e 835 break;
8e07c86e 836 case SVt_PVGV:
44a8e56a 837 if (SvFAKE(sv))
3280af22 838 SvSetMagicSV(sv, &PL_sv_undef);
20408e3c
GS
839 else {
840 GP *gp;
841 gp_free((GV*)sv);
842 Newz(602, gp, 1, GP);
843 GvGP(sv) = gp_ref(gp);
844 GvSV(sv) = NEWSV(72,0);
3280af22 845 GvLINE(sv) = PL_curcop->cop_line;
20408e3c
GS
846 GvEGV(sv) = (GV*)sv;
847 GvMULTI_on(sv);
848 }
44a8e56a 849 break;
a0d0e21e 850 default:
1e422769 851 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
4633a7c4
LW
852 (void)SvOOK_off(sv);
853 Safefree(SvPVX(sv));
854 SvPV_set(sv, Nullch);
855 SvLEN_set(sv, 0);
a0d0e21e 856 }
4633a7c4
LW
857 (void)SvOK_off(sv);
858 SvSETMAGIC(sv);
79072805 859 }
a0d0e21e
LW
860
861 RETPUSHUNDEF;
79072805
LW
862}
863
a0d0e21e 864PP(pp_predec)
79072805 865{
4e35701f 866 djSP;
68dc0745 867 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
cea2e8a9 868 Perl_croak(aTHX_ PL_no_modify);
25da4f38 869 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
55497cff 870 SvIVX(TOPs) != IV_MIN)
871 {
748a9306 872 --SvIVX(TOPs);
55497cff 873 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
874 }
875 else
876 sv_dec(TOPs);
a0d0e21e
LW
877 SvSETMAGIC(TOPs);
878 return NORMAL;
879}
79072805 880
a0d0e21e
LW
881PP(pp_postinc)
882{
4e35701f 883 djSP; dTARGET;
68dc0745 884 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
cea2e8a9 885 Perl_croak(aTHX_ PL_no_modify);
a0d0e21e 886 sv_setsv(TARG, TOPs);
25da4f38 887 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
55497cff 888 SvIVX(TOPs) != IV_MAX)
889 {
748a9306 890 ++SvIVX(TOPs);
55497cff 891 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
892 }
893 else
894 sv_inc(TOPs);
a0d0e21e
LW
895 SvSETMAGIC(TOPs);
896 if (!SvOK(TARG))
897 sv_setiv(TARG, 0);
898 SETs(TARG);
899 return NORMAL;
900}
79072805 901
a0d0e21e
LW
902PP(pp_postdec)
903{
4e35701f 904 djSP; dTARGET;
43192e07 905 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
cea2e8a9 906 Perl_croak(aTHX_ PL_no_modify);
a0d0e21e 907 sv_setsv(TARG, TOPs);
25da4f38 908 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
55497cff 909 SvIVX(TOPs) != IV_MIN)
910 {
748a9306 911 --SvIVX(TOPs);
55497cff 912 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
913 }
914 else
915 sv_dec(TOPs);
a0d0e21e
LW
916 SvSETMAGIC(TOPs);
917 SETs(TARG);
918 return NORMAL;
919}
79072805 920
a0d0e21e
LW
921/* Ordinary operators. */
922
923PP(pp_pow)
924{
8ec5e241 925 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
a0d0e21e
LW
926 {
927 dPOPTOPnnrl;
928 SETn( pow( left, right) );
929 RETURN;
93a17b20 930 }
a0d0e21e
LW
931}
932
933PP(pp_multiply)
934{
8ec5e241 935 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
a0d0e21e
LW
936 {
937 dPOPTOPnnrl;
938 SETn( left * right );
939 RETURN;
79072805 940 }
a0d0e21e
LW
941}
942
943PP(pp_divide)
944{
8ec5e241 945 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
a0d0e21e 946 {
77676ba1 947 dPOPPOPnnrl;
65202027 948 NV value;
7a4c00b4 949 if (right == 0.0)
cea2e8a9 950 DIE(aTHX_ "Illegal division by zero");
a0d0e21e
LW
951#ifdef SLOPPYDIVIDE
952 /* insure that 20./5. == 4. */
953 {
7a4c00b4 954 IV k;
65202027
DS
955 if ((NV)I_V(left) == left &&
956 (NV)I_V(right) == right &&
7a4c00b4 957 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
a0d0e21e 958 value = k;
ef54e1a4
JH
959 }
960 else {
7a4c00b4 961 value = left / right;
79072805 962 }
a0d0e21e
LW
963 }
964#else
7a4c00b4 965 value = left / right;
a0d0e21e
LW
966#endif
967 PUSHn( value );
968 RETURN;
79072805 969 }
a0d0e21e
LW
970}
971
972PP(pp_modulo)
973{
76e3520e 974 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
a0d0e21e 975 {
787eafbd
IZ
976 UV left;
977 UV right;
978 bool left_neg;
979 bool right_neg;
980 bool use_double = 0;
65202027
DS
981 NV dright;
982 NV dleft;
787eafbd
IZ
983
984 if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
985 IV i = SvIVX(POPs);
986 right = (right_neg = (i < 0)) ? -i : i;
987 }
988 else {
989 dright = POPn;
990 use_double = 1;
991 right_neg = dright < 0;
992 if (right_neg)
993 dright = -dright;
994 }
a0d0e21e 995
787eafbd
IZ
996 if (!use_double && SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
997 IV i = SvIVX(POPs);
998 left = (left_neg = (i < 0)) ? -i : i;
999 }
1000 else {
1001 dleft = POPn;
1002 if (!use_double) {
a1bd196e
GS
1003 use_double = 1;
1004 dright = right;
787eafbd
IZ
1005 }
1006 left_neg = dleft < 0;
1007 if (left_neg)
1008 dleft = -dleft;
1009 }
68dc0745 1010
787eafbd 1011 if (use_double) {
65202027 1012 NV dans;
787eafbd
IZ
1013
1014#if 1
787eafbd
IZ
1015/* Somehow U_V is pessimized even if CASTFLAGS is 0 */
1016# if CASTFLAGS & 2
1017# define CAST_D2UV(d) U_V(d)
1018# else
1019# define CAST_D2UV(d) ((UV)(d))
1020# endif
a1bd196e
GS
1021 /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
1022 * or, in other words, precision of UV more than of NV.
1023 * But in fact the approach below turned out to be an
1024 * optimization - floor() may be slow */
787eafbd
IZ
1025 if (dright <= UV_MAX && dleft <= UV_MAX) {
1026 right = CAST_D2UV(dright);
1027 left = CAST_D2UV(dleft);
1028 goto do_uv;
1029 }
1030#endif
1031
1032 /* Backward-compatibility clause: */
853846ea
NIS
1033 dright = floor(dright + 0.5);
1034 dleft = floor(dleft + 0.5);
787eafbd
IZ
1035
1036 if (!dright)
cea2e8a9 1037 DIE(aTHX_ "Illegal modulus zero");
787eafbd 1038
65202027 1039 dans = Perl_fmod(dleft, dright);
787eafbd
IZ
1040 if ((left_neg != right_neg) && dans)
1041 dans = dright - dans;
1042 if (right_neg)
1043 dans = -dans;
1044 sv_setnv(TARG, dans);
1045 }
1046 else {
1047 UV ans;
1048
1049 do_uv:
1050 if (!right)
cea2e8a9 1051 DIE(aTHX_ "Illegal modulus zero");
787eafbd
IZ
1052
1053 ans = left % right;
1054 if ((left_neg != right_neg) && ans)
1055 ans = right - ans;
1056 if (right_neg) {
1057 /* XXX may warn: unary minus operator applied to unsigned type */
1058 /* could change -foo to be (~foo)+1 instead */
1059 if (ans <= ~((UV)IV_MAX)+1)
1060 sv_setiv(TARG, ~ans+1);
1061 else
65202027 1062 sv_setnv(TARG, -(NV)ans);
787eafbd
IZ
1063 }
1064 else
1065 sv_setuv(TARG, ans);
1066 }
1067 PUSHTARG;
1068 RETURN;
79072805 1069 }
a0d0e21e 1070}
79072805 1071
a0d0e21e
LW
1072PP(pp_repeat)
1073{
4e35701f 1074 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
748a9306 1075 {
a0d0e21e 1076 register I32 count = POPi;
533c011a 1077 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
a0d0e21e
LW
1078 dMARK;
1079 I32 items = SP - MARK;
1080 I32 max;
79072805 1081
a0d0e21e
LW
1082 max = items * count;
1083 MEXTEND(MARK, max);
1084 if (count > 1) {
1085 while (SP > MARK) {
1086 if (*SP)
1087 SvTEMP_off((*SP));
1088 SP--;
79072805 1089 }
a0d0e21e
LW
1090 MARK++;
1091 repeatcpy((char*)(MARK + items), (char*)MARK,
1092 items * sizeof(SV*), count - 1);
1093 SP += max;
79072805 1094 }
a0d0e21e
LW
1095 else if (count <= 0)
1096 SP -= items;
79072805 1097 }
a0d0e21e
LW
1098 else { /* Note: mark already snarfed by pp_list */
1099 SV *tmpstr;
1100 STRLEN len;
1101
1102 tmpstr = POPs;
a0d0e21e
LW
1103 SvSetSV(TARG, tmpstr);
1104 SvPV_force(TARG, len);
8ebc5c01 1105 if (count != 1) {
1106 if (count < 1)
1107 SvCUR_set(TARG, 0);
1108 else {
1109 SvGROW(TARG, (count * len) + 1);
a0d0e21e 1110 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
8ebc5c01 1111 SvCUR(TARG) *= count;
7a4c00b4 1112 }
a0d0e21e 1113 *SvEND(TARG) = '\0';
a0d0e21e 1114 }
8ebc5c01 1115 (void)SvPOK_only(TARG);
a0d0e21e 1116 PUSHTARG;
79072805 1117 }
a0d0e21e 1118 RETURN;
748a9306 1119 }
a0d0e21e 1120}
79072805 1121
a0d0e21e
LW
1122PP(pp_subtract)
1123{
8ec5e241 1124 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
a0d0e21e 1125 {
7a4c00b4 1126 dPOPTOPnnrl_ul;
a0d0e21e
LW
1127 SETn( left - right );
1128 RETURN;
79072805 1129 }
a0d0e21e 1130}
79072805 1131
a0d0e21e
LW
1132PP(pp_left_shift)
1133{
8ec5e241 1134 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
a0d0e21e 1135 {
d0ba1bd2
JH
1136 IBW shift = POPi;
1137 if (PL_op->op_private & HINT_INTEGER) {
1138 IBW i = TOPi;
1139 i = BWi(i) << shift;
1140 SETi(BWi(i));
1141 }
1142 else {
1143 UBW u = TOPu;
1144 u <<= shift;
1145 SETu(BWu(u));
1146 }
55497cff 1147 RETURN;
79072805 1148 }
a0d0e21e 1149}
79072805 1150
a0d0e21e
LW
1151PP(pp_right_shift)
1152{
8ec5e241 1153 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
a0d0e21e 1154 {
d0ba1bd2
JH
1155 IBW shift = POPi;
1156 if (PL_op->op_private & HINT_INTEGER) {
1157 IBW i = TOPi;
1158 i = BWi(i) >> shift;
1159 SETi(BWi(i));
1160 }
1161 else {
1162 UBW u = TOPu;
1163 u >>= shift;
1164 SETu(BWu(u));
1165 }
a0d0e21e 1166 RETURN;
93a17b20 1167 }
79072805
LW
1168}
1169
a0d0e21e 1170PP(pp_lt)
79072805 1171{
8ec5e241 1172 djSP; tryAMAGICbinSET(lt,0);
a0d0e21e
LW
1173 {
1174 dPOPnv;
54310121 1175 SETs(boolSV(TOPn < value));
a0d0e21e 1176 RETURN;
79072805 1177 }
a0d0e21e 1178}
79072805 1179
a0d0e21e
LW
1180PP(pp_gt)
1181{
8ec5e241 1182 djSP; tryAMAGICbinSET(gt,0);
a0d0e21e
LW
1183 {
1184 dPOPnv;
54310121 1185 SETs(boolSV(TOPn > value));
a0d0e21e 1186 RETURN;
79072805 1187 }
a0d0e21e
LW
1188}
1189
1190PP(pp_le)
1191{
8ec5e241 1192 djSP; tryAMAGICbinSET(le,0);
a0d0e21e
LW
1193 {
1194 dPOPnv;
54310121 1195 SETs(boolSV(TOPn <= value));
a0d0e21e 1196 RETURN;
79072805 1197 }
a0d0e21e
LW
1198}
1199
1200PP(pp_ge)
1201{
8ec5e241 1202 djSP; tryAMAGICbinSET(ge,0);
a0d0e21e
LW
1203 {
1204 dPOPnv;
54310121 1205 SETs(boolSV(TOPn >= value));
a0d0e21e 1206 RETURN;
79072805 1207 }
a0d0e21e 1208}
79072805 1209
a0d0e21e
LW
1210PP(pp_ne)
1211{
8ec5e241 1212 djSP; tryAMAGICbinSET(ne,0);
a0d0e21e
LW
1213 {
1214 dPOPnv;
54310121 1215 SETs(boolSV(TOPn != value));
a0d0e21e
LW
1216 RETURN;
1217 }
79072805
LW
1218}
1219
a0d0e21e 1220PP(pp_ncmp)
79072805 1221{
8ec5e241 1222 djSP; dTARGET; tryAMAGICbin(ncmp,0);
a0d0e21e
LW
1223 {
1224 dPOPTOPnnrl;
1225 I32 value;
79072805 1226
ff0cee69 1227 if (left == right)
a0d0e21e 1228 value = 0;
a0d0e21e
LW
1229 else if (left < right)
1230 value = -1;
44a8e56a 1231 else if (left > right)
1232 value = 1;
1233 else {
3280af22 1234 SETs(&PL_sv_undef);
44a8e56a 1235 RETURN;
1236 }
a0d0e21e
LW
1237 SETi(value);
1238 RETURN;
79072805 1239 }
a0d0e21e 1240}
79072805 1241
a0d0e21e
LW
1242PP(pp_slt)
1243{
8ec5e241 1244 djSP; tryAMAGICbinSET(slt,0);
a0d0e21e
LW
1245 {
1246 dPOPTOPssrl;
533c011a 1247 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1248 ? sv_cmp_locale(left, right)
1249 : sv_cmp(left, right));
54310121 1250 SETs(boolSV(cmp < 0));
a0d0e21e
LW
1251 RETURN;
1252 }
79072805
LW
1253}
1254
a0d0e21e 1255PP(pp_sgt)
79072805 1256{
8ec5e241 1257 djSP; tryAMAGICbinSET(sgt,0);
a0d0e21e
LW
1258 {
1259 dPOPTOPssrl;
533c011a 1260 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1261 ? sv_cmp_locale(left, right)
1262 : sv_cmp(left, right));
54310121 1263 SETs(boolSV(cmp > 0));
a0d0e21e
LW
1264 RETURN;
1265 }
1266}
79072805 1267
a0d0e21e
LW
1268PP(pp_sle)
1269{
8ec5e241 1270 djSP; tryAMAGICbinSET(sle,0);
a0d0e21e
LW
1271 {
1272 dPOPTOPssrl;
533c011a 1273 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1274 ? sv_cmp_locale(left, right)
1275 : sv_cmp(left, right));
54310121 1276 SETs(boolSV(cmp <= 0));
a0d0e21e 1277 RETURN;
79072805 1278 }
79072805
LW
1279}
1280
a0d0e21e
LW
1281PP(pp_sge)
1282{
8ec5e241 1283 djSP; tryAMAGICbinSET(sge,0);
a0d0e21e
LW
1284 {
1285 dPOPTOPssrl;
533c011a 1286 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1287 ? sv_cmp_locale(left, right)
1288 : sv_cmp(left, right));
54310121 1289 SETs(boolSV(cmp >= 0));
a0d0e21e
LW
1290 RETURN;
1291 }
1292}
79072805 1293
36477c24 1294PP(pp_seq)
1295{
8ec5e241 1296 djSP; tryAMAGICbinSET(seq,0);
36477c24 1297 {
1298 dPOPTOPssrl;
54310121 1299 SETs(boolSV(sv_eq(left, right)));
a0d0e21e
LW
1300 RETURN;
1301 }
1302}
79072805 1303
a0d0e21e 1304PP(pp_sne)
79072805 1305{
8ec5e241 1306 djSP; tryAMAGICbinSET(sne,0);
a0d0e21e
LW
1307 {
1308 dPOPTOPssrl;
54310121 1309 SETs(boolSV(!sv_eq(left, right)));
a0d0e21e 1310 RETURN;
463ee0b2 1311 }
79072805
LW
1312}
1313
a0d0e21e 1314PP(pp_scmp)
79072805 1315{
4e35701f 1316 djSP; dTARGET; tryAMAGICbin(scmp,0);
a0d0e21e
LW
1317 {
1318 dPOPTOPssrl;
533c011a 1319 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1320 ? sv_cmp_locale(left, right)
1321 : sv_cmp(left, right));
1322 SETi( cmp );
a0d0e21e
LW
1323 RETURN;
1324 }
1325}
79072805 1326
55497cff 1327PP(pp_bit_and)
1328{
8ec5e241 1329 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
a0d0e21e
LW
1330 {
1331 dPOPTOPssrl;
4633a7c4 1332 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2
JH
1333 if (PL_op->op_private & HINT_INTEGER) {
1334 IBW value = SvIV(left) & SvIV(right);
1335 SETi(BWi(value));
1336 }
1337 else {
1338 UBW value = SvUV(left) & SvUV(right);
1339 SETu(BWu(value));
1340 }
a0d0e21e
LW
1341 }
1342 else {
533c011a 1343 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
1344 SETTARG;
1345 }
1346 RETURN;
1347 }
1348}
79072805 1349
a0d0e21e
LW
1350PP(pp_bit_xor)
1351{
8ec5e241 1352 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
a0d0e21e
LW
1353 {
1354 dPOPTOPssrl;
4633a7c4 1355 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2
JH
1356 if (PL_op->op_private & HINT_INTEGER) {
1357 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1358 SETi(BWi(value));
1359 }
1360 else {
1361 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1362 SETu(BWu(value));
1363 }
a0d0e21e
LW
1364 }
1365 else {
533c011a 1366 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
1367 SETTARG;
1368 }
1369 RETURN;
1370 }
1371}
79072805 1372
a0d0e21e
LW
1373PP(pp_bit_or)
1374{
8ec5e241 1375 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
a0d0e21e
LW
1376 {
1377 dPOPTOPssrl;
4633a7c4 1378 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2
JH
1379 if (PL_op->op_private & HINT_INTEGER) {
1380 IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1381 SETi(BWi(value));
1382 }
1383 else {
1384 UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1385 SETu(BWu(value));
1386 }
a0d0e21e
LW
1387 }
1388 else {
533c011a 1389 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
1390 SETTARG;
1391 }
1392 RETURN;
79072805 1393 }
a0d0e21e 1394}
79072805 1395
a0d0e21e
LW
1396PP(pp_negate)
1397{
4e35701f 1398 djSP; dTARGET; tryAMAGICun(neg);
a0d0e21e
LW
1399 {
1400 dTOPss;
4633a7c4
LW
1401 if (SvGMAGICAL(sv))
1402 mg_get(sv);
55497cff 1403 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv) && SvIVX(sv) != IV_MIN)
1404 SETi(-SvIVX(sv));
1405 else if (SvNIOKp(sv))
a0d0e21e 1406 SETn(-SvNV(sv));
4633a7c4 1407 else if (SvPOKp(sv)) {
a0d0e21e
LW
1408 STRLEN len;
1409 char *s = SvPV(sv, len);
bbce6d69 1410 if (isIDFIRST(*s)) {
a0d0e21e
LW
1411 sv_setpvn(TARG, "-", 1);
1412 sv_catsv(TARG, sv);
79072805 1413 }
a0d0e21e
LW
1414 else if (*s == '+' || *s == '-') {
1415 sv_setsv(TARG, sv);
1416 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
79072805 1417 }
b86a2fa7 1418 else if (IN_UTF8 && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
834a4ddd
LW
1419 sv_setpvn(TARG, "-", 1);
1420 sv_catsv(TARG, sv);
1421 }
79072805 1422 else
a0d0e21e
LW
1423 sv_setnv(TARG, -SvNV(sv));
1424 SETTARG;
79072805 1425 }
4633a7c4
LW
1426 else
1427 SETn(-SvNV(sv));
79072805 1428 }
a0d0e21e 1429 RETURN;
79072805
LW
1430}
1431
a0d0e21e 1432PP(pp_not)
79072805 1433{
4e35701f 1434 djSP; tryAMAGICunSET(not);
3280af22 1435 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
a0d0e21e 1436 return NORMAL;
79072805
LW
1437}
1438
a0d0e21e 1439PP(pp_complement)
79072805 1440{
8ec5e241 1441 djSP; dTARGET; tryAMAGICun(compl);
a0d0e21e
LW
1442 {
1443 dTOPss;
4633a7c4 1444 if (SvNIOKp(sv)) {
d0ba1bd2
JH
1445 if (PL_op->op_private & HINT_INTEGER) {
1446 IBW value = ~SvIV(sv);
1447 SETi(BWi(value));
1448 }
1449 else {
1450 UBW value = ~SvUV(sv);
1451 SETu(BWu(value));
1452 }
a0d0e21e
LW
1453 }
1454 else {
1455 register char *tmps;
1456 register long *tmpl;
55497cff 1457 register I32 anum;
a0d0e21e
LW
1458 STRLEN len;
1459
1460 SvSetSV(TARG, sv);
1461 tmps = SvPV_force(TARG, len);
1462 anum = len;
1463#ifdef LIBERAL
1464 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1465 *tmps = ~*tmps;
1466 tmpl = (long*)tmps;
1467 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1468 *tmpl = ~*tmpl;
1469 tmps = (char*)tmpl;
1470#endif
1471 for ( ; anum > 0; anum--, tmps++)
1472 *tmps = ~*tmps;
1473
1474 SETs(TARG);
1475 }
1476 RETURN;
1477 }
79072805
LW
1478}
1479
a0d0e21e
LW
1480/* integer versions of some of the above */
1481
a0d0e21e 1482PP(pp_i_multiply)
79072805 1483{
8ec5e241 1484 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
a0d0e21e
LW
1485 {
1486 dPOPTOPiirl;
1487 SETi( left * right );
1488 RETURN;
1489 }
79072805
LW
1490}
1491
a0d0e21e 1492PP(pp_i_divide)
79072805 1493{
8ec5e241 1494 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
a0d0e21e
LW
1495 {
1496 dPOPiv;
1497 if (value == 0)
cea2e8a9 1498 DIE(aTHX_ "Illegal division by zero");
a0d0e21e
LW
1499 value = POPi / value;
1500 PUSHi( value );
1501 RETURN;
1502 }
79072805
LW
1503}
1504
a0d0e21e 1505PP(pp_i_modulo)
79072805 1506{
76e3520e 1507 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
79072805 1508 {
a0d0e21e 1509 dPOPTOPiirl;
aa306039 1510 if (!right)
cea2e8a9 1511 DIE(aTHX_ "Illegal modulus zero");
a0d0e21e
LW
1512 SETi( left % right );
1513 RETURN;
79072805 1514 }
79072805
LW
1515}
1516
a0d0e21e 1517PP(pp_i_add)
79072805 1518{
8ec5e241 1519 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
a0d0e21e
LW
1520 {
1521 dPOPTOPiirl;
1522 SETi( left + right );
1523 RETURN;
79072805 1524 }
79072805
LW
1525}
1526
a0d0e21e 1527PP(pp_i_subtract)
79072805 1528{
8ec5e241 1529 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
a0d0e21e
LW
1530 {
1531 dPOPTOPiirl;
1532 SETi( left - right );
1533 RETURN;
79072805 1534 }
79072805
LW
1535}
1536
a0d0e21e 1537PP(pp_i_lt)
79072805 1538{
8ec5e241 1539 djSP; tryAMAGICbinSET(lt,0);
a0d0e21e
LW
1540 {
1541 dPOPTOPiirl;
54310121 1542 SETs(boolSV(left < right));
a0d0e21e
LW
1543 RETURN;
1544 }
79072805
LW
1545}
1546
a0d0e21e 1547PP(pp_i_gt)
79072805 1548{
8ec5e241 1549 djSP; tryAMAGICbinSET(gt,0);
a0d0e21e
LW
1550 {
1551 dPOPTOPiirl;
54310121 1552 SETs(boolSV(left > right));
a0d0e21e
LW
1553 RETURN;
1554 }
79072805
LW
1555}
1556
a0d0e21e 1557PP(pp_i_le)
79072805 1558{
8ec5e241 1559 djSP; tryAMAGICbinSET(le,0);
a0d0e21e
LW
1560 {
1561 dPOPTOPiirl;
54310121 1562 SETs(boolSV(left <= right));
a0d0e21e 1563 RETURN;
85e6fe83 1564 }
79072805
LW
1565}
1566
a0d0e21e 1567PP(pp_i_ge)
79072805 1568{
8ec5e241 1569 djSP; tryAMAGICbinSET(ge,0);
a0d0e21e
LW
1570 {
1571 dPOPTOPiirl;
54310121 1572 SETs(boolSV(left >= right));
a0d0e21e
LW
1573 RETURN;
1574 }
79072805
LW
1575}
1576
a0d0e21e 1577PP(pp_i_eq)
79072805 1578{
8ec5e241 1579 djSP; tryAMAGICbinSET(eq,0);
a0d0e21e
LW
1580 {
1581 dPOPTOPiirl;
54310121 1582 SETs(boolSV(left == right));
a0d0e21e
LW
1583 RETURN;
1584 }
79072805
LW
1585}
1586
a0d0e21e 1587PP(pp_i_ne)
79072805 1588{
8ec5e241 1589 djSP; tryAMAGICbinSET(ne,0);
a0d0e21e
LW
1590 {
1591 dPOPTOPiirl;
54310121 1592 SETs(boolSV(left != right));
a0d0e21e
LW
1593 RETURN;
1594 }
79072805
LW
1595}
1596
a0d0e21e 1597PP(pp_i_ncmp)
79072805 1598{
8ec5e241 1599 djSP; dTARGET; tryAMAGICbin(ncmp,0);
a0d0e21e
LW
1600 {
1601 dPOPTOPiirl;
1602 I32 value;
79072805 1603
a0d0e21e 1604 if (left > right)
79072805 1605 value = 1;
a0d0e21e 1606 else if (left < right)
79072805 1607 value = -1;
a0d0e21e 1608 else
79072805 1609 value = 0;
a0d0e21e
LW
1610 SETi(value);
1611 RETURN;
79072805 1612 }
85e6fe83
LW
1613}
1614
1615PP(pp_i_negate)
1616{
4e35701f 1617 djSP; dTARGET; tryAMAGICun(neg);
85e6fe83
LW
1618 SETi(-TOPi);
1619 RETURN;
1620}
1621
79072805
LW
1622/* High falutin' math. */
1623
1624PP(pp_atan2)
1625{
8ec5e241 1626 djSP; dTARGET; tryAMAGICbin(atan2,0);
a0d0e21e
LW
1627 {
1628 dPOPTOPnnrl;
65202027 1629 SETn(Perl_atan2(left, right));
a0d0e21e
LW
1630 RETURN;
1631 }
79072805
LW
1632}
1633
1634PP(pp_sin)
1635{
4e35701f 1636 djSP; dTARGET; tryAMAGICun(sin);
a0d0e21e 1637 {
65202027 1638 NV value;
a0d0e21e 1639 value = POPn;
65202027 1640 value = Perl_sin(value);
a0d0e21e
LW
1641 XPUSHn(value);
1642 RETURN;
1643 }
79072805
LW
1644}
1645
1646PP(pp_cos)
1647{
4e35701f 1648 djSP; dTARGET; tryAMAGICun(cos);
a0d0e21e 1649 {
65202027 1650 NV value;
a0d0e21e 1651 value = POPn;
65202027 1652 value = Perl_cos(value);
a0d0e21e
LW
1653 XPUSHn(value);
1654 RETURN;
1655 }
79072805
LW
1656}
1657
56cb0a1c
AD
1658/* Support Configure command-line overrides for rand() functions.
1659 After 5.005, perhaps we should replace this by Configure support
1660 for drand48(), random(), or rand(). For 5.005, though, maintain
1661 compatibility by calling rand() but allow the user to override it.
1662 See INSTALL for details. --Andy Dougherty 15 July 1998
1663*/
85ab1d1d
JH
1664/* Now it's after 5.005, and Configure supports drand48() and random(),
1665 in addition to rand(). So the overrides should not be needed any more.
1666 --Jarkko Hietaniemi 27 September 1998
1667 */
1668
1669#ifndef HAS_DRAND48_PROTO
20ce7b12 1670extern double drand48 (void);
56cb0a1c
AD
1671#endif
1672
79072805
LW
1673PP(pp_rand)
1674{
4e35701f 1675 djSP; dTARGET;
65202027 1676 NV value;
79072805
LW
1677 if (MAXARG < 1)
1678 value = 1.0;
1679 else
1680 value = POPn;
1681 if (value == 0.0)
1682 value = 1.0;
80252599 1683 if (!PL_srand_called) {
85ab1d1d 1684 (void)seedDrand01((Rand_seed_t)seed());
80252599 1685 PL_srand_called = TRUE;
93dc8474 1686 }
85ab1d1d 1687 value *= Drand01();
79072805
LW
1688 XPUSHn(value);
1689 RETURN;
1690}
1691
1692PP(pp_srand)
1693{
4e35701f 1694 djSP;
93dc8474
CS
1695 UV anum;
1696 if (MAXARG < 1)
1697 anum = seed();
79072805 1698 else
93dc8474 1699 anum = POPu;
85ab1d1d 1700 (void)seedDrand01((Rand_seed_t)anum);
80252599 1701 PL_srand_called = TRUE;
79072805
LW
1702 EXTEND(SP, 1);
1703 RETPUSHYES;
1704}
1705
76e3520e 1706STATIC U32
cea2e8a9 1707S_seed(pTHX)
93dc8474 1708{
54310121 1709 /*
1710 * This is really just a quick hack which grabs various garbage
1711 * values. It really should be a real hash algorithm which
1712 * spreads the effect of every input bit onto every output bit,
85ab1d1d 1713 * if someone who knows about such things would bother to write it.
54310121 1714 * Might be a good idea to add that function to CORE as well.
85ab1d1d 1715 * No numbers below come from careful analysis or anything here,
54310121 1716 * except they are primes and SEED_C1 > 1E6 to get a full-width
1717 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1718 * probably be bigger too.
1719 */
1720#if RANDBITS > 16
1721# define SEED_C1 1000003
1722#define SEED_C4 73819
1723#else
1724# define SEED_C1 25747
1725#define SEED_C4 20639
1726#endif
1727#define SEED_C2 3
1728#define SEED_C3 269
1729#define SEED_C5 26107
1730
e858de61 1731 dTHR;
73c60299
RS
1732#ifndef PERL_NO_DEV_RANDOM
1733 int fd;
1734#endif
93dc8474 1735 U32 u;
f12c7020 1736#ifdef VMS
1737# include <starlet.h>
43c92808
HF
1738 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1739 * in 100-ns units, typically incremented ever 10 ms. */
93dc8474 1740 unsigned int when[2];
73c60299
RS
1741#else
1742# ifdef HAS_GETTIMEOFDAY
1743 struct timeval when;
1744# else
1745 Time_t when;
1746# endif
1747#endif
1748
1749/* This test is an escape hatch, this symbol isn't set by Configure. */
1750#ifndef PERL_NO_DEV_RANDOM
1751#ifndef PERL_RANDOM_DEVICE
1752 /* /dev/random isn't used by default because reads from it will block
1753 * if there isn't enough entropy available. You can compile with
1754 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1755 * is enough real entropy to fill the seed. */
1756# define PERL_RANDOM_DEVICE "/dev/urandom"
1757#endif
1758 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1759 if (fd != -1) {
1760 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1761 u = 0;
1762 PerlLIO_close(fd);
1763 if (u)
1764 return u;
1765 }
1766#endif
1767
1768#ifdef VMS
93dc8474 1769 _ckvmssts(sys$gettim(when));
54310121 1770 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
f12c7020 1771#else
5f05dabc 1772# ifdef HAS_GETTIMEOFDAY
93dc8474 1773 gettimeofday(&when,(struct timezone *) 0);
54310121 1774 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
f12c7020 1775# else
93dc8474 1776 (void)time(&when);
54310121 1777 u = (U32)SEED_C1 * when;
f12c7020 1778# endif
1779#endif
54310121 1780 u += SEED_C3 * (U32)getpid();
42718184 1781 u += SEED_C4 * (U32)(UV)PTR_CAST PL_stack_sp;
54310121 1782#ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
42718184 1783 u += SEED_C5 * (U32)(UV)PTR_CAST &when;
f12c7020 1784#endif
93dc8474 1785 return u;
79072805
LW
1786}
1787
1788PP(pp_exp)
1789{
4e35701f 1790 djSP; dTARGET; tryAMAGICun(exp);
a0d0e21e 1791 {
65202027 1792 NV value;
a0d0e21e 1793 value = POPn;
65202027 1794 value = Perl_exp(value);
a0d0e21e
LW
1795 XPUSHn(value);
1796 RETURN;
1797 }
79072805
LW
1798}
1799
1800PP(pp_log)
1801{
4e35701f 1802 djSP; dTARGET; tryAMAGICun(log);
a0d0e21e 1803 {
65202027 1804 NV value;
a0d0e21e 1805 value = POPn;
bbce6d69 1806 if (value <= 0.0) {
097ee67d 1807 RESTORE_NUMERIC_STANDARD();
cea2e8a9 1808 DIE(aTHX_ "Can't take log of %g", value);
bbce6d69 1809 }
65202027 1810 value = Perl_log(value);
a0d0e21e
LW
1811 XPUSHn(value);
1812 RETURN;
1813 }
79072805
LW
1814}
1815
1816PP(pp_sqrt)
1817{
4e35701f 1818 djSP; dTARGET; tryAMAGICun(sqrt);
a0d0e21e 1819 {
65202027 1820 NV value;
a0d0e21e 1821 value = POPn;
bbce6d69 1822 if (value < 0.0) {
097ee67d 1823 RESTORE_NUMERIC_STANDARD();
cea2e8a9 1824 DIE(aTHX_ "Can't take sqrt of %g", value);
bbce6d69 1825 }
65202027 1826 value = Perl_sqrt(value);
a0d0e21e
LW
1827 XPUSHn(value);
1828 RETURN;
1829 }
79072805
LW
1830}
1831
1832PP(pp_int)
1833{
4e35701f 1834 djSP; dTARGET;
774d564b 1835 {
65202027 1836 NV value = TOPn;
774d564b 1837 IV iv;
1838
1839 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1840 iv = SvIVX(TOPs);
1841 SETi(iv);
1842 }
1843 else {
1844 if (value >= 0.0)
65202027 1845 (void)Perl_modf(value, &value);
774d564b 1846 else {
65202027 1847 (void)Perl_modf(-value, &value);
774d564b 1848 value = -value;
1849 }
1850 iv = I_V(value);
1851 if (iv == value)
1852 SETi(iv);
1853 else
1854 SETn(value);
1855 }
79072805 1856 }
79072805
LW
1857 RETURN;
1858}
1859
463ee0b2
LW
1860PP(pp_abs)
1861{
4e35701f 1862 djSP; dTARGET; tryAMAGICun(abs);
a0d0e21e 1863 {
65202027 1864 NV value = TOPn;
774d564b 1865 IV iv;
463ee0b2 1866
774d564b 1867 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1868 (iv = SvIVX(TOPs)) != IV_MIN) {
1869 if (iv < 0)
1870 iv = -iv;
1871 SETi(iv);
1872 }
1873 else {
1874 if (value < 0.0)
1875 value = -value;
1876 SETn(value);
1877 }
a0d0e21e 1878 }
774d564b 1879 RETURN;
463ee0b2
LW
1880}
1881
79072805
LW
1882PP(pp_hex)
1883{
4e35701f 1884 djSP; dTARGET;
79072805
LW
1885 char *tmps;
1886 I32 argtype;
2d8e6c8d 1887 STRLEN n_a;
79072805 1888
2d8e6c8d 1889 tmps = POPpx;
9e24b6e2 1890 XPUSHn(scan_hex(tmps, 99, &argtype));
79072805
LW
1891 RETURN;
1892}
1893
1894PP(pp_oct)
1895{
4e35701f 1896 djSP; dTARGET;
9e24b6e2 1897 NV value;
79072805
LW
1898 I32 argtype;
1899 char *tmps;
2d8e6c8d 1900 STRLEN n_a;
79072805 1901
2d8e6c8d 1902 tmps = POPpx;
464e2e8a 1903 while (*tmps && isSPACE(*tmps))
1904 tmps++;
9e24b6e2
JH
1905 if (*tmps == '0')
1906 tmps++;
1907 if (*tmps == 'x')
1908 value = scan_hex(++tmps, 99, &argtype);
1909 else if (*tmps == 'b')
1910 value = scan_bin(++tmps, 99, &argtype);
464e2e8a 1911 else
9e24b6e2
JH
1912 value = scan_oct(tmps, 99, &argtype);
1913 XPUSHn(value);
79072805
LW
1914 RETURN;
1915}
1916
1917/* String stuff. */
1918
1919PP(pp_length)
1920{
4e35701f 1921 djSP; dTARGET;
a0ed51b3
LW
1922
1923 if (IN_UTF8) {
1924 SETi( sv_len_utf8(TOPs) );
1925 RETURN;
1926 }
1927
a0d0e21e 1928 SETi( sv_len(TOPs) );
79072805
LW
1929 RETURN;
1930}
1931
1932PP(pp_substr)
1933{
4e35701f 1934 djSP; dTARGET;
79072805
LW
1935 SV *sv;
1936 I32 len;
463ee0b2 1937 STRLEN curlen;
a0ed51b3 1938 STRLEN utfcurlen;
79072805
LW
1939 I32 pos;
1940 I32 rem;
84902520 1941 I32 fail;
533c011a 1942 I32 lvalue = PL_op->op_flags & OPf_MOD;
79072805 1943 char *tmps;
3280af22 1944 I32 arybase = PL_curcop->cop_arybase;
7b8d334a
GS
1945 char *repl = 0;
1946 STRLEN repl_len;
79072805 1947
20408e3c 1948 SvTAINTED_off(TARG); /* decontaminate */
5d82c453
GA
1949 if (MAXARG > 2) {
1950 if (MAXARG > 3) {
1951 sv = POPs;
1952 repl = SvPV(sv, repl_len);
7b8d334a 1953 }
79072805 1954 len = POPi;
5d82c453 1955 }
84902520 1956 pos = POPi;
79072805 1957 sv = POPs;
849ca7ee 1958 PUTBACK;
a0d0e21e 1959 tmps = SvPV(sv, curlen);
a0ed51b3
LW
1960 if (IN_UTF8) {
1961 utfcurlen = sv_len_utf8(sv);
1962 if (utfcurlen == curlen)
1963 utfcurlen = 0;
1964 else
1965 curlen = utfcurlen;
1966 }
d1c2b58a
LW
1967 else
1968 utfcurlen = 0;
a0ed51b3 1969
84902520
TB
1970 if (pos >= arybase) {
1971 pos -= arybase;
1972 rem = curlen-pos;
1973 fail = rem;
5d82c453
GA
1974 if (MAXARG > 2) {
1975 if (len < 0) {
1976 rem += len;
1977 if (rem < 0)
1978 rem = 0;
1979 }
1980 else if (rem > len)
1981 rem = len;
1982 }
68dc0745 1983 }
84902520 1984 else {
5d82c453
GA
1985 pos += curlen;
1986 if (MAXARG < 3)
1987 rem = curlen;
1988 else if (len >= 0) {
1989 rem = pos+len;
1990 if (rem > (I32)curlen)
1991 rem = curlen;
1992 }
1993 else {
1994 rem = curlen+len;
1995 if (rem < pos)
1996 rem = pos;
1997 }
1998 if (pos < 0)
1999 pos = 0;
2000 fail = rem;
2001 rem -= pos;
84902520
TB
2002 }
2003 if (fail < 0) {
599cee73 2004 if (ckWARN(WARN_SUBSTR) || lvalue || repl)
cea2e8a9 2005 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
2304df62
AD
2006 RETPUSHUNDEF;
2007 }
79072805 2008 else {
a0ed51b3
LW
2009 if (utfcurlen)
2010 sv_pos_u2b(sv, &pos, &rem);
79072805 2011 tmps += pos;
79072805
LW
2012 sv_setpvn(TARG, tmps, rem);
2013 if (lvalue) { /* it's an lvalue! */
dedeecda 2014 if (!SvGMAGICAL(sv)) {
2015 if (SvROK(sv)) {
2d8e6c8d
GS
2016 STRLEN n_a;
2017 SvPV_force(sv,n_a);
599cee73 2018 if (ckWARN(WARN_SUBSTR))
cea2e8a9 2019 Perl_warner(aTHX_ WARN_SUBSTR,
599cee73 2020 "Attempt to use reference as lvalue in substr");
dedeecda 2021 }
2022 if (SvOK(sv)) /* is it defined ? */
2023 (void)SvPOK_only(sv);
2024 else
2025 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
2026 }
5f05dabc 2027
a0d0e21e
LW
2028 if (SvTYPE(TARG) < SVt_PVLV) {
2029 sv_upgrade(TARG, SVt_PVLV);
2030 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
ed6116ce 2031 }
a0d0e21e 2032
5f05dabc 2033 LvTYPE(TARG) = 'x';
6ff81951
GS
2034 if (LvTARG(TARG) != sv) {
2035 if (LvTARG(TARG))
2036 SvREFCNT_dec(LvTARG(TARG));
2037 LvTARG(TARG) = SvREFCNT_inc(sv);
2038 }
a0d0e21e 2039 LvTARGOFF(TARG) = pos;
8ec5e241 2040 LvTARGLEN(TARG) = rem;
79072805 2041 }
5d82c453 2042 else if (repl)
7b8d334a 2043 sv_insert(sv, pos, rem, repl, repl_len);
79072805 2044 }
849ca7ee 2045 SPAGAIN;
79072805
LW
2046 PUSHs(TARG); /* avoid SvSETMAGIC here */
2047 RETURN;
2048}
2049
2050PP(pp_vec)
2051{
4e35701f 2052 djSP; dTARGET;
79072805
LW
2053 register I32 size = POPi;
2054 register I32 offset = POPi;
2055 register SV *src = POPs;
533c011a 2056 I32 lvalue = PL_op->op_flags & OPf_MOD;
a0d0e21e 2057
81e118e0
JH
2058 SvTAINTED_off(TARG); /* decontaminate */
2059 if (lvalue) { /* it's an lvalue! */
2060 if (SvTYPE(TARG) < SVt_PVLV) {
2061 sv_upgrade(TARG, SVt_PVLV);
2062 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
79072805 2063 }
81e118e0
JH
2064 LvTYPE(TARG) = 'v';
2065 if (LvTARG(TARG) != src) {
2066 if (LvTARG(TARG))
2067 SvREFCNT_dec(LvTARG(TARG));
2068 LvTARG(TARG) = SvREFCNT_inc(src);
79072805 2069 }
81e118e0
JH
2070 LvTARGOFF(TARG) = offset;
2071 LvTARGLEN(TARG) = size;
79072805
LW
2072 }
2073
81e118e0 2074 sv_setuv(TARG, do_vecget(src, offset, size));
79072805
LW
2075 PUSHs(TARG);
2076 RETURN;
2077}
2078
2079PP(pp_index)
2080{
4e35701f 2081 djSP; dTARGET;
79072805
LW
2082 SV *big;
2083 SV *little;
2084 I32 offset;
2085 I32 retval;
2086 char *tmps;
2087 char *tmps2;
463ee0b2 2088 STRLEN biglen;
3280af22 2089 I32 arybase = PL_curcop->cop_arybase;
79072805
LW
2090
2091 if (MAXARG < 3)
2092 offset = 0;
2093 else
2094 offset = POPi - arybase;
2095 little = POPs;
2096 big = POPs;
463ee0b2 2097 tmps = SvPV(big, biglen);
a0ed51b3
LW
2098 if (IN_UTF8 && offset > 0)
2099 sv_pos_u2b(big, &offset, 0);
79072805
LW
2100 if (offset < 0)
2101 offset = 0;
93a17b20
LW
2102 else if (offset > biglen)
2103 offset = biglen;
79072805 2104 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
411d5715 2105 (unsigned char*)tmps + biglen, little, 0)))
a0ed51b3 2106 retval = -1;
79072805 2107 else
a0ed51b3
LW
2108 retval = tmps2 - tmps;
2109 if (IN_UTF8 && retval > 0)
2110 sv_pos_b2u(big, &retval);
2111 PUSHi(retval + arybase);
79072805
LW
2112 RETURN;
2113}
2114
2115PP(pp_rindex)
2116{
4e35701f 2117 djSP; dTARGET;
79072805
LW
2118 SV *big;
2119 SV *little;
463ee0b2
LW
2120 STRLEN blen;
2121 STRLEN llen;
79072805
LW
2122 I32 offset;
2123 I32 retval;
2124 char *tmps;
2125 char *tmps2;
3280af22 2126 I32 arybase = PL_curcop->cop_arybase;
79072805 2127
a0d0e21e 2128 if (MAXARG >= 3)
a0ed51b3 2129 offset = POPi;
79072805
LW
2130 little = POPs;
2131 big = POPs;
463ee0b2
LW
2132 tmps2 = SvPV(little, llen);
2133 tmps = SvPV(big, blen);
79072805 2134 if (MAXARG < 3)
463ee0b2 2135 offset = blen;
a0ed51b3
LW
2136 else {
2137 if (IN_UTF8 && offset > 0)
2138 sv_pos_u2b(big, &offset, 0);
2139 offset = offset - arybase + llen;
2140 }
79072805
LW
2141 if (offset < 0)
2142 offset = 0;
463ee0b2
LW
2143 else if (offset > blen)
2144 offset = blen;
79072805 2145 if (!(tmps2 = rninstr(tmps, tmps + offset,
463ee0b2 2146 tmps2, tmps2 + llen)))
a0ed51b3 2147 retval = -1;
79072805 2148 else
a0ed51b3
LW
2149 retval = tmps2 - tmps;
2150 if (IN_UTF8 && retval > 0)
2151 sv_pos_b2u(big, &retval);
2152 PUSHi(retval + arybase);
79072805
LW
2153 RETURN;
2154}
2155
2156PP(pp_sprintf)
2157{
4e35701f 2158 djSP; dMARK; dORIGMARK; dTARGET;
79072805 2159 do_sprintf(TARG, SP-MARK, MARK+1);
bbce6d69 2160 TAINT_IF(SvTAINTED(TARG));
79072805
LW
2161 SP = ORIGMARK;
2162 PUSHTARG;
2163 RETURN;
2164}
2165
79072805
LW
2166PP(pp_ord)
2167{
4e35701f 2168 djSP; dTARGET;
bdeef251 2169 UV value;
2d8e6c8d
GS
2170 STRLEN n_a;
2171 U8 *tmps = (U8*)POPpx;
a0ed51b3 2172 I32 retlen;
79072805 2173
a0ed51b3 2174 if (IN_UTF8 && (*tmps & 0x80))
bdeef251 2175 value = utf8_to_uv(tmps, &retlen);
a0ed51b3 2176 else
bdeef251
GA
2177 value = (UV)(*tmps & 255);
2178 XPUSHu(value);
79072805
LW
2179 RETURN;
2180}
2181
463ee0b2
LW
2182PP(pp_chr)
2183{
4e35701f 2184 djSP; dTARGET;
463ee0b2 2185 char *tmps;
3b9be786 2186 U32 value = POPu;
463ee0b2 2187
748a9306 2188 (void)SvUPGRADE(TARG,SVt_PV);
a0ed51b3
LW
2189
2190 if (IN_UTF8 && value >= 128) {
2191 SvGROW(TARG,8);
2192 tmps = SvPVX(TARG);
dfe13c55 2193 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
a0ed51b3
LW
2194 SvCUR_set(TARG, tmps - SvPVX(TARG));
2195 *tmps = '\0';
2196 (void)SvPOK_only(TARG);
2197 XPUSHs(TARG);
2198 RETURN;
2199 }
2200
748a9306 2201 SvGROW(TARG,2);
463ee0b2
LW
2202 SvCUR_set(TARG, 1);
2203 tmps = SvPVX(TARG);
a0ed51b3 2204 *tmps++ = value;
748a9306 2205 *tmps = '\0';
a0d0e21e 2206 (void)SvPOK_only(TARG);
463ee0b2
LW
2207 XPUSHs(TARG);
2208 RETURN;
2209}
2210
79072805
LW
2211PP(pp_crypt)
2212{
4e35701f 2213 djSP; dTARGET; dPOPTOPssrl;
2d8e6c8d 2214 STRLEN n_a;
79072805 2215#ifdef HAS_CRYPT
2d8e6c8d 2216 char *tmps = SvPV(left, n_a);
79072805 2217#ifdef FCRYPT
2d8e6c8d 2218 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
79072805 2219#else
2d8e6c8d 2220 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
79072805
LW
2221#endif
2222#else
cea2e8a9 2223 DIE(aTHX_
79072805
LW
2224 "The crypt() function is unimplemented due to excessive paranoia.");
2225#endif
2226 SETs(TARG);
2227 RETURN;
2228}
2229
2230PP(pp_ucfirst)
2231{
4e35701f 2232 djSP;
79072805 2233 SV *sv = TOPs;
a0ed51b3
LW
2234 register U8 *s;
2235 STRLEN slen;
2236
dfe13c55 2237 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
a0ed51b3
LW
2238 I32 ulen;
2239 U8 tmpbuf[10];
2240 U8 *tend;
2241 UV uv = utf8_to_uv(s, &ulen);
2242
2243 if (PL_op->op_private & OPpLOCALE) {
2244 TAINT;
2245 SvTAINTED_on(sv);
2246 uv = toTITLE_LC_uni(uv);
2247 }
2248 else
2249 uv = toTITLE_utf8(s);
2250
2251 tend = uv_to_utf8(tmpbuf, uv);
2252
2253 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2254 dTARGET;
dfe13c55
GS
2255 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2256 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
a0ed51b3
LW
2257 SETs(TARG);
2258 }
2259 else {
dfe13c55 2260 s = (U8*)SvPV_force(sv, slen);
a0ed51b3
LW
2261 Copy(tmpbuf, s, ulen, U8);
2262 }
a0ed51b3 2263 }
626727d5 2264 else {
31351b04
JS
2265 if (!SvPADTMP(sv)) {
2266 dTARGET;
2267 sv_setsv(TARG, sv);
2268 sv = TARG;
2269 SETs(sv);
2270 }
2271 s = (U8*)SvPV_force(sv, slen);
2272 if (*s) {
2273 if (PL_op->op_private & OPpLOCALE) {
2274 TAINT;
2275 SvTAINTED_on(sv);
2276 *s = toUPPER_LC(*s);
2277 }
2278 else
2279 *s = toUPPER(*s);
bbce6d69 2280 }
bbce6d69 2281 }
31351b04
JS
2282 if (SvSMAGICAL(sv))
2283 mg_set(sv);
79072805
LW
2284 RETURN;
2285}
2286
2287PP(pp_lcfirst)
2288{
4e35701f 2289 djSP;
79072805 2290 SV *sv = TOPs;
a0ed51b3
LW
2291 register U8 *s;
2292 STRLEN slen;
2293
dfe13c55 2294 if (IN_UTF8 && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
a0ed51b3
LW
2295 I32 ulen;
2296 U8 tmpbuf[10];
2297 U8 *tend;
2298 UV uv = utf8_to_uv(s, &ulen);
2299
2300 if (PL_op->op_private & OPpLOCALE) {
2301 TAINT;
2302 SvTAINTED_on(sv);
2303 uv = toLOWER_LC_uni(uv);
2304 }
2305 else
2306 uv = toLOWER_utf8(s);
2307
2308 tend = uv_to_utf8(tmpbuf, uv);
2309
2310 if (!SvPADTMP(sv) || tend - tmpbuf != ulen) {
2311 dTARGET;
dfe13c55
GS
2312 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2313 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
a0ed51b3
LW
2314 SETs(TARG);
2315 }
2316 else {
dfe13c55 2317 s = (U8*)SvPV_force(sv, slen);
a0ed51b3
LW
2318 Copy(tmpbuf, s, ulen, U8);
2319 }
a0ed51b3 2320 }
626727d5 2321 else {
31351b04
JS
2322 if (!SvPADTMP(sv)) {
2323 dTARGET;
2324 sv_setsv(TARG, sv);
2325 sv = TARG;
2326 SETs(sv);
2327 }
2328 s = (U8*)SvPV_force(sv, slen);
2329 if (*s) {
2330 if (PL_op->op_private & OPpLOCALE) {
2331 TAINT;
2332 SvTAINTED_on(sv);
2333 *s = toLOWER_LC(*s);
2334 }
2335 else
2336 *s = toLOWER(*s);
bbce6d69 2337 }
31351b04 2338 SETs(sv);
bbce6d69 2339 }
31351b04
JS
2340 if (SvSMAGICAL(sv))
2341 mg_set(sv);
79072805
LW
2342 RETURN;
2343}
2344
2345PP(pp_uc)
2346{
4e35701f 2347 djSP;
79072805 2348 SV *sv = TOPs;
a0ed51b3 2349 register U8 *s;
463ee0b2 2350 STRLEN len;
79072805 2351
a0ed51b3
LW
2352 if (IN_UTF8) {
2353 dTARGET;
2354 I32 ulen;
2355 register U8 *d;
2356 U8 *send;
2357
dfe13c55 2358 s = (U8*)SvPV(sv,len);
a5a20234
LW
2359 if (!len) {
2360 sv_setpvn(TARG, "", 0);
2361 SETs(TARG);
a0ed51b3
LW
2362 }
2363 else {
31351b04
JS
2364 (void)SvUPGRADE(TARG, SVt_PV);
2365 SvGROW(TARG, (len * 2) + 1);
2366 (void)SvPOK_only(TARG);
2367 d = (U8*)SvPVX(TARG);
2368 send = s + len;
2369 if (PL_op->op_private & OPpLOCALE) {
2370 TAINT;
2371 SvTAINTED_on(TARG);
2372 while (s < send) {
2373 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2374 s += ulen;
2375 }
a0ed51b3 2376 }
31351b04
JS
2377 else {
2378 while (s < send) {
2379 d = uv_to_utf8(d, toUPPER_utf8( s ));
2380 s += UTF8SKIP(s);
2381 }
a0ed51b3 2382 }
31351b04
JS
2383 *d = '\0';
2384 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2385 SETs(TARG);
a0ed51b3 2386 }
a0ed51b3 2387 }
626727d5 2388 else {
31351b04
JS
2389 if (!SvPADTMP(sv)) {
2390 dTARGET;
2391 sv_setsv(TARG, sv);
2392 sv = TARG;
2393 SETs(sv);
2394 }
2395 s = (U8*)SvPV_force(sv, len);
2396 if (len) {
2397 register U8 *send = s + len;
2398
2399 if (PL_op->op_private & OPpLOCALE) {
2400 TAINT;
2401 SvTAINTED_on(sv);
2402 for (; s < send; s++)
2403 *s = toUPPER_LC(*s);
2404 }
2405 else {
2406 for (; s < send; s++)
2407 *s = toUPPER(*s);
2408 }
bbce6d69 2409 }
79072805 2410 }
31351b04
JS
2411 if (SvSMAGICAL(sv))
2412 mg_set(sv);
79072805
LW
2413 RETURN;
2414}
2415
2416PP(pp_lc)
2417{
4e35701f 2418 djSP;
79072805 2419 SV *sv = TOPs;
a0ed51b3 2420 register U8 *s;
463ee0b2 2421 STRLEN len;
79072805 2422
a0ed51b3
LW
2423 if (IN_UTF8) {
2424 dTARGET;
2425 I32 ulen;
2426 register U8 *d;
2427 U8 *send;
2428
dfe13c55 2429 s = (U8*)SvPV(sv,len);
a5a20234
LW
2430 if (!len) {
2431 sv_setpvn(TARG, "", 0);
2432 SETs(TARG);
a0ed51b3
LW
2433 }
2434 else {
31351b04
JS
2435 (void)SvUPGRADE(TARG, SVt_PV);
2436 SvGROW(TARG, (len * 2) + 1);
2437 (void)SvPOK_only(TARG);
2438 d = (U8*)SvPVX(TARG);
2439 send = s + len;
2440 if (PL_op->op_private & OPpLOCALE) {
2441 TAINT;
2442 SvTAINTED_on(TARG);
2443 while (s < send) {
2444 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2445 s += ulen;
2446 }
a0ed51b3 2447 }
31351b04
JS
2448 else {
2449 while (s < send) {
2450 d = uv_to_utf8(d, toLOWER_utf8(s));
2451 s += UTF8SKIP(s);
2452 }
a0ed51b3 2453 }
31351b04
JS
2454 *d = '\0';
2455 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2456 SETs(TARG);
a0ed51b3 2457 }
79072805 2458 }
626727d5 2459 else {
31351b04
JS
2460 if (!SvPADTMP(sv)) {
2461 dTARGET;
2462 sv_setsv(TARG, sv);
2463 sv = TARG;
2464 SETs(sv);
a0ed51b3 2465 }
bbce6d69 2466
31351b04
JS
2467 s = (U8*)SvPV_force(sv, len);
2468 if (len) {
2469 register U8 *send = s + len;
bbce6d69 2470
31351b04
JS
2471 if (PL_op->op_private & OPpLOCALE) {
2472 TAINT;
2473 SvTAINTED_on(sv);
2474 for (; s < send; s++)
2475 *s = toLOWER_LC(*s);
2476 }
2477 else {
2478 for (; s < send; s++)
2479 *s = toLOWER(*s);
2480 }
bbce6d69 2481 }
79072805 2482 }
31351b04
JS
2483 if (SvSMAGICAL(sv))
2484 mg_set(sv);
79072805
LW
2485 RETURN;
2486}
2487
a0d0e21e 2488PP(pp_quotemeta)
79072805 2489{
4e35701f 2490 djSP; dTARGET;
a0d0e21e
LW
2491 SV *sv = TOPs;
2492 STRLEN len;
2493 register char *s = SvPV(sv,len);
2494 register char *d;
79072805 2495
a0d0e21e
LW
2496 if (len) {
2497 (void)SvUPGRADE(TARG, SVt_PV);
c07a80fd 2498 SvGROW(TARG, (len * 2) + 1);
a0d0e21e 2499 d = SvPVX(TARG);
0dd2cdef
LW
2500 if (IN_UTF8) {
2501 while (len) {
2502 if (*s & 0x80) {
2503 STRLEN ulen = UTF8SKIP(s);
2504 if (ulen > len)
2505 ulen = len;
2506 len -= ulen;
2507 while (ulen--)
2508 *d++ = *s++;
2509 }
2510 else {
2511 if (!isALNUM(*s))
2512 *d++ = '\\';
2513 *d++ = *s++;
2514 len--;
2515 }
2516 }
2517 }
2518 else {
2519 while (len--) {
2520 if (!isALNUM(*s))
2521 *d++ = '\\';
2522 *d++ = *s++;
2523 }
79072805 2524 }
a0d0e21e
LW
2525 *d = '\0';
2526 SvCUR_set(TARG, d - SvPVX(TARG));
2527 (void)SvPOK_only(TARG);
79072805 2528 }
a0d0e21e
LW
2529 else
2530 sv_setpvn(TARG, s, len);
2531 SETs(TARG);
31351b04
JS
2532 if (SvSMAGICAL(TARG))
2533 mg_set(TARG);
79072805
LW
2534 RETURN;
2535}
2536
a0d0e21e 2537/* Arrays. */
79072805 2538
a0d0e21e 2539PP(pp_aslice)
79072805 2540{
4e35701f 2541 djSP; dMARK; dORIGMARK;
a0d0e21e
LW
2542 register SV** svp;
2543 register AV* av = (AV*)POPs;
533c011a 2544 register I32 lval = PL_op->op_flags & OPf_MOD;
3280af22 2545 I32 arybase = PL_curcop->cop_arybase;
748a9306 2546 I32 elem;
79072805 2547
a0d0e21e 2548 if (SvTYPE(av) == SVt_PVAV) {
533c011a 2549 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
748a9306 2550 I32 max = -1;
924508f0 2551 for (svp = MARK + 1; svp <= SP; svp++) {
748a9306
LW
2552 elem = SvIVx(*svp);
2553 if (elem > max)
2554 max = elem;
2555 }
2556 if (max > AvMAX(av))
2557 av_extend(av, max);
2558 }
a0d0e21e 2559 while (++MARK <= SP) {
748a9306 2560 elem = SvIVx(*MARK);
a0d0e21e 2561
748a9306
LW
2562 if (elem > 0)
2563 elem -= arybase;
a0d0e21e
LW
2564 svp = av_fetch(av, elem, lval);
2565 if (lval) {
3280af22 2566 if (!svp || *svp == &PL_sv_undef)
cea2e8a9 2567 DIE(aTHX_ PL_no_aelem, elem);
533c011a 2568 if (PL_op->op_private & OPpLVAL_INTRO)
161b7d16 2569 save_aelem(av, elem, svp);
79072805 2570 }
3280af22 2571 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
2572 }
2573 }
748a9306 2574 if (GIMME != G_ARRAY) {
a0d0e21e
LW
2575 MARK = ORIGMARK;
2576 *++MARK = *SP;
2577 SP = MARK;
2578 }
79072805
LW
2579 RETURN;
2580}
2581
2582/* Associative arrays. */
2583
2584PP(pp_each)
2585{
59af0135 2586 djSP;
79072805 2587 HV *hash = (HV*)POPs;
c07a80fd 2588 HE *entry;
54310121 2589 I32 gimme = GIMME_V;
c750a3ec 2590 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
8ec5e241 2591
c07a80fd 2592 PUTBACK;
c750a3ec
MB
2593 /* might clobber stack_sp */
2594 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
c07a80fd 2595 SPAGAIN;
79072805 2596
79072805
LW
2597 EXTEND(SP, 2);
2598 if (entry) {
54310121 2599 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2600 if (gimme == G_ARRAY) {
59af0135 2601 SV *val;
c07a80fd 2602 PUTBACK;
c750a3ec 2603 /* might clobber stack_sp */
59af0135
GS
2604 val = realhv ?
2605 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
c07a80fd 2606 SPAGAIN;
59af0135 2607 PUSHs(val);
79072805 2608 }
79072805 2609 }
54310121 2610 else if (gimme == G_SCALAR)
79072805
LW
2611 RETPUSHUNDEF;
2612
2613 RETURN;
2614}
2615
2616PP(pp_values)
2617{
cea2e8a9 2618 return do_kv();
79072805
LW
2619}
2620
2621PP(pp_keys)
2622{
cea2e8a9 2623 return do_kv();
79072805
LW
2624}
2625
2626PP(pp_delete)
2627{
4e35701f 2628 djSP;
54310121 2629 I32 gimme = GIMME_V;
2630 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
79072805 2631 SV *sv;
5f05dabc 2632 HV *hv;
2633
533c011a 2634 if (PL_op->op_private & OPpSLICE) {
5f05dabc 2635 dMARK; dORIGMARK;
97fcbf96 2636 U32 hvtype;
5f05dabc 2637 hv = (HV*)POPs;
97fcbf96 2638 hvtype = SvTYPE(hv);
5f05dabc 2639 while (++MARK <= SP) {
ae77835f
MB
2640 if (hvtype == SVt_PVHV)
2641 sv = hv_delete_ent(hv, *MARK, discard, 0);
ae77835f 2642 else
cea2e8a9 2643 DIE(aTHX_ "Not a HASH reference");
3280af22 2644 *MARK = sv ? sv : &PL_sv_undef;
5f05dabc 2645 }
54310121 2646 if (discard)
2647 SP = ORIGMARK;
2648 else if (gimme == G_SCALAR) {
5f05dabc 2649 MARK = ORIGMARK;
2650 *++MARK = *SP;
2651 SP = MARK;
2652 }
2653 }
2654 else {
2655 SV *keysv = POPs;
2656 hv = (HV*)POPs;
97fcbf96
MB
2657 if (SvTYPE(hv) == SVt_PVHV)
2658 sv = hv_delete_ent(hv, keysv, discard, 0);
97fcbf96 2659 else
cea2e8a9 2660 DIE(aTHX_ "Not a HASH reference");
5f05dabc 2661 if (!sv)
3280af22 2662 sv = &PL_sv_undef;
54310121 2663 if (!discard)
2664 PUSHs(sv);
79072805 2665 }
79072805
LW
2666 RETURN;
2667}
2668
a0d0e21e 2669PP(pp_exists)
79072805 2670{
4e35701f 2671 djSP;
a0d0e21e
LW
2672 SV *tmpsv = POPs;
2673 HV *hv = (HV*)POPs;
c750a3ec 2674 if (SvTYPE(hv) == SVt_PVHV) {
ae77835f 2675 if (hv_exists_ent(hv, tmpsv, 0))
c750a3ec 2676 RETPUSHYES;
ef54e1a4
JH
2677 }
2678 else if (SvTYPE(hv) == SVt_PVAV) {
ae77835f 2679 if (avhv_exists_ent((AV*)hv, tmpsv, 0))
c750a3ec 2680 RETPUSHYES;
ef54e1a4
JH
2681 }
2682 else {
cea2e8a9 2683 DIE(aTHX_ "Not a HASH reference");
a0d0e21e 2684 }
a0d0e21e
LW
2685 RETPUSHNO;
2686}
79072805 2687
a0d0e21e
LW
2688PP(pp_hslice)
2689{
4e35701f 2690 djSP; dMARK; dORIGMARK;
a0d0e21e 2691 register HV *hv = (HV*)POPs;
533c011a 2692 register I32 lval = PL_op->op_flags & OPf_MOD;
c750a3ec 2693 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
79072805 2694
0ebe0038 2695 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
cea2e8a9 2696 DIE(aTHX_ "Can't localize pseudo-hash element");
0ebe0038 2697
c750a3ec 2698 if (realhv || SvTYPE(hv) == SVt_PVAV) {
a0d0e21e 2699 while (++MARK <= SP) {
f12c7020 2700 SV *keysv = *MARK;
ae77835f
MB
2701 SV **svp;
2702 if (realhv) {
800e9ae0 2703 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
ae77835f 2704 svp = he ? &HeVAL(he) : 0;
ef54e1a4
JH
2705 }
2706 else {
97fcbf96 2707 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
ae77835f 2708 }
a0d0e21e 2709 if (lval) {
2d8e6c8d
GS
2710 if (!svp || *svp == &PL_sv_undef) {
2711 STRLEN n_a;
cea2e8a9 2712 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
2d8e6c8d 2713 }
533c011a 2714 if (PL_op->op_private & OPpLVAL_INTRO)
800e9ae0 2715 save_helem(hv, keysv, svp);
93a17b20 2716 }
3280af22 2717 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
2718 }
2719 }
a0d0e21e
LW
2720 if (GIMME != G_ARRAY) {
2721 MARK = ORIGMARK;
2722 *++MARK = *SP;
2723 SP = MARK;
79072805 2724 }
a0d0e21e
LW
2725 RETURN;
2726}
2727
2728/* List operators. */
2729
2730PP(pp_list)
2731{
4e35701f 2732 djSP; dMARK;
a0d0e21e
LW
2733 if (GIMME != G_ARRAY) {
2734 if (++MARK <= SP)
2735 *MARK = *SP; /* unwanted list, return last item */
8990e307 2736 else
3280af22 2737 *MARK = &PL_sv_undef;
a0d0e21e 2738 SP = MARK;
79072805 2739 }
a0d0e21e 2740 RETURN;
79072805
LW
2741}
2742
a0d0e21e 2743PP(pp_lslice)
79072805 2744{
4e35701f 2745 djSP;
3280af22
NIS
2746 SV **lastrelem = PL_stack_sp;
2747 SV **lastlelem = PL_stack_base + POPMARK;
2748 SV **firstlelem = PL_stack_base + POPMARK + 1;
a0d0e21e 2749 register SV **firstrelem = lastlelem + 1;
3280af22 2750 I32 arybase = PL_curcop->cop_arybase;
533c011a 2751 I32 lval = PL_op->op_flags & OPf_MOD;
4633a7c4 2752 I32 is_something_there = lval;
79072805 2753
a0d0e21e
LW
2754 register I32 max = lastrelem - lastlelem;
2755 register SV **lelem;
2756 register I32 ix;
2757
2758 if (GIMME != G_ARRAY) {
748a9306
LW
2759 ix = SvIVx(*lastlelem);
2760 if (ix < 0)
2761 ix += max;
2762 else
2763 ix -= arybase;
a0d0e21e 2764 if (ix < 0 || ix >= max)
3280af22 2765 *firstlelem = &PL_sv_undef;
a0d0e21e
LW
2766 else
2767 *firstlelem = firstrelem[ix];
2768 SP = firstlelem;
2769 RETURN;
2770 }
2771
2772 if (max == 0) {
2773 SP = firstlelem - 1;
2774 RETURN;
2775 }
2776
2777 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
748a9306 2778 ix = SvIVx(*lelem);
c73bf8e3 2779 if (ix < 0)
a0d0e21e 2780 ix += max;
c73bf8e3 2781 else
748a9306 2782 ix -= arybase;
c73bf8e3
HS
2783 if (ix < 0 || ix >= max)
2784 *lelem = &PL_sv_undef;
2785 else {
2786 is_something_there = TRUE;
2787 if (!(*lelem = firstrelem[ix]))
3280af22 2788 *lelem = &PL_sv_undef;
748a9306 2789 }
79072805 2790 }
4633a7c4
LW
2791 if (is_something_there)
2792 SP = lastlelem;
2793 else
2794 SP = firstlelem - 1;
79072805
LW
2795 RETURN;
2796}
2797
a0d0e21e
LW
2798PP(pp_anonlist)
2799{
4e35701f 2800 djSP; dMARK; dORIGMARK;
a0d0e21e 2801 I32 items = SP - MARK;
44a8e56a 2802 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2803 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2804 XPUSHs(av);
a0d0e21e
LW
2805 RETURN;
2806}
2807
2808PP(pp_anonhash)
79072805 2809{
4e35701f 2810 djSP; dMARK; dORIGMARK;
a0d0e21e
LW
2811 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2812
2813 while (MARK < SP) {
2814 SV* key = *++MARK;
a0d0e21e
LW
2815 SV *val = NEWSV(46, 0);
2816 if (MARK < SP)
2817 sv_setsv(val, *++MARK);
599cee73 2818 else if (ckWARN(WARN_UNSAFE))
cea2e8a9 2819 Perl_warner(aTHX_ WARN_UNSAFE, "Odd number of elements in hash assignment");
f12c7020 2820 (void)hv_store_ent(hv,key,val,0);
79072805 2821 }
a0d0e21e
LW
2822 SP = ORIGMARK;
2823 XPUSHs((SV*)hv);
79072805
LW
2824 RETURN;
2825}
2826
a0d0e21e 2827PP(pp_splice)
79072805 2828{
4e35701f 2829 djSP; dMARK; dORIGMARK;
a0d0e21e
LW
2830 register AV *ary = (AV*)*++MARK;
2831 register SV **src;
2832 register SV **dst;
2833 register I32 i;
2834 register I32 offset;
2835 register I32 length;
2836 I32 newlen;
2837 I32 after;
2838 I32 diff;
2839 SV **tmparyval = 0;
93965878
NIS
2840 MAGIC *mg;
2841
33c27489
GS
2842 if (mg = SvTIED_mg((SV*)ary, 'P')) {
2843 *MARK-- = SvTIED_obj((SV*)ary, mg);
93965878 2844 PUSHMARK(MARK);
8ec5e241 2845 PUTBACK;
a60c0954 2846 ENTER;
864dbfa3 2847 call_method("SPLICE",GIMME_V);
a60c0954 2848 LEAVE;
93965878
NIS
2849 SPAGAIN;
2850 RETURN;
2851 }
79072805 2852
a0d0e21e 2853 SP++;
79072805 2854
a0d0e21e 2855 if (++MARK < SP) {
84902520 2856 offset = i = SvIVx(*MARK);
a0d0e21e 2857 if (offset < 0)
93965878 2858 offset += AvFILLp(ary) + 1;
a0d0e21e 2859 else
3280af22 2860 offset -= PL_curcop->cop_arybase;
84902520 2861 if (offset < 0)
cea2e8a9 2862 DIE(aTHX_ PL_no_aelem, i);
a0d0e21e
LW
2863 if (++MARK < SP) {
2864 length = SvIVx(*MARK++);
48cdf507
GA
2865 if (length < 0) {
2866 length += AvFILLp(ary) - offset + 1;
2867 if (length < 0)
2868 length = 0;
2869 }
79072805
LW
2870 }
2871 else
a0d0e21e 2872 length = AvMAX(ary) + 1; /* close enough to infinity */
79072805 2873 }
a0d0e21e
LW
2874 else {
2875 offset = 0;
2876 length = AvMAX(ary) + 1;
2877 }
93965878
NIS
2878 if (offset > AvFILLp(ary) + 1)
2879 offset = AvFILLp(ary) + 1;
2880 after = AvFILLp(ary) + 1 - (offset + length);
a0d0e21e
LW
2881 if (after < 0) { /* not that much array */
2882 length += after; /* offset+length now in array */
2883 after = 0;
2884 if (!AvALLOC(ary))
2885 av_extend(ary, 0);
2886 }
2887
2888 /* At this point, MARK .. SP-1 is our new LIST */
2889
2890 newlen = SP - MARK;
2891 diff = newlen - length;
13d7cbc1
GS
2892 if (newlen && !AvREAL(ary) && AvREIFY(ary))
2893 av_reify(ary);
a0d0e21e
LW
2894
2895 if (diff < 0) { /* shrinking the area */
2896 if (newlen) {
2897 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2898 Copy(MARK, tmparyval, newlen, SV*);
79072805 2899 }
a0d0e21e
LW
2900
2901 MARK = ORIGMARK + 1;
2902 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2903 MEXTEND(MARK, length);
2904 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2905 if (AvREAL(ary)) {
bbce6d69 2906 EXTEND_MORTAL(length);
36477c24 2907 for (i = length, dst = MARK; i; i--) {
d689ffdd 2908 sv_2mortal(*dst); /* free them eventualy */
36477c24 2909 dst++;
2910 }
a0d0e21e
LW
2911 }
2912 MARK += length - 1;
79072805 2913 }
a0d0e21e
LW
2914 else {
2915 *MARK = AvARRAY(ary)[offset+length-1];
2916 if (AvREAL(ary)) {
d689ffdd 2917 sv_2mortal(*MARK);
a0d0e21e
LW
2918 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2919 SvREFCNT_dec(*dst++); /* free them now */
79072805 2920 }
a0d0e21e 2921 }
93965878 2922 AvFILLp(ary) += diff;
a0d0e21e
LW
2923
2924 /* pull up or down? */
2925
2926 if (offset < after) { /* easier to pull up */
2927 if (offset) { /* esp. if nothing to pull */
2928 src = &AvARRAY(ary)[offset-1];
2929 dst = src - diff; /* diff is negative */
2930 for (i = offset; i > 0; i--) /* can't trust Copy */
2931 *dst-- = *src--;
79072805 2932 }
a0d0e21e
LW
2933 dst = AvARRAY(ary);
2934 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
2935 AvMAX(ary) += diff;
2936 }
2937 else {
2938 if (after) { /* anything to pull down? */
2939 src = AvARRAY(ary) + offset + length;
2940 dst = src + diff; /* diff is negative */
2941 Move(src, dst, after, SV*);
79072805 2942 }
93965878 2943 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
a0d0e21e
LW
2944 /* avoid later double free */
2945 }
2946 i = -diff;
2947 while (i)
3280af22 2948 dst[--i] = &PL_sv_undef;
a0d0e21e
LW
2949
2950 if (newlen) {
2951 for (src = tmparyval, dst = AvARRAY(ary) + offset;
2952 newlen; newlen--) {
2953 *dst = NEWSV(46, 0);
2954 sv_setsv(*dst++, *src++);
79072805 2955 }
a0d0e21e
LW
2956 Safefree(tmparyval);
2957 }
2958 }
2959 else { /* no, expanding (or same) */
2960 if (length) {
2961 New(452, tmparyval, length, SV*); /* so remember deletion */
2962 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
2963 }
2964
2965 if (diff > 0) { /* expanding */
2966
2967 /* push up or down? */
2968
2969 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
2970 if (offset) {
2971 src = AvARRAY(ary);
2972 dst = src - diff;
2973 Move(src, dst, offset, SV*);
79072805 2974 }
a0d0e21e
LW
2975 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
2976 AvMAX(ary) += diff;
93965878 2977 AvFILLp(ary) += diff;
79072805
LW
2978 }
2979 else {
93965878
NIS
2980 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
2981 av_extend(ary, AvFILLp(ary) + diff);
2982 AvFILLp(ary) += diff;
a0d0e21e
LW
2983
2984 if (after) {
93965878 2985 dst = AvARRAY(ary) + AvFILLp(ary);
a0d0e21e
LW
2986 src = dst - diff;
2987 for (i = after; i; i--) {
2988 *dst-- = *src--;
2989 }
79072805
LW
2990 }
2991 }
a0d0e21e
LW
2992 }
2993
2994 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
2995 *dst = NEWSV(46, 0);
2996 sv_setsv(*dst++, *src++);
2997 }
2998 MARK = ORIGMARK + 1;
2999 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3000 if (length) {
3001 Copy(tmparyval, MARK, length, SV*);
3002 if (AvREAL(ary)) {
bbce6d69 3003 EXTEND_MORTAL(length);
36477c24 3004 for (i = length, dst = MARK; i; i--) {
d689ffdd 3005 sv_2mortal(*dst); /* free them eventualy */
36477c24 3006 dst++;
3007 }
79072805 3008 }
a0d0e21e 3009 Safefree(tmparyval);
79072805 3010 }
a0d0e21e
LW
3011 MARK += length - 1;
3012 }
3013 else if (length--) {
3014 *MARK = tmparyval[length];
3015 if (AvREAL(ary)) {
d689ffdd 3016 sv_2mortal(*MARK);
a0d0e21e
LW
3017 while (length-- > 0)
3018 SvREFCNT_dec(tmparyval[length]);
79072805 3019 }
a0d0e21e 3020 Safefree(tmparyval);
79072805 3021 }
a0d0e21e 3022 else
3280af22 3023 *MARK = &PL_sv_undef;
79072805 3024 }
a0d0e21e 3025 SP = MARK;
79072805
LW
3026 RETURN;
3027}
3028
a0d0e21e 3029PP(pp_push)
79072805 3030{
4e35701f 3031 djSP; dMARK; dORIGMARK; dTARGET;
a0d0e21e 3032 register AV *ary = (AV*)*++MARK;
3280af22 3033 register SV *sv = &PL_sv_undef;
93965878 3034 MAGIC *mg;
79072805 3035
33c27489
GS
3036 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3037 *MARK-- = SvTIED_obj((SV*)ary, mg);
93965878
NIS
3038 PUSHMARK(MARK);
3039 PUTBACK;
a60c0954 3040 ENTER;
864dbfa3 3041 call_method("PUSH",G_SCALAR|G_DISCARD);
a60c0954 3042 LEAVE;
93965878 3043 SPAGAIN;
93965878 3044 }
a60c0954
NIS
3045 else {
3046 /* Why no pre-extend of ary here ? */
3047 for (++MARK; MARK <= SP; MARK++) {
3048 sv = NEWSV(51, 0);
3049 if (*MARK)
3050 sv_setsv(sv, *MARK);
3051 av_push(ary, sv);
3052 }
79072805
LW
3053 }
3054 SP = ORIGMARK;
a0d0e21e 3055 PUSHi( AvFILL(ary) + 1 );
79072805
LW
3056 RETURN;
3057}
3058
a0d0e21e 3059PP(pp_pop)
79072805 3060{
4e35701f 3061 djSP;
a0d0e21e
LW
3062 AV *av = (AV*)POPs;
3063 SV *sv = av_pop(av);
d689ffdd 3064 if (AvREAL(av))
a0d0e21e
LW
3065 (void)sv_2mortal(sv);
3066 PUSHs(sv);
79072805 3067 RETURN;
79072805
LW
3068}
3069
a0d0e21e 3070PP(pp_shift)
79072805 3071{
4e35701f 3072 djSP;
a0d0e21e
LW
3073 AV *av = (AV*)POPs;
3074 SV *sv = av_shift(av);
79072805 3075 EXTEND(SP, 1);
a0d0e21e 3076 if (!sv)
79072805 3077 RETPUSHUNDEF;
d689ffdd 3078 if (AvREAL(av))
a0d0e21e
LW
3079 (void)sv_2mortal(sv);
3080 PUSHs(sv);
79072805 3081 RETURN;
79072805
LW
3082}
3083
a0d0e21e 3084PP(pp_unshift)
79072805 3085{
4e35701f 3086 djSP; dMARK; dORIGMARK; dTARGET;
a0d0e21e
LW
3087 register AV *ary = (AV*)*++MARK;
3088 register SV *sv;
3089 register I32 i = 0;
93965878
NIS
3090 MAGIC *mg;
3091
33c27489
GS
3092 if (mg = SvTIED_mg((SV*)ary, 'P')) {
3093 *MARK-- = SvTIED_obj((SV*)ary, mg);
7fd66d9d 3094 PUSHMARK(MARK);
93965878 3095 PUTBACK;
a60c0954 3096 ENTER;
864dbfa3 3097 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
a60c0954 3098 LEAVE;
93965878 3099 SPAGAIN;
93965878 3100 }
a60c0954
NIS
3101 else {
3102 av_unshift(ary, SP - MARK);
3103 while (MARK < SP) {
3104 sv = NEWSV(27, 0);
3105 sv_setsv(sv, *++MARK);
3106 (void)av_store(ary, i++, sv);
3107 }
79072805 3108 }
a0d0e21e
LW
3109 SP = ORIGMARK;
3110 PUSHi( AvFILL(ary) + 1 );
79072805 3111 RETURN;
79072805
LW
3112}
3113
a0d0e21e 3114PP(pp_reverse)
79072805 3115{
4e35701f 3116 djSP; dMARK;
a0d0e21e
LW
3117 register SV *tmp;
3118 SV **oldsp = SP;
79072805 3119
a0d0e21e
LW
3120 if (GIMME == G_ARRAY) {
3121 MARK++;
3122 while (MARK < SP) {
3123 tmp = *MARK;
3124 *MARK++ = *SP;
3125 *SP-- = tmp;
3126 }
3127 SP = oldsp;
79072805
LW
3128 }
3129 else {
a0d0e21e
LW
3130 register char *up;
3131 register char *down;
3132 register I32 tmp;
3133 dTARGET;
3134 STRLEN len;
79072805 3135
a0d0e21e 3136 if (SP - MARK > 1)
3280af22 3137 do_join(TARG, &PL_sv_no, MARK, SP);
a0d0e21e 3138 else
54b9620d 3139 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
a0d0e21e
LW
3140 up = SvPV_force(TARG, len);
3141 if (len > 1) {
a0ed51b3 3142 if (IN_UTF8) { /* first reverse each character */
dfe13c55
GS
3143 U8* s = (U8*)SvPVX(TARG);
3144 U8* send = (U8*)(s + len);
a0ed51b3
LW
3145 while (s < send) {
3146 if (*s < 0x80) {
3147 s++;
3148 continue;
3149 }
3150 else {
dfe13c55 3151 up = (char*)s;
a0ed51b3 3152 s += UTF8SKIP(s);
dfe13c55 3153 down = (char*)(s - 1);
f248d071
GS
3154 if (s > send || !((*down & 0xc0) == 0x80)) {
3155 if (ckWARN_d(WARN_UTF8))
3156 Perl_warner(aTHX_ WARN_UTF8,
3157 "Malformed UTF-8 character");
a0ed51b3
LW
3158 break;
3159 }
3160 while (down > up) {
3161 tmp = *up;
3162 *up++ = *down;
3163 *down-- = tmp;
3164 }
3165 }
3166 }
3167 up = SvPVX(TARG);
3168 }
a0d0e21e
LW
3169 down = SvPVX(TARG) + len - 1;
3170 while (down > up) {
3171 tmp = *up;
3172 *up++ = *down;
3173 *down-- = tmp;
3174 }
3175 (void)SvPOK_only(TARG);
79072805 3176 }
a0d0e21e
LW
3177 SP = MARK + 1;
3178 SETTARG;
79072805 3179 }
a0d0e21e 3180 RETURN;
79072805
LW
3181}
3182
864dbfa3 3183STATIC SV *
cea2e8a9 3184S_mul128(pTHX_ SV *sv, U8 m)
55497cff 3185{
3186 STRLEN len;
3187 char *s = SvPV(sv, len);
3188 char *t;
3189 U32 i = 0;
3190
3191 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
79cb57f6 3192 SV *tmpNew = newSVpvn("0000000000", 10);
55497cff 3193
09b7f37c 3194 sv_catsv(tmpNew, sv);
55497cff 3195 SvREFCNT_dec(sv); /* free old sv */
09b7f37c 3196 sv = tmpNew;
55497cff 3197 s = SvPV(sv, len);
3198 }
3199 t = s + len - 1;
3200 while (!*t) /* trailing '\0'? */
3201 t--;
3202 while (t > s) {
3203 i = ((*t - '0') << 7) + m;
3204 *(t--) = '0' + (i % 10);
3205 m = i / 10;
3206 }
3207 return (sv);
3208}
3209
a0d0e21e
LW
3210/* Explosives and implosives. */
3211
9d116dd7
JH
3212#if 'I' == 73 && 'J' == 74
3213/* On an ASCII/ISO kind of system */
ba1ac976 3214#define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
9d116dd7
JH
3215#else
3216/*
3217 Some other sort of character set - use memchr() so we don't match
3218 the null byte.
3219 */
80252599 3220#define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
9d116dd7
JH
3221#endif
3222
a0d0e21e 3223PP(pp_unpack)
79072805 3224{
4e35701f 3225 djSP;
a0d0e21e 3226 dPOPPOPssrl;
924508f0 3227 SV **oldsp = SP;
54310121 3228 I32 gimme = GIMME_V;
ed6116ce 3229 SV *sv;
a0d0e21e
LW
3230 STRLEN llen;
3231 STRLEN rlen;
3232 register char *pat = SvPV(left, llen);
3233 register char *s = SvPV(right, rlen);
3234 char *strend = s + rlen;
3235 char *strbeg = s;
3236 register char *patend = pat + llen;
3237 I32 datumtype;
3238 register I32 len;
3239 register I32 bits;
79072805 3240
a0d0e21e
LW
3241 /* These must not be in registers: */
3242 I16 ashort;
3243 int aint;
3244 I32 along;
ecfc5424
AD
3245#ifdef HAS_QUAD
3246 Quad_t aquad;
a0d0e21e
LW
3247#endif
3248 U16 aushort;
3249 unsigned int auint;
3250 U32 aulong;
ecfc5424 3251#ifdef HAS_QUAD
e862df63 3252 Uquad_t auquad;
a0d0e21e
LW
3253#endif
3254 char *aptr;
3255 float afloat;
3256 double adouble;
3257 I32 checksum = 0;
3258 register U32 culong;
65202027 3259 NV cdouble;
fb73857a 3260 int commas = 0;
726ea183 3261#ifdef PERL_NATINT_PACK
ef54e1a4
JH
3262 int natint; /* native integer */
3263 int unatint; /* unsigned native integer */
726ea183 3264#endif
79072805 3265
54310121 3266 if (gimme != G_ARRAY) { /* arrange to do first one only */
a0d0e21e
LW
3267 /*SUPPRESS 530*/
3268 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
5a929a98 3269 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
a0d0e21e
LW
3270 patend++;
3271 while (isDIGIT(*patend) || *patend == '*')
3272 patend++;
3273 }
3274 else
3275 patend++;
79072805 3276 }
a0d0e21e
LW
3277 while (pat < patend) {
3278 reparse:
bbdab043 3279 datumtype = *pat++ & 0xFF;
726ea183 3280#ifdef PERL_NATINT_PACK
ef54e1a4 3281 natint = 0;
726ea183 3282#endif
bbdab043
CS
3283 if (isSPACE(datumtype))
3284 continue;
f61d411c 3285 if (*pat == '!') {
ef54e1a4
JH
3286 char *natstr = "sSiIlL";
3287
3288 if (strchr(natstr, datumtype)) {
726ea183 3289#ifdef PERL_NATINT_PACK
ef54e1a4 3290 natint = 1;
726ea183 3291#endif
ef54e1a4
JH
3292 pat++;
3293 }
3294 else
cea2e8a9 3295 Perl_croak(aTHX_ "'!' allowed only after types %s", natstr);
ef54e1a4 3296 }
a0d0e21e
LW
3297 if (pat >= patend)
3298 len = 1;
3299 else if (*pat == '*') {
3300 len = strend - strbeg; /* long enough */
3301 pat++;
3302 }
3303 else if (isDIGIT(*pat)) {
3304 len = *pat++ - '0';
06387354 3305 while (isDIGIT(*pat)) {
a0d0e21e 3306 len = (len * 10) + (*pat++ - '0');
06387354
NT
3307 if (len < 0)
3308 Perl_croak(aTHX_ "Repeat count in unpack overflows");
3309 }
a0d0e21e
LW
3310 }
3311 else
3312 len = (datumtype != '@');
3313 switch(datumtype) {
3314 default:
cea2e8a9 3315 Perl_croak(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
fb73857a 3316 case ',': /* grandfather in commas but with a warning */
599cee73 3317 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
cea2e8a9 3318 Perl_warner(aTHX_ WARN_UNSAFE, "Invalid type in unpack: '%c'", (int)datumtype);
fb73857a 3319 break;
a0d0e21e
LW
3320 case '%':
3321 if (len == 1 && pat[-1] != '1')
3322 len = 16;
3323 checksum = len;
3324 culong = 0;
3325 cdouble = 0;
3326 if (pat < patend)
3327 goto reparse;
3328 break;
3329 case '@':
3330 if (len > strend - strbeg)
cea2e8a9 3331 DIE(aTHX_ "@ outside of string");
a0d0e21e
LW
3332 s = strbeg + len;
3333 break;
3334 case 'X':
3335 if (len > s - strbeg)
cea2e8a9 3336 DIE(aTHX_ "X outside of string");
a0d0e21e
LW
3337 s -= len;
3338 break;
3339 case 'x':
3340 if (len > strend - s)
cea2e8a9 3341 DIE(aTHX_ "x outside of string");
a0d0e21e
LW
3342 s += len;
3343 break;
43192e07
IP
3344 case '#':
3345 if (oldsp >= SP)
3346 DIE(aTHX_ "# must follow a numeric type");
3347 if (*pat != 'a' && *pat != 'A' && *pat != 'Z')
3348 DIE(aTHX_ "# must be followed by a, A or Z");
3349 datumtype = *pat++;
3350 if (*pat == '*')
3351 pat++; /* ignore '*' for compatibility with pack */
3352 if (isDIGIT(*pat))
3353 DIE(aTHX_ "# cannot take a count" );
3354 len = POPi;
3355 /* drop through */
a0d0e21e 3356 case 'A':
5a929a98 3357 case 'Z':
a0d0e21e
LW
3358 case 'a':
3359 if (len > strend - s)
3360 len = strend - s;
3361 if (checksum)
3362 goto uchar_checksum;
3363 sv = NEWSV(35, len);
3364 sv_setpvn(sv, s, len);
3365 s += len;
5a929a98 3366 if (datumtype == 'A' || datumtype == 'Z') {
a0d0e21e 3367 aptr = s; /* borrow register */
5a929a98
VU
3368 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
3369 s = SvPVX(sv);
3370 while (*s)
3371 s++;
3372 }
3373 else { /* 'A' strips both nulls and spaces */
3374 s = SvPVX(sv) + len - 1;
3375 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3376 s--;
3377 *++s = '\0';
3378 }
a0d0e21e
LW
3379 SvCUR_set(sv, s - SvPVX(sv));
3380 s = aptr; /* unborrow register */
3381 }
3382 XPUSHs(sv_2mortal(sv));
3383 break;
3384 case 'B':
3385 case 'b':
3386 if (pat[-1] == '*' || len > (strend - s) * 8)
3387 len = (strend - s) * 8;
3388 if (checksum) {
80252599
GS
3389 if (!PL_bitcount) {
3390 Newz(601, PL_bitcount, 256, char);
a0d0e21e 3391 for (bits = 1; bits < 256; bits++) {
80252599
GS
3392 if (bits & 1) PL_bitcount[bits]++;
3393 if (bits & 2) PL_bitcount[bits]++;
3394 if (bits & 4) PL_bitcount[bits]++;
3395 if (bits & 8) PL_bitcount[bits]++;
3396 if (bits & 16) PL_bitcount[bits]++;
3397 if (bits & 32) PL_bitcount[bits]++;
3398 if (bits & 64) PL_bitcount[bits]++;
3399 if (bits & 128) PL_bitcount[bits]++;
a0d0e21e
LW
3400 }
3401 }
3402 while (len >= 8) {
80252599 3403 culong += PL_bitcount[*(unsigned char*)s++];
a0d0e21e
LW
3404 len -= 8;
3405 }
3406 if (len) {
3407 bits = *s;
3408 if (datumtype == 'b') {
3409 while (len-- > 0) {
3410 if (bits & 1) culong++;
3411 bits >>= 1;
3412 }
3413 }
3414 else {
3415 while (len-- > 0) {
3416 if (bits & 128) culong++;
3417 bits <<= 1;
3418 }
3419 }
3420 }
79072805
LW
3421 break;
3422 }
a0d0e21e
LW
3423 sv = NEWSV(35, len + 1);
3424 SvCUR_set(sv, len);
3425 SvPOK_on(sv);
3426 aptr = pat; /* borrow register */
3427 pat = SvPVX(sv);
3428 if (datumtype == 'b') {
3429 aint = len;
3430 for (len = 0; len < aint; len++) {
3431 if (len & 7) /*SUPPRESS 595*/
3432 bits >>= 1;
3433 else
3434 bits = *s++;
3435 *pat++ = '0' + (bits & 1);
3436 }
3437 }
3438 else {
3439 aint = len;
3440 for (len = 0; len < aint; len++) {
3441 if (len & 7)
3442 bits <<= 1;
3443 else
3444 bits = *s++;
3445 *pat++ = '0' + ((bits & 128) != 0);
3446 }
3447 }
3448 *pat = '\0';
3449 pat = aptr; /* unborrow register */
3450 XPUSHs(sv_2mortal(sv));
3451 break;
3452 case 'H':
3453 case 'h':
3454 if (pat[-1] == '*' || len > (strend - s) * 2)
3455 len = (strend - s) * 2;
3456 sv = NEWSV(35, len + 1);
3457 SvCUR_set(sv, len);
3458 SvPOK_on(sv);
3459 aptr = pat; /* borrow register */
3460 pat = SvPVX(sv);
3461 if (datumtype == 'h') {
3462 aint = len;
3463 for (len = 0; len < aint; len++) {
3464 if (len & 1)
3465 bits >>= 4;
3466 else
3467 bits = *s++;
3280af22 3468 *pat++ = PL_hexdigit[bits & 15];
a0d0e21e
LW
3469 }
3470 }
3471 else {
3472 aint = len;
3473 for (len = 0; len < aint; len++) {
3474 if (len & 1)
3475 bits <<= 4;
3476 else
3477 bits = *s++;
3280af22 3478 *pat++ = PL_hexdigit[(bits >> 4) & 15];
a0d0e21e
LW
3479 }
3480 }
3481 *pat = '\0';
3482 pat = aptr; /* unborrow register */
3483 XPUSHs(sv_2mortal(sv));
3484 break;
3485 case 'c':
3486 if (len > strend - s)
3487 len = strend - s;
3488 if (checksum) {
3489 while (len-- > 0) {
3490 aint = *s++;
3491 if (aint >= 128) /* fake up signed chars */
3492 aint -= 256;
3493 culong += aint;
3494 }
3495 }
3496 else {
3497 EXTEND(SP, len);
bbce6d69 3498 EXTEND_MORTAL(len);
a0d0e21e
LW
3499 while (len-- > 0) {
3500 aint = *s++;
3501 if (aint >= 128) /* fake up signed chars */
3502 aint -= 256;
3503 sv = NEWSV(36, 0);
1e422769 3504 sv_setiv(sv, (IV)aint);
a0d0e21e
LW
3505 PUSHs(sv_2mortal(sv));
3506 }
3507 }
3508 break;
3509 case 'C':
3510 if (len > strend - s)
3511 len = strend - s;
3512 if (checksum) {
3513 uchar_checksum:
3514 while (len-- > 0) {
3515 auint = *s++ & 255;
3516 culong += auint;
3517 }
3518 }
3519 else {
3520 EXTEND(SP, len);
bbce6d69 3521 EXTEND_MORTAL(len);
a0d0e21e
LW
3522 while (len-- > 0) {
3523 auint = *s++ & 255;
3524 sv = NEWSV(37, 0);
1e422769 3525 sv_setiv(sv, (IV)auint);
a0d0e21e
LW
3526 PUSHs(sv_2mortal(sv));
3527 }
3528 }
3529 break;
a0ed51b3
LW
3530 case 'U':
3531 if (len > strend - s)
3532 len = strend - s;
3533 if (checksum) {
3534 while (len-- > 0 && s < strend) {
dfe13c55 3535 auint = utf8_to_uv((U8*)s, &along);
a0ed51b3 3536 s += along;
32d8b6e5 3537 if (checksum > 32)
65202027 3538 cdouble += (NV)auint;
32d8b6e5
GA
3539 else
3540 culong += auint;
a0ed51b3
LW
3541 }
3542 }
3543 else {
3544 EXTEND(SP, len);
3545 EXTEND_MORTAL(len);
3546 while (len-- > 0 && s < strend) {
dfe13c55 3547 auint = utf8_to_uv((U8*)s, &along);
a0ed51b3
LW
3548 s += along;
3549 sv = NEWSV(37, 0);
bdeef251 3550 sv_setuv(sv, (UV)auint);
a0ed51b3
LW
3551 PUSHs(sv_2mortal(sv));
3552 }
3553 }
3554 break;
a0d0e21e 3555 case 's':
726ea183
JH
3556#if SHORTSIZE == SIZE16
3557 along = (strend - s) / SIZE16;
3558#else
ef54e1a4 3559 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
726ea183 3560#endif
a0d0e21e
LW
3561 if (len > along)
3562 len = along;
3563 if (checksum) {
726ea183 3564#if SHORTSIZE != SIZE16
ef54e1a4 3565 if (natint) {
bf9315bb 3566 short ashort;
ef54e1a4
JH
3567 while (len-- > 0) {
3568 COPYNN(s, &ashort, sizeof(short));
3569 s += sizeof(short);
3570 culong += ashort;
3571
3572 }
3573 }
726ea183
JH
3574 else
3575#endif
3576 {
ef54e1a4
JH
3577 while (len-- > 0) {
3578 COPY16(s, &ashort);
c67712b2
JH
3579#if SHORTSIZE > SIZE16
3580 if (ashort > 32767)
3581 ashort -= 65536;
3582#endif
ef54e1a4
JH
3583 s += SIZE16;
3584 culong += ashort;
3585 }
a0d0e21e
LW
3586 }
3587 }
3588 else {
3589 EXTEND(SP, len);
bbce6d69 3590 EXTEND_MORTAL(len);
726ea183 3591#if SHORTSIZE != SIZE16
ef54e1a4 3592 if (natint) {
bf9315bb 3593 short ashort;
ef54e1a4
JH
3594 while (len-- > 0) {
3595 COPYNN(s, &ashort, sizeof(short));
3596 s += sizeof(short);
3597 sv = NEWSV(38, 0);
3598 sv_setiv(sv, (IV)ashort);
3599 PUSHs(sv_2mortal(sv));
3600 }
3601 }
726ea183
JH
3602 else
3603#endif
3604 {
ef54e1a4
JH
3605 while (len-- > 0) {
3606 COPY16(s, &ashort);
c67712b2
JH
3607#if SHORTSIZE > SIZE16
3608 if (ashort > 32767)
3609 ashort -= 65536;
3610#endif
ef54e1a4
JH
3611 s += SIZE16;
3612 sv = NEWSV(38, 0);
3613 sv_setiv(sv, (IV)ashort);
3614 PUSHs(sv_2mortal(sv));
3615 }
a0d0e21e
LW
3616 }
3617 }
3618 break;
3619 case 'v':
3620 case 'n':
3621 case 'S':
726ea183
JH
3622#if SHORTSIZE == SIZE16
3623 along = (strend - s) / SIZE16;
3624#else
ef54e1a4
JH
3625 unatint = natint && datumtype == 'S';
3626 along = (strend - s) / (unatint ? sizeof(unsigned short) : SIZE16);
726ea183 3627#endif
a0d0e21e
LW
3628 if (len > along)
3629 len = along;
3630 if (checksum) {
726ea183 3631#if SHORTSIZE != SIZE16
ef54e1a4 3632 if (unatint) {
bf9315bb 3633 unsigned short aushort;
ef54e1a4
JH
3634 while (len-- > 0) {
3635 COPYNN(s, &aushort, sizeof(unsigned short));
3636 s += sizeof(unsigned short);
3637 culong += aushort;
3638 }
3639 }
726ea183
JH
3640 else
3641#endif
3642 {
ef54e1a4
JH
3643 while (len-- > 0) {
3644 COPY16(s, &aushort);
3645 s += SIZE16;
a0d0e21e 3646#ifdef HAS_NTOHS
ef54e1a4
JH
3647 if (datumtype == 'n')
3648 aushort = PerlSock_ntohs(aushort);
79072805 3649#endif
a0d0e21e 3650#ifdef HAS_VTOHS
ef54e1a4
JH
3651 if (datumtype == 'v')
3652 aushort = vtohs(aushort);
79072805 3653#endif
ef54e1a4
JH
3654 culong += aushort;
3655 }
a0d0e21e
LW
3656 }
3657 }
3658 else {
3659 EXTEND(SP, len);
bbce6d69 3660 EXTEND_MORTAL(len);
726ea183 3661#if SHORTSIZE != SIZE16
ef54e1a4 3662 if (unatint) {
bf9315bb 3663 unsigned short aushort;
ef54e1a4
JH
3664 while (len-- > 0) {
3665 COPYNN(s, &aushort, sizeof(unsigned short));
3666 s += sizeof(unsigned short);
3667 sv = NEWSV(39, 0);
726ea183 3668 sv_setiv(sv, (UV)aushort);
ef54e1a4
JH
3669 PUSHs(sv_2mortal(sv));
3670 }
3671 }
726ea183
JH
3672 else
3673#endif
3674 {
ef54e1a4
JH
3675 while (len-- > 0) {
3676 COPY16(s, &aushort);
3677 s += SIZE16;
3678 sv = NEWSV(39, 0);
a0d0e21e 3679#ifdef HAS_NTOHS
ef54e1a4
JH
3680 if (datumtype == 'n')
3681 aushort = PerlSock_ntohs(aushort);
79072805 3682#endif
a0d0e21e 3683#ifdef HAS_VTOHS
ef54e1a4
JH
3684 if (datumtype == 'v')
3685 aushort = vtohs(aushort);
79072805 3686#endif
726ea183 3687 sv_setiv(sv, (UV)aushort);
ef54e1a4
JH
3688 PUSHs(sv_2mortal(sv));
3689 }
a0d0e21e
LW
3690 }
3691 }
3692 break;
3693 case 'i':
3694 along = (strend - s) / sizeof(int);
3695 if (len > along)
3696 len = along;
3697 if (checksum) {
3698 while (len-- > 0) {
3699 Copy(s, &aint, 1, int);
3700 s += sizeof(int);
3701 if (checksum > 32)
65202027 3702 cdouble += (NV)aint;
a0d0e21e
LW
3703 else
3704 culong += aint;
3705 }
3706 }
3707 else {
3708 EXTEND(SP, len);
bbce6d69 3709 EXTEND_MORTAL(len);
a0d0e21e
LW
3710 while (len-- > 0) {
3711 Copy(s, &aint, 1, int);
3712 s += sizeof(int);
3713 sv = NEWSV(40, 0);
20408e3c
GS
3714#ifdef __osf__
3715 /* Without the dummy below unpack("i", pack("i",-1))
3716 * return 0xFFffFFff instead of -1 for Digital Unix V4.0
13476c87
JH
3717 * cc with optimization turned on.
3718 *
3719 * The bug was detected in
3720 * DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091) (V4.0E)
3721 * with optimization (-O4) turned on.
3722 * DEC C V5.2-040 on Digital UNIX V4.0 (Rev. 564) (V4.0B)
3723 * does not have this problem even with -O4.
3724 *
3725 * This bug was reported as DECC_BUGS 1431
3726 * and tracked internally as GEM_BUGS 7775.
3727 *
3728 * The bug is fixed in
3729 * Tru64 UNIX V5.0: Compaq C V6.1-006 or later
3730 * UNIX V4.0F support: DEC C V5.9-006 or later
3731 * UNIX V4.0E support: DEC C V5.8-011 or later
3732 * and also in DTK.
3733 *
3734 * See also few lines later for the same bug.
3735 */
20408e3c
GS
3736 (aint) ?
3737 sv_setiv(sv, (IV)aint) :
3738#endif
1e422769 3739 sv_setiv(sv, (IV)aint);
a0d0e21e
LW
3740 PUSHs(sv_2mortal(sv));
3741 }
3742 }
3743 break;
3744 case 'I':
3745 along = (strend - s) / sizeof(unsigned int);
3746 if (len > along)
3747 len = along;
3748 if (checksum) {
3749 while (len-- > 0) {
3750 Copy(s, &auint, 1, unsigned int);
3751 s += sizeof(unsigned int);
3752 if (checksum > 32)
65202027 3753 cdouble += (NV)auint;
a0d0e21e
LW
3754 else
3755 culong += auint;
3756 }
3757 }
3758 else {
3759 EXTEND(SP, len);
bbce6d69 3760 EXTEND_MORTAL(len);
a0d0e21e
LW
3761 while (len-- > 0) {
3762 Copy(s, &auint, 1, unsigned int);
3763 s += sizeof(unsigned int);
3764 sv = NEWSV(41, 0);
9d645a59
AB
3765#ifdef __osf__
3766 /* Without the dummy below unpack("I", pack("I",0xFFFFFFFF))
13476c87
JH
3767 * returns 1.84467440737096e+19 instead of 0xFFFFFFFF.
3768 * See details few lines earlier. */
9d645a59
AB
3769 (auint) ?
3770 sv_setuv(sv, (UV)auint) :
3771#endif
1e422769 3772 sv_setuv(sv, (UV)auint);
a0d0e21e
LW
3773 PUSHs(sv_2mortal(sv));
3774 }
3775 }
3776 break;
3777 case 'l':
726ea183
JH
3778#if LONGSIZE == SIZE32
3779 along = (strend - s) / SIZE32;
3780#else
ef54e1a4 3781 along = (strend - s) / (natint ? sizeof(long) : SIZE32);
726ea183 3782#endif
a0d0e21e
LW
3783 if (len > along)
3784 len = along;
3785 if (checksum) {
726ea183 3786#if LONGSIZE != SIZE32
ef54e1a4 3787 if (natint) {
bf9315bb 3788 long along;
ef54e1a4
JH
3789 while (len-- > 0) {
3790 COPYNN(s, &along, sizeof(long));
3791 s += sizeof(long);
3792 if (checksum > 32)
65202027 3793 cdouble += (NV)along;
ef54e1a4
JH
3794 else
3795 culong += along;
3796 }
3797 }
726ea183
JH
3798 else
3799#endif
3800 {
ef54e1a4
JH
3801 while (len-- > 0) {
3802 COPY32(s, &along);
c67712b2
JH
3803#if LONGSIZE > SIZE32
3804 if (along > 2147483647)
3805 along -= 4294967296;
3806#endif
ef54e1a4
JH
3807 s += SIZE32;
3808 if (checksum > 32)
65202027 3809 cdouble += (NV)along;
ef54e1a4
JH
3810 else
3811 culong += along;
3812 }
a0d0e21e
LW
3813 }
3814 }
3815 else {
3816 EXTEND(SP, len);
bbce6d69 3817 EXTEND_MORTAL(len);
726ea183 3818#if LONGSIZE != SIZE32
ef54e1a4 3819 if (natint) {
bf9315bb 3820 long along;
ef54e1a4
JH
3821 while (len-- > 0) {
3822 COPYNN(s, &along, sizeof(long));
3823 s += sizeof(long);
3824 sv = NEWSV(42, 0);
3825 sv_setiv(sv, (IV)along);
3826 PUSHs(sv_2mortal(sv));
3827 }
3828 }
726ea183
JH
3829 else
3830#endif
3831 {
ef54e1a4
JH
3832 while (len-- > 0) {
3833 COPY32(s, &along);
c67712b2
JH
3834#if LONGSIZE > SIZE32
3835 if (along > 2147483647)
3836 along -= 4294967296;
3837#endif
ef54e1a4
JH
3838 s += SIZE32;
3839 sv = NEWSV(42, 0);
3840 sv_setiv(sv, (IV)along);
3841 PUSHs(sv_2mortal(sv));
3842 }
a0d0e21e 3843 }
79072805 3844 }
a0d0e21e
LW
3845 break;
3846 case 'V':
3847 case 'N':
3848 case 'L':
726ea183
JH
3849#if LONGSIZE == SIZE32
3850 along = (strend - s) / SIZE32;
3851#else
3852 unatint = natint && datumtype == 'L';
ef54e1a4 3853 along = (strend - s) / (unatint ? sizeof(unsigned long) : SIZE32);
726ea183 3854#endif
a0d0e21e
LW
3855 if (len > along)
3856 len = along;
3857 if (checksum) {
726ea183 3858#if LONGSIZE != SIZE32
ef54e1a4 3859 if (unatint) {
bf9315bb 3860 unsigned long aulong;
ef54e1a4
JH
3861 while (len-- > 0) {
3862 COPYNN(s, &aulong, sizeof(unsigned long));
3863 s += sizeof(unsigned long);
3864 if (checksum > 32)
65202027 3865 cdouble += (NV)aulong;
ef54e1a4
JH
3866 else
3867 culong += aulong;
3868 }
3869 }
726ea183
JH
3870 else
3871#endif
3872 {
ef54e1a4
JH
3873 while (len-- > 0) {
3874 COPY32(s, &aulong);
3875 s += SIZE32;
a0d0e21e 3876#ifdef HAS_NTOHL
ef54e1a4
JH
3877 if (datumtype == 'N')
3878 aulong = PerlSock_ntohl(aulong);
79072805 3879#endif
a0d0e21e 3880#ifdef HAS_VTOHL
ef54e1a4
JH
3881 if (datumtype == 'V')
3882 aulong = vtohl(aulong);
79072805 3883#endif
ef54e1a4 3884 if (checksum > 32)
65202027 3885 cdouble += (NV)aulong;
ef54e1a4
JH
3886 else
3887 culong += aulong;
3888 }
a0d0e21e
LW
3889 }
3890 }
3891 else {
3892 EXTEND(SP, len);
bbce6d69 3893 EXTEND_MORTAL(len);
726ea183 3894#if LONGSIZE != SIZE32
ef54e1a4 3895 if (unatint) {
bf9315bb 3896 unsigned long aulong;
ef54e1a4
JH
3897 while (len-- > 0) {
3898 COPYNN(s, &aulong, sizeof(unsigned long));
3899 s += sizeof(unsigned long);
3900 sv = NEWSV(43, 0);
3901 sv_setuv(sv, (UV)aulong);
3902 PUSHs(sv_2mortal(sv));
3903 }
3904 }
726ea183
JH
3905 else
3906#endif
3907 {
ef54e1a4
JH
3908 while (len-- > 0) {
3909 COPY32(s, &aulong);
3910 s += SIZE32;
a0d0e21e 3911#ifdef HAS_NTOHL
ef54e1a4
JH
3912 if (datumtype == 'N')
3913 aulong = PerlSock_ntohl(aulong);
79072805 3914#endif
a0d0e21e 3915#ifdef HAS_VTOHL
ef54e1a4
JH
3916 if (datumtype == 'V')
3917 aulong = vtohl(aulong);
79072805 3918#endif
ef54e1a4
JH
3919 sv = NEWSV(43, 0);
3920 sv_setuv(sv, (UV)aulong);
3921 PUSHs(sv_2mortal(sv));
3922 }
a0d0e21e
LW
3923 }
3924 }
3925 break;
3926 case 'p':
3927 along = (strend - s) / sizeof(char*);
3928 if (len > along)
3929 len = along;
3930 EXTEND(SP, len);
bbce6d69 3931 EXTEND_MORTAL(len);
a0d0e21e
LW
3932 while (len-- > 0) {
3933 if (sizeof(char*) > strend - s)
3934 break;
3935 else {
3936 Copy(s, &aptr, 1, char*);
3937 s += sizeof(char*);
3938 }
3939 sv = NEWSV(44, 0);
3940 if (aptr)
3941 sv_setpv(sv, aptr);
3942 PUSHs(sv_2mortal(sv));
3943 }
3944 break;
def98dd4 3945 case 'w':
def98dd4 3946 EXTEND(SP, len);
bbce6d69 3947 EXTEND_MORTAL(len);
8ec5e241 3948 {
bbce6d69 3949 UV auv = 0;
3950 U32 bytes = 0;
3951
3952 while ((len > 0) && (s < strend)) {
3953 auv = (auv << 7) | (*s & 0x7f);
3954 if (!(*s++ & 0x80)) {
3955 bytes = 0;
3956 sv = NEWSV(40, 0);
3957 sv_setuv(sv, auv);
3958 PUSHs(sv_2mortal(sv));
3959 len--;
3960 auv = 0;
3961 }
3962 else if (++bytes >= sizeof(UV)) { /* promote to string */
bbce6d69 3963 char *t;
2d8e6c8d 3964 STRLEN n_a;
bbce6d69 3965
cea2e8a9 3966 sv = Perl_newSVpvf(aTHX_ "%.*Vu", (int)TYPE_DIGITS(UV), auv);
bbce6d69 3967 while (s < strend) {
3968 sv = mul128(sv, *s & 0x7f);
3969 if (!(*s++ & 0x80)) {
3970 bytes = 0;
3971 break;
3972 }
3973 }
2d8e6c8d 3974 t = SvPV(sv, n_a);
bbce6d69 3975 while (*t == '0')
3976 t++;
3977 sv_chop(sv, t);
3978 PUSHs(sv_2mortal(sv));
3979 len--;
3980 auv = 0;
3981 }
3982 }
3983 if ((s >= strend) && bytes)
cea2e8a9 3984 Perl_croak(aTHX_ "Unterminated compressed integer");
bbce6d69 3985 }
def98dd4 3986 break;
a0d0e21e
LW
3987 case 'P':
3988 EXTEND(SP, 1);
3989 if (sizeof(char*) > strend - s)
3990 break;
3991 else {
3992 Copy(s, &aptr, 1, char*);
3993 s += sizeof(char*);
3994 }
3995 sv = NEWSV(44, 0);
3996 if (aptr)
3997 sv_setpvn(sv, aptr, len);
3998 PUSHs(sv_2mortal(sv));
3999 break;
ecfc5424 4000#ifdef HAS_QUAD
a0d0e21e 4001 case 'q':
d4217c7e
JH
4002 along = (strend - s) / sizeof(Quad_t);
4003 if (len > along)
4004 len = along;
a0d0e21e 4005 EXTEND(SP, len);
bbce6d69 4006 EXTEND_MORTAL(len);
a0d0e21e 4007 while (len-- > 0) {
ecfc5424 4008 if (s + sizeof(Quad_t) > strend)
a0d0e21e
LW
4009 aquad = 0;
4010 else {
ecfc5424
AD
4011 Copy(s, &aquad, 1, Quad_t);
4012 s += sizeof(Quad_t);
a0d0e21e
LW
4013 }
4014 sv = NEWSV(42, 0);
96e4d5b1 4015 if (aquad >= IV_MIN && aquad <= IV_MAX)
4016 sv_setiv(sv, (IV)aquad);
4017 else
65202027 4018 sv_setnv(sv, (NV)aquad);
a0d0e21e
LW
4019 PUSHs(sv_2mortal(sv));
4020 }
4021 break;
4022 case 'Q':
d4217c7e
JH
4023 along = (strend - s) / sizeof(Quad_t);
4024 if (len > along)
4025 len = along;
a0d0e21e 4026 EXTEND(SP, len);
bbce6d69 4027 EXTEND_MORTAL(len);
a0d0e21e 4028 while (len-- > 0) {
e862df63 4029 if (s + sizeof(Uquad_t) > strend)
a0d0e21e
LW
4030 auquad = 0;
4031 else {
e862df63
HB
4032 Copy(s, &auquad, 1, Uquad_t);
4033 s += sizeof(Uquad_t);
a0d0e21e
LW
4034 }
4035 sv = NEWSV(43, 0);
27612d38 4036 if (auquad <= UV_MAX)
96e4d5b1 4037 sv_setuv(sv, (UV)auquad);
4038 else
65202027 4039 sv_setnv(sv, (NV)auquad);
a0d0e21e
LW
4040 PUSHs(sv_2mortal(sv));
4041 }
4042 break;
79072805 4043#endif
a0d0e21e
LW
4044 /* float and double added gnb@melba.bby.oz.au 22/11/89 */
4045 case 'f':
4046 case 'F':
4047 along = (strend - s) / sizeof(float);
4048 if (len > along)
4049 len = along;
4050 if (checksum) {
4051 while (len-- > 0) {
4052 Copy(s, &afloat, 1, float);
4053 s += sizeof(float);
4054 cdouble += afloat;
4055 }
4056 }
4057 else {
4058 EXTEND(SP, len);
bbce6d69 4059 EXTEND_MORTAL(len);
a0d0e21e
LW
4060 while (len-- > 0) {
4061 Copy(s, &afloat, 1, float);
4062 s += sizeof(float);
4063 sv = NEWSV(47, 0);
65202027 4064 sv_setnv(sv, (NV)afloat);
a0d0e21e
LW
4065 PUSHs(sv_2mortal(sv));
4066 }
4067 }
4068 break;
4069 case 'd':
4070 case 'D':
4071 along = (strend - s) / sizeof(double);
4072 if (len > along)
4073 len = along;
4074 if (checksum) {
4075 while (len-- > 0) {
4076 Copy(s, &adouble, 1, double);
4077 s += sizeof(double);
4078 cdouble += adouble;
4079 }
4080 }
4081 else {
4082 EXTEND(SP, len);
bbce6d69 4083 EXTEND_MORTAL(len);
a0d0e21e
LW
4084 while (len-- > 0) {
4085 Copy(s, &adouble, 1, double);
4086 s += sizeof(double);
4087 sv = NEWSV(48, 0);
65202027 4088 sv_setnv(sv, (NV)adouble);
a0d0e21e
LW
4089 PUSHs(sv_2mortal(sv));
4090 }
4091 }
4092 break;
4093 case 'u':
9d116dd7
JH
4094 /* MKS:
4095 * Initialise the decode mapping. By using a table driven
4096 * algorithm, the code will be character-set independent
4097 * (and just as fast as doing character arithmetic)
4098 */
80252599 4099 if (PL_uudmap['M'] == 0) {
9d116dd7
JH
4100 int i;
4101
80252599
GS
4102 for (i = 0; i < sizeof(PL_uuemap); i += 1)
4103 PL_uudmap[PL_uuemap[i]] = i;
9d116dd7
JH
4104 /*
4105 * Because ' ' and '`' map to the same value,
4106 * we need to decode them both the same.
4107 */
80252599 4108 PL_uudmap[' '] = 0;
9d116dd7
JH
4109 }
4110
a0d0e21e
LW
4111 along = (strend - s) * 3 / 4;
4112 sv = NEWSV(42, along);
f12c7020 4113 if (along)
4114 SvPOK_on(sv);
9d116dd7 4115 while (s < strend && *s > ' ' && ISUUCHAR(*s)) {
a0d0e21e
LW
4116 I32 a, b, c, d;
4117 char hunk[4];
79072805 4118
a0d0e21e 4119 hunk[3] = '\0';
80252599 4120 len = PL_uudmap[*s++] & 077;
a0d0e21e 4121 while (len > 0) {
9d116dd7 4122 if (s < strend && ISUUCHAR(*s))
80252599 4123 a = PL_uudmap[*s++] & 077;
9d116dd7
JH
4124 else
4125 a = 0;
4126 if (s < strend && ISUUCHAR(*s))
80252599 4127 b = PL_uudmap[*s++] & 077;
9d116dd7
JH
4128 else
4129 b = 0;
4130 if (s < strend && ISUUCHAR(*s))
80252599 4131 c = PL_uudmap[*s++] & 077;
9d116dd7
JH
4132 else
4133 c = 0;
4134 if (s < strend && ISUUCHAR(*s))
80252599 4135 d = PL_uudmap[*s++] & 077;
a0d0e21e
LW
4136 else
4137 d = 0;
4e35701f
NIS
4138 hunk[0] = (a << 2) | (b >> 4);
4139 hunk[1] = (b << 4) | (c >> 2);
4140 hunk[2] = (c << 6) | d;
4141 sv_catpvn(sv, hunk, (len > 3) ? 3 : len);
a0d0e21e
LW
4142 len -= 3;
4143 }
4144 if (*s == '\n')
4145 s++;
4146 else if (s[1] == '\n') /* possible checksum byte */
4147 s += 2;
79072805 4148 }
a0d0e21e
LW
4149 XPUSHs(sv_2mortal(sv));
4150 break;
79072805 4151 }
a0d0e21e
LW
4152 if (checksum) {
4153 sv = NEWSV(42, 0);
4154 if (strchr("fFdD", datumtype) ||
32d8b6e5 4155 (checksum > 32 && strchr("iIlLNU", datumtype)) ) {
65202027 4156 NV trouble;
79072805 4157
a0d0e21e
LW
4158 adouble = 1.0;
4159 while (checksum >= 16) {
4160 checksum -= 16;
4161 adouble *= 65536.0;
4162 }
4163 while (checksum >= 4) {
4164 checksum -= 4;
4165 adouble *= 16.0;
4166 }
4167 while (checksum--)
4168 adouble *= 2.0;
4169 along = (1 << checksum) - 1;
4170 while (cdouble < 0.0)
4171 cdouble += adouble;
65202027 4172 cdouble = Perl_modf(cdouble / adouble, &trouble) * adouble;
a0d0e21e
LW
4173 sv_setnv(sv, cdouble);
4174 }
4175 else {
4176 if (checksum < 32) {
96e4d5b1 4177 aulong = (1 << checksum) - 1;
4178 culong &= aulong;
a0d0e21e 4179 }
96e4d5b1 4180 sv_setuv(sv, (UV)culong);
a0d0e21e
LW
4181 }
4182 XPUSHs(sv_2mortal(sv));
4183 checksum = 0;
79072805 4184 }
79072805 4185 }
924508f0 4186 if (SP == oldsp && gimme == G_SCALAR)
3280af22 4187 PUSHs(&PL_sv_undef);
79072805 4188 RETURN;
79072805
LW
4189}
4190
76e3520e 4191STATIC void
cea2e8a9 4192S_doencodes(pTHX_ register SV *sv, register char *s, register I32 len)
79072805 4193{
a0d0e21e 4194 char hunk[5];
79072805 4195
80252599 4196 *hunk = PL_uuemap[len];
a0d0e21e
LW
4197 sv_catpvn(sv, hunk, 1);
4198 hunk[4] = '\0';
f264d472 4199 while (len > 2) {
80252599
GS
4200 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4201 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017)))];
4202 hunk[2] = PL_uuemap[(077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03)))];
4203 hunk[3] = PL_uuemap[(077 & (s[2] & 077))];
a0d0e21e
LW
4204 sv_catpvn(sv, hunk, 4);
4205 s += 3;
4206 len -= 3;
4207 }
f264d472
GS
4208 if (len > 0) {
4209 char r = (len > 1 ? s[1] : '\0');
80252599
GS
4210 hunk[0] = PL_uuemap[(077 & (*s >> 2))];
4211 hunk[1] = PL_uuemap[(077 & (((*s << 4) & 060) | ((r >> 4) & 017)))];
4212 hunk[2] = PL_uuemap[(077 & ((r << 2) & 074))];
4213 hunk[3] = PL_uuemap[0];
f264d472 4214 sv_catpvn(sv, hunk, 4);
a0d0e21e
LW
4215 }
4216 sv_catpvn(sv, "\n", 1);
79072805
LW
4217}
4218
79cb57f6 4219STATIC SV *
cea2e8a9 4220S_is_an_int(pTHX_ char *s, STRLEN l)
55497cff 4221{
2d8e6c8d 4222 STRLEN n_a;
79cb57f6 4223 SV *result = newSVpvn(s, l);
2d8e6c8d 4224 char *result_c = SvPV(result, n_a); /* convenience */
55497cff 4225 char *out = result_c;
4226 bool skip = 1;
4227 bool ignore = 0;
4228
4229 while (*s) {
4230 switch (*s) {
4231 case ' ':
4232 break;
4233 case '+':
4234 if (!skip) {
4235 SvREFCNT_dec(result);
4236 return (NULL);
4237 }
4238 break;
4239 case '0':
4240 case '1':
4241 case '2':
4242 case '3':
4243 case '4':
4244 case '5':
4245 case '6':
4246 case '7':
4247 case '8':
4248 case '9':
4249 skip = 0;
4250 if (!ignore) {
4251 *(out++) = *s;
4252 }
4253 break;
4254 case '.':
4255 ignore = 1;
4256 break;
4257 default:
4258 SvREFCNT_dec(result);
4259 return (NULL);
4260 }
4261 s++;
4262 }
4263 *(out++) = '\0';
4264 SvCUR_set(result, out - result_c);
4265 return (result);
4266}
4267
864dbfa3 4268/* pnum must be '\0' terminated */
76e3520e 4269STATIC int
cea2e8a9 4270S_div128(pTHX_ SV *pnum, bool *done)
55497cff 4271{
4272 STRLEN len;
4273 char *s = SvPV(pnum, len);
4274 int m = 0;
4275 int r = 0;
4276 char *t = s;
4277
4278 *done = 1;
4279 while (*t) {
4280 int i;
4281
4282 i = m * 10 + (*t - '0');
4283 m = i & 0x7F;
4284 r = (i >> 7); /* r < 10 */
4285 if (r) {
4286 *done = 0;
4287 }
4288 *(t++) = '0' + r;
4289 }
4290 *(t++) = '\0';
4291 SvCUR_set(pnum, (STRLEN) (t - s));
4292 return (m);
4293}
4294
4295
a0d0e21e 4296PP(pp_pack)
79072805 4297{
4e35701f 4298 djSP; dMARK; dORIGMARK; dTARGET;
a0d0e21e
LW
4299 register SV *cat = TARG;
4300 register I32 items;
4301 STRLEN fromlen;
4302 register char *pat = SvPVx(*++MARK, fromlen);
4303 register char *patend = pat + fromlen;
4304 register I32 len;
4305 I32 datumtype;
4306 SV *fromstr;
4307 /*SUPPRESS 442*/
4308 static char null10[] = {0,0,0,0,0,0,0,0,0,0};
4309 static char *space10 = " ";
79072805 4310
a0d0e21e
LW
4311 /* These must not be in registers: */
4312 char achar;
4313 I16 ashort;
4314 int aint;
4315 unsigned int auint;
4316 I32 along;
4317 U32 aulong;
ecfc5424
AD
4318#ifdef HAS_QUAD
4319 Quad_t aquad;
e862df63 4320 Uquad_t auquad;
79072805 4321#endif
a0d0e21e
LW
4322 char *aptr;
4323 float afloat;
4324 double adouble;
fb73857a 4325 int commas = 0;
726ea183 4326#ifdef PERL_NATINT_PACK
ef54e1a4 4327 int natint; /* native integer */
726ea183 4328#endif
79072805 4329
a0d0e21e
LW
4330 items = SP - MARK;
4331 MARK++;
4332 sv_setpvn(cat, "", 0);
4333 while (pat < patend) {
43192e07
IP
4334 SV *lengthcode = Nullsv;
4335#define NEXTFROM ( lengthcode ? lengthcode : items-- > 0 ? *MARK++ : &PL_sv_no)
bbdab043 4336 datumtype = *pat++ & 0xFF;
726ea183 4337#ifdef PERL_NATINT_PACK
ef54e1a4 4338 natint = 0;
726ea183 4339#endif
bbdab043
CS
4340 if (isSPACE(datumtype))
4341 continue;
f61d411c 4342 if (*pat == '!') {
ef54e1a4
JH
4343 char *natstr = "sSiIlL";
4344
4345 if (strchr(natstr, datumtype)) {
726ea183 4346#ifdef PERL_NATINT_PACK
ef54e1a4 4347 natint = 1;
726ea183 4348#endif
ef54e1a4
JH
4349 pat++;
4350 }
4351 else
cea2e8a9 4352 Perl_croak(aTHX_ "'!' allowed only after types %s", natstr);
ef54e1a4 4353 }
a0d0e21e
LW
4354 if (*pat == '*') {
4355 len = strchr("@Xxu", datumtype) ? 0 : items;
4356 pat++;
4357 }
4358 else if (isDIGIT(*pat)) {
4359 len = *pat++ - '0';
06387354 4360 while (isDIGIT(*pat)) {
a0d0e21e 4361 len = (len * 10) + (*pat++ - '0');
06387354
NT
4362 if (len < 0)
4363 Perl_croak(aTHX_ "Repeat count in pack overflows");
4364 }
a0d0e21e
LW
4365 }
4366 else
4367 len = 1;
43192e07
IP
4368 if (*pat == '#') {
4369 ++pat;
4370 if (*pat != 'a' && *pat != 'A' && *pat != 'Z' || pat[1] != '*')
4371 DIE(aTHX_ "# must be followed by a*, A* or Z*");
4372 lengthcode = sv_2mortal(newSViv(sv_len(items > 0
4373 ? *MARK : &PL_sv_no)));
4374 }
a0d0e21e
LW
4375 switch(datumtype) {
4376 default:
cea2e8a9 4377 Perl_croak(aTHX_ "Invalid type in pack: '%c'", (int)datumtype);
fb73857a 4378 case ',': /* grandfather in commas but with a warning */
599cee73 4379 if (commas++ == 0 && ckWARN(WARN_UNSAFE))
43192e07
IP
4380 Perl_warner(aTHX_ WARN_UNSAFE,
4381 "Invalid type in pack: '%c'", (int)datumtype);
fb73857a 4382 break;
a0d0e21e 4383 case '%':
cea2e8a9 4384 DIE(aTHX_ "%% may only be used in unpack");
a0d0e21e
LW
4385 case '@':
4386 len -= SvCUR(cat);
4387 if (len > 0)
4388 goto grow;
4389 len = -len;
4390 if (len > 0)
4391 goto shrink;
4392 break;
4393 case 'X':
4394 shrink:
4395 if (SvCUR(cat) < len)
cea2e8a9 4396 DIE(aTHX_ "X outside of string");
a0d0e21e
LW
4397 SvCUR(cat) -= len;
4398 *SvEND(cat) = '\0';
4399 break;
4400 case 'x':
4401 grow:
4402 while (len >= 10) {
4403 sv_catpvn(cat, null10, 10);
4404 len -= 10;
4405 }
4406 sv_catpvn(cat, null10, len);
4407 break;
4408 case 'A':
5a929a98 4409 case 'Z':
a0d0e21e
LW
4410 case 'a':
4411 fromstr = NEXTFROM;
4412 aptr = SvPV(fromstr, fromlen);
4413 if (pat[-1] == '*')
4414 len = fromlen;
4415 if (fromlen > len)
4416 sv_catpvn(cat, aptr, len);
4417 else {
4418 sv_catpvn(cat, aptr, fromlen);
4419 len -= fromlen;
4420 if (datumtype == 'A') {
4421 while (len >= 10) {
4422 sv_catpvn(cat, space10, 10);
4423 len -= 10;
4424 }
4425 sv_catpvn(cat, space10, len);
4426 }
4427 else {
4428 while (len >= 10) {
4429 sv_catpvn(cat, null10, 10);
4430 len -= 10;
4431 }
4432 sv_catpvn(cat, null10, len);
4433 }
4434 }
4435 break;
4436 case 'B':
4437 case 'b':
4438 {
4439 char *savepat = pat;
4440 I32 saveitems;
79072805 4441
a0d0e21e
LW
4442 fromstr = NEXTFROM;
4443 saveitems = items;
4444 aptr = SvPV(fromstr, fromlen);
4445 if (pat[-1] == '*')
4446 len = fromlen;
4447 pat = aptr;
4448 aint = SvCUR(cat);
4449 SvCUR(cat) += (len+7)/8;
4450 SvGROW(cat, SvCUR(cat) + 1);
4451 aptr = SvPVX(cat) + aint;
4452 if (len > fromlen)
4453 len = fromlen;
4454 aint = len;
4455 items = 0;
4456 if (datumtype == 'B') {
4457 for (len = 0; len++ < aint;) {
4458 items |= *pat++ & 1;
4459 if (len & 7)
4460 items <<= 1;
4461 else {
4462 *aptr++ = items & 0xff;
4463 items = 0;
4464 }
4465 }
4466 }
4467 else {
4468 for (len = 0; len++ < aint;) {
4469 if (*pat++ & 1)
4470 items |= 128;
4471 if (len & 7)
4472 items >>= 1;
4473 else {
4474 *aptr++ = items & 0xff;
4475 items = 0;
4476 }
4477 }
4478 }
4479 if (aint & 7) {
4480 if (datumtype == 'B')
4481 items <<= 7 - (aint & 7);
4482 else
4483 items >>= 7 - (aint & 7);
4484 *aptr++ = items & 0xff;
4485 }
4486 pat = SvPVX(cat) + SvCUR(cat);
4487 while (aptr <= pat)
4488 *aptr++ = '\0';
79072805 4489
a0d0e21e
LW
4490 pat = savepat;
4491 items = saveitems;
4492 }
4493 break;
4494 case 'H':
4495 case 'h':
4496 {
4497 char *savepat = pat;
4498 I32 saveitems;
79072805 4499
a0d0e21e
LW
4500 fromstr = NEXTFROM;
4501 saveitems = items;
4502 aptr = SvPV(fromstr, fromlen);
4503 if (pat[-1] == '*')
4504 len = fromlen;
4505 pat = aptr;
4506 aint = SvCUR(cat);
4507 SvCUR(cat) += (len+1)/2;
4508 SvGROW(cat, SvCUR(cat) + 1);
4509 aptr = SvPVX(cat) + aint;
4510 if (len > fromlen)
4511 len = fromlen;
4512 aint = len;
4513 items = 0;
4514 if (datumtype == 'H') {
4515 for (len = 0; len++ < aint;) {
4516 if (isALPHA(*pat))
4517 items |= ((*pat++ & 15) + 9) & 15;
4518 else
4519 items |= *pat++ & 15;
4520 if (len & 1)
4521 items <<= 4;
4522 else {
4523 *aptr++ = items & 0xff;
4524 items = 0;
4525 }
4526 }
4527 }
4528 else {
4529 for (len = 0; len++ < aint;) {
4530 if (isALPHA(*pat))
4531 items |= (((*pat++ & 15) + 9) & 15) << 4;
4532 else
4533 items |= (*pat++ & 15) << 4;
4534 if (len & 1)
4535 items >>= 4;
4536 else {
4537 *aptr++ = items & 0xff;
4538 items = 0;
4539 }
4540 }
4541 }
4542 if (aint & 1)
4543 *aptr++ = items & 0xff;
4544 pat = SvPVX(cat) + SvCUR(cat);
4545 while (aptr <= pat)
4546 *aptr++ = '\0';
79072805 4547
a0d0e21e
LW
4548 pat = savepat;
4549 items = saveitems;
4550 }
4551 break;
4552 case 'C':
4553 case 'c':
4554 while (len-- > 0) {
4555 fromstr = NEXTFROM;
4556 aint = SvIV(fromstr);
4557 achar = aint;
4558 sv_catpvn(cat, &achar, sizeof(char));
4559 }
4560 break;
a0ed51b3
LW
4561 case 'U':
4562 while (len-- > 0) {
4563 fromstr = NEXTFROM;
4564 auint = SvUV(fromstr);
4565 SvGROW(cat, SvCUR(cat) + 10);
dfe13c55
GS
4566 SvCUR_set(cat, (char*)uv_to_utf8((U8*)SvEND(cat),auint)
4567 - SvPVX(cat));
a0ed51b3
LW
4568 }
4569 *SvEND(cat) = '\0';
4570 break;
a0d0e21e
LW
4571 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
4572 case 'f':
4573 case 'F':
4574 while (len-- > 0) {
4575 fromstr = NEXTFROM;
4576 afloat = (float)SvNV(fromstr);
4577 sv_catpvn(cat, (char *)&afloat, sizeof (float));
4578 }
4579 break;
4580 case 'd':
4581 case 'D':
4582 while (len-- > 0) {
4583 fromstr = NEXTFROM;
4584 adouble = (double)SvNV(fromstr);
4585 sv_catpvn(cat, (char *)&adouble, sizeof (double));
4586 }
4587 break;
4588 case 'n':
4589 while (len-- > 0) {
4590 fromstr = NEXTFROM;
4591 ashort = (I16)SvIV(fromstr);
4592#ifdef HAS_HTONS
6ad3d225 4593 ashort = PerlSock_htons(ashort);
79072805 4594#endif
96e4d5b1 4595 CAT16(cat, &ashort);
a0d0e21e
LW
4596 }
4597 break;
4598 case 'v':
4599 while (len-- > 0) {
4600 fromstr = NEXTFROM;
4601 ashort = (I16)SvIV(fromstr);
4602#ifdef HAS_HTOVS
4603 ashort = htovs(ashort);
79072805 4604#endif
96e4d5b1 4605 CAT16(cat, &ashort);
a0d0e21e
LW
4606 }
4607 break;
4608 case 'S':
726ea183 4609#if SHORTSIZE != SIZE16
ef54e1a4
JH
4610 if (natint) {
4611 unsigned short aushort;
4612
4613 while (len-- > 0) {
4614 fromstr = NEXTFROM;
4615 aushort = SvUV(fromstr);
4616 sv_catpvn(cat, (char *)&aushort, sizeof(unsigned short));
4617 }
4618 }
726ea183
JH
4619 else
4620#endif
4621 {
ef54e1a4
JH
4622 U16 aushort;
4623
4624 while (len-- > 0) {
4625 fromstr = NEXTFROM;
726ea183 4626 aushort = (U16)SvUV(fromstr);
ef54e1a4
JH
4627 CAT16(cat, &aushort);
4628 }
726ea183 4629
ef54e1a4
JH
4630 }
4631 break;
a0d0e21e 4632 case 's':
c67712b2 4633#if SHORTSIZE != SIZE16
ef54e1a4 4634 if (natint) {
bf9315bb
GS
4635 short ashort;
4636
ef54e1a4
JH
4637 while (len-- > 0) {
4638 fromstr = NEXTFROM;
4639 ashort = SvIV(fromstr);
4640 sv_catpvn(cat, (char *)&ashort, sizeof(short));
4641 }
4642 }
726ea183
JH
4643 else
4644#endif
4645 {
ef54e1a4
JH
4646 while (len-- > 0) {
4647 fromstr = NEXTFROM;
4648 ashort = (I16)SvIV(fromstr);
4649 CAT16(cat, &ashort);
4650 }
a0d0e21e
LW
4651 }
4652 break;
4653 case 'I':
4654 while (len-- > 0) {
4655 fromstr = NEXTFROM;
96e4d5b1 4656 auint = SvUV(fromstr);
a0d0e21e
LW
4657 sv_catpvn(cat, (char*)&auint, sizeof(unsigned int));
4658 }
4659 break;
def98dd4
UP
4660 case 'w':
4661 while (len-- > 0) {
bbce6d69 4662 fromstr = NEXTFROM;
65202027 4663 adouble = Perl_floor(SvNV(fromstr));
bbce6d69 4664
4665 if (adouble < 0)
cea2e8a9 4666 Perl_croak(aTHX_ "Cannot compress negative numbers");
bbce6d69 4667
46fc3d4c 4668 if (
4669#ifdef BW_BITS
4670 adouble <= BW_MASK
4671#else
ef2d312d
TH
4672#ifdef CXUX_BROKEN_CONSTANT_CONVERT
4673 adouble <= UV_MAX_cxux
4674#else
46fc3d4c 4675 adouble <= UV_MAX
4676#endif
ef2d312d 4677#endif
46fc3d4c 4678 )
4679 {
bbce6d69 4680 char buf[1 + sizeof(UV)];
4681 char *in = buf + sizeof(buf);
db7c17d7 4682 UV auv = U_V(adouble);
bbce6d69 4683
4684 do {
4685 *--in = (auv & 0x7f) | 0x80;
4686 auv >>= 7;
4687 } while (auv);
4688 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4689 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4690 }
4691 else if (SvPOKp(fromstr)) { /* decimal string arithmetics */
4692 char *from, *result, *in;
4693 SV *norm;
4694 STRLEN len;
4695 bool done;
8ec5e241 4696
bbce6d69 4697 /* Copy string and check for compliance */
4698 from = SvPV(fromstr, len);
4699 if ((norm = is_an_int(from, len)) == NULL)
cea2e8a9 4700 Perl_croak(aTHX_ "can compress only unsigned integer");
bbce6d69 4701
4702 New('w', result, len, char);
4703 in = result + len;
4704 done = FALSE;
4705 while (!done)
4706 *--in = div128(norm, &done) | 0x80;
4707 result[len - 1] &= 0x7F; /* clear continue bit */
4708 sv_catpvn(cat, in, (result + len) - in);
5f05dabc 4709 Safefree(result);
bbce6d69 4710 SvREFCNT_dec(norm); /* free norm */
def98dd4 4711 }
bbce6d69 4712 else if (SvNOKp(fromstr)) {
4713 char buf[sizeof(double) * 2]; /* 8/7 <= 2 */
4714 char *in = buf + sizeof(buf);
4715
4716 do {
4717 double next = floor(adouble / 128);
4718 *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
4719 if (--in < buf) /* this cannot happen ;-) */
cea2e8a9 4720 Perl_croak(aTHX_ "Cannot compress integer");
bbce6d69 4721 adouble = next;
4722 } while (adouble > 0);
4723 buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
4724 sv_catpvn(cat, in, (buf + sizeof(buf)) - in);
4725 }
4726 else
cea2e8a9 4727 Perl_croak(aTHX_ "Cannot compress non integer");
bbce6d69 4728 }
def98dd4 4729 break;
a0d0e21e
LW
4730 case 'i':
4731 while (len-- > 0) {
4732 fromstr = NEXTFROM;
4733 aint = SvIV(fromstr);
4734 sv_catpvn(cat, (char*)&aint, sizeof(int));
4735 }
4736 break;
4737 case 'N':
4738 while (len-- > 0) {
4739 fromstr = NEXTFROM;
96e4d5b1 4740 aulong = SvUV(fromstr);
a0d0e21e 4741#ifdef HAS_HTONL
6ad3d225 4742 aulong = PerlSock_htonl(aulong);
79072805 4743#endif
96e4d5b1 4744 CAT32(cat, &aulong);
a0d0e21e
LW
4745 }
4746 break;
4747 case 'V':
4748 while (len-- > 0) {
4749 fromstr = NEXTFROM;
96e4d5b1 4750 aulong = SvUV(fromstr);
a0d0e21e
LW
4751#ifdef HAS_HTOVL
4752 aulong = htovl(aulong);
79072805 4753#endif
96e4d5b1 4754 CAT32(cat, &aulong);
a0d0e21e
LW
4755 }
4756 break;
4757 case 'L':
726ea183 4758#if LONGSIZE != SIZE32
ef54e1a4 4759 if (natint) {
bf9315bb
GS
4760 unsigned long aulong;
4761
ef54e1a4
JH
4762 while (len-- > 0) {
4763 fromstr = NEXTFROM;
4764 aulong = SvUV(fromstr);
4765 sv_catpvn(cat, (char *)&aulong, sizeof(unsigned long));
4766 }
4767 }
726ea183
JH
4768 else
4769#endif
4770 {
ef54e1a4
JH
4771 while (len-- > 0) {
4772 fromstr = NEXTFROM;
4773 aulong = SvUV(fromstr);
4774 CAT32(cat, &aulong);
4775 }
a0d0e21e
LW
4776 }
4777 break;
4778 case 'l':
726ea183 4779#if LONGSIZE != SIZE32
ef54e1a4 4780 if (natint) {
bf9315bb
GS
4781 long along;
4782
ef54e1a4
JH
4783 while (len-- > 0) {
4784 fromstr = NEXTFROM;
4785 along = SvIV(fromstr);
4786 sv_catpvn(cat, (char *)&along, sizeof(long));
4787 }
4788 }
726ea183
JH
4789 else
4790#endif
4791 {
ef54e1a4
JH
4792 while (len-- > 0) {
4793 fromstr = NEXTFROM;
4794 along = SvIV(fromstr);
4795 CAT32(cat, &along);
4796 }
a0d0e21e
LW
4797 }
4798 break;
ecfc5424 4799#ifdef HAS_QUAD
a0d0e21e
LW
4800 case 'Q':
4801 while (len-- > 0) {
4802 fromstr = NEXTFROM;
bf9315bb 4803 auquad = (Uquad_t)SvUV(fromstr);
e862df63 4804 sv_catpvn(cat, (char*)&auquad, sizeof(Uquad_t));
a0d0e21e
LW
4805 }
4806 break;
4807 case 'q':
4808 while (len-- > 0) {
4809 fromstr = NEXTFROM;
ecfc5424
AD
4810 aquad = (Quad_t)SvIV(fromstr);
4811 sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
a0d0e21e
LW
4812 }
4813 break;
ecfc5424 4814#endif /* HAS_QUAD */
a0d0e21e
LW
4815 case 'P':
4816 len = 1; /* assume SV is correct length */
4817 /* FALL THROUGH */
4818 case 'p':
4819 while (len-- > 0) {
4820 fromstr = NEXTFROM;
3280af22 4821 if (fromstr == &PL_sv_undef)
84902520 4822 aptr = NULL;
72dbcb4b 4823 else {
2d8e6c8d 4824 STRLEN n_a;
84902520
TB
4825 /* XXX better yet, could spirit away the string to
4826 * a safe spot and hang on to it until the result
4827 * of pack() (and all copies of the result) are
4828 * gone.
4829 */
599cee73 4830 if (ckWARN(WARN_UNSAFE) && (SvTEMP(fromstr) || SvPADTMP(fromstr)))
cea2e8a9 4831 Perl_warner(aTHX_ WARN_UNSAFE,
599cee73 4832 "Attempt to pack pointer to temporary value");
84902520 4833 if (SvPOK(fromstr) || SvNIOK(fromstr))
2d8e6c8d 4834 aptr = SvPV(fromstr,n_a);
84902520 4835 else
2d8e6c8d 4836 aptr = SvPV_force(fromstr,n_a);
72dbcb4b 4837 }
a0d0e21e
LW
4838 sv_catpvn(cat, (char*)&aptr, sizeof(char*));
4839 }
4840 break;
4841 case 'u':
4842 fromstr = NEXTFROM;
4843 aptr = SvPV(fromstr, fromlen);
4844 SvGROW(cat, fromlen * 4 / 3);
4845 if (len <= 1)
4846 len = 45;
4847 else
4848 len = len / 3 * 3;
4849 while (fromlen > 0) {
4850 I32 todo;
79072805 4851
a0d0e21e
LW
4852 if (fromlen > len)
4853 todo = len;
4854 else
4855 todo = fromlen;
4856 doencodes(cat, aptr, todo);
4857 fromlen -= todo;
4858 aptr += todo;
4859 }
4860 break;
4861 }
4862 }
4863 SvSETMAGIC(cat);
4864 SP = ORIGMARK;
4865 PUSHs(cat);
4866 RETURN;
79072805 4867}
a0d0e21e 4868#undef NEXTFROM
79072805 4869
8ec5e241 4870
a0d0e21e 4871PP(pp_split)
79072805 4872{
4e35701f 4873 djSP; dTARG;
a0d0e21e
LW
4874 AV *ary;
4875 register I32 limit = POPi; /* note, negative is forever */
4876 SV *sv = POPs;
4877 STRLEN len;
4878 register char *s = SvPV(sv, len);
4879 char *strend = s + len;
44a8e56a 4880 register PMOP *pm;
d9f97599 4881 register REGEXP *rx;
a0d0e21e
LW
4882 register SV *dstr;
4883 register char *m;
4884 I32 iters = 0;
4885 I32 maxiters = (strend - s) + 10;
4886 I32 i;
4887 char *orig;
4888 I32 origlimit = limit;
4889 I32 realarray = 0;
4890 I32 base;
3280af22 4891 AV *oldstack = PL_curstack;
54310121 4892 I32 gimme = GIMME_V;
3280af22 4893 I32 oldsave = PL_savestack_ix;
8ec5e241
NIS
4894 I32 make_mortal = 1;
4895 MAGIC *mg = (MAGIC *) NULL;
79072805 4896
44a8e56a 4897#ifdef DEBUGGING
4898 Copy(&LvTARGOFF(POPs), &pm, 1, PMOP*);
4899#else
4900 pm = (PMOP*)POPs;
4901#endif
a0d0e21e 4902 if (!pm || !s)
cea2e8a9 4903 DIE(aTHX_ "panic: do_split");
d9f97599 4904 rx = pm->op_pmregexp;
bbce6d69 4905
4906 TAINT_IF((pm->op_pmflags & PMf_LOCALE) &&
4907 (pm->op_pmflags & (PMf_WHITE | PMf_SKIPWHITE)));
4908
a0d0e21e
LW
4909 if (pm->op_pmreplroot)
4910 ary = GvAVn((GV*)pm->op_pmreplroot);
4911 else if (gimme != G_ARRAY)
6d4ff0d2 4912#ifdef USE_THREADS
533c011a 4913 ary = (AV*)PL_curpad[0];
6d4ff0d2 4914#else
3280af22 4915 ary = GvAVn(PL_defgv);
6d4ff0d2 4916#endif /* USE_THREADS */
79072805 4917 else
a0d0e21e
LW
4918 ary = Nullav;
4919 if (ary && (gimme != G_ARRAY || (pm->op_pmflags & PMf_ONCE))) {
4920 realarray = 1;
8ec5e241 4921 PUTBACK;
a0d0e21e
LW
4922 av_extend(ary,0);
4923 av_clear(ary);
8ec5e241 4924 SPAGAIN;
33c27489 4925 if (mg = SvTIED_mg((SV*)ary, 'P')) {
8ec5e241 4926 PUSHMARK(SP);
33c27489 4927 XPUSHs(SvTIED_obj((SV*)ary, mg));
8ec5e241
NIS
4928 }
4929 else {
1c0b011c
NIS
4930 if (!AvREAL(ary)) {
4931 AvREAL_on(ary);
abff13bb 4932 AvREIFY_off(ary);
1c0b011c 4933 for (i = AvFILLp(ary); i >= 0; i--)
3280af22 4934 AvARRAY(ary)[i] = &PL_sv_undef; /* don't free mere refs */
1c0b011c
NIS
4935 }
4936 /* temporarily switch stacks */
3280af22 4937 SWITCHSTACK(PL_curstack, ary);
8ec5e241 4938 make_mortal = 0;
1c0b011c 4939 }
79072805 4940 }
3280af22 4941 base = SP - PL_stack_base;
a0d0e21e
LW
4942 orig = s;
4943 if (pm->op_pmflags & PMf_SKIPWHITE) {
bbce6d69 4944 if (pm->op_pmflags & PMf_LOCALE) {
4945 while (isSPACE_LC(*s))
4946 s++;
4947 }
4948 else {
4949 while (isSPACE(*s))
4950 s++;
4951 }
a0d0e21e 4952 }
c07a80fd 4953 if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
3280af22
NIS
4954 SAVEINT(PL_multiline);
4955 PL_multiline = pm->op_pmflags & PMf_MULTILINE;
c07a80fd 4956 }
4957
a0d0e21e
LW
4958 if (!limit)
4959 limit = maxiters + 2;
4960 if (pm->op_pmflags & PMf_WHITE) {
4961 while (--limit) {
bbce6d69 4962 m = s;
4963 while (m < strend &&
4964 !((pm->op_pmflags & PMf_LOCALE)
4965 ? isSPACE_LC(*m) : isSPACE(*m)))
4966 ++m;
a0d0e21e
LW
4967 if (m >= strend)
4968 break;
bbce6d69 4969
a0d0e21e
LW
4970 dstr = NEWSV(30, m-s);
4971 sv_setpvn(dstr, s, m-s);
8ec5e241 4972 if (make_mortal)
a0d0e21e
LW
4973 sv_2mortal(dstr);
4974 XPUSHs(dstr);
bbce6d69 4975
4976 s = m + 1;
4977 while (s < strend &&
4978 ((pm->op_pmflags & PMf_LOCALE)
4979 ? isSPACE_LC(*s) : isSPACE(*s)))
4980 ++s;
79072805
LW
4981 }
4982 }
f4091fba 4983 else if (strEQ("^", rx->precomp)) {
a0d0e21e
LW
4984 while (--limit) {
4985 /*SUPPRESS 530*/
4986 for (m = s; m < strend && *m != '\n'; m++) ;
4987 m++;
4988 if (m >= strend)
4989 break;
4990 dstr = NEWSV(30, m-s);
4991 sv_setpvn(dstr, s, m-s);
8ec5e241 4992 if (make_mortal)
a0d0e21e
LW
4993 sv_2mortal(dstr);
4994 XPUSHs(dstr);
4995 s = m;
4996 }
4997 }
f722798b 4998 else if ((rx->reganch & RE_USE_INTUIT) && !rx->nparens
d9f97599
GS
4999 && (rx->reganch & ROPT_CHECK_ALL)
5000 && !(rx->reganch & ROPT_ANCH)) {
f722798b
IZ
5001 int tail = (rx->reganch & RE_INTUIT_TAIL);
5002 SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
5003 char c;
cf93c79d 5004
ca5b42cb
GS
5005 len = rx->minlen;
5006 if (len == 1 && !tail) {
5007 c = *SvPV(csv,len);
a0d0e21e 5008 while (--limit) {
bbce6d69 5009 /*SUPPRESS 530*/
f722798b 5010 for (m = s; m < strend && *m != c; m++) ;
a0d0e21e
LW
5011 if (m >= strend)
5012 break;
5013 dstr = NEWSV(30, m-s);
5014 sv_setpvn(dstr, s, m-s);
8ec5e241 5015 if (make_mortal)
a0d0e21e
LW
5016 sv_2mortal(dstr);
5017 XPUSHs(dstr);
5018 s = m + 1;
5019 }
5020 }
5021 else {
5022#ifndef lint
5023 while (s < strend && --limit &&
f722798b
IZ
5024 (m = fbm_instr((unsigned char*)s, (unsigned char*)strend,
5025 csv, PL_multiline ? FBMrf_MULTILINE : 0)) )
79072805 5026#endif
a0d0e21e
LW
5027 {
5028 dstr = NEWSV(31, m-s);
5029 sv_setpvn(dstr, s, m-s);
8ec5e241 5030 if (make_mortal)
a0d0e21e
LW
5031 sv_2mortal(dstr);
5032 XPUSHs(dstr);
ca5b42cb 5033 s = m + len; /* Fake \n at the end */
a0d0e21e 5034 }
463ee0b2 5035 }
463ee0b2 5036 }
a0d0e21e 5037 else {
d9f97599 5038 maxiters += (strend - s) * rx->nparens;
f722798b
IZ
5039 while (s < strend && --limit
5040/* && (!rx->check_substr
5041 || ((s = CALLREG_INTUIT_START(aTHX_ rx, sv, s, strend,
5042 0, NULL))))
5043*/ && CALLREGEXEC(aTHX_ rx, s, strend, orig,
5044 1 /* minend */, sv, NULL, 0))
bbce6d69 5045 {
d9f97599 5046 TAINT_IF(RX_MATCH_TAINTED(rx));
cf93c79d 5047 if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
a0d0e21e
LW
5048 m = s;
5049 s = orig;
cf93c79d 5050 orig = rx->subbeg;
a0d0e21e
LW
5051 s = orig + (m - s);
5052 strend = s + (strend - m);
5053 }
cf93c79d 5054 m = rx->startp[0] + orig;
a0d0e21e
LW
5055 dstr = NEWSV(32, m-s);
5056 sv_setpvn(dstr, s, m-s);
8ec5e241 5057 if (make_mortal)
a0d0e21e
LW
5058 sv_2mortal(dstr);
5059 XPUSHs(dstr);
d9f97599
GS
5060 if (rx->nparens) {
5061 for (i = 1; i <= rx->nparens; i++) {
cf93c79d
IZ
5062 s = rx->startp[i] + orig;
5063 m = rx->endp[i] + orig;
748a9306
LW
5064 if (m && s) {
5065 dstr = NEWSV(33, m-s);
5066 sv_setpvn(dstr, s, m-s);
5067 }
5068 else
5069 dstr = NEWSV(33, 0);
8ec5e241 5070 if (make_mortal)
a0d0e21e
LW
5071 sv_2mortal(dstr);
5072 XPUSHs(dstr);
5073 }
5074 }
cf93c79d 5075 s = rx->endp[0] + orig;
a0d0e21e 5076 }
79072805 5077 }
8ec5e241 5078
c07a80fd 5079 LEAVE_SCOPE(oldsave);
3280af22 5080 iters = (SP - PL_stack_base) - base;
a0d0e21e 5081 if (iters > maxiters)
cea2e8a9 5082 DIE(aTHX_ "Split loop");
8ec5e241 5083
a0d0e21e
LW
5084 /* keep field after final delim? */
5085 if (s < strend || (iters && origlimit)) {
5086 dstr = NEWSV(34, strend-s);
5087 sv_setpvn(dstr, s, strend-s);
8ec5e241 5088 if (make_mortal)
a0d0e21e
LW
5089 sv_2mortal(dstr);
5090 XPUSHs(dstr);
5091 iters++;
79072805 5092 }
a0d0e21e 5093 else if (!origlimit) {
b1dadf13 5094 while (iters > 0 && (!TOPs || !SvANY(TOPs) || SvCUR(TOPs) == 0))
a0d0e21e
LW
5095 iters--, SP--;
5096 }
8ec5e241 5097
a0d0e21e 5098 if (realarray) {
8ec5e241 5099 if (!mg) {
1c0b011c
NIS
5100 SWITCHSTACK(ary, oldstack);
5101 if (SvSMAGICAL(ary)) {
5102 PUTBACK;
5103 mg_set((SV*)ary);
5104 SPAGAIN;
5105 }
5106 if (gimme == G_ARRAY) {
5107 EXTEND(SP, iters);
5108 Copy(AvARRAY(ary), SP + 1, iters, SV*);
5109 SP += iters;
5110 RETURN;
5111 }
8ec5e241 5112 }
1c0b011c 5113 else {
fb73857a 5114 PUTBACK;
8ec5e241 5115 ENTER;
864dbfa3 5116 call_method("PUSH",G_SCALAR|G_DISCARD);
8ec5e241 5117 LEAVE;
fb73857a 5118 SPAGAIN;
8ec5e241
NIS
5119 if (gimme == G_ARRAY) {
5120 /* EXTEND should not be needed - we just popped them */
5121 EXTEND(SP, iters);
5122 for (i=0; i < iters; i++) {
5123 SV **svp = av_fetch(ary, i, FALSE);
3280af22 5124 PUSHs((svp) ? *svp : &PL_sv_undef);
8ec5e241 5125 }
1c0b011c
NIS
5126 RETURN;
5127 }
a0d0e21e
LW
5128 }
5129 }
5130 else {
5131 if (gimme == G_ARRAY)
5132 RETURN;
5133 }
5134 if (iters || !pm->op_pmreplroot) {
5135 GETTARGET;
5136 PUSHi(iters);
5137 RETURN;
5138 }
5139 RETPUSHUNDEF;
79072805 5140}
85e6fe83 5141
c0329465 5142#ifdef USE_THREADS
77a005ab 5143void
864dbfa3 5144Perl_unlock_condpair(pTHX_ void *svv)
c0329465
MB
5145{
5146 dTHR;
5147 MAGIC *mg = mg_find((SV*)svv, 'm');
8ec5e241 5148
c0329465 5149 if (!mg)
cea2e8a9 5150 Perl_croak(aTHX_ "panic: unlock_condpair unlocking non-mutex");
c0329465
MB
5151 MUTEX_LOCK(MgMUTEXP(mg));
5152 if (MgOWNER(mg) != thr)
cea2e8a9 5153 Perl_croak(aTHX_ "panic: unlock_condpair unlocking mutex that we don't own");
c0329465
MB
5154 MgOWNER(mg) = 0;
5155 COND_SIGNAL(MgOWNERCONDP(mg));
8b73bbec 5156 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: unlock 0x%lx\n",
bc1f4c86 5157 (unsigned long)thr, (unsigned long)svv);)
c0329465
MB
5158 MUTEX_UNLOCK(MgMUTEXP(mg));
5159}
5160#endif /* USE_THREADS */
5161
5162PP(pp_lock)
5163{
4e35701f 5164 djSP;
c0329465 5165 dTOPss;
e55aaa0e
MB
5166 SV *retsv = sv;
5167#ifdef USE_THREADS
c0329465 5168 MAGIC *mg;
8ec5e241 5169
c0329465
MB
5170 if (SvROK(sv))
5171 sv = SvRV(sv);
5172
5173 mg = condpair_magic(sv);
5174 MUTEX_LOCK(MgMUTEXP(mg));
5175 if (MgOWNER(mg) == thr)
5176 MUTEX_UNLOCK(MgMUTEXP(mg));
5177 else {
5178 while (MgOWNER(mg))
5179 COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
5180 MgOWNER(mg) = thr;
8b73bbec 5181 DEBUG_S(PerlIO_printf(PerlIO_stderr(), "0x%lx: pp_lock lock 0x%lx\n",
bc1f4c86 5182 (unsigned long)thr, (unsigned long)sv);)
c0329465 5183 MUTEX_UNLOCK(MgMUTEXP(mg));
51371543 5184 SAVEDESTRUCTOR(Perl_unlock_condpair, sv);
c0329465
MB
5185 }
5186#endif /* USE_THREADS */
e55aaa0e
MB
5187 if (SvTYPE(retsv) == SVt_PVAV || SvTYPE(retsv) == SVt_PVHV
5188 || SvTYPE(retsv) == SVt_PVCV) {
5189 retsv = refto(retsv);
5190 }
5191 SETs(retsv);
c0329465
MB
5192 RETURN;
5193}
a863c7d1 5194
2faa37cc 5195PP(pp_threadsv)
a863c7d1 5196{
12f917ad 5197 djSP;
57d3b86d 5198#ifdef USE_THREADS
924508f0 5199 EXTEND(SP, 1);
533c011a
NIS
5200 if (PL_op->op_private & OPpLVAL_INTRO)
5201 PUSHs(*save_threadsv(PL_op->op_targ));
554b3eca 5202 else
533c011a 5203 PUSHs(THREADSV(PL_op->op_targ));
fdb47d66 5204 RETURN;
a863c7d1 5205#else
cea2e8a9 5206 DIE(aTHX_ "tried to access per-thread data in non-threaded perl");
a863c7d1 5207#endif /* USE_THREADS */
a863c7d1 5208}