1 /* $Header: array.c,v 3.0.1.3 90/10/15 14:56:17 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.3 90/10/15 14:56:17 lwall
10 * patch29: non-existent array values no longer cause core dumps
12 * Revision 3.0.1.2 90/08/13 21:52:20 lwall
13 * patch28: defined(@array) and defined(%array) didn't work right
15 * Revision 3.0.1.1 89/11/17 15:02:52 lwall
16 * patch5: nested foreach on same array didn't work
18 * Revision 3.0 89/10/18 15:08:33 lwall
34 if (key < 0 || key > ar->ary_fill) {
35 if (lval && key >= 0) {
36 if (ar->ary_flags & ARF_REAL)
39 str = str_static(&str_undef);
40 (void)astore(ar,key,str);
46 if (!ar->ary_array[key]) {
49 (void)astore(ar,key,str);
54 return ar->ary_array[key];
67 if (key > ar->ary_max) {
70 if (ar->ary_alloc != ar->ary_array) {
71 retval = ar->ary_array - ar->ary_alloc;
72 Copy(ar->ary_array, ar->ary_alloc, ar->ary_max+1, STR*);
73 Zero(ar->ary_alloc+ar->ary_max+1, retval, STR*);
74 ar->ary_max += retval;
75 ar->ary_array -= retval;
76 if (key > ar->ary_max - 10) {
77 newmax = key + ar->ary_max;
83 newmax = key + ar->ary_max / 5;
85 Renew(ar->ary_alloc,newmax+1, STR*);
86 Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
89 newmax = key < 4 ? 4 : key;
90 Newz(2,ar->ary_alloc, newmax+1, STR*);
92 ar->ary_array = ar->ary_alloc;
96 if ((ar->ary_flags & ARF_REAL) && ar->ary_fill < key) {
97 while (++ar->ary_fill < key) {
98 if (ar->ary_array[ar->ary_fill] != Nullstr) {
99 str_free(ar->ary_array[ar->ary_fill]);
100 ar->ary_array[ar->ary_fill] = Nullstr;
104 retval = (ar->ary_array[key] != Nullstr);
105 if (retval && (ar->ary_flags & ARF_REAL))
106 str_free(ar->ary_array[key]);
107 ar->ary_array[key] = val;
118 ar->ary_magic = Str_new(7,0);
119 ar->ary_alloc = ar->ary_array = 0;
120 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
121 ar->ary_max = ar->ary_fill = -1;
122 ar->ary_flags = ARF_REAL;
127 afake(stab,size,strp)
135 New(4,ar->ary_alloc,size+1,STR*);
136 Copy(strp,ar->ary_alloc,size,STR*);
137 ar->ary_array = ar->ary_alloc;
138 ar->ary_magic = Str_new(8,0);
139 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
140 ar->ary_fill = size - 1;
141 ar->ary_max = size - 1;
152 if (!ar || !(ar->ary_flags & ARF_REAL) || ar->ary_max < 0)
154 if (key = ar->ary_array - ar->ary_alloc) {
156 ar->ary_array -= key;
158 for (key = 0; key <= ar->ary_max; key++)
159 str_free(ar->ary_array[key]);
161 Zero(ar->ary_array, ar->ary_max+1, STR*);
172 if (key = ar->ary_array - ar->ary_alloc) {
174 ar->ary_array -= key;
176 if (ar->ary_flags & ARF_REAL) {
177 for (key = 0; key <= ar->ary_max; key++)
178 str_free(ar->ary_array[key]);
180 str_free(ar->ary_magic);
181 Safefree(ar->ary_alloc);
190 return astore(ar,++(ar->ary_fill),val);
199 if (ar->ary_fill < 0)
201 retval = ar->ary_array[ar->ary_fill];
202 ar->ary_array[ar->ary_fill--] = Nullstr;
211 register STR **sstr,**dstr;
215 if (ar->ary_array - ar->ary_alloc >= num) {
219 *--ar->ary_array = Nullstr;
222 (void)astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
223 dstr = ar->ary_array + ar->ary_fill;
225 for (i = ar->ary_fill; i >= 0; i--) {
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);