Fix multiple problems with lexical @_.
[p5sagit/p5-mst-13.2.git] / av.c
CommitLineData
a0d0e21e 1/* av.c
79072805 2 *
9607fc9c 3 * Copyright (c) 1991-1997, 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 * "...for the Entwives desired order, and plenty, and peace (by which they
12 * meant that things should remain where they had set them)." --Treebeard
79072805 13 */
14
15#include "EXTERN.h"
16#include "perl.h"
17
a0d0e21e 18static void av_reify _((AV* av));
19
20static void
21av_reify(av)
22AV* av;
23{
24 I32 key;
25 SV* sv;
26
27 key = AvMAX(av) + 1;
28 while (key > AvFILL(av) + 1)
29 AvARRAY(av)[--key] = &sv_undef;
30 while (key) {
31 sv = AvARRAY(av)[--key];
32 assert(sv);
11343788 33 if (sv != &sv_undef) {
34 dTHR;
a0d0e21e 35 (void)SvREFCNT_inc(sv);
11343788 36 }
a0d0e21e 37 }
29de640a 38 key = AvARRAY(av) - AvALLOC(av);
39 while (key)
40 AvALLOC(av)[--key] = &sv_undef;
a0d0e21e 41 AvREAL_on(av);
42}
43
44void
45av_extend(av,key)
46AV *av;
47I32 key;
48{
11343788 49 dTHR; /* only necessary if we have to extend stack */
a0d0e21e 50 if (key > AvMAX(av)) {
51 SV** ary;
52 I32 tmp;
53 I32 newmax;
54
55 if (AvALLOC(av) != AvARRAY(av)) {
56 ary = AvALLOC(av) + AvFILL(av) + 1;
57 tmp = AvARRAY(av) - AvALLOC(av);
58 Move(AvARRAY(av), AvALLOC(av), AvFILL(av)+1, SV*);
59 AvMAX(av) += tmp;
60 SvPVX(av) = (char*)AvALLOC(av);
61 if (AvREAL(av)) {
62 while (tmp)
63 ary[--tmp] = &sv_undef;
64 }
65
66 if (key > AvMAX(av) - 10) {
67 newmax = key + AvMAX(av);
68 goto resize;
69 }
70 }
71 else {
72 if (AvALLOC(av)) {
c07a80fd 73#ifndef STRANGE_MALLOC
4633a7c4 74 U32 bytes;
c07a80fd 75#endif
4633a7c4 76
a0d0e21e 77 newmax = key + AvMAX(av) / 5;
78 resize:
4633a7c4 79#ifdef STRANGE_MALLOC
a0d0e21e 80 Renew(AvALLOC(av),newmax+1, SV*);
4633a7c4 81#else
82 bytes = (newmax + 1) * sizeof(SV*);
83#define MALLOC_OVERHEAD 16
84 tmp = MALLOC_OVERHEAD;
85 while (tmp - MALLOC_OVERHEAD < bytes)
86 tmp += tmp;
87 tmp -= MALLOC_OVERHEAD;
88 tmp /= sizeof(SV*);
89 assert(tmp > newmax);
90 newmax = tmp - 1;
91 New(2,ary, newmax+1, SV*);
92 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
c07a80fd 93 if (AvMAX(av) > 64 && !nice_chunk) {
94 nice_chunk = (char*)AvALLOC(av);
95 nice_chunk_size = (AvMAX(av) + 1) * sizeof(SV*);
96 }
4633a7c4 97 else
98 Safefree(AvALLOC(av));
99 AvALLOC(av) = ary;
100#endif
a0d0e21e 101 ary = AvALLOC(av) + AvMAX(av) + 1;
102 tmp = newmax - AvMAX(av);
7d55f622 103 if (av == curstack) { /* Oops, grew stack (via av_store()?) */
a0d0e21e 104 stack_sp = AvALLOC(av) + (stack_sp - stack_base);
105 stack_base = AvALLOC(av);
106 stack_max = stack_base + newmax;
107 }
108 }
109 else {
110 newmax = key < 4 ? 4 : key;
111 New(2,AvALLOC(av), newmax+1, SV*);
112 ary = AvALLOC(av) + 1;
113 tmp = newmax;
114 AvALLOC(av)[0] = &sv_undef; /* For the stacks */
115 }
116 if (AvREAL(av)) {
117 while (tmp)
118 ary[--tmp] = &sv_undef;
119 }
120
121 SvPVX(av) = (char*)AvALLOC(av);
122 AvMAX(av) = newmax;
123 }
124 }
125}
126
79072805 127SV**
463ee0b2 128av_fetch(av,key,lval)
129register AV *av;
79072805 130I32 key;
131I32 lval;
132{
133 SV *sv;
134
a0d0e21e 135 if (!av)
136 return 0;
137
8990e307 138 if (SvRMAGICAL(av)) {
463ee0b2 139 if (mg_find((SV*)av,'P')) {
11343788 140 dTHR;
8990e307 141 sv = sv_newmortal();
463ee0b2 142 mg_copy((SV*)av, sv, 0, key);
463ee0b2 143 Sv = sv;
144 return &Sv;
145 }
146 }
147
a0d0e21e 148 if (key < 0) {
149 key += AvFILL(av) + 1;
150 if (key < 0)
151 return 0;
152 }
153 else if (key > AvFILL(av)) {
154 if (!lval)
155 return 0;
156 if (AvREALISH(av))
157 sv = NEWSV(5,0);
158 else
159 sv = sv_newmortal();
160 return av_store(av,key,sv);
79072805 161 }
a0d0e21e 162 if (AvARRAY(av)[key] == &sv_undef) {
4dbf4341 163 emptyness:
79072805 164 if (lval) {
165 sv = NEWSV(6,0);
463ee0b2 166 return av_store(av,key,sv);
79072805 167 }
168 return 0;
169 }
4dbf4341 170 else if (AvREIFY(av)
171 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
172 || SvTYPE(AvARRAY(av)[key]) == SVTYPEMASK)) {
173 AvARRAY(av)[key] = &sv_undef; /* 1/2 reify */
174 goto emptyness;
175 }
463ee0b2 176 return &AvARRAY(av)[key];
79072805 177}
178
179SV**
463ee0b2 180av_store(av,key,val)
181register AV *av;
79072805 182I32 key;
183SV *val;
184{
79072805 185 SV** ary;
186
a0d0e21e 187 if (!av)
188 return 0;
43fcc5d2 189 if (!val)
190 val = &sv_undef;
463ee0b2 191
8990e307 192 if (SvRMAGICAL(av)) {
463ee0b2 193 if (mg_find((SV*)av,'P')) {
43fcc5d2 194 if (val != &sv_undef)
195 mg_copy((SV*)av, val, 0, key);
463ee0b2 196 return 0;
197 }
198 }
199
a0d0e21e 200 if (key < 0) {
201 key += AvFILL(av) + 1;
202 if (key < 0)
203 return 0;
79072805 204 }
43fcc5d2 205 if (SvREADONLY(av) && key >= AvFILL(av))
206 croak(no_modify);
49beac48 207 if (!AvREAL(av) && AvREIFY(av))
a0d0e21e 208 av_reify(av);
a0d0e21e 209 if (key > AvMAX(av))
210 av_extend(av,key);
463ee0b2 211 ary = AvARRAY(av);
a0d0e21e 212 if (AvFILL(av) < key) {
213 if (!AvREAL(av)) {
11343788 214 dTHR;
7d55f622 215 if (av == curstack && key > stack_sp - stack_base)
a0d0e21e 216 stack_sp = stack_base + key; /* XPUSH in disguise */
217 do
218 ary[++AvFILL(av)] = &sv_undef;
219 while (AvFILL(av) < key);
79072805 220 }
a0d0e21e 221 AvFILL(av) = key;
79072805 222 }
a0d0e21e 223 else if (AvREAL(av))
224 SvREFCNT_dec(ary[key]);
79072805 225 ary[key] = val;
8990e307 226 if (SvSMAGICAL(av)) {
a0d0e21e 227 if (val != &sv_undef) {
228 MAGIC* mg = SvMAGIC(av);
229 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
230 }
463ee0b2 231 mg_set((SV*)av);
232 }
79072805 233 return &ary[key];
234}
235
236AV *
237newAV()
238{
463ee0b2 239 register AV *av;
79072805 240
a0d0e21e 241 av = (AV*)NEWSV(3,0);
242 sv_upgrade((SV *)av, SVt_PVAV);
463ee0b2 243 AvREAL_on(av);
244 AvALLOC(av) = 0;
245 SvPVX(av) = 0;
246 AvMAX(av) = AvFILL(av) = -1;
247 return av;
79072805 248}
249
250AV *
251av_make(size,strp)
252register I32 size;
253register SV **strp;
254{
463ee0b2 255 register AV *av;
79072805 256 register I32 i;
257 register SV** ary;
258
a0d0e21e 259 av = (AV*)NEWSV(8,0);
260 sv_upgrade((SV *) av,SVt_PVAV);
79072805 261 New(4,ary,size+1,SV*);
463ee0b2 262 AvALLOC(av) = ary;
a0d0e21e 263 AvFLAGS(av) = AVf_REAL;
463ee0b2 264 SvPVX(av) = (char*)ary;
265 AvFILL(av) = size - 1;
266 AvMAX(av) = size - 1;
79072805 267 for (i = 0; i < size; i++) {
a0d0e21e 268 assert (*strp);
269 ary[i] = NEWSV(7,0);
270 sv_setsv(ary[i], *strp);
79072805 271 strp++;
272 }
463ee0b2 273 return av;
79072805 274}
275
276AV *
277av_fake(size,strp)
278register I32 size;
279register SV **strp;
280{
463ee0b2 281 register AV *av;
79072805 282 register SV** ary;
283
a0d0e21e 284 av = (AV*)NEWSV(9,0);
285 sv_upgrade((SV *)av, SVt_PVAV);
79072805 286 New(4,ary,size+1,SV*);
463ee0b2 287 AvALLOC(av) = ary;
79072805 288 Copy(strp,ary,size,SV*);
a0d0e21e 289 AvFLAGS(av) = AVf_REIFY;
463ee0b2 290 SvPVX(av) = (char*)ary;
291 AvFILL(av) = size - 1;
292 AvMAX(av) = size - 1;
79072805 293 while (size--) {
a0d0e21e 294 assert (*strp);
295 SvTEMP_off(*strp);
79072805 296 strp++;
297 }
463ee0b2 298 return av;
79072805 299}
300
301void
463ee0b2 302av_clear(av)
303register AV *av;
79072805 304{
305 register I32 key;
a0d0e21e 306 SV** ary;
79072805 307
7d55f622 308#ifdef DEBUGGING
309 if (SvREFCNT(av) <= 0) {
310 warn("Attempt to clear deleted array");
311 }
312#endif
a0d0e21e 313 if (!av || AvMAX(av) < 0)
79072805 314 return;
315 /*SUPPRESS 560*/
a0d0e21e 316
317 if (AvREAL(av)) {
318 ary = AvARRAY(av);
319 key = AvFILL(av) + 1;
320 while (key) {
321 SvREFCNT_dec(ary[--key]);
322 ary[key] = &sv_undef;
323 }
324 }
463ee0b2 325 if (key = AvARRAY(av) - AvALLOC(av)) {
326 AvMAX(av) += key;
a0d0e21e 327 SvPVX(av) = (char*)AvALLOC(av);
79072805 328 }
463ee0b2 329 AvFILL(av) = -1;
79072805 330}
331
332void
463ee0b2 333av_undef(av)
334register AV *av;
79072805 335{
336 register I32 key;
337
463ee0b2 338 if (!av)
79072805 339 return;
340 /*SUPPRESS 560*/
a0d0e21e 341 if (AvREAL(av)) {
342 key = AvFILL(av) + 1;
343 while (key)
344 SvREFCNT_dec(AvARRAY(av)[--key]);
345 }
463ee0b2 346 Safefree(AvALLOC(av));
347 AvALLOC(av) = 0;
348 SvPVX(av) = 0;
349 AvMAX(av) = AvFILL(av) = -1;
748a9306 350 if (AvARYLEN(av)) {
351 SvREFCNT_dec(AvARYLEN(av));
352 AvARYLEN(av) = 0;
353 }
79072805 354}
355
a0d0e21e 356void
463ee0b2 357av_push(av,val)
358register AV *av;
79072805 359SV *val;
360{
a0d0e21e 361 if (!av)
362 return;
363 av_store(av,AvFILL(av)+1,val);
79072805 364}
365
366SV *
463ee0b2 367av_pop(av)
368register AV *av;
79072805 369{
370 SV *retval;
371
a0d0e21e 372 if (!av || AvFILL(av) < 0)
373 return &sv_undef;
43fcc5d2 374 if (SvREADONLY(av))
375 croak(no_modify);
463ee0b2 376 retval = AvARRAY(av)[AvFILL(av)];
a0d0e21e 377 AvARRAY(av)[AvFILL(av)--] = &sv_undef;
8990e307 378 if (SvSMAGICAL(av))
463ee0b2 379 mg_set((SV*)av);
79072805 380 return retval;
381}
382
383void
463ee0b2 384av_unshift(av,num)
385register AV *av;
79072805 386register I32 num;
387{
388 register I32 i;
389 register SV **sstr,**dstr;
390
a0d0e21e 391 if (!av || num <= 0)
79072805 392 return;
43fcc5d2 393 if (SvREADONLY(av))
394 croak(no_modify);
49beac48 395 if (!AvREAL(av) && AvREIFY(av))
396 av_reify(av);
a0d0e21e 397 i = AvARRAY(av) - AvALLOC(av);
398 if (i) {
399 if (i > num)
400 i = num;
401 num -= i;
402
403 AvMAX(av) += i;
404 AvFILL(av) += i;
405 SvPVX(av) = (char*)(AvARRAY(av) - i);
406 }
407 if (num) {
408 av_extend(av,AvFILL(av)+num);
409 AvFILL(av) += num;
463ee0b2 410 dstr = AvARRAY(av) + AvFILL(av);
79072805 411 sstr = dstr - num;
412#ifdef BUGGY_MSC5
413 # pragma loop_opt(off) /* don't loop-optimize the following code */
414#endif /* BUGGY_MSC5 */
a0d0e21e 415 for (i = AvFILL(av) - num; i >= 0; --i) {
79072805 416 *dstr-- = *sstr--;
417#ifdef BUGGY_MSC5
418 # pragma loop_opt() /* loop-optimization back to command-line setting */
419#endif /* BUGGY_MSC5 */
420 }
a0d0e21e 421 while (num)
422 AvARRAY(av)[--num] = &sv_undef;
79072805 423 }
424}
425
426SV *
463ee0b2 427av_shift(av)
428register AV *av;
79072805 429{
430 SV *retval;
431
a0d0e21e 432 if (!av || AvFILL(av) < 0)
433 return &sv_undef;
43fcc5d2 434 if (SvREADONLY(av))
435 croak(no_modify);
463ee0b2 436 retval = *AvARRAY(av);
a0d0e21e 437 if (AvREAL(av))
438 *AvARRAY(av) = &sv_undef;
463ee0b2 439 SvPVX(av) = (char*)(AvARRAY(av) + 1);
440 AvMAX(av)--;
441 AvFILL(av)--;
8990e307 442 if (SvSMAGICAL(av))
463ee0b2 443 mg_set((SV*)av);
79072805 444 return retval;
445}
446
447I32
463ee0b2 448av_len(av)
449register AV *av;
79072805 450{
463ee0b2 451 return AvFILL(av);
79072805 452}
453
454void
463ee0b2 455av_fill(av, fill)
456register AV *av;
79072805 457I32 fill;
458{
a0d0e21e 459 if (!av)
460 croak("panic: null array");
79072805 461 if (fill < 0)
462 fill = -1;
463ee0b2 463 if (fill <= AvMAX(av)) {
a0d0e21e 464 I32 key = AvFILL(av);
465 SV** ary = AvARRAY(av);
466
467 if (AvREAL(av)) {
468 while (key > fill) {
469 SvREFCNT_dec(ary[key]);
470 ary[key--] = &sv_undef;
471 }
472 }
473 else {
474 while (key < fill)
475 ary[++key] = &sv_undef;
476 }
477
463ee0b2 478 AvFILL(av) = fill;
8990e307 479 if (SvSMAGICAL(av))
463ee0b2 480 mg_set((SV*)av);
481 }
a0d0e21e 482 else
483 (void)av_store(av,fill,&sv_undef);
79072805 484}
c750a3ec 485
486SV**
487avhv_fetch(av, key, klen, lval)
488AV *av;
489char *key;
490U32 klen;
491I32 lval;
492{
493 SV **keys, **indsvp;
494 I32 ind;
495
496 keys = av_fetch(av, 0, FALSE);
497 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
498 croak("Can't coerce array into hash");
499 indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE);
500 if (indsvp) {
501 ind = SvIV(*indsvp);
502 if (ind < 1)
503 croak("Bad index while coercing array into hash");
504 } else {
505 if (!lval)
506 return 0;
507
508 ind = AvFILL(av) + 1;
509 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), 0);
510 }
511 return av_fetch(av, ind, lval);
512}
513
514SV**
97fcbf96 515avhv_fetch_ent(av, keysv, lval, hash)
516AV *av;
517SV *keysv;
518I32 lval;
519U32 hash;
520{
521 SV **keys, **indsvp;
522 HE *he;
523 I32 ind;
524
525 keys = av_fetch(av, 0, FALSE);
526 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
527 croak("Can't coerce array into hash");
528 he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
529 if (he) {
530 ind = SvIV(HeVAL(he));
531 if (ind < 1)
532 croak("Bad index while coercing array into hash");
533 } else {
534 if (!lval)
535 return 0;
536
537 ind = AvFILL(av) + 1;
538 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), 0);
539 }
540 return av_fetch(av, ind, lval);
541}
542
543SV**
c750a3ec 544avhv_store(av, key, klen, val, hash)
545AV *av;
546char *key;
547U32 klen;
548SV *val;
549U32 hash;
550{
551 SV **keys, **indsvp;
552 I32 ind;
553
554 keys = av_fetch(av, 0, FALSE);
555 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
556 croak("Can't coerce array into hash");
557 indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE);
558 if (indsvp) {
559 ind = SvIV(*indsvp);
560 if (ind < 1)
561 croak("Bad index while coercing array into hash");
562 } else {
563 ind = AvFILL(av) + 1;
564 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), hash);
565 }
566 return av_store(av, ind, val);
567}
568
5bc6513d 569SV**
570avhv_store_ent(av, keysv, val, hash)
571AV *av;
572SV *keysv;
573SV *val;
574U32 hash;
575{
576 SV **keys;
577 HE *he;
578 I32 ind;
579
580 keys = av_fetch(av, 0, FALSE);
581 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
582 croak("Can't coerce array into hash");
583 he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
584 if (he) {
585 ind = SvIV(HeVAL(he));
586 if (ind < 1)
587 croak("Bad index while coercing array into hash");
588 } else {
589 ind = AvFILL(av) + 1;
590 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), hash);
591 }
592 return av_store(av, ind, val);
593}
594
c750a3ec 595bool
97fcbf96 596avhv_exists_ent(av, keysv, hash)
597AV *av;
598SV *keysv;
599U32 hash;
600{
601 SV **keys;
602
603 keys = av_fetch(av, 0, FALSE);
604 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
605 croak("Can't coerce array into hash");
606 return hv_exists_ent((HV*)SvRV(*keys), keysv, hash);
607}
608
609bool
c750a3ec 610avhv_exists(av, key, klen)
611AV *av;
612char *key;
613U32 klen;
614{
615 SV **keys;
616
617 keys = av_fetch(av, 0, FALSE);
618 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
619 croak("Can't coerce array into hash");
620 return hv_exists((HV*)SvRV(*keys), key, klen);
621}
622
623/* avhv_delete leaks. Caller can re-index and compress if so desired. */
624SV *
625avhv_delete(av, key, klen, flags)
626AV *av;
627char *key;
628U32 klen;
629I32 flags;
630{
631 SV **keys;
632 SV *sv;
633 SV **svp;
634 I32 ind;
635
636 keys = av_fetch(av, 0, FALSE);
637 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
638 croak("Can't coerce array into hash");
639 sv = hv_delete((HV*)SvRV(*keys), key, klen, 0);
640 if (!sv)
641 return Nullsv;
642 ind = SvIV(sv);
643 if (ind < 1)
644 croak("Bad index while coercing array into hash");
645 svp = av_fetch(av, ind, FALSE);
646 if (!svp)
647 return Nullsv;
648 if (flags & G_DISCARD) {
649 sv = Nullsv;
650 SvREFCNT_dec(*svp);
651 } else {
652 sv = sv_2mortal(*svp);
653 }
654 *svp = &sv_undef;
655 return sv;
656}
657
97fcbf96 658/* avhv_delete_ent leaks. Caller can re-index and compress if so desired. */
659SV *
660avhv_delete_ent(av, keysv, flags, hash)
661AV *av;
662SV *keysv;
663I32 flags;
664U32 hash;
665{
666 SV **keys;
667 SV *sv;
668 SV **svp;
669 I32 ind;
670
671 keys = av_fetch(av, 0, FALSE);
672 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
673 croak("Can't coerce array into hash");
674 sv = hv_delete_ent((HV*)SvRV(*keys), keysv, 0, hash);
675 if (!sv)
676 return Nullsv;
677 ind = SvIV(sv);
678 if (ind < 1)
679 croak("Bad index while coercing array into hash");
680 svp = av_fetch(av, ind, FALSE);
681 if (!svp)
682 return Nullsv;
683 if (flags & G_DISCARD) {
684 sv = Nullsv;
685 SvREFCNT_dec(*svp);
686 } else {
687 sv = sv_2mortal(*svp);
688 }
689 *svp = &sv_undef;
690 return sv;
691}
692
c750a3ec 693I32
694avhv_iterinit(av)
695AV *av;
696{
697 SV **keys;
698
699 keys = av_fetch(av, 0, FALSE);
700 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
701 croak("Can't coerce array into hash");
702 return hv_iterinit((HV*)SvRV(*keys));
703}
704
705HE *
706avhv_iternext(av)
707AV *av;
708{
709 SV **keys;
710
711 keys = av_fetch(av, 0, FALSE);
712 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
713 croak("Can't coerce array into hash");
714 return hv_iternext((HV*)SvRV(*keys));
715}
716
717SV *
718avhv_iterval(av, entry)
719AV *av;
720register HE *entry;
721{
722 SV **keys;
723 SV *sv;
724 I32 ind;
725
726 keys = av_fetch(av, 0, FALSE);
727 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
728 croak("Can't coerce array into hash");
729 sv = hv_iterval((HV*)SvRV(*keys), entry);
730 ind = SvIV(sv);
731 if (ind < 1)
732 croak("Bad index while coercing array into hash");
733 return *av_fetch(av, ind, TRUE);
734}
735
736SV *
737avhv_iternextsv(av, key, retlen)
738AV *av;
739char **key;
740I32 *retlen;
741{
742 SV **keys;
743 HE *he;
744 SV *sv;
745 I32 ind;
746
747 keys = av_fetch(av, 0, FALSE);
748 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
749 croak("Can't coerce array into hash");
750 if ( (he = hv_iternext((HV*)SvRV(*keys))) == NULL)
751 return NULL;
752 *key = hv_iterkey(he, retlen);
753 sv = hv_iterval((HV*)SvRV(*keys), he);
754 ind = SvIV(sv);
755 if (ind < 1)
756 croak("Bad index while coercing array into hash");
757 return *av_fetch(av, ind, TRUE);
758}