Kernel part of bluetooth stack ported by Dmitry Komissaroff. Very much work
[dragonfly.git] / contrib / tcsh / tc.str.c
blob7bddf892a55d2c51415cb3ceefd813704be57597
1 /* $Header: /src/pub/tcsh/tc.str.c,v 3.10 2002/03/08 17:36:47 christos Exp $ */
2 /*
3 * tc.str.c: Short string package
4 * This has been a lesson of how to write buggy code!
5 */
6 /*-
7 * Copyright (c) 1980, 1991 The Regents of the University of California.
8 * All rights reserved.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
34 #include "sh.h"
36 RCSID("$Id: tc.str.c,v 3.10 2002/03/08 17:36:47 christos Exp $")
38 #define MALLOC_INCR 128
40 #ifdef SHORT_STRINGS
41 Char **
42 blk2short(src)
43 register char **src;
45 size_t n;
46 register Char **sdst, **dst;
49 * Count
51 for (n = 0; src[n] != NULL; n++)
52 continue;
53 sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *)));
55 for (; *src != NULL; src++)
56 *dst++ = SAVE(*src);
57 *dst = NULL;
58 return (sdst);
61 char **
62 short2blk(src)
63 register Char **src;
65 size_t n;
66 register char **sdst, **dst;
69 * Count
71 for (n = 0; src[n] != NULL; n++)
72 continue;
73 sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *)));
75 for (; *src != NULL; src++)
76 *dst++ = strsave(short2str(*src));
77 *dst = NULL;
78 return (sdst);
81 Char *
82 str2short(src)
83 register const char *src;
85 static Char *sdst;
86 static size_t dstsize = 0;
87 register Char *dst, *edst;
89 if (src == NULL)
90 return (NULL);
92 if (sdst == (NULL)) {
93 dstsize = MALLOC_INCR;
94 sdst = (Char *) xmalloc((size_t) (dstsize * sizeof(Char)));
97 dst = sdst;
98 edst = &dst[dstsize];
99 while ((unsigned char) *src) {
100 *dst++ = (Char) ((unsigned char) *src++);
101 if (dst == edst) {
102 dstsize += MALLOC_INCR;
103 sdst = (Char *) xrealloc((ptr_t) sdst,
104 (size_t) (dstsize * sizeof(Char)));
105 edst = &sdst[dstsize];
106 dst = &edst[-MALLOC_INCR];
109 *dst = 0;
110 return (sdst);
113 char *
114 short2str(src)
115 register const Char *src;
117 static char *sdst = NULL;
118 static size_t dstsize = 0;
119 register char *dst, *edst;
121 if (src == NULL)
122 return (NULL);
124 if (sdst == NULL) {
125 dstsize = MALLOC_INCR;
126 sdst = (char *) xmalloc((size_t) (dstsize * sizeof(char)));
128 dst = sdst;
129 edst = &dst[dstsize];
130 while (*src) {
131 *dst++ = (char) *src++;
132 if (dst == edst) {
133 dstsize += MALLOC_INCR;
134 sdst = (char *) xrealloc((ptr_t) sdst,
135 (size_t) (dstsize * sizeof(char)));
136 edst = &sdst[dstsize];
137 dst = &edst[-MALLOC_INCR];
140 *dst = 0;
141 return (sdst);
144 Char *
145 s_strcpy(dst, src)
146 register Char *dst;
147 register const Char *src;
149 register Char *sdst;
151 sdst = dst;
152 while ((*dst++ = *src++) != '\0')
153 continue;
154 return (sdst);
157 Char *
158 s_strncpy(dst, src, n)
159 register Char *dst;
160 register const Char *src;
161 register size_t n;
163 register Char *sdst;
165 if (n == 0)
166 return(dst);
168 sdst = dst;
170 if ((*dst++ = *src++) == '\0') {
171 while (--n != 0)
172 *dst++ = '\0';
173 return(sdst);
175 while (--n != 0);
176 return (sdst);
179 Char *
180 s_strcat(dst, src)
181 register Char *dst;
182 register const Char *src;
184 register short *sdst;
186 sdst = dst;
187 while (*dst++)
188 continue;
189 --dst;
190 while ((*dst++ = *src++) != '\0')
191 continue;
192 return (sdst);
195 #ifdef NOTUSED
196 Char *
197 s_strncat(dst, src, n)
198 register Char *dst;
199 register const Char *src;
200 register size_t n;
202 register Char *sdst;
204 if (n == 0)
205 return (dst);
207 sdst = dst;
209 while (*dst++)
210 continue;
211 --dst;
214 if ((*dst++ = *src++) == '\0')
215 return(sdst);
216 while (--n != 0)
217 continue;
219 *dst = '\0';
220 return (sdst);
223 #endif
225 Char *
226 s_strchr(str, ch)
227 register const Char *str;
228 int ch;
231 if (*str == ch)
232 return ((Char *) str);
233 while (*str++);
234 return (NULL);
237 Char *
238 s_strrchr(str, ch)
239 register const Char *str;
240 int ch;
242 register const Char *rstr;
244 rstr = NULL;
246 if (*str == ch)
247 rstr = str;
248 while (*str++);
249 return ((Char *) rstr);
252 size_t
253 s_strlen(str)
254 register const Char *str;
256 register size_t n;
258 for (n = 0; *str++; n++)
259 continue;
260 return (n);
264 s_strcmp(str1, str2)
265 register const Char *str1, *str2;
267 for (; *str1 && *str1 == *str2; str1++, str2++)
268 continue;
270 * The following case analysis is necessary so that characters which look
271 * negative collate low against normal characters but high against the
272 * end-of-string NUL.
274 if (*str1 == '\0' && *str2 == '\0')
275 return (0);
276 else if (*str1 == '\0')
277 return (-1);
278 else if (*str2 == '\0')
279 return (1);
280 else
281 return (*str1 - *str2);
285 s_strncmp(str1, str2, n)
286 register const Char *str1, *str2;
287 register size_t n;
289 if (n == 0)
290 return (0);
291 do {
292 if (*str1 != *str2) {
294 * The following case analysis is necessary so that characters
295 * which look negative collate low against normal characters
296 * but high against the end-of-string NUL.
298 if (*str1 == '\0')
299 return (-1);
300 else if (*str2 == '\0')
301 return (1);
302 else
303 return (*str1 - *str2);
305 if (*str1 == '\0')
306 return(0);
307 str1++, str2++;
308 } while (--n != 0);
309 return(0);
312 Char *
313 s_strsave(s)
314 register const Char *s;
316 Char *n;
317 register Char *p;
319 if (s == 0)
320 s = STRNULL;
321 for (p = (Char *) s; *p++;)
322 continue;
323 n = p = (Char *) xmalloc((size_t)
324 ((((const Char *) p) - s) * sizeof(Char)));
325 while ((*p++ = *s++) != '\0')
326 continue;
327 return (n);
330 Char *
331 s_strspl(cp, dp)
332 const Char *cp, *dp;
334 Char *ep;
335 register Char *p, *q;
337 if (!cp)
338 cp = STRNULL;
339 if (!dp)
340 dp = STRNULL;
341 for (p = (Char *) cp; *p++;)
342 continue;
343 for (q = (Char *) dp; *q++;)
344 continue;
345 ep = (Char *) xmalloc((size_t)
346 (((((const Char *) p) - cp) +
347 (((const Char *) q) - dp) - 1) * sizeof(Char)));
348 for (p = ep, q = (Char*) cp; (*p++ = *q++) != '\0';)
349 continue;
350 for (p--, q = (Char *) dp; (*p++ = *q++) != '\0';)
351 continue;
352 return (ep);
355 Char *
356 s_strend(cp)
357 register const Char *cp;
359 if (!cp)
360 return ((Char *) cp);
361 while (*cp)
362 cp++;
363 return ((Char *) cp);
366 Char *
367 s_strstr(s, t)
368 register const Char *s, *t;
370 do {
371 register const Char *ss = s;
372 register const Char *tt = t;
375 if (*tt == '\0')
376 return ((Char *) s);
377 while (*ss++ == *tt++);
378 } while (*s++ != '\0');
379 return (NULL);
382 #endif /* SHORT_STRINGS */
384 char *
385 short2qstr(src)
386 register const Char *src;
388 static char *sdst = NULL;
389 static size_t dstsize = 0;
390 register char *dst, *edst;
392 if (src == NULL)
393 return (NULL);
395 if (sdst == NULL) {
396 dstsize = MALLOC_INCR;
397 sdst = (char *) xmalloc((size_t) (dstsize * sizeof(char)));
399 dst = sdst;
400 edst = &dst[dstsize];
401 while (*src) {
402 if (*src & QUOTE) {
403 *dst++ = '\\';
404 if (dst == edst) {
405 dstsize += MALLOC_INCR;
406 sdst = (char *) xrealloc((ptr_t) sdst,
407 (size_t) (dstsize * sizeof(char)));
408 edst = &sdst[dstsize];
409 dst = &edst[-MALLOC_INCR];
412 *dst++ = (char) *src++;
413 if (dst == edst) {
414 dstsize += MALLOC_INCR;
415 sdst = (char *) xrealloc((ptr_t) sdst,
416 (size_t) (dstsize * sizeof(char)));
417 edst = &sdst[dstsize];
418 dst = &edst[-MALLOC_INCR];
421 *dst = 0;
422 return (sdst);