1 /* $RCSfile: array.c,v $$Revision: 4.0.1.2 $$Date: 91/11/05 16:00:14 $
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.2 91/11/05 16:00:14 lwall
10 * patch11: random cleanup
11 * patch11: passing non-existend array elements to subrouting caused core dump
13 * Revision 4.0.1.1 91/06/07 10:19:08 lwall
14 * patch4: new copyright notice
16 * Revision 4.0 91/03/20 01:03:32 lwall
32 if (key < 0 || key > ar->ary_fill) {
33 if (lval && key >= 0) {
34 if (ar->ary_flags & ARF_REAL)
37 str = str_mortal(&str_undef);
38 (void)astore(ar,key,str);
44 if (!ar->ary_array[key]) {
47 (void)astore(ar,key,str);
52 return ar->ary_array[key];
65 if (key > ar->ary_max) {
68 if (ar->ary_alloc != ar->ary_array) {
69 retval = ar->ary_array - ar->ary_alloc;
70 Copy(ar->ary_array, ar->ary_alloc, ar->ary_max+1, STR*);
71 Zero(ar->ary_alloc+ar->ary_max+1, retval, STR*);
72 ar->ary_max += retval;
73 ar->ary_array -= retval;
74 if (key > ar->ary_max - 10) {
75 newmax = key + ar->ary_max;
81 newmax = key + ar->ary_max / 5;
83 Renew(ar->ary_alloc,newmax+1, STR*);
84 Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
87 newmax = key < 4 ? 4 : key;
88 Newz(2,ar->ary_alloc, newmax+1, STR*);
90 ar->ary_array = ar->ary_alloc;
94 if (ar->ary_flags & ARF_REAL) {
95 if (ar->ary_fill < key) {
96 while (++ar->ary_fill < key) {
97 if (ar->ary_array[ar->ary_fill] != Nullstr) {
98 str_free(ar->ary_array[ar->ary_fill]);
99 ar->ary_array[ar->ary_fill] = Nullstr;
103 retval = (ar->ary_array[key] != Nullstr);
105 str_free(ar->ary_array[key]);
109 ar->ary_array[key] = val;
120 ar->ary_magic = Str_new(7,0);
121 ar->ary_alloc = ar->ary_array = 0;
122 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
123 ar->ary_max = ar->ary_fill = -1;
124 ar->ary_flags = ARF_REAL;
129 afake(stab,size,strp)
137 New(4,ar->ary_alloc,size+1,STR*);
138 Copy(strp,ar->ary_alloc,size,STR*);
139 ar->ary_array = ar->ary_alloc;
140 ar->ary_magic = Str_new(8,0);
141 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
142 ar->ary_fill = size - 1;
143 ar->ary_max = size - 1;
147 (*strp)->str_pok &= ~SP_TEMP;
159 if (!ar || !(ar->ary_flags & ARF_REAL) || ar->ary_max < 0)
162 if (key = ar->ary_array - ar->ary_alloc) {
164 ar->ary_array -= key;
166 for (key = 0; key <= ar->ary_max; key++)
167 str_free(ar->ary_array[key]);
169 Zero(ar->ary_array, ar->ary_max+1, STR*);
181 if (key = ar->ary_array - ar->ary_alloc) {
183 ar->ary_array -= key;
185 if (ar->ary_flags & ARF_REAL) {
186 for (key = 0; key <= ar->ary_max; key++)
187 str_free(ar->ary_array[key]);
189 str_free(ar->ary_magic);
190 Safefree(ar->ary_alloc);
199 return astore(ar,++(ar->ary_fill),val);
208 if (ar->ary_fill < 0)
210 retval = ar->ary_array[ar->ary_fill];
211 ar->ary_array[ar->ary_fill--] = Nullstr;
220 register STR **sstr,**dstr;
224 if (ar->ary_array - ar->ary_alloc >= num) {
228 *--ar->ary_array = Nullstr;
231 (void)astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
232 dstr = ar->ary_array + ar->ary_fill;
235 # pragma loop_opt(off) /* don't loop-optimize the following code */
236 #endif /* BUGGY_MSC5 */
237 for (i = ar->ary_fill - num; i >= 0; i--) {
240 # pragma loop_opt() /* loop-optimization back to command-line setting */
241 #endif /* BUGGY_MSC5 */
243 Zero(ar->ary_array, num, STR*);
253 if (ar->ary_fill < 0)
255 retval = *ar->ary_array;
256 *(ar->ary_array++) = Nullstr;
275 if (fill <= ar->ary_max)
278 (void)astore(ar,fill,Nullstr);