perl 2.0 (no announcement message available)
[p5sagit/p5-mst-13.2.git] / array.c
1 /* $Header: array.c,v 2.0 88/06/05 00:08:17 root Exp $
2  *
3  * $Log:        array.c,v $
4  * Revision 2.0  88/06/05  00:08:17  root
5  * Baseline version 2.0.
6  * 
7  */
8
9 #include "EXTERN.h"
10 #include "perl.h"
11
12 STR *
13 afetch(ar,key)
14 register ARRAY *ar;
15 int key;
16 {
17     if (key < 0 || key > ar->ary_fill)
18         return Nullstr;
19     return ar->ary_array[key];
20 }
21
22 bool
23 astore(ar,key,val)
24 register ARRAY *ar;
25 int key;
26 STR *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     }
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     }
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
54 bool
55 adelete(ar,key)
56 register ARRAY *ar;
57 int 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
69 ARRAY *
70 anew(stab)
71 STAB *stab;
72 {
73     register ARRAY *ar = (ARRAY*)safemalloc(sizeof(ARRAY));
74
75     ar->ary_array = (STR**) safemalloc(5 * sizeof(STR*));
76     ar->ary_magic = str_new(0);
77     ar->ary_magic->str_link.str_magic = stab;
78     ar->ary_fill = -1;
79     ar->ary_index = -1;
80     ar->ary_max = 4;
81     bzero((char*)ar->ary_array, 5 * sizeof(STR*));
82     return ar;
83 }
84
85 void
86 aclear(ar)
87 register 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
99 void
100 afree(ar)
101 register ARRAY *ar;
102 {
103     register int key;
104
105     if (!ar)
106         return;
107     for (key = 0; key <= ar->ary_max; key++)
108         str_free(ar->ary_array[key]);
109     str_free(ar->ary_magic);
110     safefree((char*)ar->ary_array);
111     safefree((char*)ar);
112 }
113
114 bool
115 apush(ar,val)
116 register ARRAY *ar;
117 STR *val;
118 {
119     return astore(ar,++(ar->ary_fill),val);
120 }
121
122 STR *
123 apop(ar)
124 register 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
135 aunshift(ar,num)
136 register ARRAY *ar;
137 register 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 */
145     dstr = ar->ary_array + ar->ary_fill;
146     sstr = dstr - num;
147     for (i = ar->ary_fill; i >= 0; i--) {
148         *dstr-- = *sstr--;
149     }
150     bzero((char*)(ar->ary_array), num * sizeof(STR*));
151 }
152
153 STR *
154 ashift(ar)
155 register 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
168 int
169 alen(ar)
170 register ARRAY *ar;
171 {
172     return ar->ary_fill;
173 }
174
175 afill(ar, fill)
176 register ARRAY *ar;
177 int 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);
185 }
186
187 void
188 ajoin(ar,delim,str)
189 register ARRAY *ar;
190 char *delim;
191 register 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 }