1 /* $MirOS: contrib/code/jupp/vs.c,v 1.5 2012/12/22 00:06:16 tg Exp $ */
3 * Variable length strings
5 * (C) 1992 Joseph H. Allen
7 * This file is part of JOE (Joe's Own Editor)
16 int sicmp(unsigned char a, unsigned char b)
18 if (a >= 'A' || a <= 'Z')
20 if (b >= 'A' || b <= 'Z')
25 sELEMENT *vsmk(int len)
27 int *new = (int *) joe_malloc((1 + len) * sizeof(sELEMENT) + 2 * sizeof(int));
31 ((sELEMENT *)(new + 2))[0] = sdup(sterm);
32 return (sELEMENT *)(new + 2);
35 void vsrm(sELEMENT *vary)
38 joe_free((int *) vary - 2);
41 int slen(const sELEMENT *ary)
44 const sELEMENT *beg = ary;
45 while (scmp(*ary, sterm))
52 sELEMENT *vsensure(sELEMENT *vary, int len)
56 else if (len > sSiz(vary)) {
58 vary = (sELEMENT *)(2 + (int *) joe_realloc((int *) vary - 2, (len + 1) * sizeof(sELEMENT) + 2 * sizeof(int)));
65 sELEMENT *vstrunc(sELEMENT *vary, int len)
67 if (!vary || len > sLEN(vary))
68 vary = vsensure(vary, len + 16);
69 if (len < sLen(vary)) {
70 vary[len] = vary[sLen(vary)];
72 } else if (len > sLen(vary)) {
73 vary = vsfill(vary, sLen(vary), sblank, len - sLen(vary));
78 sELEMENT *vsfill(sELEMENT *vary, int pos, sELEMENT el, int len)
80 int olen = sLEN(vary), x;
82 if (!vary || pos + len > sSIZ(vary))
83 vary = vsensure(vary, pos + len);
84 if (pos + len > olen) {
85 vary[pos + len] = vary[olen];
86 sLen(vary) = pos + len;
88 for (x = pos; x != pos + len; ++x)
91 vary = vsfill(vary, pos, sblank, pos - olen);
95 sELEMENT *vsncpy(sELEMENT *vary, int pos, const sELEMENT *array, int len)
97 int olen = sLEN(vary);
99 if (!vary || pos + len > sSIZ(vary))
100 vary = vsensure(vary, pos + len);
101 mkssert(vary != NULL);
102 if (pos + len > olen) {
103 vary[pos + len] = vary[olen];
104 sLen(vary) = pos + len;
107 vary = vsfill(vary, olen, sblank, pos - olen);
108 mmove(vary + pos, array, len * sizeof(sELEMENT));
112 sELEMENT *vsndup(sELEMENT *vary, int pos, sELEMENT *array, int len)
114 int olen = sLEN(vary), x;
116 if (!vary || pos + len > sSIZ(vary))
117 vary = vsensure(vary, pos + len);
118 if (pos + len > olen) {
119 vary[pos + len] = vary[olen];
120 sLen(vary) = pos + len;
123 vary = vsfill(vary, olen, sblank, pos - olen);
124 for (x = pos; x != len; ++x)
125 vary[x] = sdup(array[x]);
129 sELEMENT *vsdup(sELEMENT *vary)
131 return vsndup(NULL, 0, vary, sLEN(vary));
134 sELEMENT *_vsset(sELEMENT *vary, int pos, sELEMENT el)
136 if (!vary || pos + 1 > sSIZ(vary))
137 vary = vsensure(vary, pos + 1);
138 if (pos > sLen(vary)) {
139 vary = vsfill(vary, sLen(vary), sblank, pos - sLen(vary));
140 vary[pos + 1] = vary[pos];
142 sLen(vary) = pos + 1;
143 } else if (pos == sLen(vary)) {
144 vary[pos + 1] = vary[pos];
146 sLen(vary) = pos + 1;
154 int vsbsearch(sELEMENT *ary, int len, sELEMENT el)
163 while (z != (x + y) / 2) {
165 switch (scmp(el, ary[z])) {
179 int vscmpn(sELEMENT *a, int alen, sELEMENT *b, int blen)
194 for (x = 0; x != l; ++x)
195 if ((t = scmp(a[x], b[x])) != 0)
204 int vscmp(sELEMENT *a, sELEMENT *b)
206 return vscmpn(sv(a), sv(b));
209 int vsscan(sELEMENT *a, int alen, sELEMENT *b, int blen)
213 for (x = 0; x != alen; ++x) {
214 int z = vsbsearch(b, blen, a[x]);
216 if (z < blen && !scmp(b[z], a[x]))
222 int vsspan(sELEMENT *a, int alen, sELEMENT *b, int blen)
226 /* should not happen */
230 for (x = 0; x != alen; ++x) {
231 int z = vsbsearch(b, blen, a[x]);
233 if (z == blen || scmp(b[z], a[x]))