1 /* $RCSfile: array.c,v $$Revision: 4.0.1.1 $$Date: 91/06/07 10:19:08 $
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.1 91/06/07 10:19:08 lwall
10 * patch4: new copyright notice
12 * Revision 4.0 91/03/20 01:03:32 lwall
28 if (key < 0 || key > ar->ary_fill) {
29 if (lval && key >= 0) {
30 if (ar->ary_flags & ARF_REAL)
33 str = str_mortal(&str_undef);
34 (void)astore(ar,key,str);
40 if (!ar->ary_array[key]) {
43 (void)astore(ar,key,str);
48 return ar->ary_array[key];
61 if (key > ar->ary_max) {
64 if (ar->ary_alloc != ar->ary_array) {
65 retval = ar->ary_array - ar->ary_alloc;
66 Copy(ar->ary_array, ar->ary_alloc, ar->ary_max+1, STR*);
67 Zero(ar->ary_alloc+ar->ary_max+1, retval, STR*);
68 ar->ary_max += retval;
69 ar->ary_array -= retval;
70 if (key > ar->ary_max - 10) {
71 newmax = key + ar->ary_max;
77 newmax = key + ar->ary_max / 5;
79 Renew(ar->ary_alloc,newmax+1, STR*);
80 Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
83 newmax = key < 4 ? 4 : key;
84 Newz(2,ar->ary_alloc, newmax+1, STR*);
86 ar->ary_array = ar->ary_alloc;
90 if ((ar->ary_flags & ARF_REAL) && ar->ary_fill < key) {
91 while (++ar->ary_fill < key) {
92 if (ar->ary_array[ar->ary_fill] != Nullstr) {
93 str_free(ar->ary_array[ar->ary_fill]);
94 ar->ary_array[ar->ary_fill] = Nullstr;
98 retval = (ar->ary_array[key] != Nullstr);
99 if (retval && (ar->ary_flags & ARF_REAL))
100 str_free(ar->ary_array[key]);
101 ar->ary_array[key] = val;
112 ar->ary_magic = Str_new(7,0);
113 ar->ary_alloc = ar->ary_array = 0;
114 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
115 ar->ary_max = ar->ary_fill = -1;
116 ar->ary_flags = ARF_REAL;
121 afake(stab,size,strp)
129 New(4,ar->ary_alloc,size+1,STR*);
130 Copy(strp,ar->ary_alloc,size,STR*);
131 ar->ary_array = ar->ary_alloc;
132 ar->ary_magic = Str_new(8,0);
133 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
134 ar->ary_fill = size - 1;
135 ar->ary_max = size - 1;
138 (*strp++)->str_pok &= ~SP_TEMP;
149 if (!ar || !(ar->ary_flags & ARF_REAL) || ar->ary_max < 0)
151 if (key = ar->ary_array - ar->ary_alloc) {
153 ar->ary_array -= key;
155 for (key = 0; key <= ar->ary_max; key++)
156 str_free(ar->ary_array[key]);
158 Zero(ar->ary_array, ar->ary_max+1, STR*);
169 if (key = ar->ary_array - ar->ary_alloc) {
171 ar->ary_array -= key;
173 if (ar->ary_flags & ARF_REAL) {
174 for (key = 0; key <= ar->ary_max; key++)
175 str_free(ar->ary_array[key]);
177 str_free(ar->ary_magic);
178 Safefree(ar->ary_alloc);
187 return astore(ar,++(ar->ary_fill),val);
196 if (ar->ary_fill < 0)
198 retval = ar->ary_array[ar->ary_fill];
199 ar->ary_array[ar->ary_fill--] = Nullstr;
208 register STR **sstr,**dstr;
212 if (ar->ary_array - ar->ary_alloc >= num) {
216 *--ar->ary_array = Nullstr;
219 (void)astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
220 dstr = ar->ary_array + ar->ary_fill;
223 # pragma loop_opt(off) /* don't loop-optimize the following code */
224 #endif /* BUGGY_MSC5 */
225 for (i = ar->ary_fill; i >= 0; i--) {
228 # pragma loop_opt() /* loop-optimization back to command-line setting */
229 #endif /* BUGGY_MSC5 */
231 Zero(ar->ary_array, num, STR*);
241 if (ar->ary_fill < 0)
243 retval = *ar->ary_array;
244 *(ar->ary_array++) = Nullstr;
263 if (fill <= ar->ary_max)
266 (void)astore(ar,fill,Nullstr);