pthread_condattr_init in thread.h for OLD_PTHREADS_API.
[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*);
fba3b22e 93 if (AvMAX(av) > 64)
94 offer_nice_chunk(AvALLOC(av), (AvMAX(av)+1) * sizeof(SV*));
4633a7c4 95 else
96 Safefree(AvALLOC(av));
97 AvALLOC(av) = ary;
98#endif
a0d0e21e 99 ary = AvALLOC(av) + AvMAX(av) + 1;
100 tmp = newmax - AvMAX(av);
7d55f622 101 if (av == curstack) { /* Oops, grew stack (via av_store()?) */
a0d0e21e 102 stack_sp = AvALLOC(av) + (stack_sp - stack_base);
103 stack_base = AvALLOC(av);
104 stack_max = stack_base + newmax;
105 }
106 }
107 else {
108 newmax = key < 4 ? 4 : key;
109 New(2,AvALLOC(av), newmax+1, SV*);
110 ary = AvALLOC(av) + 1;
111 tmp = newmax;
112 AvALLOC(av)[0] = &sv_undef; /* For the stacks */
113 }
114 if (AvREAL(av)) {
115 while (tmp)
116 ary[--tmp] = &sv_undef;
117 }
118
119 SvPVX(av) = (char*)AvALLOC(av);
120 AvMAX(av) = newmax;
121 }
122 }
123}
124
79072805 125SV**
463ee0b2 126av_fetch(av,key,lval)
127register AV *av;
79072805 128I32 key;
129I32 lval;
130{
131 SV *sv;
132
a0d0e21e 133 if (!av)
134 return 0;
135
8990e307 136 if (SvRMAGICAL(av)) {
463ee0b2 137 if (mg_find((SV*)av,'P')) {
11343788 138 dTHR;
8990e307 139 sv = sv_newmortal();
463ee0b2 140 mg_copy((SV*)av, sv, 0, key);
463ee0b2 141 Sv = sv;
142 return &Sv;
143 }
144 }
145
a0d0e21e 146 if (key < 0) {
147 key += AvFILL(av) + 1;
148 if (key < 0)
149 return 0;
150 }
151 else if (key > AvFILL(av)) {
152 if (!lval)
153 return 0;
154 if (AvREALISH(av))
155 sv = NEWSV(5,0);
156 else
157 sv = sv_newmortal();
158 return av_store(av,key,sv);
79072805 159 }
a0d0e21e 160 if (AvARRAY(av)[key] == &sv_undef) {
4dbf4341 161 emptyness:
79072805 162 if (lval) {
163 sv = NEWSV(6,0);
463ee0b2 164 return av_store(av,key,sv);
79072805 165 }
166 return 0;
167 }
4dbf4341 168 else if (AvREIFY(av)
169 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
170 || SvTYPE(AvARRAY(av)[key]) == SVTYPEMASK)) {
171 AvARRAY(av)[key] = &sv_undef; /* 1/2 reify */
172 goto emptyness;
173 }
463ee0b2 174 return &AvARRAY(av)[key];
79072805 175}
176
177SV**
463ee0b2 178av_store(av,key,val)
179register AV *av;
79072805 180I32 key;
181SV *val;
182{
79072805 183 SV** ary;
184
a0d0e21e 185 if (!av)
186 return 0;
43fcc5d2 187 if (!val)
188 val = &sv_undef;
463ee0b2 189
8990e307 190 if (SvRMAGICAL(av)) {
463ee0b2 191 if (mg_find((SV*)av,'P')) {
43fcc5d2 192 if (val != &sv_undef)
193 mg_copy((SV*)av, val, 0, key);
463ee0b2 194 return 0;
195 }
196 }
197
a0d0e21e 198 if (key < 0) {
199 key += AvFILL(av) + 1;
200 if (key < 0)
201 return 0;
79072805 202 }
43fcc5d2 203 if (SvREADONLY(av) && key >= AvFILL(av))
204 croak(no_modify);
49beac48 205 if (!AvREAL(av) && AvREIFY(av))
a0d0e21e 206 av_reify(av);
a0d0e21e 207 if (key > AvMAX(av))
208 av_extend(av,key);
463ee0b2 209 ary = AvARRAY(av);
a0d0e21e 210 if (AvFILL(av) < key) {
211 if (!AvREAL(av)) {
11343788 212 dTHR;
7d55f622 213 if (av == curstack && key > stack_sp - stack_base)
a0d0e21e 214 stack_sp = stack_base + key; /* XPUSH in disguise */
215 do
216 ary[++AvFILL(av)] = &sv_undef;
217 while (AvFILL(av) < key);
79072805 218 }
a0d0e21e 219 AvFILL(av) = key;
79072805 220 }
a0d0e21e 221 else if (AvREAL(av))
222 SvREFCNT_dec(ary[key]);
79072805 223 ary[key] = val;
8990e307 224 if (SvSMAGICAL(av)) {
a0d0e21e 225 if (val != &sv_undef) {
226 MAGIC* mg = SvMAGIC(av);
227 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
228 }
463ee0b2 229 mg_set((SV*)av);
230 }
79072805 231 return &ary[key];
232}
233
234AV *
235newAV()
236{
463ee0b2 237 register AV *av;
79072805 238
a0d0e21e 239 av = (AV*)NEWSV(3,0);
240 sv_upgrade((SV *)av, SVt_PVAV);
463ee0b2 241 AvREAL_on(av);
242 AvALLOC(av) = 0;
243 SvPVX(av) = 0;
244 AvMAX(av) = AvFILL(av) = -1;
245 return av;
79072805 246}
247
248AV *
249av_make(size,strp)
250register I32 size;
251register SV **strp;
252{
463ee0b2 253 register AV *av;
79072805 254 register I32 i;
255 register SV** ary;
256
a0d0e21e 257 av = (AV*)NEWSV(8,0);
258 sv_upgrade((SV *) av,SVt_PVAV);
a0d0e21e 259 AvFLAGS(av) = AVf_REAL;
573fa4ea 260 if (size) { /* `defined' was returning undef for size==0 anyway. */
261 New(4,ary,size,SV*);
262 AvALLOC(av) = ary;
263 SvPVX(av) = (char*)ary;
264 AvFILL(av) = size - 1;
265 AvMAX(av) = size - 1;
266 for (i = 0; i < size; i++) {
267 assert (*strp);
268 ary[i] = NEWSV(7,0);
269 sv_setsv(ary[i], *strp);
270 strp++;
271 }
79072805 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}