1 /* $Header: array.c,v 3.0.1.2 90/08/13 21:52:20 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 3.0.1.2 90/08/13 21:52:20 lwall
10 * patch28: defined(@array) and defined(%array) didn't work right
12 * Revision 3.0.1.1 89/11/17 15:02:52 lwall
13 * patch5: nested foreach on same array didn't work
15 * Revision 3.0 89/10/18 15:08:33 lwall
31 if (key < 0 || key > ar->ary_fill) {
32 if (lval && key >= 0) {
33 if (ar->ary_flags & ARF_REAL)
36 str = str_static(&str_undef);
37 (void)astore(ar,key,str);
43 if (lval && !ar->ary_array[key]) {
45 (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;
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;
219 for (i = ar->ary_fill; i >= 0; i--) {
222 Zero(ar->ary_array, num, STR*);
232 if (ar->ary_fill < 0)
234 retval = *ar->ary_array;
235 *(ar->ary_array++) = Nullstr;
254 if (fill <= ar->ary_max)
257 (void)astore(ar,fill,Nullstr);