1 /* $Header: array.c,v 4.0 91/03/20 01:03:32 lwall Locked $
3 * Copyright (c) 1989, Larry Wall
5 * You may distribute under the terms of the GNU General Public License
6 * as specified in the README file that comes with the perl 3.0 kit.
9 * Revision 4.0 91/03/20 01:03:32 lwall
25 if (key < 0 || key > ar->ary_fill) {
26 if (lval && key >= 0) {
27 if (ar->ary_flags & ARF_REAL)
30 str = str_mortal(&str_undef);
31 (void)astore(ar,key,str);
37 if (!ar->ary_array[key]) {
40 (void)astore(ar,key,str);
45 return ar->ary_array[key];
58 if (key > ar->ary_max) {
61 if (ar->ary_alloc != ar->ary_array) {
62 retval = ar->ary_array - ar->ary_alloc;
63 Copy(ar->ary_array, ar->ary_alloc, ar->ary_max+1, STR*);
64 Zero(ar->ary_alloc+ar->ary_max+1, retval, STR*);
65 ar->ary_max += retval;
66 ar->ary_array -= retval;
67 if (key > ar->ary_max - 10) {
68 newmax = key + ar->ary_max;
74 newmax = key + ar->ary_max / 5;
76 Renew(ar->ary_alloc,newmax+1, STR*);
77 Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
80 newmax = key < 4 ? 4 : key;
81 Newz(2,ar->ary_alloc, newmax+1, STR*);
83 ar->ary_array = ar->ary_alloc;
87 if ((ar->ary_flags & ARF_REAL) && ar->ary_fill < key) {
88 while (++ar->ary_fill < key) {
89 if (ar->ary_array[ar->ary_fill] != Nullstr) {
90 str_free(ar->ary_array[ar->ary_fill]);
91 ar->ary_array[ar->ary_fill] = Nullstr;
95 retval = (ar->ary_array[key] != Nullstr);
96 if (retval && (ar->ary_flags & ARF_REAL))
97 str_free(ar->ary_array[key]);
98 ar->ary_array[key] = val;
109 ar->ary_magic = Str_new(7,0);
110 ar->ary_alloc = ar->ary_array = 0;
111 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
112 ar->ary_max = ar->ary_fill = -1;
113 ar->ary_flags = ARF_REAL;
118 afake(stab,size,strp)
126 New(4,ar->ary_alloc,size+1,STR*);
127 Copy(strp,ar->ary_alloc,size,STR*);
128 ar->ary_array = ar->ary_alloc;
129 ar->ary_magic = Str_new(8,0);
130 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
131 ar->ary_fill = size - 1;
132 ar->ary_max = size - 1;
135 (*strp++)->str_pok &= ~SP_TEMP;
146 if (!ar || !(ar->ary_flags & ARF_REAL) || ar->ary_max < 0)
148 if (key = ar->ary_array - ar->ary_alloc) {
150 ar->ary_array -= key;
152 for (key = 0; key <= ar->ary_max; key++)
153 str_free(ar->ary_array[key]);
155 Zero(ar->ary_array, ar->ary_max+1, STR*);
166 if (key = ar->ary_array - ar->ary_alloc) {
168 ar->ary_array -= key;
170 if (ar->ary_flags & ARF_REAL) {
171 for (key = 0; key <= ar->ary_max; key++)
172 str_free(ar->ary_array[key]);
174 str_free(ar->ary_magic);
175 Safefree(ar->ary_alloc);
184 return astore(ar,++(ar->ary_fill),val);
193 if (ar->ary_fill < 0)
195 retval = ar->ary_array[ar->ary_fill];
196 ar->ary_array[ar->ary_fill--] = Nullstr;
205 register STR **sstr,**dstr;
209 if (ar->ary_array - ar->ary_alloc >= num) {
213 *--ar->ary_array = Nullstr;
216 (void)astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
217 dstr = ar->ary_array + ar->ary_fill;
220 # pragma loop_opt(off) /* don't loop-optimize the following code */
221 #endif /* BUGGY_MSC5 */
222 for (i = ar->ary_fill; i >= 0; i--) {
225 # pragma loop_opt() /* loop-optimization back to command-line setting */
226 #endif /* BUGGY_MSC5 */
228 Zero(ar->ary_array, num, STR*);
238 if (ar->ary_fill < 0)
240 retval = *ar->ary_array;
241 *(ar->ary_array++) = Nullstr;
260 if (fill <= ar->ary_max)
263 (void)astore(ar,fill,Nullstr);