xref: /csrg-svn/bin/csh/str.c (revision 50023)
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*50023Sbostic static char sccsid[] = "@(#)str.c	5.2 (Berkeley) 06/07/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 
18*50023Sbostic #include "csh.h"
19*50023Sbostic #include "extern.h"
2049999Schristos 
2149999Schristos Char  **
2249999Schristos blk2short(src)
2349999Schristos     register char **src;
2449999Schristos {
2549999Schristos     int     n;
2649999Schristos     register Char **sdst, **dst;
2749999Schristos 
2849999Schristos     /*
2949999Schristos      * Count
3049999Schristos      */
3149999Schristos     for (n = 0; src[n] != (char *) 0; n++);
3249999Schristos     sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *)));
3349999Schristos 
3449999Schristos     for (; *src != (char *) 0; src++)
3549999Schristos 	*dst++ = SAVE(*src);
3649999Schristos     *dst = NULL;
3749999Schristos     return (sdst);
3849999Schristos }
3949999Schristos 
4049999Schristos char  **
4149999Schristos short2blk(src)
4249999Schristos     register Char **src;
4349999Schristos {
4449999Schristos     int     n;
4549999Schristos     register char **sdst, **dst;
4649999Schristos 
4749999Schristos     /*
4849999Schristos      * Count
4949999Schristos      */
5049999Schristos     for (n = 0; src[n] != (Char *) 0; n++);
5149999Schristos     sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *)));
5249999Schristos 
5349999Schristos     for (; *src != (Char *) 0; src++)
5449999Schristos 	*dst++ = strsave(short2str(*src));
5549999Schristos     *dst = (char *) 0;
5649999Schristos     return (sdst);
5749999Schristos }
5849999Schristos 
5949999Schristos #define MALLOC_INCR	1024
6049999Schristos Char   *
6149999Schristos str2short(src)
6249999Schristos     register char *src;
6349999Schristos {
6449999Schristos     static Char *sdst;
6549999Schristos     static int dstsize = 0;
6649999Schristos     register Char *dst, *edst;
6749999Schristos 
6849999Schristos     if (src == (char *) 0)
6949999Schristos 	return ((Char *) 0);
7049999Schristos 
7149999Schristos     if (sdst == (Char *) 0) {
7249999Schristos 	dstsize = MALLOC_INCR;
7349999Schristos 	sdst = (Char *) xmalloc((size_t) dstsize * sizeof(Char));
7449999Schristos     }
7549999Schristos 
7649999Schristos     dst = sdst;
7749999Schristos     edst = &dst[dstsize];
7849999Schristos     while (*src) {
7949999Schristos 	*dst++ = (Char) ((unsigned char) *src++);
8049999Schristos 	if (dst == edst) {
8149999Schristos 	    dstsize += MALLOC_INCR;
8249999Schristos 	    sdst = (Char *) xrealloc((ptr_t) sdst,
8349999Schristos 				     (size_t) dstsize * sizeof(Char));
8449999Schristos 	    edst = &sdst[dstsize];
8549999Schristos 	    dst = &edst[-MALLOC_INCR];
8649999Schristos 	}
8749999Schristos     }
8849999Schristos     *dst = 0;
8949999Schristos     return (sdst);
9049999Schristos }
9149999Schristos 
9249999Schristos char   *
9349999Schristos short2qstr(src)
9449999Schristos     register Char *src;
9549999Schristos {
9649999Schristos     static char *sdst = (char *) 0;
9749999Schristos     static int dstsize = 0;
9849999Schristos     register char *dst, *edst;
9949999Schristos 
10049999Schristos     if (src == (Char *) 0)
10149999Schristos 	return ((char *) 0);
10249999Schristos 
10349999Schristos     if (sdst == (char *) 0) {
10449999Schristos 	dstsize = MALLOC_INCR;
10549999Schristos 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
10649999Schristos     }
10749999Schristos     dst = sdst;
10849999Schristos     edst = &dst[dstsize];
10949999Schristos     while (*src) {
11049999Schristos 	if (*src & QUOTE) {
11149999Schristos 	    *dst++ = '\\';
11249999Schristos 	    if (dst == edst) {
11349999Schristos 		dstsize += MALLOC_INCR;
11449999Schristos 		sdst = (char *) xrealloc((ptr_t) sdst,
11549999Schristos 					 (size_t) dstsize * sizeof(char));
11649999Schristos 		edst = &sdst[dstsize];
11749999Schristos 		dst = &edst[-MALLOC_INCR];
11849999Schristos 	    }
11949999Schristos 	}
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 char   *
13349999Schristos short2str(src)
13449999Schristos     register Char *src;
13549999Schristos {
13649999Schristos     static char *sdst = (char *) 0;
13749999Schristos     static int dstsize = 0;
13849999Schristos     register char *dst, *edst;
13949999Schristos 
14049999Schristos     if (src == (Char *) 0)
14149999Schristos 	return ((char *) 0);
14249999Schristos 
14349999Schristos     if (sdst == (char *) 0) {
14449999Schristos 	dstsize = MALLOC_INCR;
14549999Schristos 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
14649999Schristos     }
14749999Schristos     dst = sdst;
14849999Schristos     edst = &dst[dstsize];
14949999Schristos     while (*src) {
15049999Schristos 	*dst++ = (char) *src++;
15149999Schristos 	if (dst == edst) {
15249999Schristos 	    dstsize += MALLOC_INCR;
15349999Schristos 	    sdst = (char *) xrealloc((ptr_t) sdst,
15449999Schristos 				     (size_t) dstsize * sizeof(char));
15549999Schristos 	    edst = &sdst[dstsize];
15649999Schristos 	    dst = &edst[-MALLOC_INCR];
15749999Schristos 	}
15849999Schristos     }
15949999Schristos     *dst = 0;
16049999Schristos     return (sdst);
16149999Schristos }
16249999Schristos 
16349999Schristos Char   *
16449999Schristos s_strcpy(dst, src)
16549999Schristos     register Char *dst, *src;
16649999Schristos {
16749999Schristos     register Char *sdst;
16849999Schristos 
16949999Schristos     sdst = dst;
17049999Schristos     while (*dst++ = *src++);
17149999Schristos     return (sdst);
17249999Schristos }
17349999Schristos 
17449999Schristos Char   *
17549999Schristos s_strncpy(dst, src, n)
17649999Schristos     register Char *dst, *src;
17749999Schristos     register int n;
17849999Schristos {
17949999Schristos     register Char *sdst;
18049999Schristos 
18149999Schristos     sdst = dst;
18249999Schristos     while (--n >= 0 && (*dst++ = *src++));
18349999Schristos     while (--n >= 0)
18449999Schristos 	*dst++ = '\0';
18549999Schristos     return (sdst);
18649999Schristos }
18749999Schristos 
18849999Schristos Char   *
18949999Schristos s_strcat(dst, src)
19049999Schristos     register Char *dst, *src;
19149999Schristos {
19249999Schristos     register short *sdst;
19349999Schristos 
19449999Schristos     sdst = dst;
19549999Schristos     while (*dst++);
19649999Schristos     --dst;
19749999Schristos     while (*dst++ = *src++);
19849999Schristos     return (sdst);
19949999Schristos }
20049999Schristos 
20149999Schristos #ifdef NOTUSED
20249999Schristos Char   *
20349999Schristos s_strncat(dst, src, n)
20449999Schristos     register Char *dst, *src;
20549999Schristos     register int n;
20649999Schristos {
20749999Schristos     register Char *sdst;
20849999Schristos 
20949999Schristos     sdst = dst;
21049999Schristos     while (*dst++);
21149999Schristos     --dst;
21249999Schristos     while (*src && --n >= 0)
21349999Schristos 	*dst++ = *src++;
21449999Schristos     *dst++ = '\0';
21549999Schristos     return (sdst);
21649999Schristos }
21749999Schristos 
21849999Schristos #endif
21949999Schristos 
22049999Schristos Char   *
22149999Schristos s_strchr(str, ch)
22249999Schristos     register Char *str, ch;
22349999Schristos {
22449999Schristos     do
22549999Schristos 	if (*str == ch)
22649999Schristos 	    return (str);
22749999Schristos     while (*str++);
22849999Schristos     return ((Char *) 0);
22949999Schristos }
23049999Schristos 
23149999Schristos Char   *
23249999Schristos s_strrchr(str, ch)
23349999Schristos     register short *str, ch;
23449999Schristos {
23549999Schristos     register Char *rstr;
23649999Schristos 
23749999Schristos     rstr = (Char *) 0;
23849999Schristos     do
23949999Schristos 	if (*str == ch)
24049999Schristos 	    rstr = str;
24149999Schristos     while (*str++);
24249999Schristos     return (rstr);
24349999Schristos }
24449999Schristos 
24549999Schristos int
24649999Schristos s_strlen(str)
24749999Schristos     register Char *str;
24849999Schristos {
24949999Schristos     register int n;
25049999Schristos 
25149999Schristos     for (n = 0; *str++; n++);
25249999Schristos     return (n);
25349999Schristos }
25449999Schristos 
25549999Schristos int
25649999Schristos s_strcmp(str1, str2)
25749999Schristos     register Char *str1, *str2;
25849999Schristos {
25949999Schristos     for (; *str1 && *str1 == *str2; str1++, str2++);
26049999Schristos     /*
26149999Schristos      * The following case analysis is necessary so that characters which look
26249999Schristos      * negative collate low against normal characters but high against the
26349999Schristos      * end-of-string NUL.
26449999Schristos      */
26549999Schristos     if (*str1 == '\0' && *str2 == '\0')
26649999Schristos 	return (0);
26749999Schristos     else if (*str1 == '\0')
26849999Schristos 	return (-1);
26949999Schristos     else if (*str2 == '\0')
27049999Schristos 	return (1);
27149999Schristos     else
27249999Schristos 	return (*str1 - *str2);
27349999Schristos }
27449999Schristos 
27549999Schristos int
27649999Schristos s_strncmp(str1, str2, n)
27749999Schristos     register Char *str1, *str2;
27849999Schristos     register int n;
27949999Schristos {
28049999Schristos     for (; --n >= 0 && *str1 == *str2; str1++, str2++);
28149999Schristos 
28249999Schristos     if (n < 0)
28349999Schristos 	return (0);
28449999Schristos     /*
28549999Schristos      * The following case analysis is necessary so that characters which look
28649999Schristos      * negative collate low against normal characters but high against the
28749999Schristos      * end-of-string NUL.
28849999Schristos      */
28949999Schristos     if (*str1 == '\0' && *str2 == '\0')
29049999Schristos 	return (0);
29149999Schristos     else if (*str1 == '\0')
29249999Schristos 	return (-1);
29349999Schristos     else if (*str2 == '\0')
29449999Schristos 	return (1);
29549999Schristos     else
29649999Schristos 	return (*str1 - *str2);
29749999Schristos }
29849999Schristos 
29949999Schristos Char   *
30049999Schristos s_strsave(s)
30149999Schristos     register Char *s;
30249999Schristos {
30349999Schristos     Char   *n;
30449999Schristos     register Char *p;
30549999Schristos 
30649999Schristos     if (s == 0)
30749999Schristos 	s = STRNULL;
30849999Schristos     for (p = s; *p++;);
30949999Schristos     n = p = (Char *) xmalloc((size_t) ((p - s) * sizeof(Char)));
31049999Schristos     while (*p++ = *s++);
31149999Schristos     return (n);
31249999Schristos }
31349999Schristos 
31449999Schristos Char   *
31549999Schristos s_strspl(cp, dp)
31649999Schristos     Char   *cp, *dp;
31749999Schristos {
31849999Schristos     Char   *ep;
31949999Schristos     register Char *p, *q;
32049999Schristos 
32149999Schristos     if (!cp)
32249999Schristos 	cp = STRNULL;
32349999Schristos     if (!dp)
32449999Schristos 	dp = STRNULL;
32549999Schristos     for (p = cp; *p++;);
32649999Schristos     for (q = dp; *q++;);
32749999Schristos     ep = (Char *) xmalloc((size_t)
32849999Schristos 			  (((p - cp) + (q - dp) - 1) * sizeof(Char)));
32949999Schristos     for (p = ep, q = cp; *p++ = *q++;);
33049999Schristos     for (p--, q = dp; *p++ = *q++;);
33149999Schristos     return (ep);
33249999Schristos }
33349999Schristos 
33449999Schristos Char   *
33549999Schristos s_strend(cp)
33649999Schristos     register Char *cp;
33749999Schristos {
33849999Schristos     if (!cp)
33949999Schristos 	return (cp);
34049999Schristos     while (*cp)
34149999Schristos 	cp++;
34249999Schristos     return (cp);
34349999Schristos }
34449999Schristos 
34549999Schristos #ifdef NOTUSED
34649999Schristos Char   *
34749999Schristos s_strstr(s, t)
34849999Schristos     register Char *s, *t;
34949999Schristos {
35049999Schristos     do {
35149999Schristos 	register Char *ss = s;
35249999Schristos 	register Char *tt = t;
35349999Schristos 
35449999Schristos 	do
35549999Schristos 	    if (*tt == '\0')
35649999Schristos 		return (s);
35749999Schristos 	while (*ss++ == *tt++);
35849999Schristos     } while (*s++ != '\0');
35949999Schristos     return ((Char *) 0);
36049999Schristos }
36149999Schristos #endif
36249999Schristos 
36349999Schristos #endif				/* SHORT_STRINGS */
364