xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

strlcat.c (1815B)


      1 /*
      2  * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
      3  *
      4  * Permission to use, copy, modify, and distribute this software for any
      5  * purpose with or without fee is hereby granted, provided that the above
      6  * copyright notice and this permission notice appear in all copies.
      7  *
      8  * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
      9  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
     10  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
     11  * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
     13  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     15  */
     16 
     17 #ifdef HAVE_DIX_CONFIG_H
     18 #include <dix-config.h>
     19 #endif
     20 
     21 #include <sys/types.h>
     22 #include <string.h>
     23 #include "os.h"
     24 
     25 /*
     26  * Appends src to string dst of size siz (unlike strncat, siz is the
     27  * full size of dst, not space left).  At most siz-1 characters
     28  * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
     29  * Returns strlen(src) + MIN(siz, strlen(initial dst)).
     30  * If retval >= siz, truncation occurred.
     31  */
     32 size_t
     33 strlcat(char *dst, const char *src, size_t siz)
     34 {
     35     register char *d = dst;
     36     register const char *s = src;
     37     register size_t n = siz;
     38     size_t dlen;
     39 
     40     /* Find the end of dst and adjust bytes left but don't go past end */
     41     while (n-- != 0 && *d != '\0')
     42         d++;
     43     dlen = d - dst;
     44     n = siz - dlen;
     45 
     46     if (n == 0)
     47         return (dlen + strlen(s));
     48     while (*s != '\0') {
     49         if (n != 1) {
     50             *d++ = *s;
     51             n--;
     52         }
     53         s++;
     54     }
     55     *d = '\0';
     56 
     57     return (dlen + (s - src));  /* count does not include NUL */
     58 }