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: }
Defined functions
afetch
defined in line
16; used 11 times
afree
defined in line
81; used 2 times
alen
defined in line
149; used 4 times
anew
defined in line
69; used 9 times
apop
defined in line
103; used 2 times
apush
defined in line
95; used 35 times