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 AvFLAGS(av) = AVf_REAL;
260 if (size) { /* `defined' was returning undef for size==0 anyway. */
263 SvPVX(av) = (char*)ary;
264 AvFILL(av) = size - 1;
265 AvMAX(av) = size - 1;
266 for (i = 0; i < size; i++) {
269 sv_setsv(ary[i], *strp);
284 av = (AV*)NEWSV(9,0);
285 sv_upgrade((SV *)av, SVt_PVAV);
286 New(4,ary,size+1,SV*);
288 Copy(strp,ary,size,SV*);
289 AvFLAGS(av) = AVf_REIFY;
290 SvPVX(av) = (char*)ary;
291 AvFILL(av) = size - 1;
292 AvMAX(av) = size - 1;
309 if (SvREFCNT(av) <= 0) {
310 warn("Attempt to clear deleted array");
313 if (!av || AvMAX(av) < 0)
319 key = AvFILL(av) + 1;
321 SvREFCNT_dec(ary[--key]);
322 ary[key] = &sv_undef;
325 if (key = AvARRAY(av) - AvALLOC(av)) {
327 SvPVX(av) = (char*)AvALLOC(av);
342 key = AvFILL(av) + 1;
344 SvREFCNT_dec(AvARRAY(av)[--key]);
346 Safefree(AvALLOC(av));
349 AvMAX(av) = AvFILL(av) = -1;
351 SvREFCNT_dec(AvARYLEN(av));
363 av_store(av,AvFILL(av)+1,val);
372 if (!av || AvFILL(av) < 0)
376 retval = AvARRAY(av)[AvFILL(av)];
377 AvARRAY(av)[AvFILL(av)--] = &sv_undef;
389 register SV **sstr,**dstr;
395 if (!AvREAL(av) && AvREIFY(av))
397 i = AvARRAY(av) - AvALLOC(av);
405 SvPVX(av) = (char*)(AvARRAY(av) - i);
408 av_extend(av,AvFILL(av)+num);
410 dstr = AvARRAY(av) + AvFILL(av);
413 # pragma loop_opt(off) /* don't loop-optimize the following code */
414 #endif /* BUGGY_MSC5 */
415 for (i = AvFILL(av) - num; i >= 0; --i) {
418 # pragma loop_opt() /* loop-optimization back to command-line setting */
419 #endif /* BUGGY_MSC5 */
422 AvARRAY(av)[--num] = &sv_undef;
432 if (!av || AvFILL(av) < 0)
436 retval = *AvARRAY(av);
438 *AvARRAY(av) = &sv_undef;
439 SvPVX(av) = (char*)(AvARRAY(av) + 1);
460 croak("panic: null array");
463 if (fill <= AvMAX(av)) {
464 I32 key = AvFILL(av);
465 SV** ary = AvARRAY(av);
469 SvREFCNT_dec(ary[key]);
470 ary[key--] = &sv_undef;
475 ary[++key] = &sv_undef;
483 (void)av_store(av,fill,&sv_undef);
487 avhv_fetch(av, key, klen, lval)
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);
503 croak("Bad index while coercing array into hash");
508 ind = AvFILL(av) + 1;
509 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), 0);
511 return av_fetch(av, ind, lval);
515 avhv_fetch_ent(av, keysv, lval, hash)
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);
530 ind = SvIV(HeVAL(he));
532 croak("Bad index while coercing array into hash");
537 ind = AvFILL(av) + 1;
538 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), 0);
540 return av_fetch(av, ind, lval);
544 avhv_store(av, key, klen, val, hash)
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);
561 croak("Bad index while coercing array into hash");
563 ind = AvFILL(av) + 1;
564 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), hash);
566 return av_store(av, ind, val);
570 avhv_store_ent(av, keysv, val, hash)
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);
585 ind = SvIV(HeVAL(he));
587 croak("Bad index while coercing array into hash");
589 ind = AvFILL(av) + 1;
590 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), hash);
592 return av_store(av, ind, val);
596 avhv_exists_ent(av, keysv, hash)
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);
610 avhv_exists(av, key, klen)
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);
623 /* avhv_delete leaks. Caller can re-index and compress if so desired. */
625 avhv_delete(av, key, klen, flags)
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);
644 croak("Bad index while coercing array into hash");
645 svp = av_fetch(av, ind, FALSE);
648 if (flags & G_DISCARD) {
652 sv = sv_2mortal(*svp);
658 /* avhv_delete_ent leaks. Caller can re-index and compress if so desired. */
660 avhv_delete_ent(av, keysv, flags, hash)
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);
679 croak("Bad index while coercing array into hash");
680 svp = av_fetch(av, ind, FALSE);
683 if (flags & G_DISCARD) {
687 sv = sv_2mortal(*svp);
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));
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));
718 avhv_iterval(av, entry)
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);
732 croak("Bad index while coercing array into hash");
733 return *av_fetch(av, ind, TRUE);
737 avhv_iternextsv(av, key, retlen)
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)
752 *key = hv_iterkey(he, retlen);
753 sv = hv_iterval((HV*)SvRV(*keys), he);
756 croak("Bad index while coercing array into hash");
757 return *av_fetch(av, ind, TRUE);