1 /* $Header: array.c,v 3.0 89/10/18 15:08:33 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 89/10/18 15:08:33 lwall
25 if (key < 0 || key > ar->ary_fill) {
26 if (lval && key >= 0) {
27 if (ar->ary_flags & ARF_REAL)
30 str = str_static(&str_undef);
31 (void)astore(ar,key,str);
37 if (lval && !ar->ary_array[key]) {
39 (void)astore(ar,key,str);
42 return ar->ary_array[key];
55 if (key > ar->ary_max) {
58 if (ar->ary_alloc != ar->ary_array) {
59 retval = ar->ary_array - ar->ary_alloc;
60 Copy(ar->ary_array, ar->ary_alloc, ar->ary_max+1, STR*);
61 Zero(ar->ary_alloc+ar->ary_max+1, retval, STR*);
62 ar->ary_max += retval;
63 ar->ary_array -= retval;
64 if (key > ar->ary_max - 10) {
65 newmax = key + ar->ary_max;
70 newmax = key + ar->ary_max / 5;
72 Renew(ar->ary_alloc,newmax+1, STR*);
73 Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
74 ar->ary_array = ar->ary_alloc;
78 if ((ar->ary_flags & ARF_REAL) && ar->ary_fill < key) {
79 while (++ar->ary_fill < key) {
80 if (ar->ary_array[ar->ary_fill] != Nullstr) {
81 str_free(ar->ary_array[ar->ary_fill]);
82 ar->ary_array[ar->ary_fill] = Nullstr;
86 retval = (ar->ary_array[key] != Nullstr);
87 if (retval && (ar->ary_flags & ARF_REAL))
88 str_free(ar->ary_array[key]);
89 ar->ary_array[key] = val;
100 Newz(2,ar->ary_alloc,5,STR*);
101 ar->ary_array = ar->ary_alloc;
102 ar->ary_magic = Str_new(7,0);
103 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
107 ar->ary_flags = ARF_REAL;
112 afake(stab,size,strp)
120 New(4,ar->ary_alloc,size+1,STR*);
121 Copy(strp,ar->ary_alloc,size,STR*);
122 ar->ary_array = ar->ary_alloc;
123 ar->ary_magic = Str_new(8,0);
124 str_magic(ar->ary_magic, stab, '#', Nullch, 0);
125 ar->ary_fill = size - 1;
127 ar->ary_max = size - 1;
138 if (!ar || !(ar->ary_flags & ARF_REAL))
140 if (key = ar->ary_array - ar->ary_alloc) {
142 ar->ary_array -= key;
144 for (key = 0; key <= ar->ary_max; key++)
145 str_free(ar->ary_array[key]);
147 Zero(ar->ary_array, ar->ary_max+1, STR*);
158 if (key = ar->ary_array - ar->ary_alloc) {
160 ar->ary_array -= key;
162 if (ar->ary_flags & ARF_REAL) {
163 for (key = 0; key <= ar->ary_max; key++)
164 str_free(ar->ary_array[key]);
166 str_free(ar->ary_magic);
167 Safefree(ar->ary_alloc);
176 return astore(ar,++(ar->ary_fill),val);
185 if (ar->ary_fill < 0)
187 retval = ar->ary_array[ar->ary_fill];
188 ar->ary_array[ar->ary_fill--] = Nullstr;
197 register STR **sstr,**dstr;
201 if (ar->ary_array - ar->ary_alloc >= num) {
205 *--ar->ary_array = Nullstr;
208 (void)astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
209 dstr = ar->ary_array + ar->ary_fill;
211 for (i = ar->ary_fill; i >= 0; i--) {
214 Zero(ar->ary_array, num, STR*);
224 if (ar->ary_fill < 0)
226 retval = *ar->ary_array;
227 *(ar->ary_array++) = Nullstr;
246 if (fill <= ar->ary_max)
249 (void)astore(ar,fill,Nullstr);