1 /* $RCSfile: array.c,v $$Revision: 4.0.1.3 $$Date: 92/06/08 11:45:05 $
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.0.1.3 92/06/08 11:45:05 lwall
10 * patch20: Perl now distinguishes overlapped copies from non-overlapped
12 * Revision 4.0.1.2 91/11/05 16:00:14 lwall
13 * patch11: random cleanup
14 * patch11: passing non-existend array elements to subrouting caused core dump
16 * Revision 4.0.1.1 91/06/07 10:19:08 lwall
17 * patch4: new copyright notice
19 * Revision 4.0 91/03/20 01:03:32 lwall
35 if (key < 0 || key > ar->ary_fill) {
36 if (lval && key >= 0) {
37 if (ar->ary_flags & ARF_REAL)
40 str = str_mortal(&str_undef);
41 (void)astore(ar,key,str);
47 if (!ar->ary_array[key]) {
50 (void)astore(ar,key,str);
55 return ar->ary_array[key];
68 if (key > ar->ary_max) {
71 if (ar->ary_alloc != ar->ary_array) {
72 retval = ar->ary_array - ar->ary_alloc;
73 Move(ar->ary_array, ar->ary_alloc, ar->ary_max+1, STR*);
74 Zero(ar->ary_alloc+ar->ary_max+1, retval, STR*);
75 ar->ary_max += retval;
76 ar->ary_array -= retval;
77 if (key > ar->ary_max - 10) {
78 newmax = key + ar->ary_max;
84 newmax = key + ar->ary_max / 5;
86 Renew(ar->ary_alloc,newmax+1, STR*);
87 Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
90 newmax = key < 4 ? 4 : key;
91 Newz(2,ar->ary_alloc, newmax+1, STR*);
93 ar->ary_array = ar->ary_alloc;
97 if (ar->ary_flags & ARF_REAL) {
98 if (ar->ary_fill < key) {
99 while (++ar->ary_fill < key) {
100 if (ar->ary_array[ar->ary_fill] != Nullstr) {
101 str_free(ar->ary_array[ar->ary_fill]);
102 ar->ary_array[ar->ary_fill] = Nullstr;
106 retval = (ar->ary_array[key] != Nullstr);
108 str_free(ar->ary_array[key]);
112 ar->ary_array[key] = val;
123 ar->ary_magic = Str_new(7,0);
124 ar->ary_alloc = ar->ary_array = 0;
125 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
126 ar->ary_max = ar->ary_fill = -1;
127 ar->ary_flags = ARF_REAL;
132 afake(stab,size,strp)
140 New(4,ar->ary_alloc,size+1,STR*);
141 Copy(strp,ar->ary_alloc,size,STR*);
142 ar->ary_array = ar->ary_alloc;
143 ar->ary_magic = Str_new(8,0);
144 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
145 ar->ary_fill = size - 1;
146 ar->ary_max = size - 1;
150 (*strp)->str_pok &= ~SP_TEMP;
162 if (!ar || !(ar->ary_flags & ARF_REAL) || ar->ary_max < 0)
165 if (key = ar->ary_array - ar->ary_alloc) {
167 ar->ary_array -= key;
169 for (key = 0; key <= ar->ary_max; key++)
170 str_free(ar->ary_array[key]);
172 Zero(ar->ary_array, ar->ary_max+1, STR*);
184 if (key = ar->ary_array - ar->ary_alloc) {
186 ar->ary_array -= key;
188 if (ar->ary_flags & ARF_REAL) {
189 for (key = 0; key <= ar->ary_max; key++)
190 str_free(ar->ary_array[key]);
192 str_free(ar->ary_magic);
193 Safefree(ar->ary_alloc);
202 return astore(ar,++(ar->ary_fill),val);
211 if (ar->ary_fill < 0)
213 retval = ar->ary_array[ar->ary_fill];
214 ar->ary_array[ar->ary_fill--] = Nullstr;
224 register STR **sstr,**dstr;
228 if (ar->ary_array - ar->ary_alloc >= num) {
232 *--ar->ary_array = Nullstr;
235 (void)astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
236 dstr = ar->ary_array + ar->ary_fill;
239 # pragma loop_opt(off) /* don't loop-optimize the following code */
240 #endif /* BUGGY_MSC5 */
241 for (i = ar->ary_fill - num; i >= 0; i--) {
244 # pragma loop_opt() /* loop-optimization back to command-line setting */
245 #endif /* BUGGY_MSC5 */
247 Zero(ar->ary_array, num, STR*);
257 if (ar->ary_fill < 0)
259 retval = *ar->ary_array;
260 *(ar->ary_array++) = Nullstr;
280 if (fill <= ar->ary_max)
283 (void)astore(ar,fill,Nullstr);