2 * Variable length strings
4 * (C) 1992 Joseph H. Allen
6 * This file is part of JOE (Joe's Own Editor)
11 __RCSID("$MirOS: contrib/code/jupp/vs.c,v 1.10 2017/12/02 02:07:38 tg Exp $");
19 sELEMENT *vsmk(int len)
21 int *new = (int *) joe_malloc((1 + len) * sizeof(sELEMENT) + 2 * sizeof(int));
25 ((sELEMENT *)(new + 2))[0] = sdup(sterm);
26 return (sELEMENT *)(new + 2);
29 void vsrm(sELEMENT *vary)
32 joe_free((int *) vary - 2);
35 int slen(const sELEMENT *ary)
38 const sELEMENT *beg = ary;
39 while (scmp(*ary, sterm))
46 sELEMENT *vsensure(sELEMENT *vary, int len)
50 else if (len > sSiz(vary)) {
52 vary = (sELEMENT *)(2 + (int *) joe_realloc((int *) vary - 2, (len + 1) * sizeof(sELEMENT) + 2 * sizeof(int)));
59 sELEMENT *vstrunc(sELEMENT *vary, int len)
61 if (!vary || len > sLEN(vary))
62 vary = vsensure(vary, len + 16);
63 if (len < sLen(vary)) {
64 vary[len] = vary[sLen(vary)];
66 } else if (len > sLen(vary)) {
67 vary = vsfill(vary, sLen(vary), sblank, len - sLen(vary));
72 sELEMENT *vsfill(sELEMENT *vary, int pos, sELEMENT el, int len)
74 int olen = sLEN(vary), x;
76 if (!vary || pos + len > sSIZ(vary))
77 vary = vsensure(vary, pos + len);
78 if (pos + len > olen) {
79 vary[pos + len] = vary[olen];
80 sLen(vary) = pos + len;
82 for (x = pos; x != pos + len; ++x)
85 vary = vsfill(vary, pos, sblank, pos - olen);
89 sELEMENT *vsncpy(sELEMENT *vary, int pos, const sELEMENT *array, int len)
91 int olen = sLEN(vary);
93 if (!vary || pos + len > sSIZ(vary))
94 vary = vsensure(vary, pos + len);
95 if (pos + len > olen) {
96 vary[pos + len] = vary[olen];
97 sLen(vary) = pos + len;
100 vary = vsfill(vary, olen, sblank, pos - olen);
102 memmove(vary + pos, array, len * sizeof(sELEMENT));
104 mmove(vary + pos, array, len * sizeof(sELEMENT));
109 sELEMENT *vsndup(sELEMENT *vary, int pos, sELEMENT *array, int len)
111 int olen = sLEN(vary), x;
113 if (!vary || pos + len > sSIZ(vary))
114 vary = vsensure(vary, pos + len);
115 if (pos + len > olen) {
116 vary[pos + len] = vary[olen];
117 sLen(vary) = pos + len;
120 vary = vsfill(vary, olen, sblank, pos - olen);
121 for (x = pos; x != len; ++x)
122 vary[x] = sdup(array[x]);
126 sELEMENT *vsdup(sELEMENT *vary)
128 return vsndup(NULL, 0, vary, sLEN(vary));
131 sELEMENT *_vsset(sELEMENT *vary, int pos, sELEMENT el)
133 if (!vary || pos + 1 > sSIZ(vary))
134 vary = vsensure(vary, pos + 1);
135 if (pos > sLen(vary)) {
136 vary = vsfill(vary, sLen(vary), sblank, pos - sLen(vary));
137 vary[pos + 1] = vary[pos];
139 sLen(vary) = pos + 1;
140 } else if (pos == sLen(vary)) {
141 vary[pos + 1] = vary[pos];
143 sLen(vary) = pos + 1;
151 int vsbsearch(const sELEMENT *ary, int len, sELEMENT el)
160 while (z != (x + y) / 2) {
162 switch (scmp(el, ary[z])) {
176 int vscmpn(sELEMENT *a, int alen, sELEMENT *b, int blen)
191 for (x = 0; x != l; ++x)
192 if ((t = scmp(a[x], b[x])) != 0)
201 int vscmp(sELEMENT *a, sELEMENT *b)
203 return vscmpn(sv(a), sv(b));
206 int vsscan(const sELEMENT *a, int alen, const sELEMENT *b, int blen)
210 for (x = 0; x != alen; ++x) {
211 int z = vsbsearch(b, blen, a[x]);
213 if (z < blen && !scmp(b[z], a[x]))
219 int vsspan(sELEMENT *a, int alen, sELEMENT *b, int blen)
223 /* should not happen */
227 for (x = 0; x != alen; ++x) {
228 int z = vsbsearch(b, blen, a[x]);
230 if (z == blen || scmp(b[z], a[x]))