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