2 * Variable length array of strings
4 * (C) 1992 Joseph H. Allen
6 * This file is part of JOE (Joe's Own Editor)
10 __RCSID("$MirOS: contrib/code/jupp/va.c,v 1.7 2017/12/08 02:28:08 tg Exp $");
17 aELEMENT *vamk(int len)
19 int *new = malloc((1 + len) * sizeof(aELEMENT) + 2 * sizeof(int));
23 ((aELEMENT *)(new + 2))[0] = aterm;
24 return (aELEMENT *)(new + 2);
27 void varm(aELEMENT *vary)
30 vazap(vary, 0, aLen(vary));
31 free((int *)vary - 2);
35 int alen(aELEMENT *ary)
39 while (acmp(*ary, aterm))
46 aELEMENT *vaensure(aELEMENT *vary, int len)
50 else if (len > aSiz(vary)) {
52 vary = (aELEMENT *)(2 + (int *)realloc((int *)vary - 2, (len + 1) * sizeof(aELEMENT) + 2 * sizeof(int)));
59 aELEMENT *vazap(aELEMENT *vary, int pos, int n)
64 if (pos < aLen(vary)) {
65 if (pos + n <= aLen(vary)) {
66 for (x = pos; x != pos + n; ++x)
69 for (x = pos; x != aLen(vary); ++x)
77 aELEMENT *vatrunc(aELEMENT *vary, int len)
79 if (!vary || len > aLEN(vary))
80 vary = vaensure(vary, len);
81 if (len < aLen(vary)) {
82 vary = vazap(vary, len, aLen(vary) - len);
83 vary[len] = vary[aLen(vary)];
85 } else if (len > aLen(vary)) {
86 vary = vafill(vary, aLen(vary), ablank, len - aLen(vary));
91 aELEMENT *vafill(aELEMENT *vary, int pos, aELEMENT el, int len)
93 int olen = aLEN(vary), x;
95 if (!vary || pos + len > aSIZ(vary))
96 vary = vaensure(vary, pos + len);
97 if (pos + len > olen) {
98 vary[pos + len] = vary[olen];
99 aLen(vary) = pos + len;
101 for (x = pos; x != pos + len; ++x)
104 vary = vafill(vary, pos, ablank, pos - olen);
108 aELEMENT *vandup(aELEMENT *vary, int pos, aELEMENT *array, int len)
110 int olen = aLEN(vary), x;
112 if (!vary || pos + len > aSIZ(vary))
113 vary = vaensure(vary, pos + len);
114 if (pos + len > olen) {
115 vary[pos + len] = vary[olen];
116 aLen(vary) = pos + len;
119 vary = vafill(vary, olen, ablank, pos - olen);
120 for (x = 0; x != len; ++x)
121 vary[x + pos] = adup(array[x]);
125 aELEMENT *vadup(aELEMENT *vary)
127 return vandup(NULL, 0, vary, aLEN(vary));
130 aELEMENT *_vaset(aELEMENT *vary, int pos, aELEMENT el)
132 if (!vary || pos + 1 > aSIZ(vary))
133 vary = vaensure(vary, pos + 1);
134 if (pos > aLen(vary)) {
135 vary = vafill(vary, aLen(vary), ablank, pos - aLen(vary));
136 vary[pos + 1] = vary[pos];
138 aLen(vary) = pos + 1;
139 } else if (pos == aLen(vary)) {
140 vary[pos + 1] = vary[pos];
142 aLen(vary) = pos + 1;
150 static int _acmp(aELEMENT *a, aELEMENT *b)
155 aELEMENT *vasort(aELEMENT *ary, int len)
159 qsort(ary, len, sizeof(aELEMENT), (int (*)(const void *, const void *))_acmp);
163 aELEMENT *vawords(aELEMENT *a, unsigned char *s, int len, unsigned char *sep, int seplen)
172 x = vsspan(s, len, sep, seplen);
176 x = vsscan(s, len, sep, seplen);
178 a = vaadd(a, vsncpy(vsmk(x), 0, s, x));
184 a = vaadd(a, vsncpy(vsmk(len), 0, s, len));