1 /* $RCSfile: array.c,v $$Revision: 4.1 $$Date: 92/08/07 17:18:22 $
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.1 92/08/07 17:18:22 lwall
12 * Revision 4.0.1.3 92/06/08 11:45:05 lwall
13 * patch20: Perl now distinguishes overlapped copies from non-overlapped
15 * Revision 4.0.1.2 91/11/05 16:00:14 lwall
16 * patch11: random cleanup
17 * patch11: passing non-existend array elements to subrouting caused core dump
19 * Revision 4.0.1.1 91/06/07 10:19:08 lwall
20 * patch4: new copyright notice
22 * Revision 4.0 91/03/20 01:03:32 lwall
39 if (mg_find((SV*)av,'P')) {
42 sv = sv_2mortal(NEWSV(61,0));
43 mg_copy((SV*)av, sv, 0, key);
53 if (key < 0 || key > AvFILL(av)) {
54 if (lval && key >= 0) {
58 sv = sv_mortalcopy(&sv_undef);
59 return av_store(av,key,sv);
64 if (!AvARRAY(av)[key]) {
67 return av_store(av,key,sv);
71 return &AvARRAY(av)[key];
87 if (mg_find((SV*)av,'P')) {
88 mg_copy((SV*)av, val, 0, key);
93 if (key > AvMAX(av)) {
96 if (AvALLOC(av) != AvARRAY(av)) {
97 tmp = AvARRAY(av) - AvALLOC(av);
98 Move(AvARRAY(av), AvALLOC(av), AvMAX(av)+1, SV*);
99 Zero(AvALLOC(av)+AvMAX(av)+1, tmp, SV*);
101 SvPVX(av) = (char*)(AvARRAY(av) - tmp);
102 if (key > AvMAX(av) - 10) {
103 newmax = key + AvMAX(av);
109 newmax = key + AvMAX(av) / 5;
111 Renew(AvALLOC(av),newmax+1, SV*);
112 Zero(&AvALLOC(av)[AvMAX(av)+1], newmax - AvMAX(av), SV*);
115 newmax = key < 4 ? 4 : key;
116 Newz(2,AvALLOC(av), newmax+1, SV*);
118 SvPVX(av) = (char*)AvALLOC(av);
124 if (AvFILL(av) < key) {
125 while (++AvFILL(av) < key) {
126 if (ary[AvFILL(av)] != Nullsv) {
127 sv_free(ary[AvFILL(av)]);
128 ary[AvFILL(av)] = Nullsv;
137 MAGIC* mg = SvMAGIC(av);
138 sv_magic(val, (SV*)av, tolower(mg->mg_type), 0, key);
151 sv_upgrade(av,SVt_PVAV);
155 AvMAX(av) = AvFILL(av) = -1;
169 sv_upgrade(av,SVt_PVAV);
170 New(4,ary,size+1,SV*);
174 SvPVX(av) = (char*)ary;
175 AvFILL(av) = size - 1;
176 AvMAX(av) = size - 1;
177 for (i = 0; i < size; i++) {
180 sv_setsv(ary[i], *strp);
197 sv_upgrade(av,SVt_PVAV);
198 New(4,ary,size+1,SV*);
200 Copy(strp,ary,size,SV*);
202 SvPVX(av) = (char*)ary;
203 AvFILL(av) = size - 1;
204 AvMAX(av) = size - 1;
219 if (!av || !AvREAL(av) || AvMAX(av) < 0)
222 if (key = AvARRAY(av) - AvALLOC(av)) {
224 SvPVX(av) = (char*)(AvARRAY(av) - key);
226 for (key = 0; key <= AvMAX(av); key++)
227 sv_free(AvARRAY(av)[key]);
229 Zero(AvARRAY(av), AvMAX(av)+1, SV*);
241 if (key = AvARRAY(av) - AvALLOC(av)) {
243 SvPVX(av) = (char*)(AvARRAY(av) - key);
246 for (key = 0; key <= AvMAX(av); key++)
247 sv_free(AvARRAY(av)[key]);
249 Safefree(AvALLOC(av));
252 AvMAX(av) = AvFILL(av) = -1;
268 return av_store(av,++(AvFILL(av)),val) != 0;
279 retval = AvARRAY(av)[AvFILL(av)];
280 AvARRAY(av)[AvFILL(av)--] = Nullsv;
290 register I32 fill = AvFILL(av);
292 while (fill >= 0 && !AvARRAY(av)[fill])
303 register SV **sstr,**dstr;
307 if (AvARRAY(av) - AvALLOC(av) >= num) {
311 SvPVX(av) = (char*)(AvARRAY(av) - 1);
312 *AvARRAY(av) = Nullsv;
316 (void)av_store(av,AvFILL(av)+num,(SV*)0); /* maybe extend array */
317 dstr = AvARRAY(av) + AvFILL(av);
320 # pragma loop_opt(off) /* don't loop-optimize the following code */
321 #endif /* BUGGY_MSC5 */
322 for (i = AvFILL(av) - num; i >= 0; i--) {
325 # pragma loop_opt() /* loop-optimization back to command-line setting */
326 #endif /* BUGGY_MSC5 */
328 Zero(AvARRAY(av), num, SV*);
340 retval = *AvARRAY(av);
341 *AvARRAY(av) = Nullsv;
342 SvPVX(av) = (char*)(AvARRAY(av) + 1);
364 if (fill <= AvMAX(av)) {
370 AvFILL(av) = fill - 1; /* don't clobber in-between values */
371 (void)av_store(av,fill,Nullsv);