xref: /original-bsd/bin/csh/str.c (revision 25ce5f2e)
1 /*-
2  * Copyright (c) 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)str.c	5.6 (Berkeley) 07/02/91";
10 #endif /* not lint */
11 
12 /*
13  * tc.str.c: Short string package
14  * 	     This has been a lesson of how to write buggy code!
15  */
16 #ifdef SHORT_STRINGS
17 
18 #if __STDC__
19 # include <stdarg.h>
20 #else
21 # include <varargs.h>
22 #endif
23 
24 #include "csh.h"
25 #include "extern.h"
26 
27 Char  **
28 blk2short(src)
29     register char **src;
30 {
31     size_t     n;
32     register Char **sdst, **dst;
33 
34     /*
35      * Count
36      */
37     for (n = 0; src[n] != NULL; n++);
38     sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *)));
39 
40     for (; *src != NULL; src++)
41 	*dst++ = SAVE(*src);
42     *dst = NULL;
43     return (sdst);
44 }
45 
46 char  **
47 short2blk(src)
48     register Char **src;
49 {
50     size_t     n;
51     register char **sdst, **dst;
52 
53     /*
54      * Count
55      */
56     for (n = 0; src[n] != NULL; n++);
57     sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *)));
58 
59     for (; *src != NULL; src++)
60 	*dst++ = strsave(short2str(*src));
61     *dst = NULL;
62     return (sdst);
63 }
64 
65 #define MALLOC_INCR	1024
66 Char   *
67 str2short(src)
68     register char *src;
69 {
70     static Char *sdst;
71     static size_t dstsize = 0;
72     register Char *dst, *edst;
73 
74     if (src == NULL)
75 	return (NULL);
76 
77     if (sdst == (NULL)) {
78 	dstsize = MALLOC_INCR;
79 	sdst = (Char *) xmalloc((size_t) dstsize * sizeof(Char));
80     }
81 
82     dst = sdst;
83     edst = &dst[dstsize];
84     while (*src) {
85 	*dst++ = (Char) ((unsigned char) *src++);
86 	if (dst == edst) {
87 	    dstsize += MALLOC_INCR;
88 	    sdst = (Char *) xrealloc((ptr_t) sdst,
89 				     (size_t) dstsize * sizeof(Char));
90 	    edst = &sdst[dstsize];
91 	    dst = &edst[-MALLOC_INCR];
92 	}
93     }
94     *dst = 0;
95     return (sdst);
96 }
97 
98 char   *
99 short2qstr(src)
100     register Char *src;
101 {
102     static char *sdst = NULL;
103     static size_t dstsize = 0;
104     register char *dst, *edst;
105 
106     if (src == NULL)
107 	return (NULL);
108 
109     if (sdst == NULL) {
110 	dstsize = MALLOC_INCR;
111 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
112     }
113     dst = sdst;
114     edst = &dst[dstsize];
115     while (*src) {
116 	if (*src & QUOTE) {
117 	    *dst++ = '\\';
118 	    if (dst == edst) {
119 		dstsize += MALLOC_INCR;
120 		sdst = (char *) xrealloc((ptr_t) sdst,
121 					 (size_t) dstsize * sizeof(char));
122 		edst = &sdst[dstsize];
123 		dst = &edst[-MALLOC_INCR];
124 	    }
125 	}
126 	*dst++ = (char) *src++;
127 	if (dst == edst) {
128 	    dstsize += MALLOC_INCR;
129 	    sdst = (char *) xrealloc((ptr_t) sdst,
130 				     (size_t) dstsize * sizeof(char));
131 	    edst = &sdst[dstsize];
132 	    dst = &edst[-MALLOC_INCR];
133 	}
134     }
135     *dst = 0;
136     return (sdst);
137 }
138 char   *
139 short2str(src)
140     register Char *src;
141 {
142     static char *sdst = NULL;
143     static size_t dstsize = 0;
144     register char *dst, *edst;
145 
146     if (src == NULL)
147 	return (NULL);
148 
149     if (sdst == NULL) {
150 	dstsize = MALLOC_INCR;
151 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
152     }
153     dst = sdst;
154     edst = &dst[dstsize];
155     while (*src) {
156 	*dst++ = (char) *src++;
157 	if (dst == edst) {
158 	    dstsize += MALLOC_INCR;
159 	    sdst = (char *) xrealloc((ptr_t) sdst,
160 				     (size_t) dstsize * sizeof(char));
161 	    edst = &sdst[dstsize];
162 	    dst = &edst[-MALLOC_INCR];
163 	}
164     }
165     *dst = 0;
166     return (sdst);
167 }
168 
169 Char   *
170 s_strcpy(dst, src)
171     register Char *dst, *src;
172 {
173     register Char *sdst;
174 
175     sdst = dst;
176     while (*dst++ = *src++);
177     return (sdst);
178 }
179 
180 Char   *
181 s_strncpy(dst, src, n)
182     register Char *dst, *src;
183     register size_t n;
184 {
185     register Char *sdst;
186 
187     if (n == 0)
188 	return(dst);
189 
190     sdst = dst;
191     do
192 	if ((*dst++ = *src++) == '\0') {
193 	    while (--n != 0)
194 		*dst++ = '\0';
195 	    return(sdst);
196 	}
197     while (--n != 0);
198     return (sdst);
199 }
200 
201 Char   *
202 s_strcat(dst, src)
203     register Char *dst, *src;
204 {
205     register short *sdst;
206 
207     sdst = dst;
208     while (*dst++);
209     --dst;
210     while (*dst++ = *src++);
211     return (sdst);
212 }
213 
214 #ifdef NOTUSED
215 Char   *
216 s_strncat(dst, src, n)
217     register Char *dst, *src;
218     register size_t n;
219 {
220     register Char *sdst;
221 
222     if (n == 0)
223 	return (dst);
224 
225     sdst = dst;
226 
227     while (*dst++);
228     --dst;
229 
230     do
231 	if ((*dst++ = *src++) == '\0')
232 	    return(sdst);
233     while (--n != 0);
234 
235     *dst = '\0';
236     return (sdst);
237 }
238 
239 #endif
240 
241 Char   *
242 s_strchr(str, ch)
243     register Char *str;
244     int ch;
245 {
246     do
247 	if (*str == ch)
248 	    return (str);
249     while (*str++);
250     return (NULL);
251 }
252 
253 Char   *
254 s_strrchr(str, ch)
255     register Char *str;
256     int ch;
257 {
258     register Char *rstr;
259 
260     rstr = NULL;
261     do
262 	if (*str == ch)
263 	    rstr = str;
264     while (*str++);
265     return (rstr);
266 }
267 
268 size_t
269 s_strlen(str)
270     register Char *str;
271 {
272     register size_t n;
273 
274     for (n = 0; *str++; n++);
275     return (n);
276 }
277 
278 int
279 s_strcmp(str1, str2)
280     register Char *str1, *str2;
281 {
282     for (; *str1 && *str1 == *str2; str1++, str2++);
283     /*
284      * The following case analysis is necessary so that characters which look
285      * negative collate low against normal characters but high against the
286      * end-of-string NUL.
287      */
288     if (*str1 == '\0' && *str2 == '\0')
289 	return (0);
290     else if (*str1 == '\0')
291 	return (-1);
292     else if (*str2 == '\0')
293 	return (1);
294     else
295 	return (*str1 - *str2);
296 }
297 
298 int
299 s_strncmp(str1, str2, n)
300     register Char *str1, *str2;
301     register size_t n;
302 {
303     if (n == 0)
304 	return (0);
305     do {
306 	if (*str1 != *str2) {
307 	    /*
308 	     * The following case analysis is necessary so that characters
309 	     * which look negative collate low against normal characters
310 	     * but high against the end-of-string NUL.
311 	     */
312 	    if (*str1 == '\0')
313 		return (-1);
314 	    else if (*str2 == '\0')
315 		return (1);
316 	    else
317 		return (*str1 - *str2);
318 	    break;
319 	}
320         if (*str1 == '\0')
321 	    return(0);
322 	str1++, str2++;
323     } while (--n != 0);
324     return(0);
325 }
326 
327 Char   *
328 s_strsave(s)
329     register Char *s;
330 {
331     Char   *n;
332     register Char *p;
333 
334     if (s == 0)
335 	s = STRNULL;
336     for (p = s; *p++;);
337     n = p = (Char *) xmalloc((size_t) ((p - s) * sizeof(Char)));
338     while (*p++ = *s++);
339     return (n);
340 }
341 
342 Char   *
343 s_strspl(cp, dp)
344     Char   *cp, *dp;
345 {
346     Char   *ep;
347     register Char *p, *q;
348 
349     if (!cp)
350 	cp = STRNULL;
351     if (!dp)
352 	dp = STRNULL;
353     for (p = cp; *p++;);
354     for (q = dp; *q++;);
355     ep = (Char *) xmalloc((size_t)
356 			  (((p - cp) + (q - dp) - 1) * sizeof(Char)));
357     for (p = ep, q = cp; *p++ = *q++;);
358     for (p--, q = dp; *p++ = *q++;);
359     return (ep);
360 }
361 
362 Char   *
363 s_strend(cp)
364     register Char *cp;
365 {
366     if (!cp)
367 	return (cp);
368     while (*cp)
369 	cp++;
370     return (cp);
371 }
372 
373 #ifdef NOTUSED
374 Char   *
375 s_strstr(s, t)
376     register Char *s, *t;
377 {
378     do {
379 	register Char *ss = s;
380 	register Char *tt = t;
381 
382 	do
383 	    if (*tt == '\0')
384 		return (s);
385 	while (*ss++ == *tt++);
386     } while (*s++ != '\0');
387     return (NULL);
388 }
389 #endif
390 
391 #endif				/* SHORT_STRINGS */
392