1 /* $RCSfile: array.c,v $$Revision: 4.1 $$Date: 92/08/07 17:18:22 $
3 * Copyright (c) 1991, 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.
9 * Revision 4.1 92/08/07 17:18:22 lwall
12 * Revision 4.0.1.3 92/06/08 11:45:05 lwall
13 * patch20: Perl now distinguishes overlapped copies from non-overlapped
15 * Revision 4.0.1.2 91/11/05 16:00:14 lwall
16 * patch11: random cleanup
17 * patch11: passing non-existend array elements to subrouting caused core dump
19 * Revision 4.0.1.1 91/06/07 10:19:08 lwall
20 * patch4: new copyright notice
22 * Revision 4.0 91/03/20 01:03:32 lwall
38 if (key < 0 || key > AvFILL(ar)) {
39 if (lval && key >= 0) {
43 sv = sv_mortalcopy(&sv_undef);
44 return av_store(ar,key,sv);
49 if (!AvARRAY(ar)[key]) {
52 return av_store(ar,key,sv);
56 return &AvARRAY(ar)[key];
70 if (key > AvMAX(ar)) {
73 if (AvALLOC(ar) != AvARRAY(ar)) {
74 tmp = AvARRAY(ar) - AvALLOC(ar);
75 Move(AvARRAY(ar), AvALLOC(ar), AvMAX(ar)+1, SV*);
76 Zero(AvALLOC(ar)+AvMAX(ar)+1, tmp, SV*);
79 if (key > AvMAX(ar) - 10) {
80 newmax = key + AvMAX(ar);
86 newmax = key + AvMAX(ar) / 5;
88 Renew(AvALLOC(ar),newmax+1, SV*);
89 Zero(&AvALLOC(ar)[AvMAX(ar)+1], newmax - AvMAX(ar), SV*);
92 newmax = key < 4 ? 4 : key;
93 Newz(2,AvALLOC(ar), newmax+1, SV*);
95 AvARRAY(ar) = AvALLOC(ar);
101 if (AvFILL(ar) < key) {
102 while (++AvFILL(ar) < key) {
103 if (ary[AvFILL(ar)] != Nullsv) {
104 sv_free(ary[AvFILL(ar)]);
105 ary[AvFILL(ar)] = Nullsv;
123 sv_upgrade(ar,SVt_PVAV);
125 AvALLOC(ar) = AvARRAY(ar) = 0;
126 AvMAX(ar) = AvFILL(ar) = -1;
140 sv_upgrade(ar,SVt_PVAV);
141 New(4,ary,size+1,SV*);
146 AvFILL(ar) = size - 1;
147 AvMAX(ar) = size - 1;
148 for (i = 0; i < size; i++) {
151 sv_setsv(ary[i], *strp);
168 sv_upgrade(ar,SVt_PVAV);
169 New(4,ary,size+1,SV*);
171 Copy(strp,ary,size,SV*);
174 AvFILL(ar) = size - 1;
175 AvMAX(ar) = size - 1;
190 if (!ar || !AvREAL(ar) || AvMAX(ar) < 0)
193 if (key = AvARRAY(ar) - AvALLOC(ar)) {
197 for (key = 0; key <= AvMAX(ar); key++)
198 sv_free(AvARRAY(ar)[key]);
200 Zero(AvARRAY(ar), AvMAX(ar)+1, SV*);
212 if (key = AvARRAY(ar) - AvALLOC(ar)) {
217 for (key = 0; key <= AvMAX(ar); key++)
218 sv_free(AvARRAY(ar)[key]);
220 Safefree(AvALLOC(ar));
221 AvALLOC(ar) = AvARRAY(ar) = 0;
222 AvMAX(ar) = AvFILL(ar) = -1;
238 return av_store(ar,++(AvFILL(ar)),val) != 0;
249 retval = AvARRAY(ar)[AvFILL(ar)];
250 AvARRAY(ar)[AvFILL(ar)--] = Nullsv;
258 register I32 fill = AvFILL(ar);
260 while (fill >= 0 && !AvARRAY(ar)[fill])
271 register SV **sstr,**dstr;
275 if (AvARRAY(ar) - AvALLOC(ar) >= num) {
279 *--AvARRAY(ar) = Nullsv;
282 (void)av_store(ar,AvFILL(ar)+num,(SV*)0); /* maybe extend array */
283 dstr = AvARRAY(ar) + AvFILL(ar);
286 # pragma loop_opt(off) /* don't loop-optimize the following code */
287 #endif /* BUGGY_MSC5 */
288 for (i = AvFILL(ar) - num; i >= 0; i--) {
291 # pragma loop_opt() /* loop-optimization back to command-line setting */
292 #endif /* BUGGY_MSC5 */
294 Zero(AvARRAY(ar), num, SV*);
306 retval = *AvARRAY(ar);
307 *(AvARRAY(ar)++) = Nullsv;
327 if (fill <= AvMAX(ar))
330 AvFILL(ar) = fill - 1; /* don't clobber in-between values */
331 (void)av_store(ar,fill,Nullsv);