Integrate changes #8659,8702,8808,8809,8810 from maintperl.
[p5sagit/p5-mst-13.2.git] / doop.c
CommitLineData
a0d0e21e 1/* doop.c
79072805 2 *
bc89e66f 3 * Copyright (c) 1991-2001, Larry Wall
79072805 4 *
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.
7 *
a0d0e21e 8 */
9
10/*
11 * "'So that was the job I felt I had to do when I started,' thought Sam."
79072805 12 */
13
14#include "EXTERN.h"
864dbfa3 15#define PERL_IN_DOOP_C
79072805 16#include "perl.h"
17
64ca3a65 18#ifndef PERL_MICRO
79072805 19#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
20#include <signal.h>
21#endif
64ca3a65 22#endif
79072805 23
942e002e 24STATIC I32
b250498f 25S_do_trans_simple(pTHX_ SV *sv)
79072805 26{
4757a243 27 U8 *s;
b250498f 28 U8 *d;
4757a243 29 U8 *send;
b250498f 30 U8 *dstart;
4757a243 31 I32 matches = 0;
9b877dbb 32 I32 grows = PL_op->op_private & OPpTRANS_GROWS;
463ee0b2 33 STRLEN len;
4757a243 34 short *tbl;
35 I32 ch;
79072805 36
4757a243 37 tbl = (short*)cPVOP->op_pv;
38 if (!tbl)
2269b42e 39 Perl_croak(aTHX_ "panic: do_trans_simple");
a0ed51b3 40
4757a243 41 s = (U8*)SvPV(sv, len);
42 send = s + len;
43
b250498f 44 /* First, take care of non-UTF8 input strings, because they're easy */
1aa99e6b 45 if (!SvUTF8(sv)) {
01ec43d0 46 while (s < send) {
036b4402 47 if ((ch = tbl[*s]) >= 0) {
01ec43d0 48 matches++;
49 *s++ = ch;
50 }
51 else
52 s++;
53 }
54 SvSETMAGIC(sv);
b250498f 55 return matches;
56 }
4757a243 57
b250498f 58 /* Allow for expansion: $_="a".chr(400); tr/a/\xFE/, FE needs encoding */
9b877dbb 59 if (grows)
60 New(0, d, len*2+1, U8);
61 else
62 d = s;
b250498f 63 dstart = d;
64 while (s < send) {
ba210ebe 65 STRLEN ulen;
9b877dbb 66 UV c;
b250498f 67
b250498f 68 /* Need to check this, otherwise 128..255 won't match */
dcad2880 69 c = utf8_to_uv(s, send - s, &ulen, 0);
9b877dbb 70 if (c < 0x100 && (ch = tbl[c]) >= 0) {
b250498f 71 matches++;
0f4a810e 72 d = uv_to_utf8(d, ch);
b250498f 73 s += ulen;
01ec43d0 74 }
75 else { /* No match -> copy */
9b877dbb 76 Copy(s, d, ulen, U8);
77 d += ulen;
78 s += ulen;
b250498f 79 }
80 }
9b877dbb 81 if (grows) {
82 sv_setpvn(sv, (char*)dstart, d - dstart);
83 Safefree(dstart);
84 }
85 else {
86 *d = '\0';
87 SvCUR_set(sv, d - dstart);
88 }
b250498f 89 SvUTF8_on(sv);
b250498f 90 SvSETMAGIC(sv);
4757a243 91 return matches;
92}
93
942e002e 94STATIC I32
036b4402 95S_do_trans_count(pTHX_ SV *sv)/* SPC - OK */
4757a243 96{
4757a243 97 U8 *s;
98 U8 *send;
99 I32 matches = 0;
100 STRLEN len;
101 short *tbl;
102
103 tbl = (short*)cPVOP->op_pv;
104 if (!tbl)
2269b42e 105 Perl_croak(aTHX_ "panic: do_trans_count");
4757a243 106
107 s = (U8*)SvPV(sv, len);
108 send = s + len;
109
1aa99e6b 110 if (!SvUTF8(sv))
111 while (s < send) {
112 if (tbl[*s++] >= 0)
036b4402 113 matches++;
1aa99e6b 114 }
115 else
116 while (s < send) {
117 UV c;
118 STRLEN ulen;
119 c = utf8_to_uv(s, send - s, &ulen, 0);
120 if (c < 0x100 && tbl[c] >= 0)
121 matches++;
122 s += ulen;
123 }
4757a243 124
125 return matches;
126}
127
942e002e 128STATIC I32
b250498f 129S_do_trans_complex(pTHX_ SV *sv)/* SPC - NOT OK */
4757a243 130{
4757a243 131 U8 *s;
132 U8 *send;
133 U8 *d;
5e44153e 134 U8 *dstart;
1aa99e6b 135 I32 isutf8;
4757a243 136 I32 matches = 0;
9b877dbb 137 I32 grows = PL_op->op_private & OPpTRANS_GROWS;
4757a243 138 STRLEN len;
139 short *tbl;
140 I32 ch;
141
142 tbl = (short*)cPVOP->op_pv;
143 if (!tbl)
2269b42e 144 Perl_croak(aTHX_ "panic: do_trans_complex");
4757a243 145
146 s = (U8*)SvPV(sv, len);
1aa99e6b 147 isutf8 = SvUTF8(sv);
4757a243 148 send = s + len;
149
1aa99e6b 150 if (!isutf8) {
151 dstart = d = s;
152 if (PL_op->op_private & OPpTRANS_SQUASH) {
153 U8* p = send;
154 while (s < send) {
155 if ((ch = tbl[*s]) >= 0) {
036b4402 156 *d = ch;
157 matches++;
1aa99e6b 158 if (p != d - 1 || *p != *d)
159 p = d++;
160 }
161 else if (ch == -1) /* -1 is unmapped character */
162 *d++ = *s;
163 else if (ch == -2) /* -2 is delete character */
164 matches++;
165 s++;
166 }
a0ed51b3 167 }
1aa99e6b 168 else {
169 while (s < send) {
170 if ((ch = tbl[*s]) >= 0) {
171 matches++;
172 *d++ = ch;
173 }
174 else if (ch == -1) /* -1 is unmapped character */
175 *d++ = *s;
176 else if (ch == -2) /* -2 is delete character */
177 matches++;
178 s++;
179 }
180 }
181 SvCUR_set(sv, d - dstart);
4757a243 182 }
1aa99e6b 183 else { /* isutf8 */
9b877dbb 184 if (grows)
185 New(0, d, len*2+1, U8);
186 else
187 d = s;
1aa99e6b 188 dstart = d;
189
4aecb5b5 190#ifdef MACOS_TRADITIONAL
191#define comp CoMP /* "comp" is a keyword in some compilers ... */
192#endif
193
1aa99e6b 194 if (PL_op->op_private & OPpTRANS_SQUASH) {
195 U8* p = send;
196 UV pch = 0xfeedface;
197 while (s < send) {
198 STRLEN len;
199 UV comp = utf8_to_uv_simple(s, &len);
200
9b877dbb 201 if (comp > 0xff) { /* always unmapped */
202 Copy(s, d, len, U8);
203 d += len;
204 }
1aa99e6b 205 else if ((ch = tbl[comp]) >= 0) {
206 matches++;
207 if (ch != pch) {
208 d = uv_to_utf8(d, ch);
209 pch = ch;
210 }
211 s += len;
212 continue;
213 }
9b877dbb 214 else if (ch == -1) { /* -1 is unmapped character */
215 Copy(s, d, len, U8);
216 d += len;
217 }
1aa99e6b 218 else if (ch == -2) /* -2 is delete character */
219 matches++;
220 s += len;
221 pch = 0xfeedface;
222 }
5d06d08e 223 }
1aa99e6b 224 else {
225 while (s < send) {
226 STRLEN len;
227 UV comp = utf8_to_uv_simple(s, &len);
9b877dbb 228 if (comp > 0xff) { /* always unmapped */
229 Copy(s, d, len, U8);
230 d += len;
231 }
1aa99e6b 232 else if ((ch = tbl[comp]) >= 0) {
233 d = uv_to_utf8(d, ch);
234 matches++;
235 }
236 else if (ch == -1) { /* -1 is unmapped character */
9b877dbb 237 Copy(s, d, len, U8);
238 d += len;
1aa99e6b 239 }
240 else if (ch == -2) /* -2 is delete character */
241 matches++;
242 s += len;
243 }
244 }
9b877dbb 245 if (grows) {
246 sv_setpvn(sv, (char*)dstart, d - dstart);
247 Safefree(dstart);
248 }
249 else {
250 *d = '\0';
251 SvCUR_set(sv, d - dstart);
252 }
1aa99e6b 253 SvUTF8_on(sv);
4757a243 254 }
5e44153e 255 SvSETMAGIC(sv);
4757a243 256 return matches;
257}
258
942e002e 259STATIC I32
036b4402 260S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
4757a243 261{
4757a243 262 U8 *s;
263 U8 *send;
264 U8 *d;
036b4402 265 U8 *start;
1aa99e6b 266 U8 *dstart, *dend;
4757a243 267 I32 matches = 0;
9b877dbb 268 I32 grows = PL_op->op_private & OPpTRANS_GROWS;
4757a243 269 STRLEN len;
270
271 SV* rv = (SV*)cSVOP->op_sv;
272 HV* hv = (HV*)SvRV(rv);
273 SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
274 UV none = svp ? SvUV(*svp) : 0x7fffffff;
275 UV extra = none + 1;
276 UV final;
277 UV uv;
1aa99e6b 278 I32 isutf8;
279 U8 hibit = 0;
4757a243 280
281 s = (U8*)SvPV(sv, len);
1aa99e6b 282 isutf8 = SvUTF8(sv);
283 if (!isutf8) {
284 U8 *t = s, *e = s + len;
285 while (t < e)
fd400ab9 286 if ((hibit = UTF8_IS_CONTINUED(*t++)))
1aa99e6b 287 break;
288 if (hibit)
289 s = bytes_to_utf8(s, &len);
290 }
4757a243 291 send = s + len;
036b4402 292 start = s;
4757a243 293
294 svp = hv_fetch(hv, "FINAL", 5, FALSE);
295 if (svp)
296 final = SvUV(*svp);
297
9b877dbb 298 if (grows) {
299 /* d needs to be bigger than s, in case e.g. upgrading is required */
300 New(0, d, len*3+UTF8_MAXLEN, U8);
301 dend = d + len * 3;
302 dstart = d;
303 }
304 else {
305 dstart = d = s;
306 dend = d + len;
307 }
1aa99e6b 308
4757a243 309 while (s < send) {
310 if ((uv = swash_fetch(rv, s)) < none) {
311 s += UTF8SKIP(s);
312 matches++;
313 d = uv_to_utf8(d, uv);
314 }
315 else if (uv == none) {
1aa99e6b 316 int i = UTF8SKIP(s);
9b877dbb 317 Copy(s, d, i, U8);
318 d += i;
319 s += i;
4757a243 320 }
321 else if (uv == extra) {
1aa99e6b 322 int i = UTF8SKIP(s);
036b4402 323 s += i;
4757a243 324 matches++;
325 d = uv_to_utf8(d, final);
326 }
327 else
328 s += UTF8SKIP(s);
1aa99e6b 329
9b877dbb 330 if (d > dend) {
1aa99e6b 331 STRLEN clen = d - dstart;
332 STRLEN nlen = dend - dstart + len + UTF8_MAXLEN;
9b877dbb 333 if (!grows)
334 Perl_croak(aTHX_ "panic: do_trans_complex_utf8");
1aa99e6b 335 Renew(dstart, nlen+UTF8_MAXLEN, U8);
336 d = dstart + clen;
337 dend = dstart + nlen;
338 }
4757a243 339 }
16ec844d 340 if (grows || hibit) {
9b877dbb 341 sv_setpvn(sv, (char*)dstart, d - dstart);
342 Safefree(dstart);
16ec844d 343 if (grows && hibit)
344 Safefree(start);
9b877dbb 345 }
346 else {
347 *d = '\0';
348 SvCUR_set(sv, d - dstart);
349 }
4757a243 350 SvSETMAGIC(sv);
1aa99e6b 351 SvUTF8_on(sv);
1aa99e6b 352 if (!isutf8 && !(PL_hints & HINT_UTF8))
353 sv_utf8_downgrade(sv, TRUE);
4757a243 354
355 return matches;
356}
357
942e002e 358STATIC I32
036b4402 359S_do_trans_count_utf8(pTHX_ SV *sv)/* SPC - OK */
4757a243 360{
4757a243 361 U8 *s;
1aa99e6b 362 U8 *start, *send;
4757a243 363 I32 matches = 0;
364 STRLEN len;
365
366 SV* rv = (SV*)cSVOP->op_sv;
367 HV* hv = (HV*)SvRV(rv);
368 SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
369 UV none = svp ? SvUV(*svp) : 0x7fffffff;
370 UV uv;
1aa99e6b 371 U8 hibit = 0;
4757a243 372
373 s = (U8*)SvPV(sv, len);
1aa99e6b 374 if (!SvUTF8(sv)) {
375 U8 *t = s, *e = s + len;
376 while (t < e)
fd400ab9 377 if ((hibit = !UTF8_IS_ASCII(*t++)))
1aa99e6b 378 break;
379 if (hibit)
380 start = s = bytes_to_utf8(s, &len);
381 }
4757a243 382 send = s + len;
383
384 while (s < send) {
834a4ddd 385 if ((uv = swash_fetch(rv, s)) < none)
4757a243 386 matches++;
834a4ddd 387 s += UTF8SKIP(s);
4757a243 388 }
1aa99e6b 389 if (hibit)
390 Safefree(start);
4757a243 391
392 return matches;
393}
394
942e002e 395STATIC I32
036b4402 396S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
4757a243 397{
4757a243 398 U8 *s;
1aa99e6b 399 U8 *start, *send;
4757a243 400 U8 *d;
401 I32 matches = 0;
402 I32 squash = PL_op->op_private & OPpTRANS_SQUASH;
4757a243 403 I32 del = PL_op->op_private & OPpTRANS_DELETE;
9b877dbb 404 I32 grows = PL_op->op_private & OPpTRANS_GROWS;
4757a243 405 SV* rv = (SV*)cSVOP->op_sv;
406 HV* hv = (HV*)SvRV(rv);
407 SV** svp = hv_fetch(hv, "NONE", 4, FALSE);
408 UV none = svp ? SvUV(*svp) : 0x7fffffff;
409 UV extra = none + 1;
410 UV final;
411 UV uv;
412 STRLEN len;
1aa99e6b 413 U8 *dstart, *dend;
414 I32 isutf8;
415 U8 hibit = 0;
4757a243 416
417 s = (U8*)SvPV(sv, len);
1aa99e6b 418 isutf8 = SvUTF8(sv);
419 if (!isutf8) {
420 U8 *t = s, *e = s + len;
421 while (t < e)
fd400ab9 422 if ((hibit = !UTF8_IS_ASCII(*t++)))
1aa99e6b 423 break;
424 if (hibit)
425 s = bytes_to_utf8(s, &len);
426 }
4757a243 427 send = s + len;
1aa99e6b 428 start = s;
4757a243 429
430 svp = hv_fetch(hv, "FINAL", 5, FALSE);
431 if (svp)
432 final = SvUV(*svp);
433
9b877dbb 434 if (grows) {
435 /* d needs to be bigger than s, in case e.g. upgrading is required */
436 New(0, d, len*3+UTF8_MAXLEN, U8);
437 dend = d + len * 3;
438 dstart = d;
439 }
440 else {
441 dstart = d = s;
442 dend = d + len;
443 }
4757a243 444
445 if (squash) {
446 UV puv = 0xfeedface;
447 while (s < send) {
1aa99e6b 448 uv = swash_fetch(rv, s);
449
9b877dbb 450 if (d > dend) {
451 STRLEN clen = d - dstart;
452 STRLEN nlen = dend - dstart + len + UTF8_MAXLEN;
453 if (!grows)
454 Perl_croak(aTHX_ "panic: do_trans_complex_utf8");
1aa99e6b 455 Renew(dstart, nlen+UTF8_MAXLEN, U8);
456 d = dstart + clen;
457 dend = dstart + nlen;
4757a243 458 }
459 if (uv < none) {
460 matches++;
461 if (uv != puv) {
01ec43d0 462 d = uv_to_utf8(d, uv);
4757a243 463 puv = uv;
464 }
075321c3 465 s += UTF8SKIP(s);
4757a243 466 continue;
467 }
468 else if (uv == none) { /* "none" is unmapped character */
1aa99e6b 469 int i = UTF8SKIP(s);
9b877dbb 470 Copy(s, d, i, U8);
471 d += i;
472 s += i;
4757a243 473 puv = 0xfeedface;
474 continue;
a0ed51b3 475 }
4757a243 476 else if (uv == extra && !del) {
477 matches++;
478 if (uv != puv) {
01ec43d0 479 d = uv_to_utf8(d, final);
4757a243 480 puv = final;
481 }
01ec43d0 482 s += UTF8SKIP(s);
4757a243 483 continue;
484 }
01ec43d0 485 matches++; /* "none+1" is delete character */
486 s += UTF8SKIP(s);
a0ed51b3 487 }
79072805 488 }
489 else {
4757a243 490 while (s < send) {
1aa99e6b 491 uv = swash_fetch(rv, s);
9b877dbb 492 if (d > dend) {
493 STRLEN clen = d - dstart;
494 STRLEN nlen = dend - dstart + len + UTF8_MAXLEN;
495 if (!grows)
496 Perl_croak(aTHX_ "panic: do_trans_complex_utf8");
1aa99e6b 497 Renew(dstart, nlen+UTF8_MAXLEN, U8);
498 d = dstart + clen;
499 dend = dstart + nlen;
a0ed51b3 500 }
4757a243 501 if (uv < none) {
502 matches++;
01ec43d0 503 d = uv_to_utf8(d, uv);
504 s += UTF8SKIP(s);
4757a243 505 continue;
a0ed51b3 506 }
4757a243 507 else if (uv == none) { /* "none" is unmapped character */
1aa99e6b 508 int i = UTF8SKIP(s);
9b877dbb 509 Copy(s, d, i, U8);
510 d += i;
511 s += i;
4757a243 512 continue;
79072805 513 }
4757a243 514 else if (uv == extra && !del) {
515 matches++;
01ec43d0 516 d = uv_to_utf8(d, final);
517 s += UTF8SKIP(s);
4757a243 518 continue;
519 }
01ec43d0 520 matches++; /* "none+1" is delete character */
521 s += UTF8SKIP(s);
79072805 522 }
4757a243 523 }
16ec844d 524 if (grows || hibit) {
9b877dbb 525 sv_setpvn(sv, (char*)dstart, d - dstart);
526 Safefree(dstart);
16ec844d 527 if (grows && hibit)
528 Safefree(start);
9b877dbb 529 }
530 else {
531 *d = '\0';
532 SvCUR_set(sv, d - dstart);
533 }
1aa99e6b 534 SvUTF8_on(sv);
1aa99e6b 535 if (!isutf8 && !(PL_hints & HINT_UTF8))
536 sv_utf8_downgrade(sv, TRUE);
4757a243 537 SvSETMAGIC(sv);
538
539 return matches;
540}
541
542I32
864dbfa3 543Perl_do_trans(pTHX_ SV *sv)
4757a243 544{
545 STRLEN len;
8e84507e 546 I32 hasutf = (PL_op->op_private &
036b4402 547 (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF));
4757a243 548
549 if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
cea2e8a9 550 Perl_croak(aTHX_ PL_no_modify);
4757a243 551
552 (void)SvPV(sv, len);
553 if (!len)
554 return 0;
555 if (!SvPOKp(sv))
556 (void)SvPV_force(sv, len);
2de7b02f 557 if (!(PL_op->op_private & OPpTRANS_IDENTICAL))
558 (void)SvPOK_only_UTF8(sv);
4757a243 559
cea2e8a9 560 DEBUG_t( Perl_deb(aTHX_ "2.TBL\n"));
4757a243 561
036b4402 562 switch (PL_op->op_private & ~hasutf & 63) {
4757a243 563 case 0:
01ec43d0 564 if (hasutf)
565 return do_trans_simple_utf8(sv);
566 else
567 return do_trans_simple(sv);
4757a243 568
569 case OPpTRANS_IDENTICAL:
01ec43d0 570 if (hasutf)
571 return do_trans_count_utf8(sv);
572 else
573 return do_trans_count(sv);
4757a243 574
575 default:
01ec43d0 576 if (hasutf)
036b4402 577 return do_trans_complex_utf8(sv);
4757a243 578 else
036b4402 579 return do_trans_complex(sv);
79072805 580 }
79072805 581}
582
583void
864dbfa3 584Perl_do_join(pTHX_ register SV *sv, SV *del, register SV **mark, register SV **sp)
79072805 585{
586 SV **oldmark = mark;
587 register I32 items = sp - mark;
79072805 588 register STRLEN len;
463ee0b2 589 STRLEN delimlen;
590 register char *delim = SvPV(del, delimlen);
591 STRLEN tmplen;
79072805 592
593 mark++;
594 len = (items > 0 ? (delimlen * (items - 1) ) : 0);
07f14f54 595 (void)SvUPGRADE(sv, SVt_PV);
79072805 596 if (SvLEN(sv) < len + items) { /* current length is way too short */
597 while (items-- > 0) {
1426bbf4 598 if (*mark && !SvGAMAGIC(*mark) && SvOK(*mark)) {
463ee0b2 599 SvPV(*mark, tmplen);
600 len += tmplen;
79072805 601 }
602 mark++;
603 }
604 SvGROW(sv, len + 1); /* so try to pre-extend */
605
606 mark = oldmark;
db7c17d7 607 items = sp - mark;
79072805 608 ++mark;
609 }
610
463ee0b2 611 if (items-- > 0) {
92d29cee 612 sv_setpv(sv, "");
613 if (*mark)
614 sv_catsv(sv, *mark);
463ee0b2 615 mark++;
616 }
79072805 617 else
618 sv_setpv(sv,"");
c512ce4f 619 if (delimlen) {
79072805 620 for (; items > 0; items--,mark++) {
c512ce4f 621 sv_catsv(sv,del);
79072805 622 sv_catsv(sv,*mark);
623 }
624 }
625 else {
626 for (; items > 0; items--,mark++)
627 sv_catsv(sv,*mark);
628 }
629 SvSETMAGIC(sv);
630}
631
632void
864dbfa3 633Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg)
79072805 634{
46fc3d4c 635 STRLEN patlen;
636 char *pat = SvPV(*sarg, patlen);
637 bool do_taint = FALSE;
638
639 sv_vsetpvfn(sv, pat, patlen, Null(va_list*), sarg + 1, len - 1, &do_taint);
79072805 640 SvSETMAGIC(sv);
46fc3d4c 641 if (do_taint)
642 SvTAINTED_on(sv);
79072805 643}
644
33b45480 645/* currently converts input to bytes if possible, but doesn't sweat failure */
81e118e0 646UV
647Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
648{
649 STRLEN srclen, len;
650 unsigned char *s = (unsigned char *) SvPV(sv, srclen);
651 UV retnum = 0;
652
a50d7633 653 if (offset < 0)
81e118e0 654 return retnum;
8e84507e 655 if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
a50d7633 656 Perl_croak(aTHX_ "Illegal number of bits in vec");
246fae53 657
dcad2880 658 if (SvUTF8(sv))
33b45480 659 (void) Perl_sv_utf8_downgrade(aTHX_ sv, TRUE);
246fae53 660
81e118e0 661 offset *= size; /* turn into bit offset */
662 len = (offset + size + 7) / 8; /* required number of bytes */
663 if (len > srclen) {
664 if (size <= 8)
665 retnum = 0;
666 else {
667 offset >>= 3; /* turn into byte offset */
668 if (size == 16) {
669 if (offset >= srclen)
670 retnum = 0;
671 else
628e1a40 672 retnum = (UV) s[offset] << 8;
81e118e0 673 }
674 else if (size == 32) {
675 if (offset >= srclen)
676 retnum = 0;
677 else if (offset + 1 >= srclen)
678 retnum =
679 ((UV) s[offset ] << 24);
680 else if (offset + 2 >= srclen)
681 retnum =
682 ((UV) s[offset ] << 24) +
683 ((UV) s[offset + 1] << 16);
684 else
685 retnum =
686 ((UV) s[offset ] << 24) +
687 ((UV) s[offset + 1] << 16) +
688 ( s[offset + 2] << 8);
689 }
d7d93a81 690#ifdef UV_IS_QUAD
c5a0f51a 691 else if (size == 64) {
c5a0f51a 692 if (ckWARN(WARN_PORTABLE))
693 Perl_warner(aTHX_ WARN_PORTABLE,
694 "Bit vector size > 32 non-portable");
695 if (offset >= srclen)
696 retnum = 0;
697 else if (offset + 1 >= srclen)
698 retnum =
699 (UV) s[offset ] << 56;
700 else if (offset + 2 >= srclen)
701 retnum =
702 ((UV) s[offset ] << 56) +
703 ((UV) s[offset + 1] << 48);
704 else if (offset + 3 >= srclen)
705 retnum =
706 ((UV) s[offset ] << 56) +
707 ((UV) s[offset + 1] << 48) +
708 ((UV) s[offset + 2] << 40);
709 else if (offset + 4 >= srclen)
710 retnum =
711 ((UV) s[offset ] << 56) +
712 ((UV) s[offset + 1] << 48) +
713 ((UV) s[offset + 2] << 40) +
714 ((UV) s[offset + 3] << 32);
715 else if (offset + 5 >= srclen)
716 retnum =
717 ((UV) s[offset ] << 56) +
718 ((UV) s[offset + 1] << 48) +
719 ((UV) s[offset + 2] << 40) +
720 ((UV) s[offset + 3] << 32) +
721 ( s[offset + 4] << 24);
722 else if (offset + 6 >= srclen)
723 retnum =
724 ((UV) s[offset ] << 56) +
725 ((UV) s[offset + 1] << 48) +
726 ((UV) s[offset + 2] << 40) +
727 ((UV) s[offset + 3] << 32) +
728 ((UV) s[offset + 4] << 24) +
729 ((UV) s[offset + 5] << 16);
730 else
8e84507e 731 retnum =
c5a0f51a 732 ((UV) s[offset ] << 56) +
733 ((UV) s[offset + 1] << 48) +
734 ((UV) s[offset + 2] << 40) +
735 ((UV) s[offset + 3] << 32) +
736 ((UV) s[offset + 4] << 24) +
737 ((UV) s[offset + 5] << 16) +
628e1a40 738 ( s[offset + 6] << 8);
c5a0f51a 739 }
740#endif
81e118e0 741 }
742 }
743 else if (size < 8)
744 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
745 else {
746 offset >>= 3; /* turn into byte offset */
747 if (size == 8)
748 retnum = s[offset];
749 else if (size == 16)
750 retnum =
628e1a40 751 ((UV) s[offset] << 8) +
81e118e0 752 s[offset + 1];
753 else if (size == 32)
754 retnum =
755 ((UV) s[offset ] << 24) +
756 ((UV) s[offset + 1] << 16) +
757 ( s[offset + 2] << 8) +
758 s[offset + 3];
d7d93a81 759#ifdef UV_IS_QUAD
c5a0f51a 760 else if (size == 64) {
c5a0f51a 761 if (ckWARN(WARN_PORTABLE))
762 Perl_warner(aTHX_ WARN_PORTABLE,
763 "Bit vector size > 32 non-portable");
764 retnum =
765 ((UV) s[offset ] << 56) +
766 ((UV) s[offset + 1] << 48) +
767 ((UV) s[offset + 2] << 40) +
768 ((UV) s[offset + 3] << 32) +
769 ((UV) s[offset + 4] << 24) +
770 ((UV) s[offset + 5] << 16) +
628e1a40 771 ( s[offset + 6] << 8) +
c5a0f51a 772 s[offset + 7];
773 }
774#endif
81e118e0 775 }
776
777 return retnum;
778}
779
33b45480 780/* currently converts input to bytes if possible but doesn't sweat failures,
781 * although it does ensure that the string it clobbers is not marked as
782 * utf8-valid any more
783 */
79072805 784void
864dbfa3 785Perl_do_vecset(pTHX_ SV *sv)
79072805 786{
787 SV *targ = LvTARG(sv);
788 register I32 offset;
789 register I32 size;
8990e307 790 register unsigned char *s;
81e118e0 791 register UV lval;
79072805 792 I32 mask;
a0d0e21e 793 STRLEN targlen;
794 STRLEN len;
79072805 795
8990e307 796 if (!targ)
797 return;
a0d0e21e 798 s = (unsigned char*)SvPV_force(targ, targlen);
246fae53 799 if (SvUTF8(targ)) {
33b45480 800 /* This is handled by the SvPOK_only below...
801 if (!Perl_sv_utf8_downgrade(aTHX_ targ, TRUE))
802 SvUTF8_off(targ);
803 */
804 (void) Perl_sv_utf8_downgrade(aTHX_ targ, TRUE);
246fae53 805 }
806
4ebbc975 807 (void)SvPOK_only(targ);
81e118e0 808 lval = SvUV(sv);
79072805 809 offset = LvTARGOFF(sv);
fe58ced6 810 if (offset < 0)
811 Perl_croak(aTHX_ "Assigning to negative offset in vec");
79072805 812 size = LvTARGLEN(sv);
8e84507e 813 if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
a50d7633 814 Perl_croak(aTHX_ "Illegal number of bits in vec");
8e84507e 815
81e118e0 816 offset *= size; /* turn into bit offset */
817 len = (offset + size + 7) / 8; /* required number of bytes */
a0d0e21e 818 if (len > targlen) {
819 s = (unsigned char*)SvGROW(targ, len + 1);
12ae5dfc 820 (void)memzero((char *)(s + targlen), len - targlen + 1);
a0d0e21e 821 SvCUR_set(targ, len);
822 }
8e84507e 823
79072805 824 if (size < 8) {
825 mask = (1 << size) - 1;
826 size = offset & 7;
827 lval &= mask;
81e118e0 828 offset >>= 3; /* turn into byte offset */
79072805 829 s[offset] &= ~(mask << size);
830 s[offset] |= lval << size;
831 }
832 else {
81e118e0 833 offset >>= 3; /* turn into byte offset */
79072805 834 if (size == 8)
c5a0f51a 835 s[offset ] = lval & 0xff;
79072805 836 else if (size == 16) {
c5a0f51a 837 s[offset ] = (lval >> 8) & 0xff;
838 s[offset+1] = lval & 0xff;
79072805 839 }
840 else if (size == 32) {
c5a0f51a 841 s[offset ] = (lval >> 24) & 0xff;
842 s[offset+1] = (lval >> 16) & 0xff;
843 s[offset+2] = (lval >> 8) & 0xff;
844 s[offset+3] = lval & 0xff;
845 }
d7d93a81 846#ifdef UV_IS_QUAD
c5a0f51a 847 else if (size == 64) {
c5a0f51a 848 if (ckWARN(WARN_PORTABLE))
849 Perl_warner(aTHX_ WARN_PORTABLE,
850 "Bit vector size > 32 non-portable");
851 s[offset ] = (lval >> 56) & 0xff;
852 s[offset+1] = (lval >> 48) & 0xff;
853 s[offset+2] = (lval >> 40) & 0xff;
854 s[offset+3] = (lval >> 32) & 0xff;
855 s[offset+4] = (lval >> 24) & 0xff;
856 s[offset+5] = (lval >> 16) & 0xff;
857 s[offset+6] = (lval >> 8) & 0xff;
858 s[offset+7] = lval & 0xff;
79072805 859 }
dc1e3f56 860#endif
79072805 861 }
7bb043c3 862 SvSETMAGIC(targ);
79072805 863}
864
865void
864dbfa3 866Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
79072805 867{
463ee0b2 868 STRLEN len;
a0d0e21e 869 char *s;
8e84507e 870
79072805 871 if (SvTYPE(sv) == SVt_PVAV) {
a0d0e21e 872 register I32 i;
873 I32 max;
874 AV* av = (AV*)sv;
875 max = AvFILL(av);
876 for (i = 0; i <= max; i++) {
877 sv = (SV*)av_fetch(av, i, FALSE);
3280af22 878 if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
a0d0e21e 879 do_chop(astr, sv);
880 }
881 return;
79072805 882 }
aa854799 883 else if (SvTYPE(sv) == SVt_PVHV) {
a0d0e21e 884 HV* hv = (HV*)sv;
885 HE* entry;
886 (void)hv_iterinit(hv);
887 /*SUPPRESS 560*/
155aba94 888 while ((entry = hv_iternext(hv)))
a0d0e21e 889 do_chop(astr,hv_iterval(hv,entry));
890 return;
79072805 891 }
aa854799 892 else if (SvREADONLY(sv))
cea2e8a9 893 Perl_croak(aTHX_ PL_no_modify);
a0d0e21e 894 s = SvPV(sv, len);
748a9306 895 if (len && !SvPOK(sv))
a0d0e21e 896 s = SvPV_force(sv, len);
7e2040f0 897 if (DO_UTF8(sv)) {
a0ed51b3 898 if (s && len) {
899 char *send = s + len;
900 char *start = s;
901 s = send - 1;
a0dbb045 902 while (s > start && UTF8_IS_CONTINUATION(*s))
903 s--;
904 if (utf8_to_uv_simple((U8*)s, 0)) {
905 sv_setpvn(astr, s, send - s);
906 *s = '\0';
907 SvCUR_set(sv, s - start);
908 SvNIOK_off(sv);
909 SvUTF8_on(astr);
910 }
a0ed51b3 911 }
912 else
913 sv_setpvn(astr, "", 0);
914 }
7e2040f0 915 else if (s && len) {
a0d0e21e 916 s += --len;
917 sv_setpvn(astr, s, 1);
918 *s = '\0';
919 SvCUR_set(sv, len);
2c19a612 920 SvUTF8_off(sv);
a0d0e21e 921 SvNIOK_off(sv);
79072805 922 }
923 else
a0d0e21e 924 sv_setpvn(astr, "", 0);
925 SvSETMAGIC(sv);
7e2040f0 926}
a0d0e21e 927
928I32
864dbfa3 929Perl_do_chomp(pTHX_ register SV *sv)
a0d0e21e 930{
c07a80fd 931 register I32 count;
a0d0e21e 932 STRLEN len;
933 char *s;
c07a80fd 934
3280af22 935 if (RsSNARF(PL_rs))
c07a80fd 936 return 0;
4c5a6083 937 if (RsRECORD(PL_rs))
938 return 0;
c07a80fd 939 count = 0;
a0d0e21e 940 if (SvTYPE(sv) == SVt_PVAV) {
941 register I32 i;
942 I32 max;
943 AV* av = (AV*)sv;
944 max = AvFILL(av);
945 for (i = 0; i <= max; i++) {
946 sv = (SV*)av_fetch(av, i, FALSE);
3280af22 947 if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
a0d0e21e 948 count += do_chomp(sv);
949 }
950 return count;
951 }
aa854799 952 else if (SvTYPE(sv) == SVt_PVHV) {
a0d0e21e 953 HV* hv = (HV*)sv;
954 HE* entry;
955 (void)hv_iterinit(hv);
956 /*SUPPRESS 560*/
155aba94 957 while ((entry = hv_iternext(hv)))
a0d0e21e 958 count += do_chomp(hv_iterval(hv,entry));
959 return count;
960 }
aa854799 961 else if (SvREADONLY(sv))
cea2e8a9 962 Perl_croak(aTHX_ PL_no_modify);
a0d0e21e 963 s = SvPV(sv, len);
964 if (len && !SvPOKp(sv))
965 s = SvPV_force(sv, len);
966 if (s && len) {
967 s += --len;
3280af22 968 if (RsPARA(PL_rs)) {
a0d0e21e 969 if (*s != '\n')
970 goto nope;
971 ++count;
972 while (len && s[-1] == '\n') {
973 --len;
974 --s;
975 ++count;
976 }
977 }
a0d0e21e 978 else {
c07a80fd 979 STRLEN rslen;
3280af22 980 char *rsptr = SvPV(PL_rs, rslen);
c07a80fd 981 if (rslen == 1) {
982 if (*s != *rsptr)
983 goto nope;
984 ++count;
985 }
986 else {
8c2cee6f 987 if (len < rslen - 1)
c07a80fd 988 goto nope;
989 len -= rslen - 1;
990 s -= rslen - 1;
36477c24 991 if (memNE(s, rsptr, rslen))
c07a80fd 992 goto nope;
993 count += rslen;
994 }
a0d0e21e 995 }
a0d0e21e 996 *s = '\0';
997 SvCUR_set(sv, len);
998 SvNIOK_off(sv);
999 }
1000 nope:
1001 SvSETMAGIC(sv);
1002 return count;
8e84507e 1003}
79072805 1004
1005void
864dbfa3 1006Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
79072805 1007{
1008#ifdef LIBERAL
1009 register long *dl;
1010 register long *ll;
1011 register long *rl;
1012#endif
1013 register char *dc;
463ee0b2 1014 STRLEN leftlen;
1015 STRLEN rightlen;
7a4c00b4 1016 register char *lc;
1017 register char *rc;
79072805 1018 register I32 len;
a0d0e21e 1019 I32 lensave;
7a4c00b4 1020 char *lsave;
1021 char *rsave;
0c57e439 1022 bool left_utf = DO_UTF8(left);
1023 bool right_utf = DO_UTF8(right);
c9b3c8d0 1024 I32 needlen;
0c57e439 1025
1026 if (left_utf && !right_utf)
1027 sv_utf8_upgrade(right);
a1ca4561 1028 else if (!left_utf && right_utf)
0c57e439 1029 sv_utf8_upgrade(left);
79072805 1030
1fbd88dc 1031 if (sv != left || (optype != OP_BIT_AND && !SvOK(sv) && !SvGMAGICAL(sv)))
1032 sv_setpvn(sv, "", 0); /* avoid undef warning on |= and ^= */
7a4c00b4 1033 lsave = lc = SvPV(left, leftlen);
1034 rsave = rc = SvPV(right, rightlen);
93a17b20 1035 len = leftlen < rightlen ? leftlen : rightlen;
a0d0e21e 1036 lensave = len;
c9b3c8d0 1037 if ((left_utf || right_utf) && (sv == left || sv == right)) {
1038 needlen = optype == OP_BIT_AND ? len : leftlen + rightlen;
1039 Newz(801, dc, needlen + 1, char);
1040 }
1041 else if (SvOK(sv) || SvTYPE(sv) > SVt_PVMG) {
2d8e6c8d 1042 STRLEN n_a;
1043 dc = SvPV_force(sv, n_a);
ff68c719 1044 if (SvCUR(sv) < len) {
1045 dc = SvGROW(sv, len + 1);
1046 (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1);
1047 }
c9b3c8d0 1048 if (optype != OP_BIT_AND && (left_utf || right_utf))
1049 dc = SvGROW(sv, leftlen + rightlen + 1);
ff68c719 1050 }
1051 else {
c9b3c8d0 1052 needlen = ((optype == OP_BIT_AND)
1053 ? len : (leftlen > rightlen ? leftlen : rightlen));
ff68c719 1054 Newz(801, dc, needlen + 1, char);
1055 (void)sv_usepvn(sv, dc, needlen);
1056 dc = SvPVX(sv); /* sv_usepvn() calls Renew() */
79072805 1057 }
a0d0e21e 1058 SvCUR_set(sv, len);
1059 (void)SvPOK_only(sv);
0c57e439 1060 if (left_utf || right_utf) {
1061 UV duc, luc, ruc;
c9b3c8d0 1062 char *dcsave = dc;
0c57e439 1063 STRLEN lulen = leftlen;
1064 STRLEN rulen = rightlen;
ba210ebe 1065 STRLEN ulen;
0c57e439 1066
1067 switch (optype) {
1068 case OP_BIT_AND:
1069 while (lulen && rulen) {
cc366d4b 1070 luc = utf8_to_uv((U8*)lc, lulen, &ulen, UTF8_ALLOW_ANYUV);
0c57e439 1071 lc += ulen;
1072 lulen -= ulen;
cc366d4b 1073 ruc = utf8_to_uv((U8*)rc, rulen, &ulen, UTF8_ALLOW_ANYUV);
0c57e439 1074 rc += ulen;
1075 rulen -= ulen;
1076 duc = luc & ruc;
1077 dc = (char*)uv_to_utf8((U8*)dc, duc);
1078 }
c9b3c8d0 1079 if (sv == left || sv == right)
1080 (void)sv_usepvn(sv, dcsave, needlen);
1081 SvCUR_set(sv, dc - dcsave);
0c57e439 1082 break;
1083 case OP_BIT_XOR:
1084 while (lulen && rulen) {
cc366d4b 1085 luc = utf8_to_uv((U8*)lc, lulen, &ulen, UTF8_ALLOW_ANYUV);
0c57e439 1086 lc += ulen;
1087 lulen -= ulen;
cc366d4b 1088 ruc = utf8_to_uv((U8*)rc, rulen, &ulen, UTF8_ALLOW_ANYUV);
0c57e439 1089 rc += ulen;
1090 rulen -= ulen;
1091 duc = luc ^ ruc;
1092 dc = (char*)uv_to_utf8((U8*)dc, duc);
1093 }
1094 goto mop_up_utf;
1095 case OP_BIT_OR:
1096 while (lulen && rulen) {
cc366d4b 1097 luc = utf8_to_uv((U8*)lc, lulen, &ulen, UTF8_ALLOW_ANYUV);
0c57e439 1098 lc += ulen;
1099 lulen -= ulen;
cc366d4b 1100 ruc = utf8_to_uv((U8*)rc, rulen, &ulen, UTF8_ALLOW_ANYUV);
0c57e439 1101 rc += ulen;
1102 rulen -= ulen;
1103 duc = luc | ruc;
1104 dc = (char*)uv_to_utf8((U8*)dc, duc);
1105 }
1106 mop_up_utf:
c9b3c8d0 1107 if (sv == left || sv == right)
1108 (void)sv_usepvn(sv, dcsave, needlen);
1109 SvCUR_set(sv, dc - dcsave);
0c57e439 1110 if (rulen)
1111 sv_catpvn(sv, rc, rulen);
1112 else if (lulen)
1113 sv_catpvn(sv, lc, lulen);
1114 else
1115 *SvEND(sv) = '\0';
1116 break;
1117 }
1118 SvUTF8_on(sv);
1119 goto finish;
1120 }
1121 else
79072805 1122#ifdef LIBERAL
1123 if (len >= sizeof(long)*4 &&
1124 !((long)dc % sizeof(long)) &&
1125 !((long)lc % sizeof(long)) &&
1126 !((long)rc % sizeof(long))) /* It's almost always aligned... */
1127 {
1128 I32 remainder = len % (sizeof(long)*4);
1129 len /= (sizeof(long)*4);
1130
1131 dl = (long*)dc;
1132 ll = (long*)lc;
1133 rl = (long*)rc;
1134
1135 switch (optype) {
1136 case OP_BIT_AND:
1137 while (len--) {
1138 *dl++ = *ll++ & *rl++;
1139 *dl++ = *ll++ & *rl++;
1140 *dl++ = *ll++ & *rl++;
1141 *dl++ = *ll++ & *rl++;
1142 }
1143 break;
a0d0e21e 1144 case OP_BIT_XOR:
79072805 1145 while (len--) {
1146 *dl++ = *ll++ ^ *rl++;
1147 *dl++ = *ll++ ^ *rl++;
1148 *dl++ = *ll++ ^ *rl++;
1149 *dl++ = *ll++ ^ *rl++;
1150 }
1151 break;
1152 case OP_BIT_OR:
1153 while (len--) {
1154 *dl++ = *ll++ | *rl++;
1155 *dl++ = *ll++ | *rl++;
1156 *dl++ = *ll++ | *rl++;
1157 *dl++ = *ll++ | *rl++;
1158 }
1159 }
1160
1161 dc = (char*)dl;
1162 lc = (char*)ll;
1163 rc = (char*)rl;
1164
1165 len = remainder;
1166 }
1167#endif
a0d0e21e 1168 {
a0d0e21e 1169 switch (optype) {
1170 case OP_BIT_AND:
1171 while (len--)
1172 *dc++ = *lc++ & *rc++;
1173 break;
1174 case OP_BIT_XOR:
1175 while (len--)
1176 *dc++ = *lc++ ^ *rc++;
1177 goto mop_up;
1178 case OP_BIT_OR:
1179 while (len--)
1180 *dc++ = *lc++ | *rc++;
1181 mop_up:
1182 len = lensave;
1183 if (rightlen > len)
1184 sv_catpvn(sv, rsave + len, rightlen - len);
1185 else if (leftlen > len)
1186 sv_catpvn(sv, lsave + len, leftlen - len);
4633a7c4 1187 else
1188 *SvEND(sv) = '\0';
a0d0e21e 1189 break;
1190 }
79072805 1191 }
0c57e439 1192finish:
fb73857a 1193 SvTAINT(sv);
79072805 1194}
463ee0b2 1195
1196OP *
cea2e8a9 1197Perl_do_kv(pTHX)
463ee0b2 1198{
4e35701f 1199 djSP;
463ee0b2 1200 HV *hv = (HV*)POPs;
800e9ae0 1201 HV *keys;
463ee0b2 1202 register HE *entry;
463ee0b2 1203 SV *tmpstr;
54310121 1204 I32 gimme = GIMME_V;
533c011a 1205 I32 dokeys = (PL_op->op_type == OP_KEYS);
1206 I32 dovalues = (PL_op->op_type == OP_VALUES);
c750a3ec 1207 I32 realhv = (SvTYPE(hv) == SVt_PVHV);
8e84507e 1208
1209 if (PL_op->op_type == OP_RV2HV || PL_op->op_type == OP_PADHV)
a0d0e21e 1210 dokeys = dovalues = TRUE;
463ee0b2 1211
85581909 1212 if (!hv) {
78f9721b 1213 if (PL_op->op_flags & OPf_MOD || LVRET) { /* lvalue */
85581909 1214 dTARGET; /* make sure to clear its target here */
1215 if (SvTYPE(TARG) == SVt_PVLV)
1216 LvTARG(TARG) = Nullsv;
1217 PUSHs(TARG);
1218 }
463ee0b2 1219 RETURN;
85581909 1220 }
748a9306 1221
800e9ae0 1222 keys = realhv ? hv : avhv_keys((AV*)hv);
1223 (void)hv_iterinit(keys); /* always reset iterator regardless */
748a9306 1224
54310121 1225 if (gimme == G_VOID)
aa689395 1226 RETURN;
1227
54310121 1228 if (gimme == G_SCALAR) {
6ee623d5 1229 IV i;
463ee0b2 1230 dTARGET;
1231
78f9721b 1232 if (PL_op->op_flags & OPf_MOD || LVRET) { /* lvalue */
85581909 1233 if (SvTYPE(TARG) < SVt_PVLV) {
1234 sv_upgrade(TARG, SVt_PVLV);
1235 sv_magic(TARG, Nullsv, 'k', Nullch, 0);
1236 }
1237 LvTYPE(TARG) = 'k';
800e9ae0 1238 if (LvTARG(TARG) != (SV*)keys) {
6ff81951 1239 if (LvTARG(TARG))
1240 SvREFCNT_dec(LvTARG(TARG));
800e9ae0 1241 LvTARG(TARG) = SvREFCNT_inc(keys);
6ff81951 1242 }
85581909 1243 PUSHs(TARG);
1244 RETURN;
1245 }
1246
33c27489 1247 if (! SvTIED_mg((SV*)keys, 'P'))
800e9ae0 1248 i = HvKEYS(keys);
463ee0b2 1249 else {
1250 i = 0;
463ee0b2 1251 /*SUPPRESS 560*/
800e9ae0 1252 while (hv_iternext(keys)) i++;
463ee0b2 1253 }
1254 PUSHi( i );
1255 RETURN;
1256 }
1257
8ed4b672 1258 EXTEND(SP, HvKEYS(keys) * (dokeys + dovalues));
463ee0b2 1259
463ee0b2 1260 PUTBACK; /* hv_iternext and hv_iterval might clobber stack_sp */
155aba94 1261 while ((entry = hv_iternext(keys))) {
463ee0b2 1262 SPAGAIN;
6bfc225d 1263 if (dokeys)
8c2cee6f 1264 XPUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
463ee0b2 1265 if (dovalues) {
463ee0b2 1266 PUTBACK;
b6429b1b 1267 tmpstr = realhv ?
1268 hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry);
cea2e8a9 1269 DEBUG_H(Perl_sv_setpvf(aTHX_ tmpstr, "%lu%%%d=%lu",
46fc3d4c 1270 (unsigned long)HeHASH(entry),
800e9ae0 1271 HvMAX(keys)+1,
1272 (unsigned long)(HeHASH(entry) & HvMAX(keys))));
463ee0b2 1273 SPAGAIN;
46fc3d4c 1274 XPUSHs(tmpstr);
463ee0b2 1275 }
1276 PUTBACK;
1277 }
1278 return NORMAL;
1279}
4e35701f 1280