Commit | Line | Data |
8d063cd8 |
1 | /* $Header: array.c,v 1.0 87/12/18 13:04:42 root Exp $ |
2 | * |
3 | * $Log: array.c,v $ |
4 | * Revision 1.0 87/12/18 13:04:42 root |
5 | * Initial revision |
6 | * |
7 | */ |
8 | |
9 | #include <stdio.h> |
10 | #include "EXTERN.h" |
11 | #include "handy.h" |
12 | #include "util.h" |
13 | #include "search.h" |
14 | #include "perl.h" |
15 | |
16 | STR * |
17 | afetch(ar,key) |
18 | register ARRAY *ar; |
19 | int key; |
20 | { |
21 | if (key < 0 || key > ar->ary_max) |
22 | return Nullstr; |
23 | return ar->ary_array[key]; |
24 | } |
25 | |
26 | bool |
27 | astore(ar,key,val) |
28 | register ARRAY *ar; |
29 | int key; |
30 | STR *val; |
31 | { |
32 | bool retval; |
33 | |
34 | if (key < 0) |
35 | return FALSE; |
36 | if (key > ar->ary_max) { |
37 | int newmax = key + ar->ary_max / 5; |
38 | |
39 | ar->ary_array = (STR**)saferealloc((char*)ar->ary_array, |
40 | (newmax+1) * sizeof(STR*)); |
41 | bzero((char*)&ar->ary_array[ar->ary_max+1], |
42 | (newmax - ar->ary_max) * sizeof(STR*)); |
43 | ar->ary_max = newmax; |
44 | } |
45 | if (key > ar->ary_fill) |
46 | ar->ary_fill = key; |
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() |
71 | { |
72 | register ARRAY *ar = (ARRAY*)safemalloc(sizeof(ARRAY)); |
73 | |
74 | ar->ary_array = (STR**) safemalloc(5 * sizeof(STR*)); |
75 | ar->ary_fill = -1; |
76 | ar->ary_max = 4; |
77 | bzero((char*)ar->ary_array, 5 * sizeof(STR*)); |
78 | return ar; |
79 | } |
80 | |
81 | void |
82 | afree(ar) |
83 | register ARRAY *ar; |
84 | { |
85 | register int key; |
86 | |
87 | if (!ar) |
88 | return; |
89 | for (key = 0; key <= ar->ary_fill; key++) |
90 | str_free(ar->ary_array[key]); |
91 | safefree((char*)ar->ary_array); |
92 | safefree((char*)ar); |
93 | } |
94 | |
95 | bool |
96 | apush(ar,val) |
97 | register ARRAY *ar; |
98 | STR *val; |
99 | { |
100 | return astore(ar,++(ar->ary_fill),val); |
101 | } |
102 | |
103 | STR * |
104 | apop(ar) |
105 | register ARRAY *ar; |
106 | { |
107 | STR *retval; |
108 | |
109 | if (ar->ary_fill < 0) |
110 | return Nullstr; |
111 | retval = ar->ary_array[ar->ary_fill]; |
112 | ar->ary_array[ar->ary_fill--] = Nullstr; |
113 | return retval; |
114 | } |
115 | |
116 | aunshift(ar,num) |
117 | register ARRAY *ar; |
118 | register int num; |
119 | { |
120 | register int i; |
121 | register STR **sstr,**dstr; |
122 | |
123 | if (num <= 0) |
124 | return; |
125 | astore(ar,ar->ary_fill+num,(STR*)0); /* maybe extend array */ |
126 | sstr = ar->ary_array + ar->ary_fill; |
127 | dstr = sstr + num; |
128 | for (i = ar->ary_fill; i >= 0; i--) { |
129 | *dstr-- = *sstr--; |
130 | } |
131 | bzero((char*)(ar->ary_array), num * sizeof(STR*)); |
132 | } |
133 | |
134 | STR * |
135 | ashift(ar) |
136 | register ARRAY *ar; |
137 | { |
138 | STR *retval; |
139 | |
140 | if (ar->ary_fill < 0) |
141 | return Nullstr; |
142 | retval = ar->ary_array[0]; |
143 | bcopy((char*)(ar->ary_array+1),(char*)ar->ary_array, |
144 | ar->ary_fill * sizeof(STR*)); |
145 | ar->ary_array[ar->ary_fill--] = Nullstr; |
146 | return retval; |
147 | } |
148 | |
149 | long |
150 | alen(ar) |
151 | register ARRAY *ar; |
152 | { |
153 | return (long)ar->ary_fill; |
154 | } |
155 | |
156 | void |
157 | ajoin(ar,delim,str) |
158 | register ARRAY *ar; |
159 | char *delim; |
160 | register STR *str; |
161 | { |
162 | register int i; |
163 | register int len; |
164 | register int dlen; |
165 | |
166 | if (ar->ary_fill < 0) { |
167 | str_set(str,""); |
168 | STABSET(str); |
169 | return; |
170 | } |
171 | dlen = strlen(delim); |
172 | len = ar->ary_fill * dlen; /* account for delimiters */ |
173 | for (i = ar->ary_fill; i >= 0; i--) |
174 | len += str_len(ar->ary_array[i]); |
175 | str_grow(str,len); /* preallocate for efficiency */ |
176 | str_sset(str,ar->ary_array[0]); |
177 | for (i = 1; i <= ar->ary_fill; i++) { |
178 | str_ncat(str,delim,dlen); |
179 | str_scat(str,ar->ary_array[i]); |
180 | } |
181 | STABSET(str); |
182 | } |