perl 2.0 patch 1: removed redundant debugging code in regexp.c
[p5sagit/p5-mst-13.2.git] / array.c
CommitLineData
378cc40b 1/* $Header: array.c,v 2.0 88/06/05 00:08:17 root Exp $
8d063cd8 2 *
3 * $Log: array.c,v $
378cc40b 4 * Revision 2.0 88/06/05 00:08:17 root
5 * Baseline version 2.0.
8d063cd8 6 *
7 */
8
8d063cd8 9#include "EXTERN.h"
8d063cd8 10#include "perl.h"
11
12STR *
13afetch(ar,key)
14register ARRAY *ar;
15int key;
16{
378cc40b 17 if (key < 0 || key > ar->ary_fill)
8d063cd8 18 return Nullstr;
19 return ar->ary_array[key];
20}
21
22bool
23astore(ar,key,val)
24register ARRAY *ar;
25int key;
26STR *val;
27{
28 bool retval;
29
30 if (key < 0)
31 return FALSE;
32 if (key > ar->ary_max) {
33 int newmax = key + ar->ary_max / 5;
34
35 ar->ary_array = (STR**)saferealloc((char*)ar->ary_array,
36 (newmax+1) * sizeof(STR*));
37 bzero((char*)&ar->ary_array[ar->ary_max+1],
38 (newmax - ar->ary_max) * sizeof(STR*));
39 ar->ary_max = newmax;
40 }
378cc40b 41 while (ar->ary_fill < key) {
42 if (++ar->ary_fill < key && ar->ary_array[ar->ary_fill] != Nullstr) {
43 str_free(ar->ary_array[ar->ary_fill]);
44 ar->ary_array[ar->ary_fill] = Nullstr;
45 }
46 }
8d063cd8 47 retval = (ar->ary_array[key] != Nullstr);
48 if (retval)
49 str_free(ar->ary_array[key]);
50 ar->ary_array[key] = val;
51 return retval;
52}
53
54bool
55adelete(ar,key)
56register ARRAY *ar;
57int key;
58{
59 if (key < 0 || key > ar->ary_max)
60 return FALSE;
61 if (ar->ary_array[key]) {
62 str_free(ar->ary_array[key]);
63 ar->ary_array[key] = Nullstr;
64 return TRUE;
65 }
66 return FALSE;
67}
68
69ARRAY *
378cc40b 70anew(stab)
71STAB *stab;
8d063cd8 72{
73 register ARRAY *ar = (ARRAY*)safemalloc(sizeof(ARRAY));
74
75 ar->ary_array = (STR**) safemalloc(5 * sizeof(STR*));
378cc40b 76 ar->ary_magic = str_new(0);
77 ar->ary_magic->str_link.str_magic = stab;
8d063cd8 78 ar->ary_fill = -1;
378cc40b 79 ar->ary_index = -1;
8d063cd8 80 ar->ary_max = 4;
81 bzero((char*)ar->ary_array, 5 * sizeof(STR*));
82 return ar;
83}
84
85void
378cc40b 86aclear(ar)
87register ARRAY *ar;
88{
89 register int key;
90
91 if (!ar)
92 return;
93 for (key = 0; key <= ar->ary_max; key++)
94 str_free(ar->ary_array[key]);
95 ar->ary_fill = -1;
96 bzero((char*)ar->ary_array, (ar->ary_max+1) * sizeof(STR*));
97}
98
99void
8d063cd8 100afree(ar)
101register ARRAY *ar;
102{
103 register int key;
104
105 if (!ar)
106 return;
378cc40b 107 for (key = 0; key <= ar->ary_max; key++)
8d063cd8 108 str_free(ar->ary_array[key]);
378cc40b 109 str_free(ar->ary_magic);
8d063cd8 110 safefree((char*)ar->ary_array);
111 safefree((char*)ar);
112}
113
114bool
115apush(ar,val)
116register ARRAY *ar;
117STR *val;
118{
119 return astore(ar,++(ar->ary_fill),val);
120}
121
122STR *
123apop(ar)
124register ARRAY *ar;
125{
126 STR *retval;
127
128 if (ar->ary_fill < 0)
129 return Nullstr;
130 retval = ar->ary_array[ar->ary_fill];
131 ar->ary_array[ar->ary_fill--] = Nullstr;
132 return retval;
133}
134
135aunshift(ar,num)
136register ARRAY *ar;
137register int num;
138{
139 register int i;
140 register STR **sstr,**dstr;
141
142 if (num <= 0)
143 return;
144 astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */
378cc40b 145 dstr = ar->ary_array + ar->ary_fill;
146 sstr = dstr - num;
8d063cd8 147 for (i = ar->ary_fill; i >= 0; i--) {
148 *dstr-- = *sstr--;
149 }
150 bzero((char*)(ar->ary_array), num * sizeof(STR*));
151}
152
153STR *
154ashift(ar)
155register ARRAY *ar;
156{
157 STR *retval;
158
159 if (ar->ary_fill < 0)
160 return Nullstr;
161 retval = ar->ary_array[0];
162 bcopy((char*)(ar->ary_array+1),(char*)ar->ary_array,
163 ar->ary_fill * sizeof(STR*));
164 ar->ary_array[ar->ary_fill--] = Nullstr;
165 return retval;
166}
167
378cc40b 168int
8d063cd8 169alen(ar)
170register ARRAY *ar;
171{
378cc40b 172 return ar->ary_fill;
173}
174
175afill(ar, fill)
176register ARRAY *ar;
177int fill;
178{
179 if (fill < 0)
180 fill = -1;
181 if (fill <= ar->ary_max)
182 ar->ary_fill = fill;
183 else
184 astore(ar,fill,Nullstr);
8d063cd8 185}
186
187void
188ajoin(ar,delim,str)
189register ARRAY *ar;
190char *delim;
191register STR *str;
192{
193 register int i;
194 register int len;
195 register int dlen;
196
197 if (ar->ary_fill < 0) {
198 str_set(str,"");
199 STABSET(str);
200 return;
201 }
202 dlen = strlen(delim);
203 len = ar->ary_fill * dlen; /* account for delimiters */
204 for (i = ar->ary_fill; i >= 0; i--)
205 len += str_len(ar->ary_array[i]);
206 str_grow(str,len); /* preallocate for efficiency */
207 str_sset(str,ar->ary_array[0]);
208 for (i = 1; i <= ar->ary_fill; i++) {
209 str_ncat(str,delim,dlen);
210 str_scat(str,ar->ary_array[i]);
211 }
212 STABSET(str);
213}