This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
a7cd20caabf938191ab0522c8d9555e6c9031bd5
[perl5.git] / cpan / Scalar-List-Utils / ListUtil.xs
1 /* Copyright (c) 1997-2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
2  * This program is free software; you can redistribute it and/or
3  * modify it under the same terms as Perl itself.
4  */
5 #define PERL_NO_GET_CONTEXT /* we want efficiency */
6 #include <EXTERN.h>
7 #include <perl.h>
8 #include <XSUB.h>
9
10 #define NEED_sv_2pv_flags 1
11 #include "ppport.h"
12
13 #if PERL_BCDVERSION >= 0x5006000
14 #  include "multicall.h"
15 #endif
16
17 #ifndef CvISXSUB
18 #  define CvISXSUB(cv) CvXSUB(cv)
19 #endif
20
21 /* Some platforms have strict exports. And before 5.7.3 cxinc (or Perl_cxinc)
22    was not exported. Therefore platforms like win32, VMS etc have problems
23    so we redefine it here -- GMB
24 */
25 #if PERL_BCDVERSION < 0x5007000
26 /* Not in 5.6.1. */
27 #  ifdef cxinc
28 #    undef cxinc
29 #  endif
30 #  define cxinc() my_cxinc(aTHX)
31 static I32
32 my_cxinc(pTHX)
33 {
34     cxstack_max = cxstack_max * 3 / 2;
35     Renew(cxstack, cxstack_max + 1, struct context); /* fencepost bug in older CXINC macros requires +1 here */
36     return cxstack_ix + 1;
37 }
38 #endif
39
40 #ifndef sv_copypv
41 #define sv_copypv(a, b) my_sv_copypv(aTHX_ a, b)
42 static void
43 my_sv_copypv(pTHX_ SV *const dsv, SV *const ssv)
44 {
45     STRLEN len;
46     const char * const s = SvPV_const(ssv,len);
47     sv_setpvn(dsv,s,len);
48     if(SvUTF8(ssv))
49         SvUTF8_on(dsv);
50     else
51         SvUTF8_off(dsv);
52 }
53 #endif
54
55 #ifdef SVf_IVisUV
56 #  define slu_sv_value(sv) (SvIOK(sv)) ? (SvIOK_UV(sv)) ? (NV)(SvUVX(sv)) : (NV)(SvIVX(sv)) : (SvNV(sv))
57 #else
58 #  define slu_sv_value(sv) (SvIOK(sv)) ? (NV)(SvIVX(sv)) : (SvNV(sv))
59 #endif
60
61 #if PERL_VERSION < 13 || (PERL_VERSION == 13 && PERL_SUBVERSION < 9)
62 #  define PERL_HAS_BAD_MULTICALL_REFCOUNT
63 #endif
64
65 #if PERL_VERSION < 14
66 #  define croak_no_modify() croak("%s", PL_no_modify)
67 #endif
68
69 enum slu_accum {
70     ACC_IV,
71     ACC_NV,
72     ACC_SV,
73 };
74
75 static enum slu_accum accum_type(SV *sv) {
76     if(SvAMAGIC(sv))
77         return ACC_SV;
78
79     if(SvIOK(sv) && !SvNOK(sv) && !SvUOK(sv))
80         return ACC_IV;
81
82     return ACC_NV;
83 }
84
85 /* Magic for set_subname */
86 static MGVTBL subname_vtbl;
87
88 MODULE=List::Util       PACKAGE=List::Util
89
90 void
91 min(...)
92 PROTOTYPE: @
93 ALIAS:
94     min = 0
95     max = 1
96 CODE:
97 {
98     int index;
99     NV retval;
100     SV *retsv;
101     int magic;
102
103     if(!items)
104         XSRETURN_UNDEF;
105
106     retsv = ST(0);
107     magic = SvAMAGIC(retsv);
108     if(!magic)
109       retval = slu_sv_value(retsv);
110
111     for(index = 1 ; index < items ; index++) {
112         SV *stacksv = ST(index);
113         SV *tmpsv;
114         if((magic || SvAMAGIC(stacksv)) && (tmpsv = amagic_call(retsv, stacksv, gt_amg, 0))) {
115              if(SvTRUE(tmpsv) ? !ix : ix) {
116                   retsv = stacksv;
117                   magic = SvAMAGIC(retsv);
118                   if(!magic) {
119                       retval = slu_sv_value(retsv);
120                   }
121              }
122         }
123         else {
124             NV val = slu_sv_value(stacksv);
125             if(magic) {
126                 retval = slu_sv_value(retsv);
127                 magic = 0;
128             }
129             if(val < retval ? !ix : ix) {
130                 retsv = stacksv;
131                 retval = val;
132             }
133         }
134     }
135     ST(0) = retsv;
136     XSRETURN(1);
137 }
138
139
140 void
141 sum(...)
142 PROTOTYPE: @
143 ALIAS:
144     sum     = 0
145     sum0    = 1
146     product = 2
147 CODE:
148 {
149     dXSTARG;
150     SV *sv;
151     IV retiv = 0;
152     NV retnv = 0.0;
153     SV *retsv = NULL;
154     int index;
155     enum slu_accum accum;
156     int is_product = (ix == 2);
157     SV *tmpsv;
158
159     if(!items)
160         switch(ix) {
161             case 0: XSRETURN_UNDEF;
162             case 1: ST(0) = newSViv(0); XSRETURN(1);
163             case 2: ST(0) = newSViv(1); XSRETURN(1);
164         }
165
166     sv    = ST(0);
167     switch((accum = accum_type(sv))) {
168     case ACC_SV:
169         retsv = TARG;
170         sv_setsv(retsv, sv);
171         break;
172     case ACC_IV:
173         retiv = SvIV(sv);
174         break;
175     case ACC_NV:
176         retnv = slu_sv_value(sv);
177         break;
178     }
179
180     for(index = 1 ; index < items ; index++) {
181         sv = ST(index);
182         if(accum < ACC_SV && SvAMAGIC(sv)){
183             if(!retsv)
184                 retsv = TARG;
185             sv_setnv(retsv, accum == ACC_NV ? retnv : retiv);
186             accum = ACC_SV;
187         }
188         switch(accum) {
189         case ACC_SV:
190             tmpsv = amagic_call(retsv, sv,
191                 is_product ? mult_amg : add_amg,
192                 SvAMAGIC(retsv) ? AMGf_assign : 0);
193             if(tmpsv) {
194                 switch((accum = accum_type(tmpsv))) {
195                 case ACC_SV:
196                     retsv = tmpsv;
197                     break;
198                 case ACC_IV:
199                     retiv = SvIV(tmpsv);
200                     break;
201                 case ACC_NV:
202                     retnv = slu_sv_value(tmpsv);
203                     break;
204                 }
205             }
206             else {
207                 /* fall back to default */
208                 accum = ACC_NV;
209                 is_product ? (retnv = SvNV(retsv) * SvNV(sv))
210                            : (retnv = SvNV(retsv) + SvNV(sv));
211             }
212             break;
213         case ACC_IV:
214             if(is_product) {
215                 if(!SvNOK(sv) && SvIOK(sv) && (SvIV(sv) < IV_MAX / retiv)) {
216                     retiv *= SvIV(sv);
217                     break;
218                 }
219                 /* else fallthrough */
220             }
221             else {
222                 if(!SvNOK(sv) && SvIOK(sv) && (SvIV(sv) < IV_MAX - retiv)) {
223                     retiv += SvIV(sv);
224                     break;
225                 }
226                 /* else fallthrough */
227             }
228
229             /* fallthrough to NV now */
230             retnv = retiv;
231             accum = ACC_NV;
232         case ACC_NV:
233             is_product ? (retnv *= slu_sv_value(sv))
234                        : (retnv += slu_sv_value(sv));
235             break;
236         }
237     }
238
239     if(!retsv)
240         retsv = TARG;
241
242     switch(accum) {
243     case ACC_SV: /* nothing to do */
244         break;
245     case ACC_IV:
246         sv_setiv(retsv, retiv);
247         break;
248     case ACC_NV:
249         sv_setnv(retsv, retnv);
250         break;
251     }
252
253     ST(0) = retsv;
254     XSRETURN(1);
255 }
256
257 #define SLU_CMP_LARGER   1
258 #define SLU_CMP_SMALLER -1
259
260 void
261 minstr(...)
262 PROTOTYPE: @
263 ALIAS:
264     minstr = SLU_CMP_LARGER
265     maxstr = SLU_CMP_SMALLER
266 CODE:
267 {
268     SV *left;
269     int index;
270
271     if(!items)
272         XSRETURN_UNDEF;
273
274     left = ST(0);
275 #ifdef OPpLOCALE
276     if(MAXARG & OPpLOCALE) {
277         for(index = 1 ; index < items ; index++) {
278             SV *right = ST(index);
279             if(sv_cmp_locale(left, right) == ix)
280                 left = right;
281         }
282     }
283     else {
284 #endif
285         for(index = 1 ; index < items ; index++) {
286             SV *right = ST(index);
287             if(sv_cmp(left, right) == ix)
288                 left = right;
289         }
290 #ifdef OPpLOCALE
291     }
292 #endif
293     ST(0) = left;
294     XSRETURN(1);
295 }
296
297
298
299
300 void
301 reduce(block,...)
302     SV *block
303 PROTOTYPE: &@
304 CODE:
305 {
306     SV *ret = sv_newmortal();
307     int index;
308     GV *agv,*bgv,*gv;
309     HV *stash;
310     SV **args = &PL_stack_base[ax];
311     CV *cv    = sv_2cv(block, &stash, &gv, 0);
312
313     if(cv == Nullcv)
314         croak("Not a subroutine reference");
315
316     if(items <= 1)
317         XSRETURN_UNDEF;
318
319     agv = gv_fetchpv("a", GV_ADD, SVt_PV);
320     bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
321     SAVESPTR(GvSV(agv));
322     SAVESPTR(GvSV(bgv));
323     GvSV(agv) = ret;
324     SvSetMagicSV(ret, args[1]);
325 #ifdef dMULTICALL
326     if(!CvISXSUB(cv)) {
327         dMULTICALL;
328         I32 gimme = G_SCALAR;
329
330         PUSH_MULTICALL(cv);
331         for(index = 2 ; index < items ; index++) {
332             GvSV(bgv) = args[index];
333             MULTICALL;
334             SvSetMagicSV(ret, *PL_stack_sp);
335         }
336 #  ifdef PERL_HAS_BAD_MULTICALL_REFCOUNT
337         if(CvDEPTH(multicall_cv) > 1)
338             SvREFCNT_inc_simple_void_NN(multicall_cv);
339 #  endif
340         POP_MULTICALL;
341     }
342     else
343 #endif
344     {
345         for(index = 2 ; index < items ; index++) {
346             dSP;
347             GvSV(bgv) = args[index];
348
349             PUSHMARK(SP);
350             call_sv((SV*)cv, G_SCALAR);
351
352             SvSetMagicSV(ret, *PL_stack_sp);
353         }
354     }
355
356     ST(0) = ret;
357     XSRETURN(1);
358 }
359
360 void
361 first(block,...)
362     SV *block
363 PROTOTYPE: &@
364 CODE:
365 {
366     int index;
367     GV *gv;
368     HV *stash;
369     SV **args = &PL_stack_base[ax];
370     CV *cv    = sv_2cv(block, &stash, &gv, 0);
371
372     if(cv == Nullcv)
373         croak("Not a subroutine reference");
374
375     if(items <= 1)
376         XSRETURN_UNDEF;
377
378     SAVESPTR(GvSV(PL_defgv));
379 #ifdef dMULTICALL
380     if(!CvISXSUB(cv)) {
381         dMULTICALL;
382         I32 gimme = G_SCALAR;
383         PUSH_MULTICALL(cv);
384
385         for(index = 1 ; index < items ; index++) {
386             GvSV(PL_defgv) = args[index];
387             MULTICALL;
388             if(SvTRUEx(*PL_stack_sp)) {
389 #  ifdef PERL_HAS_BAD_MULTICALL_REFCOUNT
390                 if(CvDEPTH(multicall_cv) > 1)
391                     SvREFCNT_inc_simple_void_NN(multicall_cv);
392 #  endif
393                 POP_MULTICALL;
394                 ST(0) = ST(index);
395                 XSRETURN(1);
396             }
397         }
398 #  ifdef PERL_HAS_BAD_MULTICALL_REFCOUNT
399         if(CvDEPTH(multicall_cv) > 1)
400             SvREFCNT_inc_simple_void_NN(multicall_cv);
401 #  endif
402         POP_MULTICALL;
403     }
404     else
405 #endif
406     {
407         for(index = 1 ; index < items ; index++) {
408             dSP;
409             GvSV(PL_defgv) = args[index];
410
411             PUSHMARK(SP);
412             call_sv((SV*)cv, G_SCALAR);
413             if(SvTRUEx(*PL_stack_sp)) {
414                 ST(0) = ST(index);
415                 XSRETURN(1);
416             }
417         }
418     }
419     XSRETURN_UNDEF;
420 }
421
422
423 void
424 any(block,...)
425     SV *block
426 ALIAS:
427     none   = 0
428     all    = 1
429     any    = 2
430     notall = 3
431 PROTOTYPE: &@
432 PPCODE:
433 {
434     int ret_true = !(ix & 2); /* return true at end of loop for none/all; false for any/notall */
435     int invert   =  (ix & 1); /* invert block test for all/notall */
436     GV *gv;
437     HV *stash;
438     SV **args = &PL_stack_base[ax];
439     CV *cv    = sv_2cv(block, &stash, &gv, 0);
440
441     if(cv == Nullcv)
442         croak("Not a subroutine reference");
443
444     SAVESPTR(GvSV(PL_defgv));
445 #ifdef dMULTICALL
446     if(!CvISXSUB(cv)) {
447         dMULTICALL;
448         I32 gimme = G_SCALAR;
449         int index;
450
451         PUSH_MULTICALL(cv);
452         for(index = 1; index < items; index++) {
453             GvSV(PL_defgv) = args[index];
454
455             MULTICALL;
456             if(SvTRUEx(*PL_stack_sp) ^ invert) {
457                 POP_MULTICALL;
458                 ST(0) = ret_true ? &PL_sv_no : &PL_sv_yes;
459                 XSRETURN(1);
460             }
461         }
462         POP_MULTICALL;
463     }
464     else
465 #endif
466     {
467         int index;
468         for(index = 1; index < items; index++) {
469             dSP;
470             GvSV(PL_defgv) = args[index];
471
472             PUSHMARK(SP);
473             call_sv((SV*)cv, G_SCALAR);
474             if(SvTRUEx(*PL_stack_sp) ^ invert) {
475                 ST(0) = ret_true ? &PL_sv_no : &PL_sv_yes;
476                 XSRETURN(1);
477             }
478         }
479     }
480
481     ST(0) = ret_true ? &PL_sv_yes : &PL_sv_no;
482     XSRETURN(1);
483 }
484
485 void
486 pairs(...)
487 PROTOTYPE: @
488 PPCODE:
489 {
490     int argi = 0;
491     int reti = 0;
492     HV *pairstash = get_hv("List::Util::_Pair::", GV_ADD);
493
494     if(items % 2 && ckWARN(WARN_MISC))
495         warn("Odd number of elements in pairs");
496
497     {
498         for(; argi < items; argi += 2) {
499             SV *a = ST(argi);
500             SV *b = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
501
502             AV *av = newAV();
503             av_push(av, newSVsv(a));
504             av_push(av, newSVsv(b));
505
506             ST(reti) = sv_2mortal(newRV_noinc((SV *)av));
507             sv_bless(ST(reti), pairstash);
508             reti++;
509         }
510     }
511
512     XSRETURN(reti);
513 }
514
515 void
516 unpairs(...)
517 PROTOTYPE: @
518 PPCODE:
519 {
520     /* Unlike pairs(), we're going to trash the input values on the stack
521      * almost as soon as we start generating output. So clone them first
522      */
523     int i;
524     SV **args_copy;
525     Newx(args_copy, items, SV *);
526     SAVEFREEPV(args_copy);
527
528     Copy(&ST(0), args_copy, items, SV *);
529
530     for(i = 0; i < items; i++) {
531         SV *pair = args_copy[i];
532         SvGETMAGIC(pair);
533
534         if(SvTYPE(pair) != SVt_RV)
535             croak("Not a reference at List::Util::unpack() argument %d", i);
536         if(SvTYPE(SvRV(pair)) != SVt_PVAV)
537             croak("Not an ARRAY reference at List::Util::unpack() argument %d", i);
538
539         // TODO: assert pair is an ARRAY ref
540         AV *pairav = (AV *)SvRV(pair);
541
542         EXTEND(SP, 2);
543
544         if(AvFILL(pairav) >= 0)
545             mPUSHs(newSVsv(AvARRAY(pairav)[0]));
546         else
547             PUSHs(&PL_sv_undef);
548
549         if(AvFILL(pairav) >= 1)
550             mPUSHs(newSVsv(AvARRAY(pairav)[1]));
551         else
552             PUSHs(&PL_sv_undef);
553     }
554
555     XSRETURN(items * 2);
556 }
557
558 void
559 pairkeys(...)
560 PROTOTYPE: @
561 PPCODE:
562 {
563     int argi = 0;
564     int reti = 0;
565
566     if(items % 2 && ckWARN(WARN_MISC))
567         warn("Odd number of elements in pairkeys");
568
569     {
570         for(; argi < items; argi += 2) {
571             SV *a = ST(argi);
572
573             ST(reti++) = sv_2mortal(newSVsv(a));
574         }
575     }
576
577     XSRETURN(reti);
578 }
579
580 void
581 pairvalues(...)
582 PROTOTYPE: @
583 PPCODE:
584 {
585     int argi = 0;
586     int reti = 0;
587
588     if(items % 2 && ckWARN(WARN_MISC))
589         warn("Odd number of elements in pairvalues");
590
591     {
592         for(; argi < items; argi += 2) {
593             SV *b = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
594
595             ST(reti++) = sv_2mortal(newSVsv(b));
596         }
597     }
598
599     XSRETURN(reti);
600 }
601
602 void
603 pairfirst(block,...)
604     SV *block
605 PROTOTYPE: &@
606 PPCODE:
607 {
608     GV *agv,*bgv,*gv;
609     HV *stash;
610     CV *cv    = sv_2cv(block, &stash, &gv, 0);
611     I32 ret_gimme = GIMME_V;
612     int argi = 1; /* "shift" the block */
613
614     if(!(items % 2) && ckWARN(WARN_MISC))
615         warn("Odd number of elements in pairfirst");
616
617     agv = gv_fetchpv("a", GV_ADD, SVt_PV);
618     bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
619     SAVESPTR(GvSV(agv));
620     SAVESPTR(GvSV(bgv));
621 #ifdef dMULTICALL
622     if(!CvISXSUB(cv)) {
623         /* Since MULTICALL is about to move it */
624         SV **stack = PL_stack_base + ax;
625
626         dMULTICALL;
627         I32 gimme = G_SCALAR;
628
629         PUSH_MULTICALL(cv);
630         for(; argi < items; argi += 2) {
631             SV *a = GvSV(agv) = stack[argi];
632             SV *b = GvSV(bgv) = argi < items-1 ? stack[argi+1] : &PL_sv_undef;
633
634             MULTICALL;
635
636             if(!SvTRUEx(*PL_stack_sp))
637                 continue;
638
639             POP_MULTICALL;
640             if(ret_gimme == G_ARRAY) {
641                 ST(0) = sv_mortalcopy(a);
642                 ST(1) = sv_mortalcopy(b);
643                 XSRETURN(2);
644             }
645             else
646                 XSRETURN_YES;
647         }
648         POP_MULTICALL;
649         XSRETURN(0);
650     }
651     else
652 #endif
653     {
654         for(; argi < items; argi += 2) {
655             dSP;
656             SV *a = GvSV(agv) = ST(argi);
657             SV *b = GvSV(bgv) = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
658
659             PUSHMARK(SP);
660             call_sv((SV*)cv, G_SCALAR);
661
662             SPAGAIN;
663
664             if(!SvTRUEx(*PL_stack_sp))
665                 continue;
666
667             if(ret_gimme == G_ARRAY) {
668                 ST(0) = sv_mortalcopy(a);
669                 ST(1) = sv_mortalcopy(b);
670                 XSRETURN(2);
671             }
672             else
673                 XSRETURN_YES;
674         }
675     }
676
677     XSRETURN(0);
678 }
679
680 void
681 pairgrep(block,...)
682     SV *block
683 PROTOTYPE: &@
684 PPCODE:
685 {
686     GV *agv,*bgv,*gv;
687     HV *stash;
688     CV *cv    = sv_2cv(block, &stash, &gv, 0);
689     I32 ret_gimme = GIMME_V;
690
691     /* This function never returns more than it consumed in arguments. So we
692      * can build the results "live", behind the arguments
693      */
694     int argi = 1; /* "shift" the block */
695     int reti = 0;
696
697     if(!(items % 2) && ckWARN(WARN_MISC))
698         warn("Odd number of elements in pairgrep");
699
700     agv = gv_fetchpv("a", GV_ADD, SVt_PV);
701     bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
702     SAVESPTR(GvSV(agv));
703     SAVESPTR(GvSV(bgv));
704 #ifdef dMULTICALL
705     if(!CvISXSUB(cv)) {
706         /* Since MULTICALL is about to move it */
707         SV **stack = PL_stack_base + ax;
708         int i;
709
710         dMULTICALL;
711         I32 gimme = G_SCALAR;
712
713         PUSH_MULTICALL(cv);
714         for(; argi < items; argi += 2) {
715             SV *a = GvSV(agv) = stack[argi];
716             SV *b = GvSV(bgv) = argi < items-1 ? stack[argi+1] : &PL_sv_undef;
717
718             MULTICALL;
719
720             if(SvTRUEx(*PL_stack_sp)) {
721                 if(ret_gimme == G_ARRAY) {
722                     /* We can't mortalise yet or they'd be mortal too early */
723                     stack[reti++] = newSVsv(a);
724                     stack[reti++] = newSVsv(b);
725                 }
726                 else if(ret_gimme == G_SCALAR)
727                     reti++;
728             }
729         }
730         POP_MULTICALL;
731
732         if(ret_gimme == G_ARRAY)
733             for(i = 0; i < reti; i++)
734                 sv_2mortal(stack[i]);
735     }
736     else
737 #endif
738     {
739         for(; argi < items; argi += 2) {
740             dSP;
741             SV *a = GvSV(agv) = ST(argi);
742             SV *b = GvSV(bgv) = argi < items-1 ? ST(argi+1) : &PL_sv_undef;
743
744             PUSHMARK(SP);
745             call_sv((SV*)cv, G_SCALAR);
746
747             SPAGAIN;
748
749             if(SvTRUEx(*PL_stack_sp)) {
750                 if(ret_gimme == G_ARRAY) {
751                     ST(reti++) = sv_mortalcopy(a);
752                     ST(reti++) = sv_mortalcopy(b);
753                 }
754                 else if(ret_gimme == G_SCALAR)
755                     reti++;
756             }
757         }
758     }
759
760     if(ret_gimme == G_ARRAY)
761         XSRETURN(reti);
762     else if(ret_gimme == G_SCALAR) {
763         ST(0) = newSViv(reti);
764         XSRETURN(1);
765     }
766 }
767
768 void
769 pairmap(block,...)
770     SV *block
771 PROTOTYPE: &@
772 PPCODE:
773 {
774     GV *agv,*bgv,*gv;
775     HV *stash;
776     CV *cv    = sv_2cv(block, &stash, &gv, 0);
777     SV **args_copy = NULL;
778     I32 ret_gimme = GIMME_V;
779
780     int argi = 1; /* "shift" the block */
781     int reti = 0;
782
783     if(!(items % 2) && ckWARN(WARN_MISC))
784         warn("Odd number of elements in pairmap");
785
786     agv = gv_fetchpv("a", GV_ADD, SVt_PV);
787     bgv = gv_fetchpv("b", GV_ADD, SVt_PV);
788     SAVESPTR(GvSV(agv));
789     SAVESPTR(GvSV(bgv));
790 /* This MULTICALL-based code appears to fail on perl 5.10.0 and 5.8.9
791  * Skip it on those versions (RT#87857)
792  */
793 #if defined(dMULTICALL) && (PERL_BCDVERSION > 0x5010000 || PERL_BCDVERSION < 0x5008009)
794     if(!CvISXSUB(cv)) {
795         /* Since MULTICALL is about to move it */
796         SV **stack = PL_stack_base + ax;
797         I32 ret_gimme = GIMME_V;
798         int i;
799
800         dMULTICALL;
801         I32 gimme = G_ARRAY;
802
803         PUSH_MULTICALL(cv);
804         for(; argi < items; argi += 2) {
805             SV *a = GvSV(agv) = args_copy ? args_copy[argi] : stack[argi];
806             SV *b = GvSV(bgv) = argi < items-1 ? 
807                 (args_copy ? args_copy[argi+1] : stack[argi+1]) :
808                 &PL_sv_undef;
809             int count;
810
811             MULTICALL;
812             count = PL_stack_sp - PL_stack_base;
813
814             if(count > 2 && !args_copy) {
815                 /* We can't return more than 2 results for a given input pair
816                  * without trashing the remaining argmuents on the stack still
817                  * to be processed. So, we'll copy them out to a temporary
818                  * buffer and work from there instead.
819                  * We didn't do this initially because in the common case, most
820                  * code blocks will return only 1 or 2 items so it won't be
821                  * necessary
822                  */
823                 int n_args = items - argi;
824                 Newx(args_copy, n_args, SV *);
825                 SAVEFREEPV(args_copy);
826
827                 Copy(stack + argi, args_copy, n_args, SV *);
828
829                 argi = 0;
830                 items = n_args;
831             }
832
833             for(i = 0; i < count; i++)
834                 stack[reti++] = newSVsv(PL_stack_sp[i - count + 1]);
835         }
836         POP_MULTICALL;
837
838         if(ret_gimme == G_ARRAY)
839             for(i = 0; i < reti; i++)
840                 sv_2mortal(stack[i]);
841     }
842     else
843 #endif
844     {
845         for(; argi < items; argi += 2) {
846             dSP;
847             SV *a = GvSV(agv) = args_copy ? args_copy[argi] : ST(argi);
848             SV *b = GvSV(bgv) = argi < items-1 ? 
849                 (args_copy ? args_copy[argi+1] : ST(argi+1)) :
850                 &PL_sv_undef;
851             int count;
852             int i;
853
854             PUSHMARK(SP);
855             count = call_sv((SV*)cv, G_ARRAY);
856
857             SPAGAIN;
858
859             if(count > 2 && !args_copy && ret_gimme == G_ARRAY) {
860                 int n_args = items - argi;
861                 Newx(args_copy, n_args, SV *);
862                 SAVEFREEPV(args_copy);
863
864                 Copy(&ST(argi), args_copy, n_args, SV *);
865
866                 argi = 0;
867                 items = n_args;
868             }
869
870             if(ret_gimme == G_ARRAY)
871                 for(i = 0; i < count; i++)
872                     ST(reti++) = sv_mortalcopy(SP[i - count + 1]);
873             else
874                 reti += count;
875
876             PUTBACK;
877         }
878     }
879
880     if(ret_gimme == G_ARRAY)
881         XSRETURN(reti);
882
883     ST(0) = sv_2mortal(newSViv(reti));
884     XSRETURN(1);
885 }
886
887 void
888 shuffle(...)
889 PROTOTYPE: @
890 CODE:
891 {
892     int index;
893 #if (PERL_VERSION < 9)
894     struct op dmy_op;
895     struct op *old_op = PL_op;
896
897     /* We call pp_rand here so that Drand01 get initialized if rand()
898        or srand() has not already been called
899     */
900     memzero((char*)(&dmy_op), sizeof(struct op));
901     /* we let pp_rand() borrow the TARG allocated for this XS sub */
902     dmy_op.op_targ = PL_op->op_targ;
903     PL_op = &dmy_op;
904     (void)*(PL_ppaddr[OP_RAND])(aTHX);
905     PL_op = old_op;
906 #else
907     /* Initialize Drand01 if rand() or srand() has
908        not already been called
909     */
910     if(!PL_srand_called) {
911         (void)seedDrand01((Rand_seed_t)Perl_seed(aTHX));
912         PL_srand_called = TRUE;
913     }
914 #endif
915
916     for (index = items ; index > 1 ; ) {
917         int swap = (int)(Drand01() * (double)(index--));
918         SV *tmp = ST(swap);
919         ST(swap) = ST(index);
920         ST(index) = tmp;
921     }
922
923     XSRETURN(items);
924 }
925
926
927 MODULE=List::Util       PACKAGE=Scalar::Util
928
929 void
930 dualvar(num,str)
931     SV *num
932     SV *str
933 PROTOTYPE: $$
934 CODE:
935 {
936     dXSTARG;
937
938     (void)SvUPGRADE(TARG, SVt_PVNV);
939
940     sv_copypv(TARG,str);
941
942     if(SvNOK(num) || SvPOK(num) || SvMAGICAL(num)) {
943         SvNV_set(TARG, SvNV(num));
944         SvNOK_on(TARG);
945     }
946 #ifdef SVf_IVisUV
947     else if(SvUOK(num)) {
948         SvUV_set(TARG, SvUV(num));
949         SvIOK_on(TARG);
950         SvIsUV_on(TARG);
951     }
952 #endif
953     else {
954         SvIV_set(TARG, SvIV(num));
955         SvIOK_on(TARG);
956     }
957
958     if(PL_tainting && (SvTAINTED(num) || SvTAINTED(str)))
959         SvTAINTED_on(TARG);
960
961     ST(0) = TARG;
962     XSRETURN(1);
963 }
964
965 void
966 isdual(sv)
967     SV *sv
968 PROTOTYPE: $
969 CODE:
970     if(SvMAGICAL(sv))
971         mg_get(sv);
972
973     ST(0) = boolSV((SvPOK(sv) || SvPOKp(sv)) && (SvNIOK(sv) || SvNIOKp(sv)));
974     XSRETURN(1);
975
976 char *
977 blessed(sv)
978     SV *sv
979 PROTOTYPE: $
980 CODE:
981 {
982     SvGETMAGIC(sv);
983
984     if(!(SvROK(sv) && SvOBJECT(SvRV(sv))))
985         XSRETURN_UNDEF;
986
987     RETVAL = (char*)sv_reftype(SvRV(sv),TRUE);
988 }
989 OUTPUT:
990     RETVAL
991
992 char *
993 reftype(sv)
994     SV *sv
995 PROTOTYPE: $
996 CODE:
997 {
998     SvGETMAGIC(sv);
999     if(!SvROK(sv))
1000         XSRETURN_UNDEF;
1001
1002     RETVAL = (char*)sv_reftype(SvRV(sv),FALSE);
1003 }
1004 OUTPUT:
1005     RETVAL
1006
1007 UV
1008 refaddr(sv)
1009     SV *sv
1010 PROTOTYPE: $
1011 CODE:
1012 {
1013     SvGETMAGIC(sv);
1014     if(!SvROK(sv))
1015         XSRETURN_UNDEF;
1016
1017     RETVAL = PTR2UV(SvRV(sv));
1018 }
1019 OUTPUT:
1020     RETVAL
1021
1022 void
1023 weaken(sv)
1024     SV *sv
1025 PROTOTYPE: $
1026 CODE:
1027 #ifdef SvWEAKREF
1028     sv_rvweaken(sv);
1029 #else
1030     croak("weak references are not implemented in this release of perl");
1031 #endif
1032
1033 void
1034 unweaken(sv)
1035     SV *sv
1036 PROTOTYPE: $
1037 INIT:
1038     SV *tsv;
1039 CODE:
1040 #ifdef SvWEAKREF
1041     /* This code stolen from core's sv_rvweaken() and modified */
1042     if (!SvOK(sv))
1043         return;
1044     if (!SvROK(sv))
1045         croak("Can't unweaken a nonreference");
1046     else if (!SvWEAKREF(sv)) {
1047         if(ckWARN(WARN_MISC))
1048             warn("Reference is not weak");
1049         return;
1050     }
1051     else if (SvREADONLY(sv)) croak_no_modify();
1052
1053     tsv = SvRV(sv);
1054 #if PERL_VERSION >= 14
1055     SvWEAKREF_off(sv); SvROK_on(sv);
1056     SvREFCNT_inc_NN(tsv);
1057     Perl_sv_del_backref(aTHX_ tsv, sv);
1058 #else
1059     /* Lacking sv_del_backref() the best we can do is clear the old (weak) ref
1060      * then set a new strong one
1061      */
1062     sv_setsv(sv, &PL_sv_undef);
1063     SvRV_set(sv, SvREFCNT_inc_NN(tsv));
1064     SvROK_on(sv);
1065 #endif
1066 #else
1067     croak("weak references are not implemented in this release of perl");
1068 #endif
1069
1070 void
1071 isweak(sv)
1072     SV *sv
1073 PROTOTYPE: $
1074 CODE:
1075 #ifdef SvWEAKREF
1076     ST(0) = boolSV(SvROK(sv) && SvWEAKREF(sv));
1077     XSRETURN(1);
1078 #else
1079     croak("weak references are not implemented in this release of perl");
1080 #endif
1081
1082 int
1083 readonly(sv)
1084     SV *sv
1085 PROTOTYPE: $
1086 CODE:
1087     SvGETMAGIC(sv);
1088     RETVAL = SvREADONLY(sv);
1089 OUTPUT:
1090     RETVAL
1091
1092 int
1093 tainted(sv)
1094     SV *sv
1095 PROTOTYPE: $
1096 CODE:
1097     SvGETMAGIC(sv);
1098     RETVAL = SvTAINTED(sv);
1099 OUTPUT:
1100     RETVAL
1101
1102 void
1103 isvstring(sv)
1104     SV *sv
1105 PROTOTYPE: $
1106 CODE:
1107 #ifdef SvVOK
1108     SvGETMAGIC(sv);
1109     ST(0) = boolSV(SvVOK(sv));
1110     XSRETURN(1);
1111 #else
1112     croak("vstrings are not implemented in this release of perl");
1113 #endif
1114
1115 SV *
1116 looks_like_number(sv)
1117     SV *sv
1118 PROTOTYPE: $
1119 CODE:
1120     SV *tempsv;
1121     SvGETMAGIC(sv);
1122     if(SvAMAGIC(sv) && (tempsv = AMG_CALLun(sv, numer))) {
1123         sv = tempsv;
1124     }
1125 #if PERL_BCDVERSION < 0x5008005
1126     if(SvPOK(sv) || SvPOKp(sv)) {
1127         RETVAL = looks_like_number(sv) ? &PL_sv_yes : &PL_sv_no;
1128     }
1129     else {
1130         RETVAL = (SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK)) ? &PL_sv_yes : &PL_sv_no;
1131     }
1132 #else
1133     RETVAL = looks_like_number(sv) ? &PL_sv_yes : &PL_sv_no;
1134 #endif
1135 OUTPUT:
1136     RETVAL
1137
1138 void
1139 openhandle(SV *sv)
1140 PROTOTYPE: $
1141 CODE:
1142 {
1143     IO *io = NULL;
1144     SvGETMAGIC(sv);
1145     if(SvROK(sv)){
1146         /* deref first */
1147         sv = SvRV(sv);
1148     }
1149
1150     /* must be GLOB or IO */
1151     if(isGV(sv)){
1152         io = GvIO((GV*)sv);
1153     }
1154     else if(SvTYPE(sv) == SVt_PVIO){
1155         io = (IO*)sv;
1156     }
1157
1158     if(io){
1159         /* real or tied filehandle? */
1160         if(IoIFP(io) || SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)){
1161             XSRETURN(1);
1162         }
1163     }
1164     XSRETURN_UNDEF;
1165 }
1166
1167 MODULE=List::Util       PACKAGE=Sub::Util
1168
1169 void
1170 set_prototype(proto, code)
1171     SV *proto
1172     SV *code
1173 PREINIT:
1174     SV *cv; /* not CV * */
1175 PPCODE:
1176     SvGETMAGIC(code);
1177     if(!SvROK(code))
1178         croak("set_prototype: not a reference");
1179
1180     cv = SvRV(code);
1181     if(SvTYPE(cv) != SVt_PVCV)
1182         croak("set_prototype: not a subroutine reference");
1183
1184     if(SvPOK(proto)) {
1185         /* set the prototype */
1186         sv_copypv(cv, proto);
1187     }
1188     else {
1189         /* delete the prototype */
1190         SvPOK_off(cv);
1191     }
1192
1193     PUSHs(code);
1194     XSRETURN(1);
1195
1196 void
1197 set_subname(name, sub)
1198     char *name
1199     SV *sub
1200 PREINIT:
1201     CV *cv = NULL;
1202     GV *gv;
1203     HV *stash = CopSTASH(PL_curcop);
1204     char *s, *end = NULL;
1205     MAGIC *mg;
1206 PPCODE:
1207     if (!SvROK(sub) && SvGMAGICAL(sub))
1208         mg_get(sub);
1209     if (SvROK(sub))
1210         cv = (CV *) SvRV(sub);
1211     else if (SvTYPE(sub) == SVt_PVGV)
1212         cv = GvCVu(sub);
1213     else if (!SvOK(sub))
1214         croak(PL_no_usym, "a subroutine");
1215     else if (PL_op->op_private & HINT_STRICT_REFS)
1216         croak("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use",
1217               SvPV_nolen(sub), "a subroutine");
1218     else if ((gv = gv_fetchpv(SvPV_nolen(sub), FALSE, SVt_PVCV)))
1219         cv = GvCVu(gv);
1220     if (!cv)
1221         croak("Undefined subroutine %s", SvPV_nolen(sub));
1222     if (SvTYPE(cv) != SVt_PVCV && SvTYPE(cv) != SVt_PVFM)
1223         croak("Not a subroutine reference");
1224     for (s = name; *s++; ) {
1225         if (*s == ':' && s[-1] == ':')
1226             end = ++s;
1227         else if (*s && s[-1] == '\'')
1228             end = s;
1229     }
1230     s--;
1231     if (end) {
1232         char *namepv = savepvn(name, end - name);
1233         stash = GvHV(gv_fetchpv(namepv, TRUE, SVt_PVHV));
1234         Safefree(namepv);
1235         name = end;
1236     }
1237
1238     /* under debugger, provide information about sub location */
1239     if (PL_DBsub && CvGV(cv)) {
1240         HV *hv = GvHV(PL_DBsub);
1241
1242         char *new_pkg = HvNAME(stash);
1243
1244         char *old_name = GvNAME( CvGV(cv) );
1245         char *old_pkg = HvNAME( GvSTASH(CvGV(cv)) );
1246
1247         int old_len = strlen(old_name) + strlen(old_pkg);
1248         int new_len = strlen(name) + strlen(new_pkg);
1249
1250         SV **old_data;
1251         char *full_name;
1252
1253         Newxz(full_name, (old_len > new_len ? old_len : new_len) + 3, char);
1254
1255         strcat(full_name, old_pkg);
1256         strcat(full_name, "::");
1257         strcat(full_name, old_name);
1258
1259         old_data = hv_fetch(hv, full_name, strlen(full_name), 0);
1260
1261         if (old_data) {
1262             strcpy(full_name, new_pkg);
1263             strcat(full_name, "::");
1264             strcat(full_name, name);
1265
1266             SvREFCNT_inc(*old_data);
1267             if (!hv_store(hv, full_name, strlen(full_name), *old_data, 0))
1268                 SvREFCNT_dec(*old_data);
1269         }
1270         Safefree(full_name);
1271     }
1272
1273     gv = (GV *) newSV(0);
1274     gv_init(gv, stash, name, s - name, TRUE);
1275
1276     /*
1277      * set_subname needs to create a GV to store the name. The CvGV field of a
1278      * CV is not refcounted, so perl wouldn't know to SvREFCNT_dec() this GV if
1279      * it destroys the containing CV. We use a MAGIC with an empty vtable
1280      * simply for the side-effect of using MGf_REFCOUNTED to store the
1281      * actually-counted reference to the GV.
1282      */
1283     mg = SvMAGIC(cv);
1284     while (mg && mg->mg_virtual != &subname_vtbl)
1285         mg = mg->mg_moremagic;
1286     if (!mg) {
1287         Newxz(mg, 1, MAGIC);
1288         mg->mg_moremagic = SvMAGIC(cv);
1289         mg->mg_type = PERL_MAGIC_ext;
1290         mg->mg_virtual = &subname_vtbl;
1291         SvMAGIC_set(cv, mg);
1292     }
1293     if (mg->mg_flags & MGf_REFCOUNTED)
1294         SvREFCNT_dec(mg->mg_obj);
1295     mg->mg_flags |= MGf_REFCOUNTED;
1296     mg->mg_obj = (SV *) gv;
1297     SvRMAGICAL_on(cv);
1298     CvANON_off(cv);
1299 #ifndef CvGV_set
1300     CvGV(cv) = gv;
1301 #else
1302     CvGV_set(cv, gv);
1303 #endif
1304     PUSHs(sub);
1305
1306 void
1307 subname(code)
1308     SV *code
1309 PREINIT:
1310     CV *cv;
1311     GV *gv;
1312 PPCODE:
1313     if (!SvROK(code) && SvGMAGICAL(code))
1314         mg_get(code);
1315
1316     if(!SvROK(code) || SvTYPE(cv = (CV *)SvRV(code)) != SVt_PVCV)
1317         croak("Not a subroutine reference");
1318
1319     if(!(gv = CvGV(cv)))
1320         XSRETURN(0);
1321
1322     mPUSHs(newSVpvf("%s::%s", HvNAME(GvSTASH(gv)), GvNAME(gv)));
1323     XSRETURN(1);
1324
1325 BOOT:
1326 {
1327     HV *lu_stash = gv_stashpvn("List::Util", 10, TRUE);
1328     GV *rmcgv = *(GV**)hv_fetch(lu_stash, "REAL_MULTICALL", 14, TRUE);
1329     SV *rmcsv;
1330 #if !defined(SvWEAKREF) || !defined(SvVOK)
1331     HV *su_stash = gv_stashpvn("Scalar::Util", 12, TRUE);
1332     GV *vargv = *(GV**)hv_fetch(su_stash, "EXPORT_FAIL", 11, TRUE);
1333     AV *varav;
1334     if(SvTYPE(vargv) != SVt_PVGV)
1335         gv_init(vargv, su_stash, "Scalar::Util", 12, TRUE);
1336     varav = GvAVn(vargv);
1337 #endif
1338     if(SvTYPE(rmcgv) != SVt_PVGV)
1339         gv_init(rmcgv, lu_stash, "List::Util", 10, TRUE);
1340     rmcsv = GvSVn(rmcgv);
1341 #ifndef SvWEAKREF
1342     av_push(varav, newSVpv("weaken",6));
1343     av_push(varav, newSVpv("isweak",6));
1344 #endif
1345 #ifndef SvVOK
1346     av_push(varav, newSVpv("isvstring",9));
1347 #endif
1348 #ifdef REAL_MULTICALL
1349     sv_setsv(rmcsv, &PL_sv_yes);
1350 #else
1351     sv_setsv(rmcsv, &PL_sv_no);
1352 #endif
1353 }