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
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);
345 key = AvFILL(av) + 1;
347 SvREFCNT_dec(AvARRAY(av)[--key]);
349 Safefree(AvALLOC(av));
352 AvMAX(av) = AvFILL(av) = -1;
354 SvREFCNT_dec(AvARYLEN(av));
366 av_store(av,AvFILL(av)+1,val);
375 if (!av || AvFILL(av) < 0)
379 retval = AvARRAY(av)[AvFILL(av)];
380 AvARRAY(av)[AvFILL(av)--] = &sv_undef;
392 register SV **sstr,**dstr;
398 if (!AvREAL(av) && AvREIFY(av))
400 i = AvARRAY(av) - AvALLOC(av);
408 SvPVX(av) = (char*)(AvARRAY(av) - i);
411 av_extend(av,AvFILL(av)+num);
413 dstr = AvARRAY(av) + AvFILL(av);
416 # pragma loop_opt(off) /* don't loop-optimize the following code */
417 #endif /* BUGGY_MSC5 */
418 for (i = AvFILL(av) - num; i >= 0; --i) {
421 # pragma loop_opt() /* loop-optimization back to command-line setting */
422 #endif /* BUGGY_MSC5 */
425 AvARRAY(av)[--num] = &sv_undef;
435 if (!av || AvFILL(av) < 0)
439 retval = *AvARRAY(av);
441 *AvARRAY(av) = &sv_undef;
442 SvPVX(av) = (char*)(AvARRAY(av) + 1);
463 croak("panic: null array");
466 if (fill <= AvMAX(av)) {
467 I32 key = AvFILL(av);
468 SV** ary = AvARRAY(av);
472 SvREFCNT_dec(ary[key]);
473 ary[key--] = &sv_undef;
478 ary[++key] = &sv_undef;
486 (void)av_store(av,fill,&sv_undef);
490 avhv_fetch(av, key, klen, lval)
499 keys = av_fetch(av, 0, FALSE);
500 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
501 croak("Can't coerce array into hash");
502 indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE);
506 croak("Bad index while coercing array into hash");
511 ind = AvFILL(av) + 1;
512 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), 0);
514 return av_fetch(av, ind, lval);
518 avhv_fetch_ent(av, keysv, lval, hash)
528 keys = av_fetch(av, 0, FALSE);
529 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
530 croak("Can't coerce array into hash");
531 he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
533 ind = SvIV(HeVAL(he));
535 croak("Bad index while coercing array into hash");
540 ind = AvFILL(av) + 1;
541 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), 0);
543 return av_fetch(av, ind, lval);
547 avhv_store(av, key, klen, val, hash)
557 keys = av_fetch(av, 0, FALSE);
558 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
559 croak("Can't coerce array into hash");
560 indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE);
564 croak("Bad index while coercing array into hash");
566 ind = AvFILL(av) + 1;
567 hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), hash);
569 return av_store(av, ind, val);
573 avhv_store_ent(av, keysv, val, hash)
583 keys = av_fetch(av, 0, FALSE);
584 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
585 croak("Can't coerce array into hash");
586 he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
588 ind = SvIV(HeVAL(he));
590 croak("Bad index while coercing array into hash");
592 ind = AvFILL(av) + 1;
593 hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), hash);
595 return av_store(av, ind, val);
599 avhv_exists_ent(av, keysv, hash)
606 keys = av_fetch(av, 0, FALSE);
607 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
608 croak("Can't coerce array into hash");
609 return hv_exists_ent((HV*)SvRV(*keys), keysv, hash);
613 avhv_exists(av, key, klen)
620 keys = av_fetch(av, 0, FALSE);
621 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
622 croak("Can't coerce array into hash");
623 return hv_exists((HV*)SvRV(*keys), key, klen);
626 /* avhv_delete leaks. Caller can re-index and compress if so desired. */
628 avhv_delete(av, key, klen, flags)
639 keys = av_fetch(av, 0, FALSE);
640 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
641 croak("Can't coerce array into hash");
642 sv = hv_delete((HV*)SvRV(*keys), key, klen, 0);
647 croak("Bad index while coercing array into hash");
648 svp = av_fetch(av, ind, FALSE);
651 if (flags & G_DISCARD) {
655 sv = sv_2mortal(*svp);
661 /* avhv_delete_ent leaks. Caller can re-index and compress if so desired. */
663 avhv_delete_ent(av, keysv, flags, hash)
674 keys = av_fetch(av, 0, FALSE);
675 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
676 croak("Can't coerce array into hash");
677 sv = hv_delete_ent((HV*)SvRV(*keys), keysv, 0, hash);
682 croak("Bad index while coercing array into hash");
683 svp = av_fetch(av, ind, FALSE);
686 if (flags & G_DISCARD) {
690 sv = sv_2mortal(*svp);
702 keys = av_fetch(av, 0, FALSE);
703 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
704 croak("Can't coerce array into hash");
705 return hv_iterinit((HV*)SvRV(*keys));
714 keys = av_fetch(av, 0, FALSE);
715 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
716 croak("Can't coerce array into hash");
717 return hv_iternext((HV*)SvRV(*keys));
721 avhv_iterval(av, entry)
729 keys = av_fetch(av, 0, FALSE);
730 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
731 croak("Can't coerce array into hash");
732 sv = hv_iterval((HV*)SvRV(*keys), entry);
735 croak("Bad index while coercing array into hash");
736 return *av_fetch(av, ind, TRUE);
740 avhv_iternextsv(av, key, retlen)
750 keys = av_fetch(av, 0, FALSE);
751 if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
752 croak("Can't coerce array into hash");
753 if ( (he = hv_iternext((HV*)SvRV(*keys))) == NULL)
755 *key = hv_iterkey(he, retlen);
756 sv = hv_iterval((HV*)SvRV(*keys), he);
759 croak("Bad index while coercing array into hash");
760 return *av_fetch(av, ind, TRUE);