Home | History | Annotate | Line # | Download | only in csh
str.c revision 1.3
      1 /*-
      2  * Copyright (c) 1991 The Regents of the University of California.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *	This product includes software developed by the University of
     16  *	California, Berkeley and its contributors.
     17  * 4. Neither the name of the University nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #ifndef lint
     35 static char sccsid[] = "@(#)str.c	5.5 (Berkeley) 6/27/91";
     36 static char rcsid[] = "$Header: /tank/opengrok/rsync2/NetBSD/src/bin/csh/str.c,v 1.3 1993/03/23 00:25:25 cgd Exp $";
     37 #endif /* not lint */
     38 
     39 /*
     40  * tc.str.c: Short string package
     41  * 	     This has been a lesson of how to write buggy code!
     42  */
     43 #ifdef SHORT_STRINGS
     44 
     45 #if __STDC__
     46 # include <stdarg.h>
     47 #else
     48 # include <varargs.h>
     49 #endif
     50 
     51 #include "csh.h"
     52 #include "extern.h"
     53 
     54 Char  **
     55 blk2short(src)
     56     register char **src;
     57 {
     58     size_t     n;
     59     register Char **sdst, **dst;
     60 
     61     /*
     62      * Count
     63      */
     64     for (n = 0; src[n] != NULL; n++);
     65     sdst = dst = (Char **) xmalloc((size_t) ((n + 1) * sizeof(Char *)));
     66 
     67     for (; *src != NULL; src++)
     68 	*dst++ = SAVE(*src);
     69     *dst = NULL;
     70     return (sdst);
     71 }
     72 
     73 char  **
     74 short2blk(src)
     75     register Char **src;
     76 {
     77     size_t     n;
     78     register char **sdst, **dst;
     79 
     80     /*
     81      * Count
     82      */
     83     for (n = 0; src[n] != NULL; n++);
     84     sdst = dst = (char **) xmalloc((size_t) ((n + 1) * sizeof(char *)));
     85 
     86     for (; *src != NULL; src++)
     87 	*dst++ = strsave(short2str(*src));
     88     *dst = NULL;
     89     return (sdst);
     90 }
     91 
     92 #define MALLOC_INCR	1024
     93 Char   *
     94 str2short(src)
     95     register char *src;
     96 {
     97     static Char *sdst;
     98     static size_t dstsize = 0;
     99     register Char *dst, *edst;
    100 
    101     if (src == NULL)
    102 	return (NULL);
    103 
    104     if (sdst == (NULL)) {
    105 	dstsize = MALLOC_INCR;
    106 	sdst = (Char *) xmalloc((size_t) dstsize * sizeof(Char));
    107     }
    108 
    109     dst = sdst;
    110     edst = &dst[dstsize];
    111     while (*src) {
    112 	*dst++ = (Char) ((unsigned char) *src++);
    113 	if (dst == edst) {
    114 	    dstsize += MALLOC_INCR;
    115 	    sdst = (Char *) xrealloc((ptr_t) sdst,
    116 				     (size_t) dstsize * sizeof(Char));
    117 	    edst = &sdst[dstsize];
    118 	    dst = &edst[-MALLOC_INCR];
    119 	}
    120     }
    121     *dst = 0;
    122     return (sdst);
    123 }
    124 
    125 char   *
    126 short2qstr(src)
    127     register Char *src;
    128 {
    129     static char *sdst = NULL;
    130     static size_t dstsize = 0;
    131     register char *dst, *edst;
    132 
    133     if (src == NULL)
    134 	return (NULL);
    135 
    136     if (sdst == NULL) {
    137 	dstsize = MALLOC_INCR;
    138 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
    139     }
    140     dst = sdst;
    141     edst = &dst[dstsize];
    142     while (*src) {
    143 	if (*src & QUOTE) {
    144 	    *dst++ = '\\';
    145 	    if (dst == edst) {
    146 		dstsize += MALLOC_INCR;
    147 		sdst = (char *) xrealloc((ptr_t) sdst,
    148 					 (size_t) dstsize * sizeof(char));
    149 		edst = &sdst[dstsize];
    150 		dst = &edst[-MALLOC_INCR];
    151 	    }
    152 	}
    153 	*dst++ = (char) *src++;
    154 	if (dst == edst) {
    155 	    dstsize += MALLOC_INCR;
    156 	    sdst = (char *) xrealloc((ptr_t) sdst,
    157 				     (size_t) dstsize * sizeof(char));
    158 	    edst = &sdst[dstsize];
    159 	    dst = &edst[-MALLOC_INCR];
    160 	}
    161     }
    162     *dst = 0;
    163     return (sdst);
    164 }
    165 char   *
    166 short2str(src)
    167     register Char *src;
    168 {
    169     static char *sdst = NULL;
    170     static size_t dstsize = 0;
    171     register char *dst, *edst;
    172 
    173     if (src == NULL)
    174 	return (NULL);
    175 
    176     if (sdst == NULL) {
    177 	dstsize = MALLOC_INCR;
    178 	sdst = (char *) xmalloc((size_t) dstsize * sizeof(char));
    179     }
    180     dst = sdst;
    181     edst = &dst[dstsize];
    182     while (*src) {
    183 	*dst++ = (char) *src++;
    184 	if (dst == edst) {
    185 	    dstsize += MALLOC_INCR;
    186 	    sdst = (char *) xrealloc((ptr_t) sdst,
    187 				     (size_t) dstsize * sizeof(char));
    188 	    edst = &sdst[dstsize];
    189 	    dst = &edst[-MALLOC_INCR];
    190 	}
    191     }
    192     *dst = 0;
    193     return (sdst);
    194 }
    195 
    196 Char   *
    197 s_strcpy(dst, src)
    198     register Char *dst, *src;
    199 {
    200     register Char *sdst;
    201 
    202     sdst = dst;
    203     while (*dst++ = *src++);
    204     return (sdst);
    205 }
    206 
    207 Char   *
    208 s_strncpy(dst, src, n)
    209     register Char *dst, *src;
    210     register size_t n;
    211 {
    212     register Char *sdst;
    213 
    214     if (n == 0)
    215 	return(dst);
    216 
    217     sdst = dst;
    218     do
    219 	if ((*dst++ = *src++) == '\0') {
    220 	    while (--n != 0)
    221 		*dst++ = '\0';
    222 	    return(sdst);
    223 	}
    224     while (--n != 0);
    225     return (sdst);
    226 }
    227 
    228 Char   *
    229 s_strcat(dst, src)
    230     register Char *dst, *src;
    231 {
    232     register short *sdst;
    233 
    234     sdst = dst;
    235     while (*dst++);
    236     --dst;
    237     while (*dst++ = *src++);
    238     return (sdst);
    239 }
    240 
    241 #ifdef NOTUSED
    242 Char   *
    243 s_strncat(dst, src, n)
    244     register Char *dst, *src;
    245     register size_t n;
    246 {
    247     register Char *sdst;
    248 
    249     if (n == 0)
    250 	return (dst);
    251 
    252     sdst = dst;
    253 
    254     while (*dst++);
    255     --dst;
    256 
    257     do
    258 	if ((*dst++ = *src++) == '\0')
    259 	    return(sdst);
    260     while (--n != 0);
    261 
    262     *dst = '\0';
    263     return (sdst);
    264 }
    265 
    266 #endif
    267 
    268 Char   *
    269 s_strchr(str, ch)
    270     register Char *str;
    271     int ch;
    272 {
    273     do
    274 	if (*str == ch)
    275 	    return (str);
    276     while (*str++);
    277     return (NULL);
    278 }
    279 
    280 Char   *
    281 s_strrchr(str, ch)
    282     register Char *str;
    283     int ch;
    284 {
    285     register Char *rstr;
    286 
    287     rstr = NULL;
    288     do
    289 	if (*str == ch)
    290 	    rstr = str;
    291     while (*str++);
    292     return (rstr);
    293 }
    294 
    295 size_t
    296 s_strlen(str)
    297     register Char *str;
    298 {
    299     register size_t n;
    300 
    301     for (n = 0; *str++; n++);
    302     return (n);
    303 }
    304 
    305 int
    306 s_strcmp(str1, str2)
    307     register Char *str1, *str2;
    308 {
    309     for (; *str1 && *str1 == *str2; str1++, str2++);
    310     /*
    311      * The following case analysis is necessary so that characters which look
    312      * negative collate low against normal characters but high against the
    313      * end-of-string NUL.
    314      */
    315     if (*str1 == '\0' && *str2 == '\0')
    316 	return (0);
    317     else if (*str1 == '\0')
    318 	return (-1);
    319     else if (*str2 == '\0')
    320 	return (1);
    321     else
    322 	return (*str1 - *str2);
    323 }
    324 
    325 int
    326 s_strncmp(str1, str2, n)
    327     register Char *str1, *str2;
    328     register size_t n;
    329 {
    330     if (n == 0)
    331 	return (0);
    332     do {
    333         if (*str1 == '\0' || *str1 != *str2)
    334 	    break;
    335 	str1++, str2++;
    336     } while (--n != 0);
    337     /*
    338      * The following case analysis is necessary so that characters which look
    339      * negative collate low against normal characters but high against the
    340      * end-of-string NUL.
    341      */
    342     if (*str1 == '\0' && *str2 == '\0')
    343 	return (0);
    344     else if (*str1 == '\0')
    345 	return (-1);
    346     else if (*str2 == '\0')
    347 	return (1);
    348     else
    349 	return (*str1 - *str2);
    350     return(0);
    351 }
    352 
    353 Char   *
    354 s_strsave(s)
    355     register Char *s;
    356 {
    357     Char   *n;
    358     register Char *p;
    359 
    360     if (s == 0)
    361 	s = STRNULL;
    362     for (p = s; *p++;);
    363     n = p = (Char *) xmalloc((size_t) ((p - s) * sizeof(Char)));
    364     while (*p++ = *s++);
    365     return (n);
    366 }
    367 
    368 Char   *
    369 s_strspl(cp, dp)
    370     Char   *cp, *dp;
    371 {
    372     Char   *ep;
    373     register Char *p, *q;
    374 
    375     if (!cp)
    376 	cp = STRNULL;
    377     if (!dp)
    378 	dp = STRNULL;
    379     for (p = cp; *p++;);
    380     for (q = dp; *q++;);
    381     ep = (Char *) xmalloc((size_t)
    382 			  (((p - cp) + (q - dp) - 1) * sizeof(Char)));
    383     for (p = ep, q = cp; *p++ = *q++;);
    384     for (p--, q = dp; *p++ = *q++;);
    385     return (ep);
    386 }
    387 
    388 Char   *
    389 s_strend(cp)
    390     register Char *cp;
    391 {
    392     if (!cp)
    393 	return (cp);
    394     while (*cp)
    395 	cp++;
    396     return (cp);
    397 }
    398 
    399 #ifdef NOTUSED
    400 Char   *
    401 s_strstr(s, t)
    402     register Char *s, *t;
    403 {
    404     do {
    405 	register Char *ss = s;
    406 	register Char *tt = t;
    407 
    408 	do
    409 	    if (*tt == '\0')
    410 		return (s);
    411 	while (*ss++ == *tt++);
    412     } while (*s++ != '\0');
    413     return (NULL);
    414 }
    415 #endif
    416 
    417 #endif				/* SHORT_STRINGS */
    418