This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[ID 20000803.006] 'use lib ...' doesn't behave as documented
[perl5.git] / pp.c
CommitLineData
a0d0e21e 1/* pp.c
79072805 2 *
3818b22b 3 * Copyright (c) 1991-2000, 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/*
96e4d5b1 31 * Offset for integer pack/unpack.
32 *
33 * On architectures where I16 and I32 aren't really 16 and 32 bits,
34 * which for now are all Crays, pack and unpack have to play games.
35 */
36
37/*
38 * These values are required for portability of pack() output.
39 * If they're not right on your machine, then pack() and unpack()
40 * wouldn't work right anyway; you'll need to apply the Cray hack.
41 * (I'd like to check them with #if, but you can't use sizeof() in
dc45a647
MB
42 * the preprocessor.) --???
43 */
44/*
45 The appropriate SHORTSIZE, INTSIZE, LONGSIZE, and LONGLONGSIZE
46 defines are now in config.h. --Andy Dougherty April 1998
96e4d5b1 47 */
48#define SIZE16 2
49#define SIZE32 4
50
9851f69c
JH
51/* CROSSCOMPILE and MULTIARCH are going to affect pp_pack() and pp_unpack().
52 --jhi Feb 1999 */
53
726ea183
JH
54#if SHORTSIZE != SIZE16 || LONGSIZE != SIZE32
55# define PERL_NATINT_PACK
56#endif
57
0f9dfb06 58#if LONGSIZE > 4 && defined(_CRAY)
96e4d5b1 59# if BYTEORDER == 0x12345678
60# define OFF16(p) (char*)(p)
61# define OFF32(p) (char*)(p)
62# else
63# if BYTEORDER == 0x87654321
64# define OFF16(p) ((char*)(p) + (sizeof(U16) - SIZE16))
65# define OFF32(p) ((char*)(p) + (sizeof(U32) - SIZE32))
66# else
67 }}}} bad cray byte order
68# endif
69# endif
70# define COPY16(s,p) (*(p) = 0, Copy(s, OFF16(p), SIZE16, char))
71# define COPY32(s,p) (*(p) = 0, Copy(s, OFF32(p), SIZE32, char))
ef54e1a4 72# define COPYNN(s,p,n) (*(p) = 0, Copy(s, (char *)(p), n, char))
96e4d5b1 73# define CAT16(sv,p) sv_catpvn(sv, OFF16(p), SIZE16)
74# define CAT32(sv,p) sv_catpvn(sv, OFF32(p), SIZE32)
75#else
76# define COPY16(s,p) Copy(s, p, SIZE16, char)
77# define COPY32(s,p) Copy(s, p, SIZE32, char)
ef54e1a4 78# define COPYNN(s,p,n) Copy(s, (char *)(p), n, char)
96e4d5b1 79# define CAT16(sv,p) sv_catpvn(sv, (char*)(p), SIZE16)
80# define CAT32(sv,p) sv_catpvn(sv, (char*)(p), SIZE32)
81#endif
82
a0d0e21e 83/* variations on pp_null */
79072805 84
8ac85365
NIS
85#ifdef I_UNISTD
86#include <unistd.h>
87#endif
dfe9444c
AD
88
89/* XXX I can't imagine anyone who doesn't have this actually _needs_
90 it, since pid_t is an integral type.
91 --AD 2/20/1998
92*/
93#ifdef NEED_GETPID_PROTO
94extern Pid_t getpid (void);
8ac85365
NIS
95#endif
96
93a17b20
LW
97PP(pp_stub)
98{
4e35701f 99 djSP;
54310121 100 if (GIMME_V == G_SCALAR)
3280af22 101 XPUSHs(&PL_sv_undef);
93a17b20
LW
102 RETURN;
103}
104
79072805
LW
105PP(pp_scalar)
106{
107 return NORMAL;
108}
109
110/* Pushy stuff. */
111
93a17b20
LW
112PP(pp_padav)
113{
4e35701f 114 djSP; dTARGET;
533c011a
NIS
115 if (PL_op->op_private & OPpLVAL_INTRO)
116 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
85e6fe83 117 EXTEND(SP, 1);
533c011a 118 if (PL_op->op_flags & OPf_REF) {
85e6fe83 119 PUSHs(TARG);
93a17b20 120 RETURN;
85e6fe83
LW
121 }
122 if (GIMME == G_ARRAY) {
123 I32 maxarg = AvFILL((AV*)TARG) + 1;
124 EXTEND(SP, maxarg);
93965878
NIS
125 if (SvMAGICAL(TARG)) {
126 U32 i;
127 for (i=0; i < maxarg; i++) {
128 SV **svp = av_fetch((AV*)TARG, i, FALSE);
3280af22 129 SP[i+1] = (svp) ? *svp : &PL_sv_undef;
93965878
NIS
130 }
131 }
132 else {
133 Copy(AvARRAY((AV*)TARG), SP+1, maxarg, SV*);
134 }
85e6fe83
LW
135 SP += maxarg;
136 }
137 else {
138 SV* sv = sv_newmortal();
139 I32 maxarg = AvFILL((AV*)TARG) + 1;
140 sv_setiv(sv, maxarg);
141 PUSHs(sv);
142 }
143 RETURN;
93a17b20
LW
144}
145
146PP(pp_padhv)
147{
4e35701f 148 djSP; dTARGET;
54310121 149 I32 gimme;
150
93a17b20 151 XPUSHs(TARG);
533c011a
NIS
152 if (PL_op->op_private & OPpLVAL_INTRO)
153 SAVECLEARSV(PL_curpad[PL_op->op_targ]);
154 if (PL_op->op_flags & OPf_REF)
93a17b20 155 RETURN;
54310121 156 gimme = GIMME_V;
157 if (gimme == G_ARRAY) {
cea2e8a9 158 RETURNOP(do_kv());
85e6fe83 159 }
54310121 160 else if (gimme == G_SCALAR) {
85e6fe83 161 SV* sv = sv_newmortal();
46fc3d4c 162 if (HvFILL((HV*)TARG))
cea2e8a9 163 Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
46fc3d4c 164 (long)HvFILL((HV*)TARG), (long)HvMAX((HV*)TARG) + 1);
85e6fe83
LW
165 else
166 sv_setiv(sv, 0);
167 SETs(sv);
85e6fe83 168 }
54310121 169 RETURN;
93a17b20
LW
170}
171
ed6116ce
LW
172PP(pp_padany)
173{
cea2e8a9 174 DIE(aTHX_ "NOT IMPL LINE %d",__LINE__);
ed6116ce
LW
175}
176
79072805
LW
177/* Translations. */
178
179PP(pp_rv2gv)
180{
853846ea 181 djSP; dTOPss;
8ec5e241 182
ed6116ce 183 if (SvROK(sv)) {
a0d0e21e 184 wasref:
f5284f61
IZ
185 tryAMAGICunDEREF(to_gv);
186
ed6116ce 187 sv = SvRV(sv);
b1dadf13 188 if (SvTYPE(sv) == SVt_PVIO) {
189 GV *gv = (GV*) sv_newmortal();
190 gv_init(gv, 0, "", 0, 0);
191 GvIOp(gv) = (IO *)sv;
3e3baf6d 192 (void)SvREFCNT_inc(sv);
b1dadf13 193 sv = (SV*) gv;
ef54e1a4
JH
194 }
195 else if (SvTYPE(sv) != SVt_PVGV)
cea2e8a9 196 DIE(aTHX_ "Not a GLOB reference");
79072805
LW
197 }
198 else {
93a17b20 199 if (SvTYPE(sv) != SVt_PVGV) {
748a9306 200 char *sym;
c9d5ac95 201 STRLEN len;
748a9306 202
a0d0e21e
LW
203 if (SvGMAGICAL(sv)) {
204 mg_get(sv);
205 if (SvROK(sv))
206 goto wasref;
207 }
afd1915d 208 if (!SvOK(sv) && sv != &PL_sv_undef) {
853846ea
NIS
209 /* If this is a 'my' scalar and flag is set then vivify
210 * NI-S 1999/05/07
211 */
1d8d4d2a 212 if (PL_op->op_private & OPpDEREF) {
2c8ac474
GS
213 char *name;
214 GV *gv;
215 if (cUNOP->op_targ) {
216 STRLEN len;
217 SV *namesv = PL_curpad[cUNOP->op_targ];
218 name = SvPV(namesv, len);
2d6d9f7a 219 gv = (GV*)NEWSV(0,0);
2c8ac474
GS
220 gv_init(gv, CopSTASH(PL_curcop), name, len, 0);
221 }
222 else {
223 name = CopSTASHPV(PL_curcop);
224 gv = newGVgen(name);
1d8d4d2a 225 }
853846ea 226 sv_upgrade(sv, SVt_RV);
2c8ac474 227 SvRV(sv) = (SV*)gv;
853846ea 228 SvROK_on(sv);
1d8d4d2a 229 SvSETMAGIC(sv);
853846ea 230 goto wasref;
2c8ac474 231 }
533c011a
NIS
232 if (PL_op->op_flags & OPf_REF ||
233 PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 234 DIE(aTHX_ PL_no_usym, "a symbol");
599cee73 235 if (ckWARN(WARN_UNINITIALIZED))
b89fed5f 236 report_uninit();
a0d0e21e
LW
237 RETSETUNDEF;
238 }
c9d5ac95 239 sym = SvPV(sv,len);
35cd451c
GS
240 if ((PL_op->op_flags & OPf_SPECIAL) &&
241 !(PL_op->op_flags & OPf_MOD))
242 {
243 sv = (SV*)gv_fetchpv(sym, FALSE, SVt_PVGV);
c9d5ac95
GS
244 if (!sv
245 && (!is_gv_magical(sym,len,0)
246 || !(sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV))))
247 {
35cd451c 248 RETSETUNDEF;
c9d5ac95 249 }
35cd451c
GS
250 }
251 else {
252 if (PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 253 DIE(aTHX_ PL_no_symref, sym, "a symbol");
35cd451c
GS
254 sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
255 }
93a17b20 256 }
79072805 257 }
533c011a
NIS
258 if (PL_op->op_private & OPpLVAL_INTRO)
259 save_gp((GV*)sv, !(PL_op->op_flags & OPf_SPECIAL));
79072805
LW
260 SETs(sv);
261 RETURN;
262}
263
79072805
LW
264PP(pp_rv2sv)
265{
4e35701f 266 djSP; dTOPss;
79072805 267
ed6116ce 268 if (SvROK(sv)) {
a0d0e21e 269 wasref:
f5284f61
IZ
270 tryAMAGICunDEREF(to_sv);
271
ed6116ce 272 sv = SvRV(sv);
79072805
LW
273 switch (SvTYPE(sv)) {
274 case SVt_PVAV:
275 case SVt_PVHV:
276 case SVt_PVCV:
cea2e8a9 277 DIE(aTHX_ "Not a SCALAR reference");
79072805
LW
278 }
279 }
280 else {
f12c7020 281 GV *gv = (GV*)sv;
748a9306 282 char *sym;
c9d5ac95 283 STRLEN len;
748a9306 284
463ee0b2 285 if (SvTYPE(gv) != SVt_PVGV) {
a0d0e21e
LW
286 if (SvGMAGICAL(sv)) {
287 mg_get(sv);
288 if (SvROK(sv))
289 goto wasref;
290 }
291 if (!SvOK(sv)) {
533c011a
NIS
292 if (PL_op->op_flags & OPf_REF ||
293 PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 294 DIE(aTHX_ PL_no_usym, "a SCALAR");
599cee73 295 if (ckWARN(WARN_UNINITIALIZED))
b89fed5f 296 report_uninit();
a0d0e21e
LW
297 RETSETUNDEF;
298 }
c9d5ac95 299 sym = SvPV(sv, len);
35cd451c
GS
300 if ((PL_op->op_flags & OPf_SPECIAL) &&
301 !(PL_op->op_flags & OPf_MOD))
302 {
303 gv = (GV*)gv_fetchpv(sym, FALSE, SVt_PV);
c9d5ac95
GS
304 if (!gv
305 && (!is_gv_magical(sym,len,0)
306 || !(gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV))))
307 {
35cd451c 308 RETSETUNDEF;
c9d5ac95 309 }
35cd451c
GS
310 }
311 else {
312 if (PL_op->op_private & HINT_STRICT_REFS)
cea2e8a9 313 DIE(aTHX_ PL_no_symref, sym, "a SCALAR");
35cd451c
GS
314 gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PV);
315 }
463ee0b2
LW
316 }
317 sv = GvSV(gv);
a0d0e21e 318 }
533c011a
NIS
319 if (PL_op->op_flags & OPf_MOD) {
320 if (PL_op->op_private & OPpLVAL_INTRO)
a0d0e21e 321 sv = save_scalar((GV*)TOPs);
533c011a
NIS
322 else if (PL_op->op_private & OPpDEREF)
323 vivify_ref(sv, PL_op->op_private & OPpDEREF);
79072805 324 }
a0d0e21e 325 SETs(sv);
79072805
LW
326 RETURN;
327}
328
329PP(pp_av2arylen)
330{
4e35701f 331 djSP;
79072805
LW
332 AV *av = (AV*)TOPs;
333 SV *sv = AvARYLEN(av);
334 if (!sv) {
335 AvARYLEN(av) = sv = NEWSV(0,0);
336 sv_upgrade(sv, SVt_IV);
337 sv_magic(sv, (SV*)av, '#', Nullch, 0);
338 }
339 SETs(sv);
340 RETURN;
341}
342
a0d0e21e
LW
343PP(pp_pos)
344{
4e35701f 345 djSP; dTARGET; dPOPss;
8ec5e241 346
533c011a 347 if (PL_op->op_flags & OPf_MOD) {
5f05dabc 348 if (SvTYPE(TARG) < SVt_PVLV) {
349 sv_upgrade(TARG, SVt_PVLV);
350 sv_magic(TARG, Nullsv, '.', Nullch, 0);
351 }
352
353 LvTYPE(TARG) = '.';
6ff81951
GS
354 if (LvTARG(TARG) != sv) {
355 if (LvTARG(TARG))
356 SvREFCNT_dec(LvTARG(TARG));
357 LvTARG(TARG) = SvREFCNT_inc(sv);
358 }
a0d0e21e
LW
359 PUSHs(TARG); /* no SvSETMAGIC */
360 RETURN;
361 }
362 else {
8ec5e241 363 MAGIC* mg;
a0d0e21e
LW
364
365 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
366 mg = mg_find(sv, 'g');
565764a8 367 if (mg && mg->mg_len >= 0) {
a0ed51b3 368 I32 i = mg->mg_len;
7e2040f0 369 if (DO_UTF8(sv))
a0ed51b3
LW
370 sv_pos_b2u(sv, &i);
371 PUSHi(i + PL_curcop->cop_arybase);
a0d0e21e
LW
372 RETURN;
373 }
374 }
375 RETPUSHUNDEF;
376 }
377}
378
79072805
LW
379PP(pp_rv2cv)
380{
4e35701f 381 djSP;
79072805
LW
382 GV *gv;
383 HV *stash;
8990e307 384
4633a7c4
LW
385 /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
386 /* (But not in defined().) */
533c011a 387 CV *cv = sv_2cv(TOPs, &stash, &gv, !(PL_op->op_flags & OPf_SPECIAL));
07055b4c
CS
388 if (cv) {
389 if (CvCLONE(cv))
390 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
cd06dffe 391 if ((PL_op->op_private & OPpLVAL_INTRO) && !CvLVALUE(cv))
d470f89e 392 DIE(aTHX_ "Can't modify non-lvalue subroutine call");
07055b4c
CS
393 }
394 else
3280af22 395 cv = (CV*)&PL_sv_undef;
79072805
LW
396 SETs((SV*)cv);
397 RETURN;
398}
399
c07a80fd 400PP(pp_prototype)
401{
4e35701f 402 djSP;
c07a80fd 403 CV *cv;
404 HV *stash;
405 GV *gv;
406 SV *ret;
407
3280af22 408 ret = &PL_sv_undef;
b6c543e3
IZ
409 if (SvPOK(TOPs) && SvCUR(TOPs) >= 7) {
410 char *s = SvPVX(TOPs);
411 if (strnEQ(s, "CORE::", 6)) {
412 int code;
413
414 code = keyword(s + 6, SvCUR(TOPs) - 6);
415 if (code < 0) { /* Overridable. */
416#define MAX_ARGS_OP ((sizeof(I32) - 1) * 2)
417 int i = 0, n = 0, seen_question = 0;
418 I32 oa;
419 char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
420
421 while (i < MAXO) { /* The slow way. */
22c35a8c
GS
422 if (strEQ(s + 6, PL_op_name[i])
423 || strEQ(s + 6, PL_op_desc[i]))
424 {
b6c543e3 425 goto found;
22c35a8c 426 }
b6c543e3
IZ
427 i++;
428 }
429 goto nonesuch; /* Should not happen... */
430 found:
22c35a8c 431 oa = PL_opargs[i] >> OASHIFT;
b6c543e3
IZ
432 while (oa) {
433 if (oa & OA_OPTIONAL) {
434 seen_question = 1;
435 str[n++] = ';';
ef54e1a4 436 }
1c1fc3ea 437 else if (n && str[0] == ';' && seen_question)
b6c543e3
IZ
438 goto set; /* XXXX system, exec */
439 if ((oa & (OA_OPTIONAL - 1)) >= OA_AVREF
440 && (oa & (OA_OPTIONAL - 1)) <= OA_HVREF) {
441 str[n++] = '\\';
442 }
443 /* What to do with R ((un)tie, tied, (sys)read, recv)? */
444 str[n++] = ("?$@@%&*$")[oa & (OA_OPTIONAL - 1)];
445 oa = oa >> 4;
446 }
447 str[n++] = '\0';
79cb57f6 448 ret = sv_2mortal(newSVpvn(str, n - 1));
ef54e1a4
JH
449 }
450 else if (code) /* Non-Overridable */
b6c543e3
IZ
451 goto set;
452 else { /* None such */
453 nonesuch:
d470f89e 454 DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
b6c543e3
IZ
455 }
456 }
457 }
c07a80fd 458 cv = sv_2cv(TOPs, &stash, &gv, FALSE);
5f05dabc 459 if (cv && SvPOK(cv))
79cb57f6 460 ret = sv_2mortal(newSVpvn(SvPVX(cv), SvCUR(cv)));
b6c543e3 461 set:
c07a80fd 462 SETs(ret);
463 RETURN;
464}
465
a0d0e21e
LW
466PP(pp_anoncode)
467{
4e35701f 468 djSP;
533c011a 469 CV* cv = (CV*)PL_curpad[PL_op->op_targ];
a5f75d66 470 if (CvCLONE(cv))
b355b4e0 471 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
5f05dabc 472 EXTEND(SP,1);
748a9306 473 PUSHs((SV*)cv);
a0d0e21e
LW
474 RETURN;
475}
476
477PP(pp_srefgen)
79072805 478{
4e35701f 479 djSP;
71be2cbc 480 *SP = refto(*SP);
79072805 481 RETURN;
8ec5e241 482}
a0d0e21e
LW
483
484PP(pp_refgen)
485{
4e35701f 486 djSP; dMARK;
a0d0e21e 487 if (GIMME != G_ARRAY) {
5f0b1d4e
GS
488 if (++MARK <= SP)
489 *MARK = *SP;
490 else
3280af22 491 *MARK = &PL_sv_undef;
5f0b1d4e
GS
492 *MARK = refto(*MARK);
493 SP = MARK;
494 RETURN;
a0d0e21e 495 }
bbce6d69 496 EXTEND_MORTAL(SP - MARK);
71be2cbc 497 while (++MARK <= SP)
498 *MARK = refto(*MARK);
a0d0e21e 499 RETURN;
79072805
LW
500}
501
76e3520e 502STATIC SV*
cea2e8a9 503S_refto(pTHX_ SV *sv)
71be2cbc 504{
505 SV* rv;
506
507 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
508 if (LvTARGLEN(sv))
68dc0745 509 vivify_defelem(sv);
510 if (!(sv = LvTARG(sv)))
3280af22 511 sv = &PL_sv_undef;
0dd88869 512 else
a6c40364 513 (void)SvREFCNT_inc(sv);
71be2cbc 514 }
d8b46c1b
GS
515 else if (SvTYPE(sv) == SVt_PVAV) {
516 if (!AvREAL((AV*)sv) && AvREIFY((AV*)sv))
517 av_reify((AV*)sv);
518 SvTEMP_off(sv);
519 (void)SvREFCNT_inc(sv);
520 }
71be2cbc 521 else if (SvPADTMP(sv))
522 sv = newSVsv(sv);
523 else {
524 SvTEMP_off(sv);
525 (void)SvREFCNT_inc(sv);
526 }
527 rv = sv_newmortal();
528 sv_upgrade(rv, SVt_RV);
529 SvRV(rv) = sv;
530 SvROK_on(rv);
531 return rv;
532}
533
79072805
LW
534PP(pp_ref)
535{
4e35701f 536 djSP; dTARGET;
463ee0b2 537 SV *sv;
79072805
LW
538 char *pv;
539
a0d0e21e 540 sv = POPs;
f12c7020 541
542 if (sv && SvGMAGICAL(sv))
8ec5e241 543 mg_get(sv);
f12c7020 544
a0d0e21e 545 if (!sv || !SvROK(sv))
4633a7c4 546 RETPUSHNO;
79072805 547
ed6116ce 548 sv = SvRV(sv);
a0d0e21e 549 pv = sv_reftype(sv,TRUE);
463ee0b2 550 PUSHp(pv, strlen(pv));
79072805
LW
551 RETURN;
552}
553
554PP(pp_bless)
555{
4e35701f 556 djSP;
463ee0b2 557 HV *stash;
79072805 558
463ee0b2 559 if (MAXARG == 1)
11faa288 560 stash = CopSTASH(PL_curcop);
7b8d334a
GS
561 else {
562 SV *ssv = POPs;
563 STRLEN len;
564 char *ptr = SvPV(ssv,len);
e476b1b5
GS
565 if (ckWARN(WARN_MISC) && len == 0)
566 Perl_warner(aTHX_ WARN_MISC,
599cee73 567 "Explicit blessing to '' (assuming package main)");
7b8d334a
GS
568 stash = gv_stashpvn(ptr, len, TRUE);
569 }
a0d0e21e 570
5d3fdfeb 571 (void)sv_bless(TOPs, stash);
79072805
LW
572 RETURN;
573}
574
fb73857a 575PP(pp_gelem)
576{
577 GV *gv;
578 SV *sv;
76e3520e 579 SV *tmpRef;
fb73857a 580 char *elem;
4e35701f 581 djSP;
2d8e6c8d
GS
582 STRLEN n_a;
583
fb73857a 584 sv = POPs;
2d8e6c8d 585 elem = SvPV(sv, n_a);
fb73857a 586 gv = (GV*)POPs;
76e3520e 587 tmpRef = Nullsv;
fb73857a 588 sv = Nullsv;
589 switch (elem ? *elem : '\0')
590 {
591 case 'A':
592 if (strEQ(elem, "ARRAY"))
76e3520e 593 tmpRef = (SV*)GvAV(gv);
fb73857a 594 break;
595 case 'C':
596 if (strEQ(elem, "CODE"))
76e3520e 597 tmpRef = (SV*)GvCVu(gv);
fb73857a 598 break;
599 case 'F':
600 if (strEQ(elem, "FILEHANDLE")) /* XXX deprecate in 5.005 */
76e3520e 601 tmpRef = (SV*)GvIOp(gv);
f4d13ee9
JH
602 else
603 if (strEQ(elem, "FORMAT"))
604 tmpRef = (SV*)GvFORM(gv);
fb73857a 605 break;
606 case 'G':
607 if (strEQ(elem, "GLOB"))
76e3520e 608 tmpRef = (SV*)gv;
fb73857a 609 break;
610 case 'H':
611 if (strEQ(elem, "HASH"))
76e3520e 612 tmpRef = (SV*)GvHV(gv);
fb73857a 613 break;
614 case 'I':
615 if (strEQ(elem, "IO"))
76e3520e 616 tmpRef = (SV*)GvIOp(gv);
fb73857a 617 break;
618 case 'N':
619 if (strEQ(elem, "NAME"))
79cb57f6 620 sv = newSVpvn(GvNAME(gv), GvNAMELEN(gv));
fb73857a 621 break;
622 case 'P':
623 if (strEQ(elem, "PACKAGE"))
624 sv = newSVpv(HvNAME(GvSTASH(gv)), 0);
625 break;
626 case 'S':
627 if (strEQ(elem, "SCALAR"))
76e3520e 628 tmpRef = GvSV(gv);
fb73857a 629 break;
630 }
76e3520e
GS
631 if (tmpRef)
632 sv = newRV(tmpRef);
fb73857a 633 if (sv)
634 sv_2mortal(sv);
635 else
3280af22 636 sv = &PL_sv_undef;
fb73857a 637 XPUSHs(sv);
638 RETURN;
639}
640
a0d0e21e 641/* Pattern matching */
79072805 642
a0d0e21e 643PP(pp_study)
79072805 644{
4e35701f 645 djSP; dPOPss;
a0d0e21e
LW
646 register unsigned char *s;
647 register I32 pos;
648 register I32 ch;
649 register I32 *sfirst;
650 register I32 *snext;
a0d0e21e
LW
651 STRLEN len;
652
3280af22 653 if (sv == PL_lastscream) {
1e422769 654 if (SvSCREAM(sv))
655 RETPUSHYES;
656 }
c07a80fd 657 else {
3280af22
NIS
658 if (PL_lastscream) {
659 SvSCREAM_off(PL_lastscream);
660 SvREFCNT_dec(PL_lastscream);
c07a80fd 661 }
3280af22 662 PL_lastscream = SvREFCNT_inc(sv);
c07a80fd 663 }
1e422769 664
665 s = (unsigned char*)(SvPV(sv, len));
666 pos = len;
667 if (pos <= 0)
668 RETPUSHNO;
3280af22
NIS
669 if (pos > PL_maxscream) {
670 if (PL_maxscream < 0) {
671 PL_maxscream = pos + 80;
672 New(301, PL_screamfirst, 256, I32);
673 New(302, PL_screamnext, PL_maxscream, I32);
79072805
LW
674 }
675 else {
3280af22
NIS
676 PL_maxscream = pos + pos / 4;
677 Renew(PL_screamnext, PL_maxscream, I32);
79072805 678 }
79072805 679 }
a0d0e21e 680
3280af22
NIS
681 sfirst = PL_screamfirst;
682 snext = PL_screamnext;
a0d0e21e
LW
683
684 if (!sfirst || !snext)
cea2e8a9 685 DIE(aTHX_ "do_study: out of memory");
a0d0e21e
LW
686
687 for (ch = 256; ch; --ch)
688 *sfirst++ = -1;
689 sfirst -= 256;
690
691 while (--pos >= 0) {
692 ch = s[pos];
693 if (sfirst[ch] >= 0)
694 snext[pos] = sfirst[ch] - pos;
695 else
696 snext[pos] = -pos;
697 sfirst[ch] = pos;
79072805
LW
698 }
699
c07a80fd 700 SvSCREAM_on(sv);
464e2e8a 701 sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
1e422769 702 RETPUSHYES;
79072805
LW
703}
704
a0d0e21e 705PP(pp_trans)
79072805 706{
4e35701f 707 djSP; dTARG;
a0d0e21e
LW
708 SV *sv;
709
533c011a 710 if (PL_op->op_flags & OPf_STACKED)
a0d0e21e 711 sv = POPs;
79072805 712 else {
54b9620d 713 sv = DEFSV;
a0d0e21e 714 EXTEND(SP,1);
79072805 715 }
adbc6bb1 716 TARG = sv_newmortal();
4757a243 717 PUSHi(do_trans(sv));
a0d0e21e 718 RETURN;
79072805
LW
719}
720
a0d0e21e 721/* Lvalue operators. */
79072805 722
a0d0e21e
LW
723PP(pp_schop)
724{
4e35701f 725 djSP; dTARGET;
a0d0e21e
LW
726 do_chop(TARG, TOPs);
727 SETTARG;
728 RETURN;
79072805
LW
729}
730
a0d0e21e 731PP(pp_chop)
79072805 732{
4e35701f 733 djSP; dMARK; dTARGET;
a0d0e21e
LW
734 while (SP > MARK)
735 do_chop(TARG, POPs);
736 PUSHTARG;
737 RETURN;
79072805
LW
738}
739
a0d0e21e 740PP(pp_schomp)
79072805 741{
4e35701f 742 djSP; dTARGET;
a0d0e21e
LW
743 SETi(do_chomp(TOPs));
744 RETURN;
79072805
LW
745}
746
a0d0e21e 747PP(pp_chomp)
79072805 748{
4e35701f 749 djSP; dMARK; dTARGET;
a0d0e21e 750 register I32 count = 0;
8ec5e241 751
a0d0e21e
LW
752 while (SP > MARK)
753 count += do_chomp(POPs);
754 PUSHi(count);
755 RETURN;
79072805
LW
756}
757
a0d0e21e 758PP(pp_defined)
463ee0b2 759{
4e35701f 760 djSP;
a0d0e21e
LW
761 register SV* sv;
762
763 sv = POPs;
764 if (!sv || !SvANY(sv))
765 RETPUSHNO;
766 switch (SvTYPE(sv)) {
767 case SVt_PVAV:
6051dbdb 768 if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
a0d0e21e
LW
769 RETPUSHYES;
770 break;
771 case SVt_PVHV:
6051dbdb 772 if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv,'P')))
a0d0e21e
LW
773 RETPUSHYES;
774 break;
775 case SVt_PVCV:
776 if (CvROOT(sv) || CvXSUB(sv))
777 RETPUSHYES;
778 break;
779 default:
780 if (SvGMAGICAL(sv))
781 mg_get(sv);
782 if (SvOK(sv))
783 RETPUSHYES;
784 }
785 RETPUSHNO;
463ee0b2
LW
786}
787
a0d0e21e
LW
788PP(pp_undef)
789{
4e35701f 790 djSP;
a0d0e21e
LW
791 SV *sv;
792
533c011a 793 if (!PL_op->op_private) {
774d564b 794 EXTEND(SP, 1);
a0d0e21e 795 RETPUSHUNDEF;
774d564b 796 }
79072805 797
a0d0e21e
LW
798 sv = POPs;
799 if (!sv)
800 RETPUSHUNDEF;
85e6fe83 801
6fc92669
GS
802 if (SvTHINKFIRST(sv))
803 sv_force_normal(sv);
85e6fe83 804
a0d0e21e
LW
805 switch (SvTYPE(sv)) {
806 case SVt_NULL:
807 break;
808 case SVt_PVAV:
809 av_undef((AV*)sv);
810 break;
811 case SVt_PVHV:
812 hv_undef((HV*)sv);
813 break;
814 case SVt_PVCV:
e476b1b5
GS
815 if (ckWARN(WARN_MISC) && cv_const_sv((CV*)sv))
816 Perl_warner(aTHX_ WARN_MISC, "Constant subroutine %s undefined",
54310121 817 CvANON((CV*)sv) ? "(anonymous)" : GvENAME(CvGV((CV*)sv)));
9607fc9c 818 /* FALL THROUGH */
819 case SVt_PVFM:
6fc92669
GS
820 {
821 /* let user-undef'd sub keep its identity */
822 GV* gv = (GV*)SvREFCNT_inc(CvGV((CV*)sv));
823 cv_undef((CV*)sv);
824 CvGV((CV*)sv) = gv;
825 }
a0d0e21e 826 break;
8e07c86e 827 case SVt_PVGV:
44a8e56a 828 if (SvFAKE(sv))
3280af22 829 SvSetMagicSV(sv, &PL_sv_undef);
20408e3c
GS
830 else {
831 GP *gp;
832 gp_free((GV*)sv);
833 Newz(602, gp, 1, GP);
834 GvGP(sv) = gp_ref(gp);
835 GvSV(sv) = NEWSV(72,0);
57843af0 836 GvLINE(sv) = CopLINE(PL_curcop);
20408e3c
GS
837 GvEGV(sv) = (GV*)sv;
838 GvMULTI_on(sv);
839 }
44a8e56a 840 break;
a0d0e21e 841 default:
1e422769 842 if (SvTYPE(sv) >= SVt_PV && SvPVX(sv) && SvLEN(sv)) {
4633a7c4
LW
843 (void)SvOOK_off(sv);
844 Safefree(SvPVX(sv));
845 SvPV_set(sv, Nullch);
846 SvLEN_set(sv, 0);
a0d0e21e 847 }
4633a7c4
LW
848 (void)SvOK_off(sv);
849 SvSETMAGIC(sv);
79072805 850 }
a0d0e21e
LW
851
852 RETPUSHUNDEF;
79072805
LW
853}
854
a0d0e21e 855PP(pp_predec)
79072805 856{
4e35701f 857 djSP;
68dc0745 858 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
d470f89e 859 DIE(aTHX_ PL_no_modify);
25da4f38 860 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
55497cff 861 SvIVX(TOPs) != IV_MIN)
862 {
748a9306 863 --SvIVX(TOPs);
55497cff 864 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
865 }
866 else
867 sv_dec(TOPs);
a0d0e21e
LW
868 SvSETMAGIC(TOPs);
869 return NORMAL;
870}
79072805 871
a0d0e21e
LW
872PP(pp_postinc)
873{
4e35701f 874 djSP; dTARGET;
68dc0745 875 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
d470f89e 876 DIE(aTHX_ PL_no_modify);
a0d0e21e 877 sv_setsv(TARG, TOPs);
25da4f38 878 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
55497cff 879 SvIVX(TOPs) != IV_MAX)
880 {
748a9306 881 ++SvIVX(TOPs);
55497cff 882 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
883 }
884 else
885 sv_inc(TOPs);
a0d0e21e
LW
886 SvSETMAGIC(TOPs);
887 if (!SvOK(TARG))
888 sv_setiv(TARG, 0);
889 SETs(TARG);
890 return NORMAL;
891}
79072805 892
a0d0e21e
LW
893PP(pp_postdec)
894{
4e35701f 895 djSP; dTARGET;
43192e07 896 if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
d470f89e 897 DIE(aTHX_ PL_no_modify);
a0d0e21e 898 sv_setsv(TARG, TOPs);
25da4f38 899 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
55497cff 900 SvIVX(TOPs) != IV_MIN)
901 {
748a9306 902 --SvIVX(TOPs);
55497cff 903 SvFLAGS(TOPs) &= ~(SVp_NOK|SVp_POK);
748a9306
LW
904 }
905 else
906 sv_dec(TOPs);
a0d0e21e
LW
907 SvSETMAGIC(TOPs);
908 SETs(TARG);
909 return NORMAL;
910}
79072805 911
a0d0e21e
LW
912/* Ordinary operators. */
913
914PP(pp_pow)
915{
8ec5e241 916 djSP; dATARGET; tryAMAGICbin(pow,opASSIGN);
a0d0e21e
LW
917 {
918 dPOPTOPnnrl;
73b309ea 919 SETn( Perl_pow( left, right) );
a0d0e21e 920 RETURN;
93a17b20 921 }
a0d0e21e
LW
922}
923
924PP(pp_multiply)
925{
8ec5e241 926 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
a0d0e21e
LW
927 {
928 dPOPTOPnnrl;
929 SETn( left * right );
930 RETURN;
79072805 931 }
a0d0e21e
LW
932}
933
934PP(pp_divide)
935{
8ec5e241 936 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
a0d0e21e 937 {
77676ba1 938 dPOPPOPnnrl;
65202027 939 NV value;
7a4c00b4 940 if (right == 0.0)
cea2e8a9 941 DIE(aTHX_ "Illegal division by zero");
a0d0e21e
LW
942#ifdef SLOPPYDIVIDE
943 /* insure that 20./5. == 4. */
944 {
7a4c00b4 945 IV k;
65202027
DS
946 if ((NV)I_V(left) == left &&
947 (NV)I_V(right) == right &&
7a4c00b4 948 (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) {
a0d0e21e 949 value = k;
ef54e1a4
JH
950 }
951 else {
7a4c00b4 952 value = left / right;
79072805 953 }
a0d0e21e
LW
954 }
955#else
7a4c00b4 956 value = left / right;
a0d0e21e
LW
957#endif
958 PUSHn( value );
959 RETURN;
79072805 960 }
a0d0e21e
LW
961}
962
963PP(pp_modulo)
964{
76e3520e 965 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
a0d0e21e 966 {
787eafbd
IZ
967 UV left;
968 UV right;
969 bool left_neg;
970 bool right_neg;
971 bool use_double = 0;
65202027
DS
972 NV dright;
973 NV dleft;
787eafbd 974
d658dc55 975 if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
787eafbd
IZ
976 IV i = SvIVX(POPs);
977 right = (right_neg = (i < 0)) ? -i : i;
978 }
979 else {
980 dright = POPn;
981 use_double = 1;
982 right_neg = dright < 0;
983 if (right_neg)
984 dright = -dright;
985 }
a0d0e21e 986
d658dc55 987 if (!use_double && SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs)) {
787eafbd
IZ
988 IV i = SvIVX(POPs);
989 left = (left_neg = (i < 0)) ? -i : i;
990 }
991 else {
992 dleft = POPn;
993 if (!use_double) {
a1bd196e
GS
994 use_double = 1;
995 dright = right;
787eafbd
IZ
996 }
997 left_neg = dleft < 0;
998 if (left_neg)
999 dleft = -dleft;
1000 }
68dc0745 1001
787eafbd 1002 if (use_double) {
65202027 1003 NV dans;
787eafbd
IZ
1004
1005#if 1
787eafbd
IZ
1006/* Somehow U_V is pessimized even if CASTFLAGS is 0 */
1007# if CASTFLAGS & 2
1008# define CAST_D2UV(d) U_V(d)
1009# else
1010# define CAST_D2UV(d) ((UV)(d))
1011# endif
a1bd196e
GS
1012 /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
1013 * or, in other words, precision of UV more than of NV.
1014 * But in fact the approach below turned out to be an
1015 * optimization - floor() may be slow */
787eafbd
IZ
1016 if (dright <= UV_MAX && dleft <= UV_MAX) {
1017 right = CAST_D2UV(dright);
1018 left = CAST_D2UV(dleft);
1019 goto do_uv;
1020 }
1021#endif
1022
1023 /* Backward-compatibility clause: */
73b309ea
JH
1024 dright = Perl_floor(dright + 0.5);
1025 dleft = Perl_floor(dleft + 0.5);
787eafbd
IZ
1026
1027 if (!dright)
cea2e8a9 1028 DIE(aTHX_ "Illegal modulus zero");
787eafbd 1029
65202027 1030 dans = Perl_fmod(dleft, dright);
787eafbd
IZ
1031 if ((left_neg != right_neg) && dans)
1032 dans = dright - dans;
1033 if (right_neg)
1034 dans = -dans;
1035 sv_setnv(TARG, dans);
1036 }
1037 else {
1038 UV ans;
1039
1040 do_uv:
1041 if (!right)
cea2e8a9 1042 DIE(aTHX_ "Illegal modulus zero");
787eafbd
IZ
1043
1044 ans = left % right;
1045 if ((left_neg != right_neg) && ans)
1046 ans = right - ans;
1047 if (right_neg) {
1048 /* XXX may warn: unary minus operator applied to unsigned type */
1049 /* could change -foo to be (~foo)+1 instead */
1050 if (ans <= ~((UV)IV_MAX)+1)
1051 sv_setiv(TARG, ~ans+1);
1052 else
65202027 1053 sv_setnv(TARG, -(NV)ans);
787eafbd
IZ
1054 }
1055 else
1056 sv_setuv(TARG, ans);
1057 }
1058 PUSHTARG;
1059 RETURN;
79072805 1060 }
a0d0e21e 1061}
79072805 1062
a0d0e21e
LW
1063PP(pp_repeat)
1064{
4e35701f 1065 djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
748a9306 1066 {
a0d0e21e 1067 register I32 count = POPi;
533c011a 1068 if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
a0d0e21e
LW
1069 dMARK;
1070 I32 items = SP - MARK;
1071 I32 max;
79072805 1072
a0d0e21e
LW
1073 max = items * count;
1074 MEXTEND(MARK, max);
1075 if (count > 1) {
1076 while (SP > MARK) {
1077 if (*SP)
1078 SvTEMP_off((*SP));
1079 SP--;
79072805 1080 }
a0d0e21e
LW
1081 MARK++;
1082 repeatcpy((char*)(MARK + items), (char*)MARK,
1083 items * sizeof(SV*), count - 1);
1084 SP += max;
79072805 1085 }
a0d0e21e
LW
1086 else if (count <= 0)
1087 SP -= items;
79072805 1088 }
a0d0e21e 1089 else { /* Note: mark already snarfed by pp_list */
dfcb284a 1090 SV *tmpstr = POPs;
a0d0e21e 1091 STRLEN len;
3aa33fe5 1092 bool isutf = DO_UTF8(tmpstr);
a0d0e21e 1093
a0d0e21e
LW
1094 SvSetSV(TARG, tmpstr);
1095 SvPV_force(TARG, len);
8ebc5c01 1096 if (count != 1) {
1097 if (count < 1)
1098 SvCUR_set(TARG, 0);
1099 else {
1100 SvGROW(TARG, (count * len) + 1);
a0d0e21e 1101 repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1);
8ebc5c01 1102 SvCUR(TARG) *= count;
7a4c00b4 1103 }
a0d0e21e 1104 *SvEND(TARG) = '\0';
a0d0e21e 1105 }
dfcb284a
GS
1106 if (isutf)
1107 (void)SvPOK_only_UTF8(TARG);
1108 else
1109 (void)SvPOK_only(TARG);
a0d0e21e 1110 PUSHTARG;
79072805 1111 }
a0d0e21e 1112 RETURN;
748a9306 1113 }
a0d0e21e 1114}
79072805 1115
a0d0e21e
LW
1116PP(pp_subtract)
1117{
8ec5e241 1118 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
a0d0e21e 1119 {
7a4c00b4 1120 dPOPTOPnnrl_ul;
a0d0e21e
LW
1121 SETn( left - right );
1122 RETURN;
79072805 1123 }
a0d0e21e 1124}
79072805 1125
a0d0e21e
LW
1126PP(pp_left_shift)
1127{
8ec5e241 1128 djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
a0d0e21e 1129 {
972b05a9 1130 IV shift = POPi;
d0ba1bd2 1131 if (PL_op->op_private & HINT_INTEGER) {
972b05a9
JH
1132 IV i = TOPi;
1133 SETi(i << shift);
d0ba1bd2
JH
1134 }
1135 else {
972b05a9
JH
1136 UV u = TOPu;
1137 SETu(u << shift);
d0ba1bd2 1138 }
55497cff 1139 RETURN;
79072805 1140 }
a0d0e21e 1141}
79072805 1142
a0d0e21e
LW
1143PP(pp_right_shift)
1144{
8ec5e241 1145 djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN);
a0d0e21e 1146 {
972b05a9 1147 IV shift = POPi;
d0ba1bd2 1148 if (PL_op->op_private & HINT_INTEGER) {
972b05a9
JH
1149 IV i = TOPi;
1150 SETi(i >> shift);
d0ba1bd2
JH
1151 }
1152 else {
972b05a9
JH
1153 UV u = TOPu;
1154 SETu(u >> shift);
d0ba1bd2 1155 }
a0d0e21e 1156 RETURN;
93a17b20 1157 }
79072805
LW
1158}
1159
a0d0e21e 1160PP(pp_lt)
79072805 1161{
8ec5e241 1162 djSP; tryAMAGICbinSET(lt,0);
a0d0e21e
LW
1163 {
1164 dPOPnv;
54310121 1165 SETs(boolSV(TOPn < value));
a0d0e21e 1166 RETURN;
79072805 1167 }
a0d0e21e 1168}
79072805 1169
a0d0e21e
LW
1170PP(pp_gt)
1171{
8ec5e241 1172 djSP; tryAMAGICbinSET(gt,0);
a0d0e21e
LW
1173 {
1174 dPOPnv;
54310121 1175 SETs(boolSV(TOPn > value));
a0d0e21e 1176 RETURN;
79072805 1177 }
a0d0e21e
LW
1178}
1179
1180PP(pp_le)
1181{
8ec5e241 1182 djSP; tryAMAGICbinSET(le,0);
a0d0e21e
LW
1183 {
1184 dPOPnv;
54310121 1185 SETs(boolSV(TOPn <= value));
a0d0e21e 1186 RETURN;
79072805 1187 }
a0d0e21e
LW
1188}
1189
1190PP(pp_ge)
1191{
8ec5e241 1192 djSP; tryAMAGICbinSET(ge,0);
a0d0e21e
LW
1193 {
1194 dPOPnv;
54310121 1195 SETs(boolSV(TOPn >= value));
a0d0e21e 1196 RETURN;
79072805 1197 }
a0d0e21e 1198}
79072805 1199
a0d0e21e
LW
1200PP(pp_ne)
1201{
8ec5e241 1202 djSP; tryAMAGICbinSET(ne,0);
a0d0e21e
LW
1203 {
1204 dPOPnv;
54310121 1205 SETs(boolSV(TOPn != value));
a0d0e21e
LW
1206 RETURN;
1207 }
79072805
LW
1208}
1209
a0d0e21e 1210PP(pp_ncmp)
79072805 1211{
8ec5e241 1212 djSP; dTARGET; tryAMAGICbin(ncmp,0);
a0d0e21e
LW
1213 {
1214 dPOPTOPnnrl;
1215 I32 value;
79072805 1216
a3540c92 1217#ifdef Perl_isnan
1ad04cfd
JH
1218 if (Perl_isnan(left) || Perl_isnan(right)) {
1219 SETs(&PL_sv_undef);
1220 RETURN;
1221 }
1222 value = (left > right) - (left < right);
1223#else
ff0cee69 1224 if (left == right)
a0d0e21e 1225 value = 0;
a0d0e21e
LW
1226 else if (left < right)
1227 value = -1;
44a8e56a 1228 else if (left > right)
1229 value = 1;
1230 else {
3280af22 1231 SETs(&PL_sv_undef);
44a8e56a 1232 RETURN;
1233 }
1ad04cfd 1234#endif
a0d0e21e
LW
1235 SETi(value);
1236 RETURN;
79072805 1237 }
a0d0e21e 1238}
79072805 1239
a0d0e21e
LW
1240PP(pp_slt)
1241{
8ec5e241 1242 djSP; tryAMAGICbinSET(slt,0);
a0d0e21e
LW
1243 {
1244 dPOPTOPssrl;
533c011a 1245 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1246 ? sv_cmp_locale(left, right)
1247 : sv_cmp(left, right));
54310121 1248 SETs(boolSV(cmp < 0));
a0d0e21e
LW
1249 RETURN;
1250 }
79072805
LW
1251}
1252
a0d0e21e 1253PP(pp_sgt)
79072805 1254{
8ec5e241 1255 djSP; tryAMAGICbinSET(sgt,0);
a0d0e21e
LW
1256 {
1257 dPOPTOPssrl;
533c011a 1258 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1259 ? sv_cmp_locale(left, right)
1260 : sv_cmp(left, right));
54310121 1261 SETs(boolSV(cmp > 0));
a0d0e21e
LW
1262 RETURN;
1263 }
1264}
79072805 1265
a0d0e21e
LW
1266PP(pp_sle)
1267{
8ec5e241 1268 djSP; tryAMAGICbinSET(sle,0);
a0d0e21e
LW
1269 {
1270 dPOPTOPssrl;
533c011a 1271 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1272 ? sv_cmp_locale(left, right)
1273 : sv_cmp(left, right));
54310121 1274 SETs(boolSV(cmp <= 0));
a0d0e21e 1275 RETURN;
79072805 1276 }
79072805
LW
1277}
1278
a0d0e21e
LW
1279PP(pp_sge)
1280{
8ec5e241 1281 djSP; tryAMAGICbinSET(sge,0);
a0d0e21e
LW
1282 {
1283 dPOPTOPssrl;
533c011a 1284 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1285 ? sv_cmp_locale(left, right)
1286 : sv_cmp(left, right));
54310121 1287 SETs(boolSV(cmp >= 0));
a0d0e21e
LW
1288 RETURN;
1289 }
1290}
79072805 1291
36477c24 1292PP(pp_seq)
1293{
8ec5e241 1294 djSP; tryAMAGICbinSET(seq,0);
36477c24 1295 {
1296 dPOPTOPssrl;
54310121 1297 SETs(boolSV(sv_eq(left, right)));
a0d0e21e
LW
1298 RETURN;
1299 }
1300}
79072805 1301
a0d0e21e 1302PP(pp_sne)
79072805 1303{
8ec5e241 1304 djSP; tryAMAGICbinSET(sne,0);
a0d0e21e
LW
1305 {
1306 dPOPTOPssrl;
54310121 1307 SETs(boolSV(!sv_eq(left, right)));
a0d0e21e 1308 RETURN;
463ee0b2 1309 }
79072805
LW
1310}
1311
a0d0e21e 1312PP(pp_scmp)
79072805 1313{
4e35701f 1314 djSP; dTARGET; tryAMAGICbin(scmp,0);
a0d0e21e
LW
1315 {
1316 dPOPTOPssrl;
533c011a 1317 int cmp = ((PL_op->op_private & OPpLOCALE)
bbce6d69 1318 ? sv_cmp_locale(left, right)
1319 : sv_cmp(left, right));
1320 SETi( cmp );
a0d0e21e
LW
1321 RETURN;
1322 }
1323}
79072805 1324
55497cff 1325PP(pp_bit_and)
1326{
8ec5e241 1327 djSP; dATARGET; tryAMAGICbin(band,opASSIGN);
a0d0e21e
LW
1328 {
1329 dPOPTOPssrl;
4633a7c4 1330 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2 1331 if (PL_op->op_private & HINT_INTEGER) {
972b05a9
JH
1332 IV i = SvIV(left) & SvIV(right);
1333 SETi(i);
d0ba1bd2
JH
1334 }
1335 else {
972b05a9
JH
1336 UV u = SvUV(left) & SvUV(right);
1337 SETu(u);
d0ba1bd2 1338 }
a0d0e21e
LW
1339 }
1340 else {
533c011a 1341 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
1342 SETTARG;
1343 }
1344 RETURN;
1345 }
1346}
79072805 1347
a0d0e21e
LW
1348PP(pp_bit_xor)
1349{
8ec5e241 1350 djSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
a0d0e21e
LW
1351 {
1352 dPOPTOPssrl;
4633a7c4 1353 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2 1354 if (PL_op->op_private & HINT_INTEGER) {
972b05a9
JH
1355 IV i = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
1356 SETi(i);
d0ba1bd2
JH
1357 }
1358 else {
972b05a9
JH
1359 UV u = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
1360 SETu(u);
d0ba1bd2 1361 }
a0d0e21e
LW
1362 }
1363 else {
533c011a 1364 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
1365 SETTARG;
1366 }
1367 RETURN;
1368 }
1369}
79072805 1370
a0d0e21e
LW
1371PP(pp_bit_or)
1372{
8ec5e241 1373 djSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
a0d0e21e
LW
1374 {
1375 dPOPTOPssrl;
4633a7c4 1376 if (SvNIOKp(left) || SvNIOKp(right)) {
d0ba1bd2 1377 if (PL_op->op_private & HINT_INTEGER) {
972b05a9
JH
1378 IV i = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right);
1379 SETi(i);
d0ba1bd2
JH
1380 }
1381 else {
972b05a9
JH
1382 UV u = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right);
1383 SETu(u);
d0ba1bd2 1384 }
a0d0e21e
LW
1385 }
1386 else {
533c011a 1387 do_vop(PL_op->op_type, TARG, left, right);
a0d0e21e
LW
1388 SETTARG;
1389 }
1390 RETURN;
79072805 1391 }
a0d0e21e 1392}
79072805 1393
a0d0e21e
LW
1394PP(pp_negate)
1395{
4e35701f 1396 djSP; dTARGET; tryAMAGICun(neg);
a0d0e21e
LW
1397 {
1398 dTOPss;
4633a7c4
LW
1399 if (SvGMAGICAL(sv))
1400 mg_get(sv);
9b0e499b
GS
1401 if (SvIOKp(sv) && !SvNOKp(sv) && !SvPOKp(sv)) {
1402 if (SvIsUV(sv)) {
1403 if (SvIVX(sv) == IV_MIN) {
1404 SETi(SvIVX(sv)); /* special case: -((UV)IV_MAX+1) == IV_MIN */
1405 RETURN;
1406 }
1407 else if (SvUVX(sv) <= IV_MAX) {
beccb14c 1408 SETi(-SvIVX(sv));
9b0e499b
GS
1409 RETURN;
1410 }
1411 }
1412 else if (SvIVX(sv) != IV_MIN) {
1413 SETi(-SvIVX(sv));
1414 RETURN;
1415 }
1416 }
1417 if (SvNIOKp(sv))
a0d0e21e 1418 SETn(-SvNV(sv));
4633a7c4 1419 else if (SvPOKp(sv)) {
a0d0e21e
LW
1420 STRLEN len;
1421 char *s = SvPV(sv, len);
bbce6d69 1422 if (isIDFIRST(*s)) {
a0d0e21e
LW
1423 sv_setpvn(TARG, "-", 1);
1424 sv_catsv(TARG, sv);
79072805 1425 }
a0d0e21e
LW
1426 else if (*s == '+' || *s == '-') {
1427 sv_setsv(TARG, sv);
1428 *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
79072805 1429 }
7e2040f0 1430 else if (DO_UTF8(sv) && *(U8*)s >= 0xc0 && isIDFIRST_utf8((U8*)s)) {
834a4ddd
LW
1431 sv_setpvn(TARG, "-", 1);
1432 sv_catsv(TARG, sv);
1433 }
79072805 1434 else
a0d0e21e
LW
1435 sv_setnv(TARG, -SvNV(sv));
1436 SETTARG;
79072805 1437 }
4633a7c4
LW
1438 else
1439 SETn(-SvNV(sv));
79072805 1440 }
a0d0e21e 1441 RETURN;
79072805
LW
1442}
1443
a0d0e21e 1444PP(pp_not)
79072805 1445{
4e35701f 1446 djSP; tryAMAGICunSET(not);
3280af22 1447 *PL_stack_sp = boolSV(!SvTRUE(*PL_stack_sp));
a0d0e21e 1448 return NORMAL;
79072805
LW
1449}
1450
a0d0e21e 1451PP(pp_complement)
79072805 1452{
8ec5e241 1453 djSP; dTARGET; tryAMAGICun(compl);
a0d0e21e
LW
1454 {
1455 dTOPss;
4633a7c4 1456 if (SvNIOKp(sv)) {
d0ba1bd2 1457 if (PL_op->op_private & HINT_INTEGER) {
972b05a9
JH
1458 IV i = ~SvIV(sv);
1459 SETi(i);
d0ba1bd2
JH
1460 }
1461 else {
972b05a9
JH
1462 UV u = ~SvUV(sv);
1463 SETu(u);
d0ba1bd2 1464 }
a0d0e21e
LW
1465 }
1466 else {
1467 register char *tmps;
1468 register long *tmpl;
55497cff 1469 register I32 anum;
a0d0e21e
LW
1470 STRLEN len;
1471
1472 SvSetSV(TARG, sv);
1473 tmps = SvPV_force(TARG, len);
1474 anum = len;
1475#ifdef LIBERAL
1476 for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
1477 *tmps = ~*tmps;
1478 tmpl = (long*)tmps;
1479 for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
1480 *tmpl = ~*tmpl;
1481 tmps = (char*)tmpl;
1482#endif
1483 for ( ; anum > 0; anum--, tmps++)
1484 *tmps = ~*tmps;
1485
1486 SETs(TARG);
1487 }
1488 RETURN;
1489 }
79072805
LW
1490}
1491
a0d0e21e
LW
1492/* integer versions of some of the above */
1493
a0d0e21e 1494PP(pp_i_multiply)
79072805 1495{
8ec5e241 1496 djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
a0d0e21e
LW
1497 {
1498 dPOPTOPiirl;
1499 SETi( left * right );
1500 RETURN;
1501 }
79072805
LW
1502}
1503
a0d0e21e 1504PP(pp_i_divide)
79072805 1505{
8ec5e241 1506 djSP; dATARGET; tryAMAGICbin(div,opASSIGN);
a0d0e21e
LW
1507 {
1508 dPOPiv;
1509 if (value == 0)
cea2e8a9 1510 DIE(aTHX_ "Illegal division by zero");
a0d0e21e
LW
1511 value = POPi / value;
1512 PUSHi( value );
1513 RETURN;
1514 }
79072805
LW
1515}
1516
a0d0e21e 1517PP(pp_i_modulo)
79072805 1518{
76e3520e 1519 djSP; dATARGET; tryAMAGICbin(modulo,opASSIGN);
79072805 1520 {
a0d0e21e 1521 dPOPTOPiirl;
aa306039 1522 if (!right)
cea2e8a9 1523 DIE(aTHX_ "Illegal modulus zero");
a0d0e21e
LW
1524 SETi( left % right );
1525 RETURN;
79072805 1526 }
79072805
LW
1527}
1528
a0d0e21e 1529PP(pp_i_add)
79072805 1530{
8ec5e241 1531 djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
a0d0e21e
LW
1532 {
1533 dPOPTOPiirl;
1534 SETi( left + right );
1535 RETURN;
79072805 1536 }
79072805
LW
1537}
1538
a0d0e21e 1539PP(pp_i_subtract)
79072805 1540{
8ec5e241 1541 djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN);
a0d0e21e
LW
1542 {
1543 dPOPTOPiirl;
1544 SETi( left - right );
1545 RETURN;
79072805 1546 }
79072805
LW
1547}
1548
a0d0e21e 1549PP(pp_i_lt)
79072805 1550{
8ec5e241 1551 djSP; tryAMAGICbinSET(lt,0);
a0d0e21e
LW
1552 {
1553 dPOPTOPiirl;
54310121 1554 SETs(boolSV(left < right));
a0d0e21e
LW
1555 RETURN;
1556 }
79072805
LW
1557}
1558
a0d0e21e 1559PP(pp_i_gt)
79072805 1560{
8ec5e241 1561 djSP; tryAMAGICbinSET(gt,0);
a0d0e21e
LW
1562 {
1563 dPOPTOPiirl;
54310121 1564 SETs(boolSV(left > right));
a0d0e21e
LW
1565 RETURN;
1566 }
79072805
LW
1567}
1568
a0d0e21e 1569PP(pp_i_le)
79072805 1570{
8ec5e241 1571 djSP; tryAMAGICbinSET(le,0);
a0d0e21e
LW
1572 {
1573 dPOPTOPiirl;
54310121 1574 SETs(boolSV(left <= right));
a0d0e21e 1575 RETURN;
85e6fe83 1576 }
79072805
LW
1577}
1578
a0d0e21e 1579PP(pp_i_ge)
79072805 1580{
8ec5e241 1581 djSP; tryAMAGICbinSET(ge,0);
a0d0e21e
LW
1582 {
1583 dPOPTOPiirl;
54310121 1584 SETs(boolSV(left >= right));
a0d0e21e
LW
1585 RETURN;
1586 }
79072805
LW
1587}
1588
a0d0e21e 1589PP(pp_i_eq)
79072805 1590{
8ec5e241 1591 djSP; tryAMAGICbinSET(eq,0);
a0d0e21e
LW
1592 {
1593 dPOPTOPiirl;
54310121 1594 SETs(boolSV(left == right));
a0d0e21e
LW
1595 RETURN;
1596 }
79072805
LW
1597}
1598
a0d0e21e 1599PP(pp_i_ne)
79072805 1600{
8ec5e241 1601 djSP; tryAMAGICbinSET(ne,0);
a0d0e21e
LW
1602 {
1603 dPOPTOPiirl;
54310121 1604 SETs(boolSV(left != right));
a0d0e21e
LW
1605 RETURN;
1606 }
79072805
LW
1607}
1608
a0d0e21e 1609PP(pp_i_ncmp)
79072805 1610{
8ec5e241 1611 djSP; dTARGET; tryAMAGICbin(ncmp,0);
a0d0e21e
LW
1612 {
1613 dPOPTOPiirl;
1614 I32 value;
79072805 1615
a0d0e21e 1616 if (left > right)
79072805 1617 value = 1;
a0d0e21e 1618 else if (left < right)
79072805 1619 value = -1;
a0d0e21e 1620 else
79072805 1621 value = 0;
a0d0e21e
LW
1622 SETi(value);
1623 RETURN;
79072805 1624 }
85e6fe83
LW
1625}
1626
1627PP(pp_i_negate)
1628{
4e35701f 1629 djSP; dTARGET; tryAMAGICun(neg);
85e6fe83
LW
1630 SETi(-TOPi);
1631 RETURN;
1632}
1633
79072805
LW
1634/* High falutin' math. */
1635
1636PP(pp_atan2)
1637{
8ec5e241 1638 djSP; dTARGET; tryAMAGICbin(atan2,0);
a0d0e21e
LW
1639 {
1640 dPOPTOPnnrl;
65202027 1641 SETn(Perl_atan2(left, right));
a0d0e21e
LW
1642 RETURN;
1643 }
79072805
LW
1644}
1645
1646PP(pp_sin)
1647{
4e35701f 1648 djSP; dTARGET; tryAMAGICun(sin);
a0d0e21e 1649 {
65202027 1650 NV value;
a0d0e21e 1651 value = POPn;
65202027 1652 value = Perl_sin(value);
a0d0e21e
LW
1653 XPUSHn(value);
1654 RETURN;
1655 }
79072805
LW
1656}
1657
1658PP(pp_cos)
1659{
4e35701f 1660 djSP; dTARGET; tryAMAGICun(cos);
a0d0e21e 1661 {
65202027 1662 NV value;
a0d0e21e 1663 value = POPn;
65202027 1664 value = Perl_cos(value);
a0d0e21e
LW
1665 XPUSHn(value);
1666 RETURN;
1667 }
79072805
LW
1668}
1669
56cb0a1c
AD
1670/* Support Configure command-line overrides for rand() functions.
1671 After 5.005, perhaps we should replace this by Configure support
1672 for drand48(), random(), or rand(). For 5.005, though, maintain
1673 compatibility by calling rand() but allow the user to override it.
1674 See INSTALL for details. --Andy Dougherty 15 July 1998
1675*/
85ab1d1d
JH
1676/* Now it's after 5.005, and Configure supports drand48() and random(),
1677 in addition to rand(). So the overrides should not be needed any more.
1678 --Jarkko Hietaniemi 27 September 1998
1679 */
1680
1681#ifndef HAS_DRAND48_PROTO
20ce7b12 1682extern double drand48 (void);
56cb0a1c
AD
1683#endif
1684
79072805
LW
1685PP(pp_rand)
1686{
4e35701f 1687 djSP; dTARGET;
65202027 1688 NV value;
79072805
LW
1689 if (MAXARG < 1)
1690 value = 1.0;
1691 else
1692 value = POPn;
1693 if (value == 0.0)
1694 value = 1.0;
80252599 1695 if (!PL_srand_called) {
85ab1d1d 1696 (void)seedDrand01((Rand_seed_t)seed());
80252599 1697 PL_srand_called = TRUE;
93dc8474 1698 }
85ab1d1d 1699 value *= Drand01();
79072805
LW
1700 XPUSHn(value);
1701 RETURN;
1702}
1703
1704PP(pp_srand)
1705{
4e35701f 1706 djSP;
93dc8474
CS
1707 UV anum;
1708 if (MAXARG < 1)
1709 anum = seed();
79072805 1710 else
93dc8474 1711 anum = POPu;
85ab1d1d 1712 (void)seedDrand01((Rand_seed_t)anum);
80252599 1713 PL_srand_called = TRUE;
79072805
LW
1714 EXTEND(SP, 1);
1715 RETPUSHYES;
1716}
1717
76e3520e 1718STATIC U32
cea2e8a9 1719S_seed(pTHX)
93dc8474 1720{
54310121 1721 /*
1722 * This is really just a quick hack which grabs various garbage
1723 * values. It really should be a real hash algorithm which
1724 * spreads the effect of every input bit onto every output bit,
85ab1d1d 1725 * if someone who knows about such things would bother to write it.
54310121 1726 * Might be a good idea to add that function to CORE as well.
85ab1d1d 1727 * No numbers below come from careful analysis or anything here,
54310121 1728 * except they are primes and SEED_C1 > 1E6 to get a full-width
1729 * value from (tv_sec * SEED_C1 + tv_usec). The multipliers should
1730 * probably be bigger too.
1731 */
1732#if RANDBITS > 16
1733# define SEED_C1 1000003
1734#define SEED_C4 73819
1735#else
1736# define SEED_C1 25747
1737#define SEED_C4 20639
1738#endif
1739#define SEED_C2 3
1740#define SEED_C3 269
1741#define SEED_C5 26107
1742
e858de61 1743 dTHR;
73c60299
RS
1744#ifndef PERL_NO_DEV_RANDOM
1745 int fd;
1746#endif
93dc8474 1747 U32 u;
f12c7020 1748#ifdef VMS
1749# include <starlet.h>
43c92808
HF
1750 /* when[] = (low 32 bits, high 32 bits) of time since epoch
1751 * in 100-ns units, typically incremented ever 10 ms. */
93dc8474 1752 unsigned int when[2];
73c60299
RS
1753#else
1754# ifdef HAS_GETTIMEOFDAY
1755 struct timeval when;
1756# else
1757 Time_t when;
1758# endif
1759#endif
1760
1761/* This test is an escape hatch, this symbol isn't set by Configure. */
1762#ifndef PERL_NO_DEV_RANDOM
1763#ifndef PERL_RANDOM_DEVICE
1764 /* /dev/random isn't used by default because reads from it will block
1765 * if there isn't enough entropy available. You can compile with
1766 * PERL_RANDOM_DEVICE to it if you'd prefer Perl to block until there
1767 * is enough real entropy to fill the seed. */
1768# define PERL_RANDOM_DEVICE "/dev/urandom"
1769#endif
1770 fd = PerlLIO_open(PERL_RANDOM_DEVICE, 0);
1771 if (fd != -1) {
1772 if (PerlLIO_read(fd, &u, sizeof u) != sizeof u)
1773 u = 0;
1774 PerlLIO_close(fd);
1775 if (u)
1776 return u;
1777 }
1778#endif
1779
1780#ifdef VMS
93dc8474 1781 _ckvmssts(sys$gettim(when));
54310121 1782 u = (U32)SEED_C1 * when[0] + (U32)SEED_C2 * when[1];
f12c7020 1783#else
5f05dabc 1784# ifdef HAS_GETTIMEOFDAY
93dc8474 1785 gettimeofday(&when,(struct timezone *) 0);
54310121 1786 u = (U32)SEED_C1 * when.tv_sec + (U32)SEED_C2 * when.tv_usec;
f12c7020 1787# else
93dc8474 1788 (void)time(&when);
54310121 1789 u = (U32)SEED_C1 * when;
f12c7020 1790# endif
1791#endif
7766f137 1792 u += SEED_C3 * (U32)PerlProc_getpid();
56431972 1793 u += SEED_C4 * (U32)PTR2UV(PL_stack_sp);
54310121 1794#ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */
56431972 1795 u += SEED_C5 * (U32)PTR2UV(&when);
f12c7020 1796#endif
93dc8474 1797 return u;
79072805
LW
1798}
1799
1800PP(pp_exp)
1801{
4e35701f 1802 djSP; dTARGET; tryAMAGICun(exp);
a0d0e21e 1803 {
65202027 1804 NV value;
a0d0e21e 1805 value = POPn;
65202027 1806 value = Perl_exp(value);
a0d0e21e
LW
1807 XPUSHn(value);
1808 RETURN;
1809 }
79072805
LW
1810}
1811
1812PP(pp_log)
1813{
4e35701f 1814 djSP; dTARGET; tryAMAGICun(log);
a0d0e21e 1815 {
65202027 1816 NV value;
a0d0e21e 1817 value = POPn;
bbce6d69 1818 if (value <= 0.0) {
097ee67d 1819 RESTORE_NUMERIC_STANDARD();
cea2e8a9 1820 DIE(aTHX_ "Can't take log of %g", value);
bbce6d69 1821 }
65202027 1822 value = Perl_log(value);
a0d0e21e
LW
1823 XPUSHn(value);
1824 RETURN;
1825 }
79072805
LW
1826}
1827
1828PP(pp_sqrt)
1829{
4e35701f 1830 djSP; dTARGET; tryAMAGICun(sqrt);
a0d0e21e 1831 {
65202027 1832 NV value;
a0d0e21e 1833 value = POPn;
bbce6d69 1834 if (value < 0.0) {
097ee67d 1835 RESTORE_NUMERIC_STANDARD();
cea2e8a9 1836 DIE(aTHX_ "Can't take sqrt of %g", value);
bbce6d69 1837 }
65202027 1838 value = Perl_sqrt(value);
a0d0e21e
LW
1839 XPUSHn(value);
1840 RETURN;
1841 }
79072805
LW
1842}
1843
1844PP(pp_int)
1845{
4e35701f 1846 djSP; dTARGET;
774d564b 1847 {
65202027 1848 NV value = TOPn;
774d564b 1849 IV iv;
1850
1851 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs)) {
1852 iv = SvIVX(TOPs);
1853 SETi(iv);
1854 }
1855 else {
1856 if (value >= 0.0)
65202027 1857 (void)Perl_modf(value, &value);
774d564b 1858 else {
65202027 1859 (void)Perl_modf(-value, &value);
774d564b 1860 value = -value;
1861 }
1862 iv = I_V(value);
1863 if (iv == value)
1864 SETi(iv);
1865 else
1866 SETn(value);
1867 }
79072805 1868 }
79072805
LW
1869 RETURN;
1870}
1871
463ee0b2
LW
1872PP(pp_abs)
1873{
4e35701f 1874 djSP; dTARGET; tryAMAGICun(abs);
a0d0e21e 1875 {
65202027 1876 NV value = TOPn;
774d564b 1877 IV iv;
463ee0b2 1878
774d564b 1879 if (SvIOKp(TOPs) && !SvNOKp(TOPs) && !SvPOKp(TOPs) &&
1880 (iv = SvIVX(TOPs)) != IV_MIN) {
1881 if (iv < 0)
1882 iv = -iv;
1883 SETi(iv);
1884 }
1885 else {
1886 if (value < 0.0)
1887 value = -value;
1888 SETn(value);
1889 }
a0d0e21e 1890 }
774d564b 1891 RETURN;
463ee0b2
LW
1892}
1893
79072805
LW
1894PP(pp_hex)
1895{
4e35701f 1896 djSP; dTARGET;
79072805
LW
1897 char *tmps;
1898 I32 argtype;
2d8e6c8d 1899 STRLEN n_a;
79072805 1900
2d8e6c8d 1901 tmps = POPpx;
b21ed0a9 1902 argtype = 1; /* allow underscores */
9e24b6e2 1903 XPUSHn(scan_hex(tmps, 99, &argtype));
79072805
LW
1904 RETURN;
1905}
1906
1907PP(pp_oct)
1908{
4e35701f 1909 djSP; dTARGET;
9e24b6e2 1910 NV value;
79072805
LW
1911 I32 argtype;
1912 char *tmps;
2d8e6c8d 1913 STRLEN n_a;
79072805 1914
2d8e6c8d 1915 tmps = POPpx;
464e2e8a 1916 while (*tmps && isSPACE(*tmps))
1917 tmps++;
9e24b6e2
JH
1918 if (*tmps == '0')
1919 tmps++;
b21ed0a9 1920 argtype = 1; /* allow underscores */
9e24b6e2
JH
1921 if (*tmps == 'x')
1922 value = scan_hex(++tmps, 99, &argtype);
1923 else if (*tmps == 'b')
1924 value = scan_bin(++tmps, 99, &argtype);
464e2e8a 1925 else
9e24b6e2
JH
1926 value = scan_oct(tmps, 99, &argtype);
1927 XPUSHn(value);
79072805
LW
1928 RETURN;
1929}
1930
1931/* String stuff. */
1932
1933PP(pp_length)
1934{
4e35701f 1935 djSP; dTARGET;
7e2040f0 1936 SV *sv = TOPs;
a0ed51b3 1937
7e2040f0
GS
1938 if (DO_UTF8(sv))
1939 SETi(sv_len_utf8(sv));
1940 else
1941 SETi(sv_len(sv));
79072805
LW
1942 RETURN;
1943}
1944
1945PP(pp_substr)
1946{
4e35701f 1947 djSP; dTARGET;
79072805
LW
1948 SV *sv;
1949 I32 len;
463ee0b2 1950 STRLEN curlen;
a0ed51b3 1951 STRLEN utfcurlen;
79072805
LW
1952 I32 pos;
1953 I32 rem;
84902520 1954 I32 fail;
533c011a 1955 I32 lvalue = PL_op->op_flags & OPf_MOD;
79072805 1956 char *tmps;
3280af22 1957 I32 arybase = PL_curcop->cop_arybase;
7b8d334a
GS
1958 char *repl = 0;
1959 STRLEN repl_len;
79072805 1960
20408e3c 1961 SvTAINTED_off(TARG); /* decontaminate */
7e2040f0 1962 SvUTF8_off(TARG); /* decontaminate */
5d82c453
GA
1963 if (MAXARG > 2) {
1964 if (MAXARG > 3) {
1965 sv = POPs;
1966 repl = SvPV(sv, repl_len);
7b8d334a 1967 }
79072805 1968 len = POPi;
5d82c453 1969 }
84902520 1970 pos = POPi;
79072805 1971 sv = POPs;
849ca7ee 1972 PUTBACK;
a0d0e21e 1973 tmps = SvPV(sv, curlen);
7e2040f0 1974 if (DO_UTF8(sv)) {
a0ed51b3
LW
1975 utfcurlen = sv_len_utf8(sv);
1976 if (utfcurlen == curlen)
1977 utfcurlen = 0;
1978 else
1979 curlen = utfcurlen;
1980 }
d1c2b58a
LW
1981 else
1982 utfcurlen = 0;
a0ed51b3 1983
84902520
TB
1984 if (pos >= arybase) {
1985 pos -= arybase;
1986 rem = curlen-pos;
1987 fail = rem;
5d82c453
GA
1988 if (MAXARG > 2) {
1989 if (len < 0) {
1990 rem += len;
1991 if (rem < 0)
1992 rem = 0;
1993 }
1994 else if (rem > len)
1995 rem = len;
1996 }
68dc0745 1997 }
84902520 1998 else {
5d82c453
GA
1999 pos += curlen;
2000 if (MAXARG < 3)
2001 rem = curlen;
2002 else if (len >= 0) {
2003 rem = pos+len;
2004 if (rem > (I32)curlen)
2005 rem = curlen;
2006 }
2007 else {
2008 rem = curlen+len;
2009 if (rem < pos)
2010 rem = pos;
2011 }
2012 if (pos < 0)
2013 pos = 0;
2014 fail = rem;
2015 rem -= pos;
84902520
TB
2016 }
2017 if (fail < 0) {
e476b1b5
GS
2018 if (lvalue || repl)
2019 Perl_croak(aTHX_ "substr outside of string");
2020 if (ckWARN(WARN_SUBSTR))
cea2e8a9 2021 Perl_warner(aTHX_ WARN_SUBSTR, "substr outside of string");
2304df62
AD
2022 RETPUSHUNDEF;
2023 }
79072805 2024 else {
7f66633b 2025 if (utfcurlen)
a0ed51b3 2026 sv_pos_u2b(sv, &pos, &rem);
79072805 2027 tmps += pos;
79072805 2028 sv_setpvn(TARG, tmps, rem);
7f66633b
GS
2029 if (utfcurlen)
2030 SvUTF8_on(TARG);
c8faf1c5
GS
2031 if (repl)
2032 sv_insert(sv, pos, rem, repl, repl_len);
2033 else if (lvalue) { /* it's an lvalue! */
dedeecda 2034 if (!SvGMAGICAL(sv)) {
2035 if (SvROK(sv)) {
2d8e6c8d
GS
2036 STRLEN n_a;
2037 SvPV_force(sv,n_a);
599cee73 2038 if (ckWARN(WARN_SUBSTR))
cea2e8a9 2039 Perl_warner(aTHX_ WARN_SUBSTR,
599cee73 2040 "Attempt to use reference as lvalue in substr");
dedeecda 2041 }
2042 if (SvOK(sv)) /* is it defined ? */
7f66633b 2043 (void)SvPOK_only_UTF8(sv);
dedeecda 2044 else
2045 sv_setpvn(sv,"",0); /* avoid lexical reincarnation */
2046 }
5f05dabc 2047
a0d0e21e
LW
2048 if (SvTYPE(TARG) < SVt_PVLV) {
2049 sv_upgrade(TARG, SVt_PVLV);
2050 sv_magic(TARG, Nullsv, 'x', Nullch, 0);
ed6116ce 2051 }
a0d0e21e 2052
5f05dabc 2053 LvTYPE(TARG) = 'x';
6ff81951
GS
2054 if (LvTARG(TARG) != sv) {
2055 if (LvTARG(TARG))
2056 SvREFCNT_dec(LvTARG(TARG));
2057 LvTARG(TARG) = SvREFCNT_inc(sv);
2058 }
a0d0e21e 2059 LvTARGOFF(TARG) = pos;
8ec5e241 2060 LvTARGLEN(TARG) = rem;
79072805
LW
2061 }
2062 }
849ca7ee 2063 SPAGAIN;
79072805
LW
2064 PUSHs(TARG); /* avoid SvSETMAGIC here */
2065 RETURN;
2066}
2067
2068PP(pp_vec)
2069{
4e35701f 2070 djSP; dTARGET;
79072805
LW
2071 register I32 size = POPi;
2072 register I32 offset = POPi;
2073 register SV *src = POPs;
533c011a 2074 I32 lvalue = PL_op->op_flags & OPf_MOD;
a0d0e21e 2075
81e118e0
JH
2076 SvTAINTED_off(TARG); /* decontaminate */
2077 if (lvalue) { /* it's an lvalue! */
2078 if (SvTYPE(TARG) < SVt_PVLV) {
2079 sv_upgrade(TARG, SVt_PVLV);
2080 sv_magic(TARG, Nullsv, 'v', Nullch, 0);
79072805 2081 }
81e118e0
JH
2082 LvTYPE(TARG) = 'v';
2083 if (LvTARG(TARG) != src) {
2084 if (LvTARG(TARG))
2085 SvREFCNT_dec(LvTARG(TARG));
2086 LvTARG(TARG) = SvREFCNT_inc(src);
79072805 2087 }
81e118e0
JH
2088 LvTARGOFF(TARG) = offset;
2089 LvTARGLEN(TARG) = size;
79072805
LW
2090 }
2091
81e118e0 2092 sv_setuv(TARG, do_vecget(src, offset, size));
79072805
LW
2093 PUSHs(TARG);
2094 RETURN;
2095}
2096
2097PP(pp_index)
2098{
4e35701f 2099 djSP; dTARGET;
79072805
LW
2100 SV *big;
2101 SV *little;
2102 I32 offset;
2103 I32 retval;
2104 char *tmps;
2105 char *tmps2;
463ee0b2 2106 STRLEN biglen;
3280af22 2107 I32 arybase = PL_curcop->cop_arybase;
79072805
LW
2108
2109 if (MAXARG < 3)
2110 offset = 0;
2111 else
2112 offset = POPi - arybase;
2113 little = POPs;
2114 big = POPs;
463ee0b2 2115 tmps = SvPV(big, biglen);
7e2040f0 2116 if (offset > 0 && DO_UTF8(big))
a0ed51b3 2117 sv_pos_u2b(big, &offset, 0);
79072805
LW
2118 if (offset < 0)
2119 offset = 0;
93a17b20
LW
2120 else if (offset > biglen)
2121 offset = biglen;
79072805 2122 if (!(tmps2 = fbm_instr((unsigned char*)tmps + offset,
411d5715 2123 (unsigned char*)tmps + biglen, little, 0)))
a0ed51b3 2124 retval = -1;
79072805 2125 else
a0ed51b3 2126 retval = tmps2 - tmps;
7e2040f0 2127 if (retval > 0 && DO_UTF8(big))
a0ed51b3
LW
2128 sv_pos_b2u(big, &retval);
2129 PUSHi(retval + arybase);
79072805
LW
2130 RETURN;
2131}
2132
2133PP(pp_rindex)
2134{
4e35701f 2135 djSP; dTARGET;
79072805
LW
2136 SV *big;
2137 SV *little;
463ee0b2
LW
2138 STRLEN blen;
2139 STRLEN llen;
79072805
LW
2140 I32 offset;
2141 I32 retval;
2142 char *tmps;
2143 char *tmps2;
3280af22 2144 I32 arybase = PL_curcop->cop_arybase;
79072805 2145
a0d0e21e 2146 if (MAXARG >= 3)
a0ed51b3 2147 offset = POPi;
79072805
LW
2148 little = POPs;
2149 big = POPs;
463ee0b2
LW
2150 tmps2 = SvPV(little, llen);
2151 tmps = SvPV(big, blen);
79072805 2152 if (MAXARG < 3)
463ee0b2 2153 offset = blen;
a0ed51b3 2154 else {
7e2040f0 2155 if (offset > 0 && DO_UTF8(big))
a0ed51b3
LW
2156 sv_pos_u2b(big, &offset, 0);
2157 offset = offset - arybase + llen;
2158 }
79072805
LW
2159 if (offset < 0)
2160 offset = 0;
463ee0b2
LW
2161 else if (offset > blen)
2162 offset = blen;
79072805 2163 if (!(tmps2 = rninstr(tmps, tmps + offset,
463ee0b2 2164 tmps2, tmps2 + llen)))
a0ed51b3 2165 retval = -1;
79072805 2166 else
a0ed51b3 2167 retval = tmps2 - tmps;
7e2040f0 2168 if (retval > 0 && DO_UTF8(big))
a0ed51b3
LW
2169 sv_pos_b2u(big, &retval);
2170 PUSHi(retval + arybase);
79072805
LW
2171 RETURN;
2172}
2173
2174PP(pp_sprintf)
2175{
4e35701f 2176 djSP; dMARK; dORIGMARK; dTARGET;
79072805 2177 do_sprintf(TARG, SP-MARK, MARK+1);
bbce6d69 2178 TAINT_IF(SvTAINTED(TARG));
79072805
LW
2179 SP = ORIGMARK;
2180 PUSHTARG;
2181 RETURN;
2182}
2183
79072805
LW
2184PP(pp_ord)
2185{
4e35701f 2186 djSP; dTARGET;
bdeef251 2187 UV value;
2d8e6c8d 2188 STRLEN n_a;
7e2040f0
GS
2189 SV *tmpsv = POPs;
2190 U8 *tmps = (U8*)SvPVx(tmpsv,n_a);
a0ed51b3 2191 I32 retlen;
79072805 2192
7e2040f0 2193 if ((*tmps & 0x80) && DO_UTF8(tmpsv))
bdeef251 2194 value = utf8_to_uv(tmps, &retlen);
a0ed51b3 2195 else
bdeef251
GA
2196 value = (UV)(*tmps & 255);
2197 XPUSHu(value);
79072805
LW
2198 RETURN;
2199}
2200
463ee0b2
LW
2201PP(pp_chr)
2202{
4e35701f 2203 djSP; dTARGET;
463ee0b2 2204 char *tmps;
3b9be786 2205 U32 value = POPu;
463ee0b2 2206
748a9306 2207 (void)SvUPGRADE(TARG,SVt_PV);
a0ed51b3 2208
aaa68c4a 2209 if ((value > 255 && !IN_BYTE) || (value & 0x80 && PL_hints & HINT_UTF8) ) {
aa6ffa16 2210 SvGROW(TARG, UTF8_MAXLEN+1);
a0ed51b3 2211 tmps = SvPVX(TARG);
dfe13c55 2212 tmps = (char*)uv_to_utf8((U8*)tmps, (UV)value);
a0ed51b3
LW
2213 SvCUR_set(TARG, tmps - SvPVX(TARG));
2214 *tmps = '\0';
2215 (void)SvPOK_only(TARG);
aa6ffa16 2216 SvUTF8_on(TARG);
a0ed51b3
LW
2217 XPUSHs(TARG);
2218 RETURN;
2219 }
2220
748a9306 2221 SvGROW(TARG,2);
463ee0b2
LW
2222 SvCUR_set(TARG, 1);
2223 tmps = SvPVX(TARG);
a0ed51b3 2224 *tmps++ = value;
748a9306 2225 *tmps = '\0';
a0d0e21e 2226 (void)SvPOK_only(TARG);
463ee0b2
LW
2227 XPUSHs(TARG);
2228 RETURN;
2229}
2230
79072805
LW
2231PP(pp_crypt)
2232{
4e35701f 2233 djSP; dTARGET; dPOPTOPssrl;
2d8e6c8d 2234 STRLEN n_a;
79072805 2235#ifdef HAS_CRYPT
2d8e6c8d 2236 char *tmps = SvPV(left, n_a);
79072805 2237#ifdef FCRYPT
2d8e6c8d 2238 sv_setpv(TARG, fcrypt(tmps, SvPV(right, n_a)));
79072805 2239#else
2d8e6c8d 2240 sv_setpv(TARG, PerlProc_crypt(tmps, SvPV(right, n_a)));
79072805
LW
2241#endif
2242#else
cea2e8a9 2243 DIE(aTHX_
79072805
LW
2244 "The crypt() function is unimplemented due to excessive paranoia.");
2245#endif
2246 SETs(TARG);
2247 RETURN;
2248}
2249
2250PP(pp_ucfirst)
2251{
4e35701f 2252 djSP;
79072805 2253 SV *sv = TOPs;
a0ed51b3
LW
2254 register U8 *s;
2255 STRLEN slen;
2256
7e2040f0 2257 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
a0ed51b3 2258 I32 ulen;
806e7201 2259 U8 tmpbuf[UTF8_MAXLEN];
a0ed51b3
LW
2260 U8 *tend;
2261 UV uv = utf8_to_uv(s, &ulen);
2262
2263 if (PL_op->op_private & OPpLOCALE) {
2264 TAINT;
2265 SvTAINTED_on(sv);
2266 uv = toTITLE_LC_uni(uv);
2267 }
2268 else
2269 uv = toTITLE_utf8(s);
2270
2271 tend = uv_to_utf8(tmpbuf, uv);
2272
014822e4 2273 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
a0ed51b3 2274 dTARGET;
dfe13c55
GS
2275 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2276 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
7e2040f0 2277 SvUTF8_on(TARG);
a0ed51b3
LW
2278 SETs(TARG);
2279 }
2280 else {
dfe13c55 2281 s = (U8*)SvPV_force(sv, slen);
a0ed51b3
LW
2282 Copy(tmpbuf, s, ulen, U8);
2283 }
a0ed51b3 2284 }
626727d5 2285 else {
014822e4 2286 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
31351b04 2287 dTARGET;
7e2040f0 2288 SvUTF8_off(TARG); /* decontaminate */
31351b04
JS
2289 sv_setsv(TARG, sv);
2290 sv = TARG;
2291 SETs(sv);
2292 }
2293 s = (U8*)SvPV_force(sv, slen);
2294 if (*s) {
2295 if (PL_op->op_private & OPpLOCALE) {
2296 TAINT;
2297 SvTAINTED_on(sv);
2298 *s = toUPPER_LC(*s);
2299 }
2300 else
2301 *s = toUPPER(*s);
bbce6d69 2302 }
bbce6d69 2303 }
31351b04
JS
2304 if (SvSMAGICAL(sv))
2305 mg_set(sv);
79072805
LW
2306 RETURN;
2307}
2308
2309PP(pp_lcfirst)
2310{
4e35701f 2311 djSP;
79072805 2312 SV *sv = TOPs;
a0ed51b3
LW
2313 register U8 *s;
2314 STRLEN slen;
2315
7e2040f0 2316 if (DO_UTF8(sv) && (s = (U8*)SvPV(sv, slen)) && slen && (*s & 0xc0) == 0xc0) {
a0ed51b3 2317 I32 ulen;
806e7201 2318 U8 tmpbuf[UTF8_MAXLEN];
a0ed51b3
LW
2319 U8 *tend;
2320 UV uv = utf8_to_uv(s, &ulen);
2321
2322 if (PL_op->op_private & OPpLOCALE) {
2323 TAINT;
2324 SvTAINTED_on(sv);
2325 uv = toLOWER_LC_uni(uv);
2326 }
2327 else
2328 uv = toLOWER_utf8(s);
2329
2330 tend = uv_to_utf8(tmpbuf, uv);
2331
014822e4 2332 if (!SvPADTMP(sv) || tend - tmpbuf != ulen || SvREADONLY(sv)) {
a0ed51b3 2333 dTARGET;
dfe13c55
GS
2334 sv_setpvn(TARG, (char*)tmpbuf, tend - tmpbuf);
2335 sv_catpvn(TARG, (char*)(s + ulen), slen - ulen);
7e2040f0 2336 SvUTF8_on(TARG);
a0ed51b3
LW
2337 SETs(TARG);
2338 }
2339 else {
dfe13c55 2340 s = (U8*)SvPV_force(sv, slen);
a0ed51b3
LW
2341 Copy(tmpbuf, s, ulen, U8);
2342 }
a0ed51b3 2343 }
626727d5 2344 else {
014822e4 2345 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
31351b04 2346 dTARGET;
7e2040f0 2347 SvUTF8_off(TARG); /* decontaminate */
31351b04
JS
2348 sv_setsv(TARG, sv);
2349 sv = TARG;
2350 SETs(sv);
2351 }
2352 s = (U8*)SvPV_force(sv, slen);
2353 if (*s) {
2354 if (PL_op->op_private & OPpLOCALE) {
2355 TAINT;
2356 SvTAINTED_on(sv);
2357 *s = toLOWER_LC(*s);
2358 }
2359 else
2360 *s = toLOWER(*s);
bbce6d69 2361 }
bbce6d69 2362 }
31351b04
JS
2363 if (SvSMAGICAL(sv))
2364 mg_set(sv);
79072805
LW
2365 RETURN;
2366}
2367
2368PP(pp_uc)
2369{
4e35701f 2370 djSP;
79072805 2371 SV *sv = TOPs;
a0ed51b3 2372 register U8 *s;
463ee0b2 2373 STRLEN len;
79072805 2374
7e2040f0 2375 if (DO_UTF8(sv)) {
a0ed51b3
LW
2376 dTARGET;
2377 I32 ulen;
2378 register U8 *d;
2379 U8 *send;
2380
dfe13c55 2381 s = (U8*)SvPV(sv,len);
a5a20234 2382 if (!len) {
7e2040f0 2383 SvUTF8_off(TARG); /* decontaminate */
a5a20234
LW
2384 sv_setpvn(TARG, "", 0);
2385 SETs(TARG);
a0ed51b3
LW
2386 }
2387 else {
31351b04
JS
2388 (void)SvUPGRADE(TARG, SVt_PV);
2389 SvGROW(TARG, (len * 2) + 1);
2390 (void)SvPOK_only(TARG);
2391 d = (U8*)SvPVX(TARG);
2392 send = s + len;
2393 if (PL_op->op_private & OPpLOCALE) {
2394 TAINT;
2395 SvTAINTED_on(TARG);
2396 while (s < send) {
2397 d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
2398 s += ulen;
2399 }
a0ed51b3 2400 }
31351b04
JS
2401 else {
2402 while (s < send) {
2403 d = uv_to_utf8(d, toUPPER_utf8( s ));
2404 s += UTF8SKIP(s);
2405 }
a0ed51b3 2406 }
31351b04 2407 *d = '\0';
7e2040f0 2408 SvUTF8_on(TARG);
31351b04
JS
2409 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2410 SETs(TARG);
a0ed51b3 2411 }
a0ed51b3 2412 }
626727d5 2413 else {
014822e4 2414 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
31351b04 2415 dTARGET;
7e2040f0 2416 SvUTF8_off(TARG); /* decontaminate */
31351b04
JS
2417 sv_setsv(TARG, sv);
2418 sv = TARG;
2419 SETs(sv);
2420 }
2421 s = (U8*)SvPV_force(sv, len);
2422 if (len) {
2423 register U8 *send = s + len;
2424
2425 if (PL_op->op_private & OPpLOCALE) {
2426 TAINT;
2427 SvTAINTED_on(sv);
2428 for (; s < send; s++)
2429 *s = toUPPER_LC(*s);
2430 }
2431 else {
2432 for (; s < send; s++)
2433 *s = toUPPER(*s);
2434 }
bbce6d69 2435 }
79072805 2436 }
31351b04
JS
2437 if (SvSMAGICAL(sv))
2438 mg_set(sv);
79072805
LW
2439 RETURN;
2440}
2441
2442PP(pp_lc)
2443{
4e35701f 2444 djSP;
79072805 2445 SV *sv = TOPs;
a0ed51b3 2446 register U8 *s;
463ee0b2 2447 STRLEN len;
79072805 2448
7e2040f0 2449 if (DO_UTF8(sv)) {
a0ed51b3
LW
2450 dTARGET;
2451 I32 ulen;
2452 register U8 *d;
2453 U8 *send;
2454
dfe13c55 2455 s = (U8*)SvPV(sv,len);
a5a20234 2456 if (!len) {
7e2040f0 2457 SvUTF8_off(TARG); /* decontaminate */
a5a20234
LW
2458 sv_setpvn(TARG, "", 0);
2459 SETs(TARG);
a0ed51b3
LW
2460 }
2461 else {
31351b04
JS
2462 (void)SvUPGRADE(TARG, SVt_PV);
2463 SvGROW(TARG, (len * 2) + 1);
2464 (void)SvPOK_only(TARG);
2465 d = (U8*)SvPVX(TARG);
2466 send = s + len;
2467 if (PL_op->op_private & OPpLOCALE) {
2468 TAINT;
2469 SvTAINTED_on(TARG);
2470 while (s < send) {
2471 d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
2472 s += ulen;
2473 }
a0ed51b3 2474 }
31351b04
JS
2475 else {
2476 while (s < send) {
2477 d = uv_to_utf8(d, toLOWER_utf8(s));
2478 s += UTF8SKIP(s);
2479 }
a0ed51b3 2480 }
31351b04 2481 *d = '\0';
7e2040f0 2482 SvUTF8_on(TARG);
31351b04
JS
2483 SvCUR_set(TARG, d - (U8*)SvPVX(TARG));
2484 SETs(TARG);
a0ed51b3 2485 }
79072805 2486 }
626727d5 2487 else {
014822e4 2488 if (!SvPADTMP(sv) || SvREADONLY(sv)) {
31351b04 2489 dTARGET;
7e2040f0 2490 SvUTF8_off(TARG); /* decontaminate */
31351b04
JS
2491 sv_setsv(TARG, sv);
2492 sv = TARG;
2493 SETs(sv);
a0ed51b3 2494 }
bbce6d69 2495
31351b04
JS
2496 s = (U8*)SvPV_force(sv, len);
2497 if (len) {
2498 register U8 *send = s + len;
bbce6d69 2499
31351b04
JS
2500 if (PL_op->op_private & OPpLOCALE) {
2501 TAINT;
2502 SvTAINTED_on(sv);
2503 for (; s < send; s++)
2504 *s = toLOWER_LC(*s);
2505 }
2506 else {
2507 for (; s < send; s++)
2508 *s = toLOWER(*s);
2509 }
bbce6d69 2510 }
79072805 2511 }
31351b04
JS
2512 if (SvSMAGICAL(sv))
2513 mg_set(sv);
79072805
LW
2514 RETURN;
2515}
2516
a0d0e21e 2517PP(pp_quotemeta)
79072805 2518{
4e35701f 2519 djSP; dTARGET;
a0d0e21e
LW
2520 SV *sv = TOPs;
2521 STRLEN len;
2522 register char *s = SvPV(sv,len);
2523 register char *d;
79072805 2524
7e2040f0 2525 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e
LW
2526 if (len) {
2527 (void)SvUPGRADE(TARG, SVt_PV);
c07a80fd 2528 SvGROW(TARG, (len * 2) + 1);
a0d0e21e 2529 d = SvPVX(TARG);
7e2040f0 2530 if (DO_UTF8(sv)) {
0dd2cdef
LW
2531 while (len) {
2532 if (*s & 0x80) {
2533 STRLEN ulen = UTF8SKIP(s);
2534 if (ulen > len)
2535 ulen = len;
2536 len -= ulen;
2537 while (ulen--)
2538 *d++ = *s++;
2539 }
2540 else {
2541 if (!isALNUM(*s))
2542 *d++ = '\\';
2543 *d++ = *s++;
2544 len--;
2545 }
2546 }
7e2040f0 2547 SvUTF8_on(TARG);
0dd2cdef
LW
2548 }
2549 else {
2550 while (len--) {
2551 if (!isALNUM(*s))
2552 *d++ = '\\';
2553 *d++ = *s++;
2554 }
79072805 2555 }
a0d0e21e
LW
2556 *d = '\0';
2557 SvCUR_set(TARG, d - SvPVX(TARG));
3aa33fe5 2558 (void)SvPOK_only_UTF8(TARG);
79072805 2559 }
a0d0e21e
LW
2560 else
2561 sv_setpvn(TARG, s, len);
2562 SETs(TARG);
31351b04
JS
2563 if (SvSMAGICAL(TARG))
2564 mg_set(TARG);
79072805
LW
2565 RETURN;
2566}
2567
a0d0e21e 2568/* Arrays. */
79072805 2569
a0d0e21e 2570PP(pp_aslice)
79072805 2571{
4e35701f 2572 djSP; dMARK; dORIGMARK;
a0d0e21e
LW
2573 register SV** svp;
2574 register AV* av = (AV*)POPs;
533c011a 2575 register I32 lval = PL_op->op_flags & OPf_MOD;
3280af22 2576 I32 arybase = PL_curcop->cop_arybase;
748a9306 2577 I32 elem;
79072805 2578
a0d0e21e 2579 if (SvTYPE(av) == SVt_PVAV) {
533c011a 2580 if (lval && PL_op->op_private & OPpLVAL_INTRO) {
748a9306 2581 I32 max = -1;
924508f0 2582 for (svp = MARK + 1; svp <= SP; svp++) {
748a9306
LW
2583 elem = SvIVx(*svp);
2584 if (elem > max)
2585 max = elem;
2586 }
2587 if (max > AvMAX(av))
2588 av_extend(av, max);
2589 }
a0d0e21e 2590 while (++MARK <= SP) {
748a9306 2591 elem = SvIVx(*MARK);
a0d0e21e 2592
748a9306
LW
2593 if (elem > 0)
2594 elem -= arybase;
a0d0e21e
LW
2595 svp = av_fetch(av, elem, lval);
2596 if (lval) {
3280af22 2597 if (!svp || *svp == &PL_sv_undef)
cea2e8a9 2598 DIE(aTHX_ PL_no_aelem, elem);
533c011a 2599 if (PL_op->op_private & OPpLVAL_INTRO)
161b7d16 2600 save_aelem(av, elem, svp);
79072805 2601 }
3280af22 2602 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
2603 }
2604 }
748a9306 2605 if (GIMME != G_ARRAY) {
a0d0e21e
LW
2606 MARK = ORIGMARK;
2607 *++MARK = *SP;
2608 SP = MARK;
2609 }
79072805
LW
2610 RETURN;
2611}
2612
2613/* Associative arrays. */
2614
2615PP(pp_each)
2616{
59af0135 2617 djSP;
79072805 2618 HV *hash = (HV*)POPs;
c07a80fd 2619 HE *entry;
54310121 2620 I32 gimme = GIMME_V;
c750a3ec 2621 I32 realhv = (SvTYPE(hash) == SVt_PVHV);
8ec5e241 2622
c07a80fd 2623 PUTBACK;
c750a3ec
MB
2624 /* might clobber stack_sp */
2625 entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash);
c07a80fd 2626 SPAGAIN;
79072805 2627
79072805
LW
2628 EXTEND(SP, 2);
2629 if (entry) {
54310121 2630 PUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
2631 if (gimme == G_ARRAY) {
59af0135 2632 SV *val;
c07a80fd 2633 PUTBACK;
c750a3ec 2634 /* might clobber stack_sp */
59af0135
GS
2635 val = realhv ?
2636 hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry);
c07a80fd 2637 SPAGAIN;
59af0135 2638 PUSHs(val);
79072805 2639 }
79072805 2640 }
54310121 2641 else if (gimme == G_SCALAR)
79072805
LW
2642 RETPUSHUNDEF;
2643
2644 RETURN;
2645}
2646
2647PP(pp_values)
2648{
cea2e8a9 2649 return do_kv();
79072805
LW
2650}
2651
2652PP(pp_keys)
2653{
cea2e8a9 2654 return do_kv();
79072805
LW
2655}
2656
2657PP(pp_delete)
2658{
4e35701f 2659 djSP;
54310121 2660 I32 gimme = GIMME_V;
2661 I32 discard = (gimme == G_VOID) ? G_DISCARD : 0;
79072805 2662 SV *sv;
5f05dabc 2663 HV *hv;
2664
533c011a 2665 if (PL_op->op_private & OPpSLICE) {
5f05dabc 2666 dMARK; dORIGMARK;
97fcbf96 2667 U32 hvtype;
5f05dabc 2668 hv = (HV*)POPs;
97fcbf96 2669 hvtype = SvTYPE(hv);
01020589
GS
2670 if (hvtype == SVt_PVHV) { /* hash element */
2671 while (++MARK <= SP) {
ae77835f 2672 sv = hv_delete_ent(hv, *MARK, discard, 0);
01020589
GS
2673 *MARK = sv ? sv : &PL_sv_undef;
2674 }
5f05dabc 2675 }
01020589
GS
2676 else if (hvtype == SVt_PVAV) {
2677 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2678 while (++MARK <= SP) {
2679 sv = av_delete((AV*)hv, SvIV(*MARK), discard);
2680 *MARK = sv ? sv : &PL_sv_undef;
2681 }
2682 }
2683 else { /* pseudo-hash element */
2684 while (++MARK <= SP) {
2685 sv = avhv_delete_ent((AV*)hv, *MARK, discard, 0);
2686 *MARK = sv ? sv : &PL_sv_undef;
2687 }
2688 }
2689 }
2690 else
2691 DIE(aTHX_ "Not a HASH reference");
54310121 2692 if (discard)
2693 SP = ORIGMARK;
2694 else if (gimme == G_SCALAR) {
5f05dabc 2695 MARK = ORIGMARK;
2696 *++MARK = *SP;
2697 SP = MARK;
2698 }
2699 }
2700 else {
2701 SV *keysv = POPs;
2702 hv = (HV*)POPs;
97fcbf96
MB
2703 if (SvTYPE(hv) == SVt_PVHV)
2704 sv = hv_delete_ent(hv, keysv, discard, 0);
01020589
GS
2705 else if (SvTYPE(hv) == SVt_PVAV) {
2706 if (PL_op->op_flags & OPf_SPECIAL)
2707 sv = av_delete((AV*)hv, SvIV(keysv), discard);
2708 else
2709 sv = avhv_delete_ent((AV*)hv, keysv, discard, 0);
2710 }
97fcbf96 2711 else
cea2e8a9 2712 DIE(aTHX_ "Not a HASH reference");
5f05dabc 2713 if (!sv)
3280af22 2714 sv = &PL_sv_undef;
54310121 2715 if (!discard)
2716 PUSHs(sv);
79072805 2717 }
79072805
LW
2718 RETURN;
2719}
2720
a0d0e21e 2721PP(pp_exists)
79072805 2722{
4e35701f 2723 djSP;
afebc493
GS
2724 SV *tmpsv;
2725 HV *hv;
2726
2727 if (PL_op->op_private & OPpEXISTS_SUB) {
2728 GV *gv;
2729 CV *cv;
2730 SV *sv = POPs;
2731 cv = sv_2cv(sv, &hv, &gv, FALSE);
2732 if (cv)
2733 RETPUSHYES;
2734 if (gv && isGV(gv) && GvCV(gv) && !GvCVGEN(gv))
2735 RETPUSHYES;
2736 RETPUSHNO;
2737 }
2738 tmpsv = POPs;
2739 hv = (HV*)POPs;
c750a3ec 2740 if (SvTYPE(hv) == SVt_PVHV) {
ae77835f 2741 if (hv_exists_ent(hv, tmpsv, 0))
c750a3ec 2742 RETPUSHYES;
ef54e1a4
JH
2743 }
2744 else if (SvTYPE(hv) == SVt_PVAV) {
01020589
GS
2745 if (PL_op->op_flags & OPf_SPECIAL) { /* array element */
2746 if (av_exists((AV*)hv, SvIV(tmpsv)))
2747 RETPUSHYES;
2748 }
2749 else if (avhv_exists_ent((AV*)hv, tmpsv, 0)) /* pseudo-hash element */
c750a3ec 2750 RETPUSHYES;
ef54e1a4
JH
2751 }
2752 else {
cea2e8a9 2753 DIE(aTHX_ "Not a HASH reference");
a0d0e21e 2754 }
a0d0e21e
LW
2755 RETPUSHNO;
2756}
79072805 2757
a0d0e21e
LW
2758PP(pp_hslice)
2759{
4e35701f 2760 djSP; dMARK; dORIGMARK;
a0d0e21e 2761 register HV *hv = (HV*)POPs;
533c011a 2762 register I32 lval = PL_op->op_flags & OPf_MOD;
c750a3ec 2763 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
79072805 2764
0ebe0038 2765 if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
cea2e8a9 2766 DIE(aTHX_ "Can't localize pseudo-hash element");
0ebe0038 2767
c750a3ec 2768 if (realhv || SvTYPE(hv) == SVt_PVAV) {
a0d0e21e 2769 while (++MARK <= SP) {
f12c7020 2770 SV *keysv = *MARK;
ae77835f
MB
2771 SV **svp;
2772 if (realhv) {
800e9ae0 2773 HE *he = hv_fetch_ent(hv, keysv, lval, 0);
ae77835f 2774 svp = he ? &HeVAL(he) : 0;
ef54e1a4
JH
2775 }
2776 else {
97fcbf96 2777 svp = avhv_fetch_ent((AV*)hv, keysv, lval, 0);
ae77835f 2778 }
a0d0e21e 2779 if (lval) {
2d8e6c8d
GS
2780 if (!svp || *svp == &PL_sv_undef) {
2781 STRLEN n_a;
cea2e8a9 2782 DIE(aTHX_ PL_no_helem, SvPV(keysv, n_a));
2d8e6c8d 2783 }
533c011a 2784 if (PL_op->op_private & OPpLVAL_INTRO)
800e9ae0 2785 save_helem(hv, keysv, svp);
93a17b20 2786 }
3280af22 2787 *MARK = svp ? *svp : &PL_sv_undef;
79072805
LW
2788 }
2789 }
a0d0e21e
LW
2790 if (GIMME != G_ARRAY) {
2791 MARK = ORIGMARK;
2792 *++MARK = *SP;
2793 SP = MARK;
79072805 2794 }
a0d0e21e
LW
2795 RETURN;
2796}
2797
2798/* List operators. */
2799
2800PP(pp_list)
2801{
4e35701f 2802 djSP; dMARK;
a0d0e21e
LW
2803 if (GIMME != G_ARRAY) {
2804 if (++MARK <= SP)
2805 *MARK = *SP; /* unwanted list, return last item */
8990e307 2806 else
3280af22 2807 *MARK = &PL_sv_undef;
a0d0e21e 2808 SP = MARK;
79072805 2809 }
a0d0e21e 2810 RETURN;
79072805
LW
2811}
2812
a0d0e21e 2813PP(pp_lslice)
79072805 2814{
4e35701f 2815 djSP;
3280af22
NIS
2816 SV **lastrelem = PL_stack_sp;
2817 SV **lastlelem = PL_stack_base + POPMARK;
2818 SV **firstlelem = PL_stack_base + POPMARK + 1;
a0d0e21e 2819 register SV **firstrelem = lastlelem + 1;
3280af22 2820 I32 arybase = PL_curcop->cop_arybase;
533c011a 2821 I32 lval = PL_op->op_flags & OPf_MOD;
4633a7c4 2822 I32 is_something_there = lval;
79072805 2823
a0d0e21e
LW
2824 register I32 max = lastrelem - lastlelem;
2825 register SV **lelem;
2826 register I32 ix;
2827
2828 if (GIMME != G_ARRAY) {
748a9306
LW
2829 ix = SvIVx(*lastlelem);
2830 if (ix < 0)
2831 ix += max;
2832 else
2833 ix -= arybase;
a0d0e21e 2834 if (ix < 0 || ix >= max)
3280af22 2835 *firstlelem = &PL_sv_undef;
a0d0e21e
LW
2836 else
2837 *firstlelem = firstrelem[ix];
2838 SP = firstlelem;
2839 RETURN;
2840 }
2841
2842 if (max == 0) {
2843 SP = firstlelem - 1;
2844 RETURN;
2845 }
2846
2847 for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
748a9306 2848 ix = SvIVx(*lelem);
c73bf8e3 2849 if (ix < 0)
a0d0e21e 2850 ix += max;
c73bf8e3 2851 else
748a9306 2852 ix -= arybase;
c73bf8e3
HS
2853 if (ix < 0 || ix >= max)
2854 *lelem = &PL_sv_undef;
2855 else {
2856 is_something_there = TRUE;
2857 if (!(*lelem = firstrelem[ix]))
3280af22 2858 *lelem = &PL_sv_undef;
748a9306 2859 }
79072805 2860 }
4633a7c4
LW
2861 if (is_something_there)
2862 SP = lastlelem;
2863 else
2864 SP = firstlelem - 1;
79072805
LW
2865 RETURN;
2866}
2867
a0d0e21e
LW
2868PP(pp_anonlist)
2869{
4e35701f 2870 djSP; dMARK; dORIGMARK;
a0d0e21e 2871 I32 items = SP - MARK;
44a8e56a 2872 SV *av = sv_2mortal((SV*)av_make(items, MARK+1));
2873 SP = ORIGMARK; /* av_make() might realloc stack_sp */
2874 XPUSHs(av);
a0d0e21e
LW
2875 RETURN;
2876}
2877
2878PP(pp_anonhash)
79072805 2879{
4e35701f 2880 djSP; dMARK; dORIGMARK;
a0d0e21e
LW
2881 HV* hv = (HV*)sv_2mortal((SV*)newHV());
2882
2883 while (MARK < SP) {
2884 SV* key = *++MARK;
a0d0e21e
LW
2885 SV *val = NEWSV(46, 0);
2886 if (MARK < SP)
2887 sv_setsv(val, *++MARK);
e476b1b5
GS
2888 else if (ckWARN(WARN_MISC))
2889 Perl_warner(aTHX_ WARN_MISC, "Odd number of elements in hash assignment");
f12c7020 2890 (void)hv_store_ent(hv,key,val,0);
79072805 2891 }
a0d0e21e
LW
2892 SP = ORIGMARK;
2893 XPUSHs((SV*)hv);
79072805
LW
2894 RETURN;
2895}
2896
a0d0e21e 2897PP(pp_splice)
79072805 2898{
4e35701f 2899 djSP; dMARK; dORIGMARK;
a0d0e21e
LW
2900 register AV *ary = (AV*)*++MARK;
2901 register SV **src;
2902 register SV **dst;
2903 register I32 i;
2904 register I32 offset;
2905 register I32 length;
2906 I32 newlen;
2907 I32 after;
2908 I32 diff;
2909 SV **tmparyval = 0;
93965878
NIS
2910 MAGIC *mg;
2911
155aba94 2912 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
33c27489 2913 *MARK-- = SvTIED_obj((SV*)ary, mg);
93965878 2914 PUSHMARK(MARK);
8ec5e241 2915 PUTBACK;
a60c0954 2916 ENTER;
864dbfa3 2917 call_method("SPLICE",GIMME_V);
a60c0954 2918 LEAVE;
93965878
NIS
2919 SPAGAIN;
2920 RETURN;
2921 }
79072805 2922
a0d0e21e 2923 SP++;
79072805 2924
a0d0e21e 2925 if (++MARK < SP) {
84902520 2926 offset = i = SvIVx(*MARK);
a0d0e21e 2927 if (offset < 0)
93965878 2928 offset += AvFILLp(ary) + 1;
a0d0e21e 2929 else
3280af22 2930 offset -= PL_curcop->cop_arybase;
84902520 2931 if (offset < 0)
cea2e8a9 2932 DIE(aTHX_ PL_no_aelem, i);
a0d0e21e
LW
2933 if (++MARK < SP) {
2934 length = SvIVx(*MARK++);
48cdf507
GA
2935 if (length < 0) {
2936 length += AvFILLp(ary) - offset + 1;
2937 if (length < 0)
2938 length = 0;
2939 }
79072805
LW
2940 }
2941 else
a0d0e21e 2942 length = AvMAX(ary) + 1; /* close enough to infinity */
79072805 2943 }
a0d0e21e
LW
2944 else {
2945 offset = 0;
2946 length = AvMAX(ary) + 1;
2947 }
93965878
NIS
2948 if (offset > AvFILLp(ary) + 1)
2949 offset = AvFILLp(ary) + 1;
2950 after = AvFILLp(ary) + 1 - (offset + length);
a0d0e21e
LW
2951 if (after < 0) { /* not that much array */
2952 length += after; /* offset+length now in array */
2953 after = 0;
2954 if (!AvALLOC(ary))
2955 av_extend(ary, 0);
2956 }
2957
2958 /* At this point, MARK .. SP-1 is our new LIST */
2959
2960 newlen = SP - MARK;
2961 diff = newlen - length;
13d7cbc1
GS
2962 if (newlen && !AvREAL(ary) && AvREIFY(ary))
2963 av_reify(ary);
a0d0e21e
LW
2964
2965 if (diff < 0) { /* shrinking the area */
2966 if (newlen) {
2967 New(451, tmparyval, newlen, SV*); /* so remember insertion */
2968 Copy(MARK, tmparyval, newlen, SV*);
79072805 2969 }
a0d0e21e
LW
2970
2971 MARK = ORIGMARK + 1;
2972 if (GIMME == G_ARRAY) { /* copy return vals to stack */
2973 MEXTEND(MARK, length);
2974 Copy(AvARRAY(ary)+offset, MARK, length, SV*);
2975 if (AvREAL(ary)) {
bbce6d69 2976 EXTEND_MORTAL(length);
36477c24 2977 for (i = length, dst = MARK; i; i--) {
d689ffdd 2978 sv_2mortal(*dst); /* free them eventualy */
36477c24 2979 dst++;
2980 }
a0d0e21e
LW
2981 }
2982 MARK += length - 1;
79072805 2983 }
a0d0e21e
LW
2984 else {
2985 *MARK = AvARRAY(ary)[offset+length-1];
2986 if (AvREAL(ary)) {
d689ffdd 2987 sv_2mortal(*MARK);
a0d0e21e
LW
2988 for (i = length - 1, dst = &AvARRAY(ary)[offset]; i > 0; i--)
2989 SvREFCNT_dec(*dst++); /* free them now */
79072805 2990 }
a0d0e21e 2991 }
93965878 2992 AvFILLp(ary) += diff;
a0d0e21e
LW
2993
2994 /* pull up or down? */
2995
2996 if (offset < after) { /* easier to pull up */
2997 if (offset) { /* esp. if nothing to pull */
2998 src = &AvARRAY(ary)[offset-1];
2999 dst = src - diff; /* diff is negative */
3000 for (i = offset; i > 0; i--) /* can't trust Copy */
3001 *dst-- = *src--;
79072805 3002 }
a0d0e21e
LW
3003 dst = AvARRAY(ary);
3004 SvPVX(ary) = (char*)(AvARRAY(ary) - diff); /* diff is negative */
3005 AvMAX(ary) += diff;
3006 }
3007 else {
3008 if (after) { /* anything to pull down? */
3009 src = AvARRAY(ary) + offset + length;
3010 dst = src + diff; /* diff is negative */
3011 Move(src, dst, after, SV*);
79072805 3012 }
93965878 3013 dst = &AvARRAY(ary)[AvFILLp(ary)+1];
a0d0e21e
LW
3014 /* avoid later double free */
3015 }
3016 i = -diff;
3017 while (i)
3280af22 3018 dst[--i] = &PL_sv_undef;
a0d0e21e
LW
3019
3020 if (newlen) {
3021 for (src = tmparyval, dst = AvARRAY(ary) + offset;
3022 newlen; newlen--) {
3023 *dst = NEWSV(46, 0);
3024 sv_setsv(*dst++, *src++);
79072805 3025 }
a0d0e21e
LW
3026 Safefree(tmparyval);
3027 }
3028 }
3029 else { /* no, expanding (or same) */
3030 if (length) {
3031 New(452, tmparyval, length, SV*); /* so remember deletion */
3032 Copy(AvARRAY(ary)+offset, tmparyval, length, SV*);
3033 }
3034
3035 if (diff > 0) { /* expanding */
3036
3037 /* push up or down? */
3038
3039 if (offset < after && diff <= AvARRAY(ary) - AvALLOC(ary)) {
3040 if (offset) {
3041 src = AvARRAY(ary);
3042 dst = src - diff;
3043 Move(src, dst, offset, SV*);
79072805 3044 }
a0d0e21e
LW
3045 SvPVX(ary) = (char*)(AvARRAY(ary) - diff);/* diff is positive */
3046 AvMAX(ary) += diff;
93965878 3047 AvFILLp(ary) += diff;
79072805
LW
3048 }
3049 else {
93965878
NIS
3050 if (AvFILLp(ary) + diff >= AvMAX(ary)) /* oh, well */
3051 av_extend(ary, AvFILLp(ary) + diff);
3052 AvFILLp(ary) += diff;
a0d0e21e
LW
3053
3054 if (after) {
93965878 3055 dst = AvARRAY(ary) + AvFILLp(ary);
a0d0e21e
LW
3056 src = dst - diff;
3057 for (i = after; i; i--) {
3058 *dst-- = *src--;
3059 }
79072805
LW
3060 }
3061 }
a0d0e21e
LW
3062 }
3063
3064 for (src = MARK, dst = AvARRAY(ary) + offset; newlen; newlen--) {
3065 *dst = NEWSV(46, 0);
3066 sv_setsv(*dst++, *src++);
3067 }
3068 MARK = ORIGMARK + 1;
3069 if (GIMME == G_ARRAY) { /* copy return vals to stack */
3070 if (length) {
3071 Copy(tmparyval, MARK, length, SV*);
3072 if (AvREAL(ary)) {
bbce6d69 3073 EXTEND_MORTAL(length);
36477c24 3074 for (i = length, dst = MARK; i; i--) {
d689ffdd 3075 sv_2mortal(*dst); /* free them eventualy */
36477c24 3076 dst++;
3077 }
79072805 3078 }
a0d0e21e 3079 Safefree(tmparyval);
79072805 3080 }
a0d0e21e
LW
3081 MARK += length - 1;
3082 }
3083 else if (length--) {
3084 *MARK = tmparyval[length];
3085 if (AvREAL(ary)) {
d689ffdd 3086 sv_2mortal(*MARK);
a0d0e21e
LW
3087 while (length-- > 0)
3088 SvREFCNT_dec(tmparyval[length]);
79072805 3089 }
a0d0e21e 3090 Safefree(tmparyval);
79072805 3091 }
a0d0e21e 3092 else
3280af22 3093 *MARK = &PL_sv_undef;
79072805 3094 }
a0d0e21e 3095 SP = MARK;
79072805
LW
3096 RETURN;
3097}
3098
a0d0e21e 3099PP(pp_push)
79072805 3100{
4e35701f 3101 djSP; dMARK; dORIGMARK; dTARGET;
a0d0e21e 3102 register AV *ary = (AV*)*++MARK;
3280af22 3103 register SV *sv = &PL_sv_undef;
93965878 3104 MAGIC *mg;
79072805 3105
155aba94 3106 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
33c27489 3107 *MARK-- = SvTIED_obj((SV*)ary, mg);
93965878
NIS
3108 PUSHMARK(MARK);
3109 PUTBACK;
a60c0954 3110 ENTER;
864dbfa3 3111 call_method("PUSH",G_SCALAR|G_DISCARD);
a60c0954 3112 LEAVE;
93965878 3113 SPAGAIN;
93965878 3114 }
a60c0954
NIS
3115 else {
3116 /* Why no pre-extend of ary here ? */
3117 for (++MARK; MARK <= SP; MARK++) {
3118 sv = NEWSV(51, 0);
3119 if (*MARK)
3120 sv_setsv(sv, *MARK);
3121 av_push(ary, sv);
3122 }
79072805
LW
3123 }
3124 SP = ORIGMARK;
a0d0e21e 3125 PUSHi( AvFILL(ary) + 1 );
79072805
LW
3126 RETURN;
3127}
3128
a0d0e21e 3129PP(pp_pop)
79072805 3130{
4e35701f 3131 djSP;
a0d0e21e
LW
3132 AV *av = (AV*)POPs;
3133 SV *sv = av_pop(av);
d689ffdd 3134 if (AvREAL(av))
a0d0e21e
LW
3135 (void)sv_2mortal(sv);
3136 PUSHs(sv);
79072805 3137 RETURN;
79072805
LW
3138}
3139
a0d0e21e 3140PP(pp_shift)
79072805 3141{
4e35701f 3142 djSP;
a0d0e21e
LW
3143 AV *av = (AV*)POPs;
3144 SV *sv = av_shift(av);
79072805 3145 EXTEND(SP, 1);
a0d0e21e 3146 if (!sv)
79072805 3147 RETPUSHUNDEF;
d689ffdd 3148 if (AvREAL(av))
a0d0e21e
LW
3149 (void)sv_2mortal(sv);
3150 PUSHs(sv);
79072805 3151 RETURN;
79072805
LW
3152}
3153
a0d0e21e 3154PP(pp_unshift)
79072805 3155{
4e35701f 3156 djSP; dMARK; dORIGMARK; dTARGET;
a0d0e21e
LW
3157 register AV *ary = (AV*)*++MARK;
3158 register SV *sv;
3159 register I32 i = 0;
93965878
NIS
3160 MAGIC *mg;
3161
155aba94 3162 if ((mg = SvTIED_mg((SV*)ary, 'P'))) {
33c27489 3163 *MARK-- = SvTIED_obj((SV*)ary, mg);
7fd66d9d 3164 PUSHMARK(MARK);
93965878 3165 PUTBACK;
a60c0954 3166 ENTER;
864dbfa3 3167 call_method("UNSHIFT",G_SCALAR|G_DISCARD);
a60c0954 3168 LEAVE;
93965878 3169 SPAGAIN;
93965878 3170 }
a60c0954
NIS
3171 else {
3172 av_unshift(ary, SP - MARK);
3173 while (MARK < SP) {
3174 sv = NEWSV(27, 0);
3175 sv_setsv(sv, *++MARK);
3176 (void)av_store(ary, i++, sv);
3177 }
79072805 3178 }
a0d0e21e
LW
3179 SP = ORIGMARK;
3180 PUSHi( AvFILL(ary) + 1 );
79072805 3181 RETURN;
79072805
LW
3182}
3183
a0d0e21e 3184PP(pp_reverse)
79072805 3185{
4e35701f 3186 djSP; dMARK;
a0d0e21e
LW
3187 register SV *tmp;
3188 SV **oldsp = SP;
79072805 3189
a0d0e21e
LW
3190 if (GIMME == G_ARRAY) {
3191 MARK++;
3192 while (MARK < SP) {
3193 tmp = *MARK;
3194 *MARK++ = *SP;
3195 *SP-- = tmp;
3196 }
dd58a1ab 3197 /* safe as long as stack cannot get extended in the above */
a0d0e21e 3198 SP = oldsp;
79072805
LW
3199 }
3200 else {
a0d0e21e
LW
3201 register char *up;
3202 register char *down;
3203 register I32 tmp;
3204 dTARGET;
3205 STRLEN len;
79072805 3206
7e2040f0 3207 SvUTF8_off(TARG); /* decontaminate */
a0d0e21e 3208 if (SP - MARK > 1)
3280af22 3209 do_join(TARG, &PL_sv_no, MARK, SP);
a0d0e21e 3210 else
54b9620d 3211 sv_setsv(TARG, (SP > MARK) ? *SP : DEFSV);
a0d0e21e
LW
3212 up = SvPV_force(TARG, len);
3213 if (len > 1) {
7e2040f0 3214 if (DO_UTF8(TARG)) { /* first reverse each character */
dfe13c55
GS
3215 U8* s = (U8*)SvPVX(TARG);
3216 U8* send = (U8*)(s + len);
a0ed51b3
LW
3217 while (s < send) {
3218 if (*s < 0x80) {
3219 s++;
3220 continue;
3221 }
3222 else {
dfe13c55 3223 up = (char*)s;
a0ed51b3 3224 s += UTF8SKIP(s);
dfe13c55 3225 down = (char*)(s - 1);
f248d071
GS
3226 if (s > send || !((*down & 0xc0) == 0x80)) {
3227 if (ckWARN_d(WARN_UTF8))
3228 Perl_warner(aTHX_ WARN_UTF8,
3229 "Malformed UTF-8 character");
a0ed51b3
LW
3230 break;
3231 }
3232 while (down > up) {
3233 tmp = *up;
3234 *up++ = *down;
3235 *down-- = tmp;
3236 }
3237 }
3238 }
3239 up = SvPVX(TARG);
3240 }
a0d0e21e
LW
3241 down = SvPVX(TARG) + len - 1;
3242 while (down > up) {
3243 tmp = *up;
3244 *up++ = *down;
3245 *down-- = tmp;
3246 }
3aa33fe5 3247 (void)SvPOK_only_UTF8(TARG);
79072805 3248 }
a0d0e21e
LW
3249 SP = MARK + 1;
3250 SETTARG;
79072805 3251 }
a0d0e21e 3252 RETURN;
79072805
LW
3253}
3254
864dbfa3 3255STATIC SV *
cea2e8a9 3256S_mul128(pTHX_ SV *sv, U8 m)
55497cff 3257{
3258 STRLEN len;
3259 char *s = SvPV(sv, len);
3260 char *t;
3261 U32 i = 0;
3262
3263 if (!strnEQ(s, "0000", 4)) { /* need to grow sv */
79cb57f6 3264 SV *tmpNew = newSVpvn("0000000000", 10);
55497cff 3265
09b7f37c 3266 sv_catsv(tmpNew, sv);
55497cff 3267 SvREFCNT_dec(sv); /* free old sv */
09b7f37c 3268 sv = tmpNew;
55497cff 3269 s = SvPV(sv, len);
3270 }
3271 t = s + len - 1;
3272 while (!*t) /* trailing '\0'? */
3273 t--;
3274 while (t > s) {
3275 i = ((*t - '0') << 7) + m;
3276 *(t--) = '0' + (i % 10);
3277 m = i / 10;
3278 }
3279 return (sv);
3280}
3281
a0d0e21e
LW
3282/* Explosives and implosives. */
3283
9d116dd7
JH
3284#if 'I' == 73 && 'J' == 74
3285/* On an ASCII/ISO kind of system */
ba1ac976 3286#define ISUUCHAR(ch) ((ch) >= ' ' && (ch) < 'a')
9d116dd7
JH
3287#else
3288/*
3289 Some other sort of character set - use memchr() so we don't match
3290 the null byte.
3291 */
80252599 3292#define ISUUCHAR(ch) (memchr(PL_uuemap, (ch), sizeof(PL_uuemap)-1) || (ch) == ' ')
9d116dd7
JH
3293#endif
3294
a0d0e21e 3295PP(pp_unpack)
79072805 3296{
4e35701f 3297 djSP;
a0d0e21e 3298 dPOPPOPssrl;
dd58a1ab 3299 I32 start_sp_offset = SP - PL_stack_base;
54310121 3300 I32 gimme = GIMME_V;
ed6116ce 3301 SV *sv;
a0d0e21e
LW
3302 STRLEN llen;
3303 STRLEN rlen;
3304 register char *pat = SvPV(left, llen);
3305 register char *s = SvPV(right, rlen);
3306 char *strend = s + rlen;
3307 char *strbeg = s;
3308 register char *patend = pat + llen;
3309 I32 datumtype;
3310 register I32 len;
3311 register I32 bits;
abdc5761 3312 register char *str;
79072805 3313
a0d0e21e
LW
3314 /* These must not be in registers: */
3315 I16 ashort;
3316 int aint;
3317 I32 along;
6b8eaf93 3318#ifdef HAS_QUAD
ecfc5424 3319 Quad_t aquad;
a0d0e21e
LW
3320#endif
3321 U16 aushort;
3322 unsigned int auint;
3323 U32 aulong;
6b8eaf93 3324#ifdef HAS_QUAD
e862df63 3325 Uquad_t auquad;
a0d0e21e
LW
3326#endif
3327 char *aptr;
3328 float afloat;
3329 double adouble;
3330 I32 checksum = 0;
3331 register U32 culong;
65202027 3332 NV cdouble;
fb73857a 3333 int commas = 0;
4b5b2118 3334 int star;
726ea183 3335#ifdef PERL_NATINT_PACK
ef54e1a4
JH
3336 int natint; /* native integer */
3337 int unatint; /* unsigned native integer */
726ea183 3338#endif
79072805 3339
54310121 3340 if (gimme != G_ARRAY) { /* arrange to do first one only */
a0d0e21e
LW
3341 /*SUPPRESS 530*/
3342 for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
5a929a98 3343 if (strchr("aAZbBhHP", *patend) || *pat == '%') {
a0d0e21e
LW
3344 patend++;
3345 while (isDIGIT(*patend) || *patend == '*')
3346 patend++;
3347 }
3348 else
3349 patend++;
79072805 3350 }
a0d0e21e
LW
3351 while (pat < patend) {
3352 reparse:
bbdab043 3353 datumtype = *pat++ & 0xFF;
726ea183 3354#ifdef PERL_NATINT_PACK
ef54e1a4 3355 natint = 0;
726ea183 3356#endif
bbdab043
CS
3357 if (isSPACE(datumtype))
3358 continue;
17f4a12d
IZ
3359 if (datumtype == '#') {
3360 while (pat < patend && *pat != '\n')
3361 pat++;
3362 continue;
3363 }
f61d411c 3364 if (*pat == '!') {
ef54e1a4
JH
3365 char *natstr = "sSiIlL";
3366
3367 if (strchr(natstr, datumtype)) {
726ea183 3368#ifdef PERL_NATINT_PACK
ef54e1a4 3369 natint = 1;
726ea183 3370#endif
ef54e1a4
JH
3371 pat++;
3372 }
3373 else
d470f89e 3374 DIE(aTHX_ "'!' allowed only after types %s", natstr);
ef54e1a4 3375 }
4b5b2118 3376 star = 0;
a0d0e21e
LW
3377 if (pat >= patend)
3378 len = 1;
3379 else if (*pat == '*') {
3380 len = strend - strbeg; /* long enough */
3381 pat++;
4b5b2118 3382 star = 1;
a0d0e21e
LW
3383 }
3384 else if (isDIGIT(*pat)) {
3385 len = *pat++ - '0';
06387354 3386 while (isDIGIT(*pat)) {
a0d0e21e 3387 len = (len * 10) + (*pat++ - '0');
06387354 3388 if (len < 0)
d470f89e 3389 DIE(aTHX_ "Repeat count in unpack overflows");
06387354 3390 }
a0d0e21e
LW
3391 }
3392 else
3393 len = (datumtype != '@');
4b5b2118 3394 redo_switch:
a0d0e21e
LW
3395 switch(datumtype) {
3396 default:
d470f89e 3397 DIE(aTHX_ "Invalid type in unpack: '%c'", (int)datumtype);
fb73857a 3398 case ',': /* grandfather in commas but with a warning */
e476b1b5
GS
3399 if (commas++ == 0 && ckWARN(WARN_UNPACK))
3400 Perl_warner(aTHX_ WARN_UNPACK,
d470f89e 3401 "Invalid type in unpack: '%c'", (int)datumtype);
fb73857a 3402 break;
a0d0e21e
LW
3403 case '%':
3404 if (len == 1 && pat[-1] != '1')
3405 len = 16;
3406 checksum = len;
3407 culong = 0;
3408 cdouble = 0;
3409 if (pat < patend)
3410 goto reparse;
3411 break;
3412 case '@':
3413 if (len > strend - strbeg)
cea2e8a9 3414 DIE(aTHX_ "@ outside of string");
a0d0e21e
LW
3415 s = strbeg + len;
3416 break;
3417 case 'X':
3418 if (len > s - strbeg)
cea2e8a9 3419 DIE(aTHX_ "X outside of string");
a0d0e21e
LW
3420 s -= len;
3421 break;
3422 case 'x':
3423 if (len > strend - s)
cea2e8a9 3424 DIE(aTHX_ "x outside of string");
a0d0e21e
LW
3425 s += len;
3426 break;
17f4a12d 3427 case '/':
dd58a1ab 3428 if (start_sp_offset >= SP - PL_stack_base)
17f4a12d 3429 DIE(aTHX_ "/ must follow a numeric type");
43192e07
IP
3430 datumtype = *pat++;
3431 if (*pat == '*')
3432 pat++; /* ignore '*' for compatibility with pack */
3433 if (isDIGIT(*pat))
17f4a12d 3434 DIE(aTHX_ "/ cannot take a count" );
43192e07 3435 len = POPi;
4b5b2118
GS
3436 star = 0;
3437 goto redo_switch;
a0d0e21e 3438 case 'A':
5a929a98 3439 case 'Z':
a0d0e21e
LW
3440 case 'a':
3441 if (len > strend - s)
3442 len = strend - s;
3443 if (checksum)
3444 goto uchar_checksum;
3445 sv = NEWSV(35, len);
3446 sv_setpvn(sv, s, len);
3447 s += len;
5a929a98 3448 if (datumtype == 'A' || datumtype == 'Z') {
a0d0e21e 3449 aptr = s; /* borrow register */
5a929a98
VU
3450 if (datumtype == 'Z') { /* 'Z' strips stuff after first null */
3451 s = SvPVX(sv);
3452 while (*s)
3453 s++;
3454 }
3455 else { /* 'A' strips both nulls and spaces */
3456 s = SvPVX(sv) + len - 1;
3457 while (s >= SvPVX(sv) && (!*s || isSPACE(*s)))
3458 s--;
3459 *++s = '\0';
3460 }
a0d0e21e
LW
3461 SvCUR_set(sv, s - SvPVX(sv));
3462 s = aptr; /* unborrow register */
3463 }
3464 XPUSHs(sv_2mortal(sv));
3465 break;
3466 case 'B':
3467 case 'b':
4b5b2118 3468 if (star || len > (strend - s) * 8)
a0d0e21e
LW
3469 len = (strend - s) * 8;
3470 if (checksum) {
80252599
GS
3471 if (!PL_bitcount) {
3472 Newz(601, PL_bitcount, 256, char);
a0d0e21e 3473 for (bits = 1; bits < 256; bits++) {
80252599
GS
3474 if (bits & 1) PL_bitcount[bits]++;
3475 if (bits & 2) PL_bitcount[bits]++;
3476 if (bits & 4) PL_bitcount[bits]++;
3477 if (bits & 8) PL_bitcount[bits]++;
3478 if (bits & 16) PL_bitcount[bits]++;
3479 if (bits & 32) PL_bitcount[bits]++;
3480 if (bits & 64) PL_bitcount[bits]++;
3481 if (bits & 128) PL_bitcount[bits]++;
a0d0e21e
LW
3482 }
3483 }
3484 while (len >= 8) {
80252599 3485 culong += PL_bitcount[*(unsigned char*)s++];
a0d0e21e
LW
3486 len -= 8;
3487 }
3488 if (len) {
3489 bits = *s;
3490 if (datumtype == 'b') {
3491 while (len-- > 0) {
3492 if (bits & 1) culong++;
3493 bits >>= 1;
3494 }
3495 }
3496 else {
3497 while (len-- > 0) {
3498 if (bits & 128) culong++;
3499 bits <<= 1;
3500 }
3501 }
3502 }
79072805
LW
3503 break;
3504 }
a0d0e21e
LW
3505 sv = NEWSV(35, len + 1);
3506 SvCUR_set(sv, len);
3507 SvPOK_on(sv);
abdc5761 3508 str = SvPVX(sv);
a0d0e21e
LW
3509 if (datumtype == 'b') {
3510 aint = len;
3511 for (len = 0; len < aint; len++) {
3512 if (len & 7) /*SUPPRESS 595*/
3513 bits >>= 1;
3514 else
3515 bits = *s++;
abdc5761 3516 *str++ = '0' + (bits & 1);
a0d0e21e
LW
3517 }
3518 }
3519 else {
3520 aint = len;
3521 for (len = 0; len < aint; len++) {
3522 if (len & 7)
3523 bits <<= 1;
3524 else
3525 bits = *s++;
abdc5761 3526 *str++ = '0' + ((bits & 128) != 0);
a0d0e21e
LW
3527 }
3528 }
abdc5761 3529 *str = '\0';
a0d0e21e
LW
3530 XPUSHs(sv_2mortal(sv));
3531 break;
3532 case 'H':
3533 case 'h':
4b5b2118 3534 if (star || len > (strend - s) * 2)
a0d0e21e
LW
3535 len = (strend - s) * 2;
3536 sv = NEWSV(35, len + 1);
3537 SvCUR_set(sv, len);
3538 SvPOK_on(sv);
abdc5761 3539 str = SvPVX(sv);
a0d0e21e
LW
3540 if (datumtype == 'h') {
3541 aint = len;
3542 for (len = 0; len < aint; len++) {
3543 if (len & 1)
3544 bits >>= 4;
3545 else
3546 bits = *s++;
abdc5761 3547 *str++ = PL_hexdigit[bits & 15];
a0d0e21e
LW
3548 }
3549 }
3550 else {
3551 aint = len;
3552 for (len = 0; len < aint; len++) {
3553 if (len & 1)
3554 bits <<= 4;
3555 else
3556 bits = *s++;
abdc5761 3557 *str++ = PL_hexdigit[(bits >> 4) & 15];
a0d0e21e
LW
3558 }
3559 }
abdc5761 3560 *str = '\0';
a0d0e21e
LW
3561 XPUSHs(sv_2mortal(sv));
3562 break;
3563 case 'c':
3564 if (len > strend - s)
3565 len = strend - s;
3566 if (checksum) {
3567 while (len-- > 0) {
3568 aint = *s++;
3569 if (aint >= 128) /* fake up signed chars */
3570 aint -= 256;
3571 culong += aint;
3572 }
3573 }
3574 else {
3575 EXTEND(SP, len);
bbce6d69 3576 EXTEND_MORTAL(len);
a0d0e21e
LW
3577 while (len-- > 0) {
3578 aint = *s++;
3579 if (aint >= 128) /* fake up signed chars */
3580 aint -= 256;
3581 sv = NEWSV(36, 0);
1e422769 3582 sv_setiv(sv, (IV)aint);
a0d0e21e
LW
3583 PUSHs(sv_2mortal(sv));
3584 }
3585 }
3586 break;
3587 case 'C':
3588 if (len > strend - s)
3589 len = strend - s;
3590 if (checksum) {
3591 uchar_checksum:
3592 while (len-- > 0) {
3593 auint = *s++ & 255;
3594 culong += auint;
3595 }
3596 }
3597 else {
3598 EXTEND(SP, len);
bbce6d69 3599 EXTEND_MORTAL(len);
a0d0e21e
LW
3600 while (len-- > 0) {
3601 auint = *s++ & 255;
3602 sv = NEWSV(37, 0);
1e422769 3603 sv_setiv(sv, (IV)auint);
a0d0e21e
LW
3604 PUSHs(sv_2mortal(sv));
3605 }
3606 }
3607 break;
a0ed51b3
LW
3608 case 'U':
3609 if (len > strend - s)
3610 len = strend - s;
3611 if (checksum) {
3612 while (len-- > 0 && s < strend) {
dfe13c55 3613 auint = utf8_to_uv((U8*)s, &along);
a0ed51b3 3614 s += along;
32d8b6e5 3615 if (checksum > 32)
65202027 3616 cdouble += (NV)auint;
32d8b6e5
GA
3617 else
3618 culong += auint;
a0ed51b3
LW
3619 }
3620 }
3621 else {
3622 EXTEND(SP, len);
3623 EXTEND_MORTAL(len);
3624 while (len-- > 0 && s < strend) {
dfe13c55 3625 auint = utf8_to_uv((U8*)s, &along);
a0ed51b3
LW
3626 s += along;
3627 sv = NEWSV(37, 0);
bdeef251 3628 sv_setuv(sv, (UV)auint);
a0ed51b3
LW
3629 PUSHs(sv_2mortal(sv));
3630 }
3631 }
3632 break;
a0d0e21e 3633 case 's':
726ea183
JH
3634#if SHORTSIZE == SIZE16
3635 along = (strend - s) / SIZE16;
3636#else
ef54e1a4 3637 along = (strend - s) / (natint ? sizeof(short) : SIZE16);
726ea183 3638#endif
a0d0e21e
LW
3639 if (len > along)
3640 len = along;
3641 if (checksum) {
726ea183 3642#if SHORTSIZE != SIZE16