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