xref: /csrg-svn/bin/csh/str.c (revision 50075)
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*50075Schristos static char sccsid[] = "@(#)str.c	5.4 (Berkeley) 06/17/91";
1049999Schristos #endif /* not lint */
1149999Schristos 
1249999Schristos /*
1349999Schristos  * tc.str.c: Short string package
1449999Schristos  * 	     This has been a lesson of how to write buggy code!
1549999Schristos  */
1649999Schristos #ifdef SHORT_STRINGS
1749999Schristos 
1850033Schristos #if __STDC__
1950033Schristos # include <stdarg.h>
2050033Schristos #else
2150033Schristos # include <varargs.h>
2250033Schristos #endif
2350033Schristos 
2450023Sbostic #include "csh.h"
2550023Sbostic #include "extern.h"
2649999Schristos 
2749999Schristos Char  **
2849999Schristos blk2short(src)
2949999Schristos     register char **src;
3049999Schristos {
3150033Schristos     size_t     n;
3249999Schristos     register Char **sdst, **dst;
3349999Schristos 
3449999Schristos     /*
3549999Schristos      * Count
3649999Schristos      */
3750033Schristos     for (n = 0; src[n] != NULL; n++);
3849999Schristos     sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *)));
3949999Schristos 
4050033Schristos     for (; *src != NULL; src++)
4149999Schristos 	*dst++ = SAVE(*src);
4249999Schristos     *dst = NULL;
4349999Schristos     return (sdst);
4449999Schristos }
4549999Schristos 
4649999Schristos char  **
4749999Schristos short2blk(src)
4849999Schristos     register Char **src;
4949999Schristos {
5050033Schristos     size_t     n;
5149999Schristos     register char **sdst, **dst;
5249999Schristos 
5349999Schristos     /*
5449999Schristos      * Count
5549999Schristos      */
5650033Schristos     for (n = 0; src[n] != NULL; n++);
5749999Schristos     sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *)));
5849999Schristos 
5950033Schristos     for (; *src != NULL; src++)
6049999Schristos 	*dst++ = strsave(short2str(*src));
6150033Schristos     *dst = NULL;
6249999Schristos     return (sdst);
6349999Schristos }
6449999Schristos 
6549999Schristos #define MALLOC_INCR	1024
6649999Schristos Char   *
6749999Schristos str2short(src)
6849999Schristos     register char *src;
6949999Schristos {
7049999Schristos     static Char *sdst;
7150033Schristos     static size_t dstsize = 0;
7249999Schristos     register Char *dst, *edst;
7349999Schristos 
7450033Schristos     if (src == NULL)
7550033Schristos 	return (NULL);
7649999Schristos 
7750033Schristos     if (sdst == (NULL)) {
7849999Schristos 	dstsize = MALLOC_INCR;
7949999Schristos 	sdst = (Char *) xmalloc((size_t) dstsize * sizeof(Char));
8049999Schristos     }
8149999Schristos 
8249999Schristos     dst = sdst;
8349999Schristos     edst = &dst[dstsize];
8449999Schristos     while (*src) {
8549999Schristos 	*dst++ = (Char) ((unsigned char) *src++);
8649999Schristos 	if (dst == edst) {
8749999Schristos 	    dstsize += MALLOC_INCR;
8849999Schristos 	    sdst = (Char *) xrealloc((ptr_t) sdst,
8949999Schristos 				     (size_t) dstsize * sizeof(Char));
9049999Schristos 	    edst = &sdst[dstsize];
9149999Schristos 	    dst = &edst[-MALLOC_INCR];
9249999Schristos 	}
9349999Schristos     }
9449999Schristos     *dst = 0;
9549999Schristos     return (sdst);
9649999Schristos }
9749999Schristos 
9849999Schristos char   *
9949999Schristos short2qstr(src)
10049999Schristos     register Char *src;
10149999Schristos {
10250033Schristos     static char *sdst = NULL;
10350033Schristos     static size_t dstsize = 0;
10449999Schristos     register char *dst, *edst;
10549999Schristos 
10650033Schristos     if (src == NULL)
10750033Schristos 	return (NULL);
10849999Schristos 
10950033Schristos     if (sdst == NULL) {
11049999Schristos 	dstsize = MALLOC_INCR;
11149999Schristos 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
11249999Schristos     }
11349999Schristos     dst = sdst;
11449999Schristos     edst = &dst[dstsize];
11549999Schristos     while (*src) {
11649999Schristos 	if (*src & QUOTE) {
11749999Schristos 	    *dst++ = '\\';
11849999Schristos 	    if (dst == edst) {
11949999Schristos 		dstsize += MALLOC_INCR;
12049999Schristos 		sdst = (char *) xrealloc((ptr_t) sdst,
12149999Schristos 					 (size_t) dstsize * sizeof(char));
12249999Schristos 		edst = &sdst[dstsize];
12349999Schristos 		dst = &edst[-MALLOC_INCR];
12449999Schristos 	    }
12549999Schristos 	}
12649999Schristos 	*dst++ = (char) *src++;
12749999Schristos 	if (dst == edst) {
12849999Schristos 	    dstsize += MALLOC_INCR;
12949999Schristos 	    sdst = (char *) xrealloc((ptr_t) sdst,
13049999Schristos 				     (size_t) dstsize * sizeof(char));
13149999Schristos 	    edst = &sdst[dstsize];
13249999Schristos 	    dst = &edst[-MALLOC_INCR];
13349999Schristos 	}
13449999Schristos     }
13549999Schristos     *dst = 0;
13649999Schristos     return (sdst);
13749999Schristos }
13849999Schristos char   *
13949999Schristos short2str(src)
14049999Schristos     register Char *src;
14149999Schristos {
14250033Schristos     static char *sdst = NULL;
14350033Schristos     static size_t dstsize = 0;
14449999Schristos     register char *dst, *edst;
14549999Schristos 
14650033Schristos     if (src == NULL)
14750033Schristos 	return (NULL);
14849999Schristos 
14950033Schristos     if (sdst == NULL) {
15049999Schristos 	dstsize = MALLOC_INCR;
15149999Schristos 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
15249999Schristos     }
15349999Schristos     dst = sdst;
15449999Schristos     edst = &dst[dstsize];
15549999Schristos     while (*src) {
15649999Schristos 	*dst++ = (char) *src++;
15749999Schristos 	if (dst == edst) {
15849999Schristos 	    dstsize += MALLOC_INCR;
15949999Schristos 	    sdst = (char *) xrealloc((ptr_t) sdst,
16049999Schristos 				     (size_t) dstsize * sizeof(char));
16149999Schristos 	    edst = &sdst[dstsize];
16249999Schristos 	    dst = &edst[-MALLOC_INCR];
16349999Schristos 	}
16449999Schristos     }
16549999Schristos     *dst = 0;
16649999Schristos     return (sdst);
16749999Schristos }
16849999Schristos 
16949999Schristos Char   *
17049999Schristos s_strcpy(dst, src)
17149999Schristos     register Char *dst, *src;
17249999Schristos {
17349999Schristos     register Char *sdst;
17449999Schristos 
17549999Schristos     sdst = dst;
17649999Schristos     while (*dst++ = *src++);
17749999Schristos     return (sdst);
17849999Schristos }
17949999Schristos 
18049999Schristos Char   *
18149999Schristos s_strncpy(dst, src, n)
18249999Schristos     register Char *dst, *src;
18350033Schristos     register size_t n;
18449999Schristos {
18549999Schristos     register Char *sdst;
18649999Schristos 
187*50075Schristos     if (n == 0)
188*50075Schristos 	return(dst);
189*50075Schristos 
19049999Schristos     sdst = dst;
191*50075Schristos     do
192*50075Schristos 	if ((*dst++ = *src++) == '\0') {
193*50075Schristos 	    while (--n > 0)
194*50075Schristos 		*dst++ = '\0';
195*50075Schristos 	    return(sdst);
196*50075Schristos 	}
197*50075Schristos     while (--n != 0);
19849999Schristos     return (sdst);
19949999Schristos }
20049999Schristos 
20149999Schristos Char   *
20249999Schristos s_strcat(dst, src)
20349999Schristos     register Char *dst, *src;
20449999Schristos {
20549999Schristos     register short *sdst;
20649999Schristos 
20749999Schristos     sdst = dst;
20849999Schristos     while (*dst++);
20949999Schristos     --dst;
21049999Schristos     while (*dst++ = *src++);
21149999Schristos     return (sdst);
21249999Schristos }
21349999Schristos 
21449999Schristos #ifdef NOTUSED
21549999Schristos Char   *
21649999Schristos s_strncat(dst, src, n)
21749999Schristos     register Char *dst, *src;
21850033Schristos     register size_t n;
21949999Schristos {
22049999Schristos     register Char *sdst;
22149999Schristos 
222*50075Schristos     if (n == 0)
223*50075Schristos 	return (dst);
224*50075Schristos 
22549999Schristos     sdst = dst;
226*50075Schristos 
22749999Schristos     while (*dst++);
22849999Schristos     --dst;
229*50075Schristos 
230*50075Schristos     do
231*50075Schristos 	if ((*dst++ = *src++) == '\0')
232*50075Schristos 	    return(sdst);
233*50075Schristos     while (--n != 0);
234*50075Schristos 
235*50075Schristos     *dst = '\0';
23649999Schristos     return (sdst);
23749999Schristos }
23849999Schristos 
23949999Schristos #endif
24049999Schristos 
24149999Schristos Char   *
24249999Schristos s_strchr(str, ch)
24350033Schristos     register Char *str;
24450033Schristos     int ch;
24549999Schristos {
24649999Schristos     do
24749999Schristos 	if (*str == ch)
24849999Schristos 	    return (str);
24949999Schristos     while (*str++);
25050033Schristos     return (NULL);
25149999Schristos }
25249999Schristos 
25349999Schristos Char   *
25449999Schristos s_strrchr(str, ch)
25550033Schristos     register Char *str;
25650033Schristos     int ch;
25749999Schristos {
25849999Schristos     register Char *rstr;
25949999Schristos 
26050033Schristos     rstr = NULL;
26149999Schristos     do
26249999Schristos 	if (*str == ch)
26349999Schristos 	    rstr = str;
26449999Schristos     while (*str++);
26549999Schristos     return (rstr);
26649999Schristos }
26749999Schristos 
26850033Schristos size_t
26949999Schristos s_strlen(str)
27049999Schristos     register Char *str;
27149999Schristos {
27250033Schristos     register size_t n;
27349999Schristos 
27449999Schristos     for (n = 0; *str++; n++);
27549999Schristos     return (n);
27649999Schristos }
27749999Schristos 
27849999Schristos int
27949999Schristos s_strcmp(str1, str2)
28049999Schristos     register Char *str1, *str2;
28149999Schristos {
28249999Schristos     for (; *str1 && *str1 == *str2; str1++, str2++);
28349999Schristos     /*
28449999Schristos      * The following case analysis is necessary so that characters which look
28549999Schristos      * negative collate low against normal characters but high against the
28649999Schristos      * end-of-string NUL.
28749999Schristos      */
28849999Schristos     if (*str1 == '\0' && *str2 == '\0')
28949999Schristos 	return (0);
29049999Schristos     else if (*str1 == '\0')
29149999Schristos 	return (-1);
29249999Schristos     else if (*str2 == '\0')
29349999Schristos 	return (1);
29449999Schristos     else
29549999Schristos 	return (*str1 - *str2);
29649999Schristos }
29749999Schristos 
29849999Schristos int
29949999Schristos s_strncmp(str1, str2, n)
30049999Schristos     register Char *str1, *str2;
30150033Schristos     register size_t n;
30249999Schristos {
303*50075Schristos     if (n == 0)
30449999Schristos 	return (0);
305*50075Schristos     do {
306*50075Schristos         if (*str1 == '\0' || *str1 != *str2)
307*50075Schristos 	    break;
308*50075Schristos 	str1++, str2++;
309*50075Schristos     } while (--n != 0);
31049999Schristos     /*
31149999Schristos      * The following case analysis is necessary so that characters which look
31249999Schristos      * negative collate low against normal characters but high against the
31349999Schristos      * end-of-string NUL.
31449999Schristos      */
31549999Schristos     if (*str1 == '\0' && *str2 == '\0')
31649999Schristos 	return (0);
31749999Schristos     else if (*str1 == '\0')
31849999Schristos 	return (-1);
31949999Schristos     else if (*str2 == '\0')
32049999Schristos 	return (1);
32149999Schristos     else
32249999Schristos 	return (*str1 - *str2);
323*50075Schristos     return(0);
32449999Schristos }
32549999Schristos 
32649999Schristos Char   *
32749999Schristos s_strsave(s)
32849999Schristos     register Char *s;
32949999Schristos {
33049999Schristos     Char   *n;
33149999Schristos     register Char *p;
33249999Schristos 
33349999Schristos     if (s == 0)
33449999Schristos 	s = STRNULL;
33549999Schristos     for (p = s; *p++;);
33649999Schristos     n = p = (Char *) xmalloc((size_t) ((p - s) * sizeof(Char)));
33749999Schristos     while (*p++ = *s++);
33849999Schristos     return (n);
33949999Schristos }
34049999Schristos 
34149999Schristos Char   *
34249999Schristos s_strspl(cp, dp)
34349999Schristos     Char   *cp, *dp;
34449999Schristos {
34549999Schristos     Char   *ep;
34649999Schristos     register Char *p, *q;
34749999Schristos 
34849999Schristos     if (!cp)
34949999Schristos 	cp = STRNULL;
35049999Schristos     if (!dp)
35149999Schristos 	dp = STRNULL;
35249999Schristos     for (p = cp; *p++;);
35349999Schristos     for (q = dp; *q++;);
35449999Schristos     ep = (Char *) xmalloc((size_t)
35549999Schristos 			  (((p - cp) + (q - dp) - 1) * sizeof(Char)));
35649999Schristos     for (p = ep, q = cp; *p++ = *q++;);
35749999Schristos     for (p--, q = dp; *p++ = *q++;);
35849999Schristos     return (ep);
35949999Schristos }
36049999Schristos 
36149999Schristos Char   *
36249999Schristos s_strend(cp)
36349999Schristos     register Char *cp;
36449999Schristos {
36549999Schristos     if (!cp)
36649999Schristos 	return (cp);
36749999Schristos     while (*cp)
36849999Schristos 	cp++;
36949999Schristos     return (cp);
37049999Schristos }
37149999Schristos 
37249999Schristos #ifdef NOTUSED
37349999Schristos Char   *
37449999Schristos s_strstr(s, t)
37549999Schristos     register Char *s, *t;
37649999Schristos {
37749999Schristos     do {
37849999Schristos 	register Char *ss = s;
37949999Schristos 	register Char *tt = t;
38049999Schristos 
38149999Schristos 	do
38249999Schristos 	    if (*tt == '\0')
38349999Schristos 		return (s);
38449999Schristos 	while (*ss++ == *tt++);
38549999Schristos     } while (*s++ != '\0');
38650033Schristos     return (NULL);
38749999Schristos }
38849999Schristos #endif
38949999Schristos 
39049999Schristos #endif				/* SHORT_STRINGS */
391