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