1 /* $Header: array.c,v 3.0.1.1 89/11/17 15:02:52 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.1 89/11/17 15:02:52 lwall
10 * patch5: nested foreach on same array didn't work
12 * Revision 3.0 89/10/18 15:08:33 lwall
28 if (key < 0 || key > ar->ary_fill) {
29 if (lval && key >= 0) {
30 if (ar->ary_flags & ARF_REAL)
33 str = str_static(&str_undef);
34 (void)astore(ar,key,str);
40 if (lval && !ar->ary_array[key]) {
42 (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;
73 newmax = key + ar->ary_max / 5;
75 Renew(ar->ary_alloc,newmax+1, STR*);
76 Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
77 ar->ary_array = ar->ary_alloc;
81 if ((ar->ary_flags & ARF_REAL) && ar->ary_fill < key) {
82 while (++ar->ary_fill < key) {
83 if (ar->ary_array[ar->ary_fill] != Nullstr) {
84 str_free(ar->ary_array[ar->ary_fill]);
85 ar->ary_array[ar->ary_fill] = Nullstr;
89 retval = (ar->ary_array[key] != Nullstr);
90 if (retval && (ar->ary_flags & ARF_REAL))
91 str_free(ar->ary_array[key]);
92 ar->ary_array[key] = val;
103 Newz(2,ar->ary_alloc,5,STR*);
104 ar->ary_array = ar->ary_alloc;
105 ar->ary_magic = Str_new(7,0);
106 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
109 ar->ary_flags = ARF_REAL;
114 afake(stab,size,strp)
122 New(4,ar->ary_alloc,size+1,STR*);
123 Copy(strp,ar->ary_alloc,size,STR*);
124 ar->ary_array = ar->ary_alloc;
125 ar->ary_magic = Str_new(8,0);
126 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
127 ar->ary_fill = size - 1;
128 ar->ary_max = size - 1;
139 if (!ar || !(ar->ary_flags & ARF_REAL))
141 if (key = ar->ary_array - ar->ary_alloc) {
143 ar->ary_array -= key;
145 for (key = 0; key <= ar->ary_max; key++)
146 str_free(ar->ary_array[key]);
148 Zero(ar->ary_array, ar->ary_max+1, STR*);
159 if (key = ar->ary_array - ar->ary_alloc) {
161 ar->ary_array -= key;
163 if (ar->ary_flags & ARF_REAL) {
164 for (key = 0; key <= ar->ary_max; key++)
165 str_free(ar->ary_array[key]);
167 str_free(ar->ary_magic);
168 Safefree(ar->ary_alloc);
177 return astore(ar,++(ar->ary_fill),val);
186 if (ar->ary_fill < 0)
188 retval = ar->ary_array[ar->ary_fill];
189 ar->ary_array[ar->ary_fill--] = Nullstr;
198 register STR **sstr,**dstr;
202 if (ar->ary_array - ar->ary_alloc >= num) {
206 *--ar->ary_array = Nullstr;
209 (void)astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
210 dstr = ar->ary_array + ar->ary_fill;
212 for (i = ar->ary_fill; i >= 0; i--) {
215 Zero(ar->ary_array, num, STR*);
225 if (ar->ary_fill < 0)
227 retval = *ar->ary_array;
228 *(ar->ary_array++) = Nullstr;
247 if (fill <= ar->ary_max)
250 (void)astore(ar,fill,Nullstr);