xref: /csrg-svn/bin/csh/str.c (revision 51437)
149999Schristos /*-
249999Schristos  * Copyright (c) 1991 The Regents of the University of California.
349999Schristos  * All rights reserved.
449999Schristos  *
549999Schristos  * %sccs.include.redist.c%
649999Schristos  */
749999Schristos 
849999Schristos #ifndef lint
9*51437Sleres static char sccsid[] = "@(#)str.c	5.9 (Berkeley) 10/28/91";
1049999Schristos #endif /* not lint */
1149999Schristos 
1250439Schristos #define MALLOC_INCR	128
1350439Schristos 
1449999Schristos /*
1549999Schristos  * tc.str.c: Short string package
16*51437Sleres  *	     This has been a lesson of how to write buggy code!
1749999Schristos  */
1849999Schristos 
1950033Schristos #if __STDC__
2050033Schristos # include <stdarg.h>
2150033Schristos #else
2250033Schristos # include <varargs.h>
2350033Schristos #endif
2450033Schristos 
2550023Sbostic #include "csh.h"
2650023Sbostic #include "extern.h"
2749999Schristos 
2850465Schristos #ifdef SHORT_STRINGS
2950465Schristos 
3049999Schristos Char  **
3149999Schristos blk2short(src)
3249999Schristos     register char **src;
3349999Schristos {
3450033Schristos     size_t     n;
3549999Schristos     register Char **sdst, **dst;
3649999Schristos 
3749999Schristos     /*
3849999Schristos      * Count
3949999Schristos      */
40*51437Sleres     for (n = 0; src[n] != NULL; n++)
41*51437Sleres 	continue;
4249999Schristos     sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *)));
4349999Schristos 
4450033Schristos     for (; *src != NULL; src++)
4549999Schristos 	*dst++ = SAVE(*src);
4649999Schristos     *dst = NULL;
4749999Schristos     return (sdst);
4849999Schristos }
4949999Schristos 
5049999Schristos char  **
5149999Schristos short2blk(src)
5249999Schristos     register Char **src;
5349999Schristos {
5450033Schristos     size_t     n;
5549999Schristos     register char **sdst, **dst;
5649999Schristos 
5749999Schristos     /*
5849999Schristos      * Count
5949999Schristos      */
60*51437Sleres     for (n = 0; src[n] != NULL; n++)
61*51437Sleres 	continue;
6249999Schristos     sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *)));
6349999Schristos 
6450033Schristos     for (; *src != NULL; src++)
6549999Schristos 	*dst++ = strsave(short2str(*src));
6650033Schristos     *dst = NULL;
6749999Schristos     return (sdst);
6849999Schristos }
6949999Schristos 
7049999Schristos Char   *
7149999Schristos str2short(src)
7249999Schristos     register char *src;
7349999Schristos {
7449999Schristos     static Char *sdst;
7550033Schristos     static size_t dstsize = 0;
7649999Schristos     register Char *dst, *edst;
7749999Schristos 
7850033Schristos     if (src == NULL)
7950033Schristos 	return (NULL);
8049999Schristos 
8150033Schristos     if (sdst == (NULL)) {
8249999Schristos 	dstsize = MALLOC_INCR;
8349999Schristos 	sdst = (Char *) xmalloc((size_t) dstsize * sizeof(Char));
8449999Schristos     }
8549999Schristos 
8649999Schristos     dst = sdst;
8749999Schristos     edst = &dst[dstsize];
8849999Schristos     while (*src) {
8949999Schristos 	*dst++ = (Char) ((unsigned char) *src++);
9049999Schristos 	if (dst == edst) {
9149999Schristos 	    dstsize += MALLOC_INCR;
9249999Schristos 	    sdst = (Char *) xrealloc((ptr_t) sdst,
9349999Schristos 				     (size_t) dstsize * sizeof(Char));
9449999Schristos 	    edst = &sdst[dstsize];
9549999Schristos 	    dst = &edst[-MALLOC_INCR];
9649999Schristos 	}
9749999Schristos     }
9849999Schristos     *dst = 0;
9949999Schristos     return (sdst);
10049999Schristos }
10149999Schristos 
10249999Schristos char   *
10349999Schristos short2str(src)
10449999Schristos     register Char *src;
10549999Schristos {
10650033Schristos     static char *sdst = NULL;
10750033Schristos     static size_t dstsize = 0;
10849999Schristos     register char *dst, *edst;
10949999Schristos 
11050033Schristos     if (src == NULL)
11150033Schristos 	return (NULL);
11249999Schristos 
11350033Schristos     if (sdst == NULL) {
11449999Schristos 	dstsize = MALLOC_INCR;
11549999Schristos 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
11649999Schristos     }
11749999Schristos     dst = sdst;
11849999Schristos     edst = &dst[dstsize];
11949999Schristos     while (*src) {
12049999Schristos 	*dst++ = (char) *src++;
12149999Schristos 	if (dst == edst) {
12249999Schristos 	    dstsize += MALLOC_INCR;
12349999Schristos 	    sdst = (char *) xrealloc((ptr_t) sdst,
12449999Schristos 				     (size_t) dstsize * sizeof(char));
12549999Schristos 	    edst = &sdst[dstsize];
12649999Schristos 	    dst = &edst[-MALLOC_INCR];
12749999Schristos 	}
12849999Schristos     }
12949999Schristos     *dst = 0;
13049999Schristos     return (sdst);
13149999Schristos }
13249999Schristos 
13349999Schristos Char   *
13449999Schristos s_strcpy(dst, src)
13549999Schristos     register Char *dst, *src;
13649999Schristos {
13749999Schristos     register Char *sdst;
13849999Schristos 
13949999Schristos     sdst = dst;
140*51437Sleres     while (*dst++ = *src++)
141*51437Sleres 	continue;
14249999Schristos     return (sdst);
14349999Schristos }
14449999Schristos 
14549999Schristos Char   *
14649999Schristos s_strncpy(dst, src, n)
14749999Schristos     register Char *dst, *src;
14850033Schristos     register size_t n;
14949999Schristos {
15049999Schristos     register Char *sdst;
15149999Schristos 
15250075Schristos     if (n == 0)
15350075Schristos 	return(dst);
15450075Schristos 
15549999Schristos     sdst = dst;
156*51437Sleres     do
15750075Schristos 	if ((*dst++ = *src++) == '\0') {
15850162Schristos 	    while (--n != 0)
15950075Schristos 		*dst++ = '\0';
16050075Schristos 	    return(sdst);
16150075Schristos 	}
16250075Schristos     while (--n != 0);
16349999Schristos     return (sdst);
16449999Schristos }
16549999Schristos 
16649999Schristos Char   *
16749999Schristos s_strcat(dst, src)
16849999Schristos     register Char *dst, *src;
16949999Schristos {
17049999Schristos     register short *sdst;
17149999Schristos 
17249999Schristos     sdst = dst;
173*51437Sleres     while (*dst++)
174*51437Sleres 	continue;
17549999Schristos     --dst;
176*51437Sleres     while (*dst++ = *src++)
177*51437Sleres 	continue;
17849999Schristos     return (sdst);
17949999Schristos }
18049999Schristos 
18149999Schristos #ifdef NOTUSED
18249999Schristos Char   *
18349999Schristos s_strncat(dst, src, n)
18449999Schristos     register Char *dst, *src;
18550033Schristos     register size_t n;
18649999Schristos {
18749999Schristos     register Char *sdst;
18849999Schristos 
189*51437Sleres     if (n == 0)
19050075Schristos 	return (dst);
19150075Schristos 
19249999Schristos     sdst = dst;
19350075Schristos 
194*51437Sleres     while (*dst++)
195*51437Sleres 	continue;
19649999Schristos     --dst;
19750075Schristos 
198*51437Sleres     do
19950075Schristos 	if ((*dst++ = *src++) == '\0')
20050075Schristos 	    return(sdst);
201*51437Sleres     while (--n != 0)
202*51437Sleres 	continue;
20350075Schristos 
20450075Schristos     *dst = '\0';
20549999Schristos     return (sdst);
20649999Schristos }
20749999Schristos 
20849999Schristos #endif
20949999Schristos 
21049999Schristos Char   *
21149999Schristos s_strchr(str, ch)
21250033Schristos     register Char *str;
21350033Schristos     int ch;
21449999Schristos {
21549999Schristos     do
21649999Schristos 	if (*str == ch)
21749999Schristos 	    return (str);
21849999Schristos     while (*str++);
21950033Schristos     return (NULL);
22049999Schristos }
22149999Schristos 
22249999Schristos Char   *
22349999Schristos s_strrchr(str, ch)
22450033Schristos     register Char *str;
22550033Schristos     int ch;
22649999Schristos {
22749999Schristos     register Char *rstr;
22849999Schristos 
22950033Schristos     rstr = NULL;
23049999Schristos     do
23149999Schristos 	if (*str == ch)
23249999Schristos 	    rstr = str;
23349999Schristos     while (*str++);
23449999Schristos     return (rstr);
23549999Schristos }
23649999Schristos 
23750033Schristos size_t
23849999Schristos s_strlen(str)
23949999Schristos     register Char *str;
24049999Schristos {
24150033Schristos     register size_t n;
24249999Schristos 
243*51437Sleres     for (n = 0; *str++; n++)
244*51437Sleres 	continue;
24549999Schristos     return (n);
24649999Schristos }
24749999Schristos 
24849999Schristos int
24949999Schristos s_strcmp(str1, str2)
25049999Schristos     register Char *str1, *str2;
25149999Schristos {
252*51437Sleres     for (; *str1 && *str1 == *str2; str1++, str2++)
253*51437Sleres 	continue;
25449999Schristos     /*
25549999Schristos      * The following case analysis is necessary so that characters which look
25649999Schristos      * negative collate low against normal characters but high against the
25749999Schristos      * end-of-string NUL.
25849999Schristos      */
25949999Schristos     if (*str1 == '\0' && *str2 == '\0')
26049999Schristos 	return (0);
26149999Schristos     else if (*str1 == '\0')
26249999Schristos 	return (-1);
26349999Schristos     else if (*str2 == '\0')
26449999Schristos 	return (1);
26549999Schristos     else
26649999Schristos 	return (*str1 - *str2);
26749999Schristos }
26849999Schristos 
26949999Schristos int
27049999Schristos s_strncmp(str1, str2, n)
27149999Schristos     register Char *str1, *str2;
27250033Schristos     register size_t n;
27349999Schristos {
27450075Schristos     if (n == 0)
27549999Schristos 	return (0);
27650075Schristos     do {
27750396Schristos 	if (*str1 != *str2) {
27850396Schristos 	    /*
279*51437Sleres 	     * The following case analysis is necessary so that characters
28050396Schristos 	     * which look negative collate low against normal characters
28150396Schristos 	     * but high against the end-of-string NUL.
28250396Schristos 	     */
28350396Schristos 	    if (*str1 == '\0')
28450396Schristos 		return (-1);
28550396Schristos 	    else if (*str2 == '\0')
28650396Schristos 		return (1);
28750396Schristos 	    else
28850396Schristos 		return (*str1 - *str2);
28950075Schristos 	    break;
29050396Schristos 	}
29150396Schristos         if (*str1 == '\0')
29250396Schristos 	    return(0);
29350075Schristos 	str1++, str2++;
29450075Schristos     } while (--n != 0);
29550075Schristos     return(0);
29649999Schristos }
29749999Schristos 
29849999Schristos Char   *
29949999Schristos s_strsave(s)
30049999Schristos     register Char *s;
30149999Schristos {
30249999Schristos     Char   *n;
30349999Schristos     register Char *p;
30449999Schristos 
30549999Schristos     if (s == 0)
30649999Schristos 	s = STRNULL;
307*51437Sleres     for (p = s; *p++;)
308*51437Sleres 	continue;
30949999Schristos     n = p = (Char *) xmalloc((size_t) ((p - s) * sizeof(Char)));
310*51437Sleres     while (*p++ = *s++)
311*51437Sleres 	continue;
31249999Schristos     return (n);
31349999Schristos }
31449999Schristos 
31549999Schristos Char   *
31649999Schristos s_strspl(cp, dp)
31749999Schristos     Char   *cp, *dp;
31849999Schristos {
31949999Schristos     Char   *ep;
32049999Schristos     register Char *p, *q;
32149999Schristos 
32249999Schristos     if (!cp)
32349999Schristos 	cp = STRNULL;
32449999Schristos     if (!dp)
32549999Schristos 	dp = STRNULL;
326*51437Sleres     for (p = cp; *p++;)
327*51437Sleres 	continue;
328*51437Sleres     for (q = dp; *q++;)
329*51437Sleres 	continue;
33049999Schristos     ep = (Char *) xmalloc((size_t)
33149999Schristos 			  (((p - cp) + (q - dp) - 1) * sizeof(Char)));
332*51437Sleres     for (p = ep, q = cp; *p++ = *q++;)
333*51437Sleres 	continue;
334*51437Sleres     for (p--, q = dp; *p++ = *q++;)
335*51437Sleres 	continue;
33649999Schristos     return (ep);
33749999Schristos }
33849999Schristos 
33949999Schristos Char   *
34049999Schristos s_strend(cp)
34149999Schristos     register Char *cp;
34249999Schristos {
34349999Schristos     if (!cp)
34449999Schristos 	return (cp);
34549999Schristos     while (*cp)
34649999Schristos 	cp++;
34749999Schristos     return (cp);
34849999Schristos }
34949999Schristos 
35050439Schristos # ifdef NOTUSED
35149999Schristos Char   *
35249999Schristos s_strstr(s, t)
35349999Schristos     register Char *s, *t;
35449999Schristos {
35549999Schristos     do {
35649999Schristos 	register Char *ss = s;
35749999Schristos 	register Char *tt = t;
35849999Schristos 
35949999Schristos 	do
36049999Schristos 	    if (*tt == '\0')
36149999Schristos 		return (s);
36249999Schristos 	while (*ss++ == *tt++);
36349999Schristos     } while (*s++ != '\0');
36450033Schristos     return (NULL);
36549999Schristos }
36650439Schristos # endif
36750439Schristos #endif				/* SHORT_STRINGS */
36849999Schristos 
36950439Schristos char   *
37050439Schristos short2qstr(src)
37150439Schristos     register Char *src;
37250439Schristos {
37350439Schristos     static char *sdst = NULL;
37450439Schristos     static size_t dstsize = 0;
37550439Schristos     register char *dst, *edst;
37650439Schristos 
37750439Schristos     if (src == NULL)
37850439Schristos 	return (NULL);
37950439Schristos 
38050439Schristos     if (sdst == NULL) {
38150439Schristos 	dstsize = MALLOC_INCR;
38250439Schristos 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
38350439Schristos     }
38450439Schristos     dst = sdst;
38550439Schristos     edst = &dst[dstsize];
38650439Schristos     while (*src) {
38750439Schristos 	if (*src & QUOTE) {
38850439Schristos 	    *dst++ = '\\';
38950439Schristos 	    if (dst == edst) {
39050439Schristos 		dstsize += MALLOC_INCR;
39150439Schristos 		sdst = (char *) xrealloc((ptr_t) sdst,
39250439Schristos 					 (size_t) dstsize * sizeof(char));
39350439Schristos 		edst = &sdst[dstsize];
39450439Schristos 		dst = &edst[-MALLOC_INCR];
39550439Schristos 	    }
39650439Schristos 	}
39750439Schristos 	*dst++ = (char) *src++;
39850439Schristos 	if (dst == edst) {
39950439Schristos 	    dstsize += MALLOC_INCR;
40050439Schristos 	    sdst = (char *) xrealloc((ptr_t) sdst,
40150439Schristos 				     (size_t) dstsize * sizeof(char));
40250439Schristos 	    edst = &sdst[dstsize];
40350439Schristos 	    dst = &edst[-MALLOC_INCR];
40450439Schristos 	}
40550439Schristos     }
40650439Schristos     *dst = 0;
40750439Schristos     return (sdst);
40850439Schristos }
409