3 * Copyright (c) 1991-1997, Larry Wall
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.
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
18 static void av_reify _((AV* av));
28 while (key > AvFILL(av) + 1)
29 AvARRAY(av)[--key] = &sv_undef;
31 sv = AvARRAY(av)[--key];
33 if (sv != &sv_undef) {
35 (void)SvREFCNT_inc(sv);
38 key = AvARRAY(av) - AvALLOC(av);
40 AvALLOC(av)[--key] = &sv_undef;
49 dTHR; /* only necessary if we have to extend stack */
50 if (key > AvMAX(av)) {
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*);
60 SvPVX(av) = (char*)AvALLOC(av);
63 ary[--tmp] = &sv_undef;
66 if (key > AvMAX(av) - 10) {
67 newmax = key + AvMAX(av);
73 #ifndef STRANGE_MALLOC
77 newmax = key + AvMAX(av) / 5;
80 Renew(AvALLOC(av),newmax+1, SV*);
82 bytes = (newmax + 1) * sizeof(SV*);
83 #define MALLOC_OVERHEAD 16
84 tmp = MALLOC_OVERHEAD;
85 while (tmp - MALLOC_OVERHEAD < bytes)
87 tmp -= MALLOC_OVERHEAD;
91 New(2,ary, newmax+1, SV*);
92 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
94 offer_nice_chunk(AvALLOC(av), (AvMAX(av)+1) * sizeof(SV*));
96 Safefree(AvALLOC(av));
99 ary = AvALLOC(av) + AvMAX(av) + 1;
100 tmp = newmax - AvMAX(av);
101 if (av == curstack) { /* Oops, grew stack (via av_store()?) */
102 stack_sp = AvALLOC(av) + (stack_sp - stack_base);
103 stack_base = AvALLOC(av);
104 stack_max = stack_base + newmax;
108 newmax = key < 4 ? 4 : key;
109 New(2,AvALLOC(av), newmax+1, SV*);
110 ary = AvALLOC(av) + 1;
112 AvALLOC(av)[0] = &sv_undef; /* For the stacks */
116 ary[--tmp] = &sv_undef;
119 SvPVX(av) = (char*)AvALLOC(av);
126 av_fetch(av,key,lval)
136 if (SvRMAGICAL(av)) {
137 if (mg_find((SV*)av,'P')) {
140 mg_copy((SV*)av, sv, 0, key);
147 key += AvFILL(av) + 1;
151 else if (key > AvFILL(av)) {
158 return av_store(av,key,sv);
160 if (AvARRAY(av)[key] == &sv_undef) {
164 return av_store(av,key,sv);
169 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
170 || SvTYPE(AvARRAY(av)[key]) == SVTYPEMASK)) {
171 AvARRAY(av)[key] = &sv_undef; /* 1/2 reify */
174 return &AvARRAY(av)[key];
190 if (SvRMAGICAL(av)) {
191 if (mg_find((SV*)av,'P')) {
192 if (val != &sv_undef)
193 mg_copy((SV*)av, val, 0, key);
199 key += AvFILL(av) + 1;
203 if (SvREADONLY(av) && key >= AvFILL(av))
205 if (!AvREAL(av) && AvREIFY(av))
210 if (AvFILL(av) < key) {
213 if (av == curstack && key > stack_sp - stack_base)
214 stack_sp = stack_base + key; /* XPUSH in disguise */
216 ary[++AvFILL(av)] = &sv_undef;
217 while (AvFILL(av) < key);
222 SvREFCNT_dec(ary[key]);
224 if (SvSMAGICAL(av)) {
225 if (val != &sv_undef) {
226 MAGIC* mg = SvMAGIC(av);
227 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
239 av = (AV*)NEWSV(3,0);
240 sv_upgrade((SV *)av, SVt_PVAV);
244 AvMAX(av) = AvFILL(av) = -1;
257 av = (AV*)NEWSV(8,0);
258 sv_upgrade((SV *) av,SVt_PVAV);
259 New(4,ary,size+1,SV*);
261 AvFLAGS(av) = AVf_REAL;
262 SvPVX(av) = (char*)ary;
263 AvFILL(av) = size - 1;
264 AvMAX(av) = size - 1;
265 for (i = 0; i < size; i++) {
268 sv_setsv(ary[i], *strp);
282 av = (AV*)NEWSV(9,0);
283 sv_upgrade((SV *)av, SVt_PVAV);
284 New(4,ary,size+1,SV*);
286 Copy(strp,ary,size,SV*);
287 AvFLAGS(av) = AVf_REIFY;
288 SvPVX(av) = (char*)ary;
289 AvFILL(av) = size - 1;
290 AvMAX(av) = size - 1;
307 if (SvREFCNT(av) <= 0) {
308 warn("Attempt to clear deleted array");
311 if (!av || AvMAX(av) < 0)
317 key = AvFILL(av) + 1;
319 SvREFCNT_dec(ary[--key]);
320 ary[key] = &sv_undef;
323 if (key = AvARRAY(av) - AvALLOC(av)) {
325 SvPVX(av) = (char*)AvALLOC(av);
340 key = AvFILL(av) + 1;
342 SvREFCNT_dec(AvARRAY(av)[--key]);
344 Safefree(AvALLOC(av));
347 AvMAX(av) = AvFILL(av) = -1;
349 SvREFCNT_dec(AvARYLEN(av));
361 av_store(av,AvFILL(av)+1,val);
370 if (!av || AvFILL(av) < 0)
374 retval = AvARRAY(av)[AvFILL(av)];
375 AvARRAY(av)[AvFILL(av)--] = &sv_undef;
387 register SV **sstr,**dstr;
393 if (!AvREAL(av) && AvREIFY(av))
395 i = AvARRAY(av) - AvALLOC(av);
403 SvPVX(av) = (char*)(AvARRAY(av) - i);
406 av_extend(av,AvFILL(av)+num);
408 dstr = AvARRAY(av) + AvFILL(av);
411 # pragma loop_opt(off) /* don't loop-optimize the following code */
412 #endif /* BUGGY_MSC5 */
413 for (i = AvFILL(av) - num; i >= 0; --i) {
416 # pragma loop_opt() /* loop-optimization back to command-line setting */
417 #endif /* BUGGY_MSC5 */
420 AvARRAY(av)[--num] = &sv_undef;
430 if (!av || AvFILL(av) < 0)
434 retval = *AvARRAY(av);
436 *AvARRAY(av) = &sv_undef;
437 SvPVX(av) = (char*)(AvARRAY(av) + 1);
458 croak("panic: null array");
461 if (fill <= AvMAX(av)) {
462 I32 key = AvFILL(av);
463 SV** ary = AvARRAY(av);
467 SvREFCNT_dec(ary[key]);
468 ary[key--] = &sv_undef;
473 ary[++key] = &sv_undef;
481 (void)av_store(av,fill,&sv_undef);
485 avhv_fetch(av, key, klen, lval)
494 keys = av_fetch(av, 0, FALSE);
495 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
496 croak("Can't coerce array into hash");
497 indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE);
501 croak("Bad index while coercing array into hash");
506 ind = AvFILL(av) + 1;
507 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), 0);
509 return av_fetch(av, ind, lval);
513 avhv_fetch_ent(av, keysv, lval, hash)
523 keys = av_fetch(av, 0, FALSE);
524 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
525 croak("Can't coerce array into hash");
526 he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
528 ind = SvIV(HeVAL(he));
530 croak("Bad index while coercing array into hash");
535 ind = AvFILL(av) + 1;
536 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), 0);
538 return av_fetch(av, ind, lval);
542 avhv_store(av, key, klen, val, hash)
552 keys = av_fetch(av, 0, FALSE);
553 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
554 croak("Can't coerce array into hash");
555 indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE);
559 croak("Bad index while coercing array into hash");
561 ind = AvFILL(av) + 1;
562 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), hash);
564 return av_store(av, ind, val);
568 avhv_store_ent(av, keysv, val, hash)
578 keys = av_fetch(av, 0, FALSE);
579 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
580 croak("Can't coerce array into hash");
581 he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
583 ind = SvIV(HeVAL(he));
585 croak("Bad index while coercing array into hash");
587 ind = AvFILL(av) + 1;
588 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), hash);
590 return av_store(av, ind, val);
594 avhv_exists_ent(av, keysv, hash)
601 keys = av_fetch(av, 0, FALSE);
602 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
603 croak("Can't coerce array into hash");
604 return hv_exists_ent((HV*)SvRV(*keys), keysv, hash);
608 avhv_exists(av, key, klen)
615 keys = av_fetch(av, 0, FALSE);
616 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
617 croak("Can't coerce array into hash");
618 return hv_exists((HV*)SvRV(*keys), key, klen);
621 /* avhv_delete leaks. Caller can re-index and compress if so desired. */
623 avhv_delete(av, key, klen, flags)
634 keys = av_fetch(av, 0, FALSE);
635 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
636 croak("Can't coerce array into hash");
637 sv = hv_delete((HV*)SvRV(*keys), key, klen, 0);
642 croak("Bad index while coercing array into hash");
643 svp = av_fetch(av, ind, FALSE);
646 if (flags & G_DISCARD) {
650 sv = sv_2mortal(*svp);
656 /* avhv_delete_ent leaks. Caller can re-index and compress if so desired. */
658 avhv_delete_ent(av, keysv, flags, hash)
669 keys = av_fetch(av, 0, FALSE);
670 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
671 croak("Can't coerce array into hash");
672 sv = hv_delete_ent((HV*)SvRV(*keys), keysv, 0, hash);
677 croak("Bad index while coercing array into hash");
678 svp = av_fetch(av, ind, FALSE);
681 if (flags & G_DISCARD) {
685 sv = sv_2mortal(*svp);
697 keys = av_fetch(av, 0, FALSE);
698 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
699 croak("Can't coerce array into hash");
700 return hv_iterinit((HV*)SvRV(*keys));
709 keys = av_fetch(av, 0, FALSE);
710 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
711 croak("Can't coerce array into hash");
712 return hv_iternext((HV*)SvRV(*keys));
716 avhv_iterval(av, entry)
724 keys = av_fetch(av, 0, FALSE);
725 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
726 croak("Can't coerce array into hash");
727 sv = hv_iterval((HV*)SvRV(*keys), entry);
730 croak("Bad index while coercing array into hash");
731 return *av_fetch(av, ind, TRUE);
735 avhv_iternextsv(av, key, retlen)
745 keys = av_fetch(av, 0, FALSE);
746 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
747 croak("Can't coerce array into hash");
748 if ( (he = hv_iternext((HV*)SvRV(*keys))) == NULL)
750 *key = hv_iterkey(he, retlen);
751 sv = hv_iterval((HV*)SvRV(*keys), he);
754 croak("Bad index while coercing array into hash");
755 return *av_fetch(av, ind, TRUE);