1 /* $MirOS: contrib/code/jupp/vs.c,v 1.7 2014/07/25 11:44:34 tg Exp $ */
3 * Variable length strings
5 * (C) 1992 Joseph H. Allen
7 * This file is part of JOE (Joe's Own Editor)
16 sELEMENT *vsmk(int len)
18 int *new = (int *) joe_malloc((1 + len) * sizeof(sELEMENT) + 2 * sizeof(int));
22 ((sELEMENT *)(new + 2))[0] = sdup(sterm);
23 return (sELEMENT *)(new + 2);
26 void vsrm(sELEMENT *vary)
29 joe_free((int *) vary - 2);
32 int slen(const sELEMENT *ary)
35 const sELEMENT *beg = ary;
36 while (scmp(*ary, sterm))
43 sELEMENT *vsensure(sELEMENT *vary, int len)
47 else if (len > sSiz(vary)) {
49 vary = (sELEMENT *)(2 + (int *) joe_realloc((int *) vary - 2, (len + 1) * sizeof(sELEMENT) + 2 * sizeof(int)));
56 sELEMENT *vstrunc(sELEMENT *vary, int len)
58 if (!vary || len > sLEN(vary))
59 vary = vsensure(vary, len + 16);
60 if (len < sLen(vary)) {
61 vary[len] = vary[sLen(vary)];
63 } else if (len > sLen(vary)) {
64 vary = vsfill(vary, sLen(vary), sblank, len - sLen(vary));
69 sELEMENT *vsfill(sELEMENT *vary, int pos, sELEMENT el, int len)
71 int olen = sLEN(vary), x;
73 if (!vary || pos + len > sSIZ(vary))
74 vary = vsensure(vary, pos + len);
75 if (pos + len > olen) {
76 vary[pos + len] = vary[olen];
77 sLen(vary) = pos + len;
79 for (x = pos; x != pos + len; ++x)
82 vary = vsfill(vary, pos, sblank, pos - olen);
86 sELEMENT *vsncpy(sELEMENT *vary, int pos, const sELEMENT *array, int len)
88 int olen = sLEN(vary);
90 if (!vary || pos + len > sSIZ(vary))
91 vary = vsensure(vary, pos + len);
92 mkssert(vary != NULL);
93 if (pos + len > olen) {
94 vary[pos + len] = vary[olen];
95 sLen(vary) = pos + len;
98 vary = vsfill(vary, olen, sblank, pos - olen);
100 memmove(vary + pos, array, len * sizeof(sELEMENT));
102 mmove(vary + pos, array, len * sizeof(sELEMENT));
107 sELEMENT *vsndup(sELEMENT *vary, int pos, sELEMENT *array, int len)
109 int olen = sLEN(vary), x;
111 if (!vary || pos + len > sSIZ(vary))
112 vary = vsensure(vary, pos + len);
113 if (pos + len > olen) {
114 vary[pos + len] = vary[olen];
115 sLen(vary) = pos + len;
118 vary = vsfill(vary, olen, sblank, pos - olen);
119 for (x = pos; x != len; ++x)
120 vary[x] = sdup(array[x]);
124 sELEMENT *vsdup(sELEMENT *vary)
126 return vsndup(NULL, 0, vary, sLEN(vary));
129 sELEMENT *_vsset(sELEMENT *vary, int pos, sELEMENT el)
131 if (!vary || pos + 1 > sSIZ(vary))
132 vary = vsensure(vary, pos + 1);
133 if (pos > sLen(vary)) {
134 vary = vsfill(vary, sLen(vary), sblank, pos - sLen(vary));
135 vary[pos + 1] = vary[pos];
137 sLen(vary) = pos + 1;
138 } else if (pos == sLen(vary)) {
139 vary[pos + 1] = vary[pos];
141 sLen(vary) = pos + 1;
149 int vsbsearch(sELEMENT *ary, int len, sELEMENT el)
158 while (z != (x + y) / 2) {
160 switch (scmp(el, ary[z])) {
174 int vscmpn(sELEMENT *a, int alen, sELEMENT *b, int blen)
189 for (x = 0; x != l; ++x)
190 if ((t = scmp(a[x], b[x])) != 0)
199 int vscmp(sELEMENT *a, sELEMENT *b)
201 return vscmpn(sv(a), sv(b));
204 int vsscan(sELEMENT *a, int alen, sELEMENT *b, int blen)
208 for (x = 0; x != alen; ++x) {
209 int z = vsbsearch(b, blen, a[x]);
211 if (z < blen && !scmp(b[z], a[x]))
217 int vsspan(sELEMENT *a, int alen, sELEMENT *b, int blen)
221 /* should not happen */
225 for (x = 0; x != alen; ++x) {
226 int z = vsbsearch(b, blen, a[x]);
228 if (z == blen || scmp(b[z], a[x]))