When these were originally written I wanted to avoid calling external
functions.  As a result, strlcat.c in particular is hard to read.
Compilers are smarter and string functions are better these days
so using strlen and mempcy are probably actually faster than doing
byte-oriented string traversal and copies.

The diff is context rather than unified so you can see the entire
function, before and after.

 - todd

Index: lib/libc/string/strlcat.c
===================================================================
RCS file: /cvs/src/lib/libc/string/strlcat.c,v
retrieving revision 1.13
diff -c -r1.13 strlcat.c
*** lib/libc/string/strlcat.c   8 Aug 2005 08:05:37 -0000       1.13
--- lib/libc/string/strlcat.c   2 Dec 2014 17:51:48 -0000
***************
*** 1,7 ****
  /*    $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $      */
  
  /*
!  * Copyright (c) 1998 Todd C. Miller <[email protected]>
   *
   * Permission to use, copy, modify, and distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
--- 1,7 ----
  /*    $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $      */
  
  /*
!  * Copyright (c) 1998, 2014 Todd C. Miller <[email protected]>
   *
   * Permission to use, copy, modify, and distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
***************
*** 20,55 ****
  #include <string.h>
  
  /*
!  * Appends src to string dst of size siz (unlike strncat, siz is the
!  * full size of dst, not space left).  At most siz-1 characters
!  * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
!  * Returns strlen(src) + MIN(siz, strlen(initial dst)).
!  * If retval >= siz, truncation occurred.
   */
  size_t
! strlcat(char *dst, const char *src, size_t siz)
  {
!       char *d = dst;
!       const char *s = src;
!       size_t n = siz;
!       size_t dlen;
  
!       /* Find the end of dst and adjust bytes left but don't go past end */
!       while (n-- != 0 && *d != '\0')
!               d++;
!       dlen = d - dst;
!       n = siz - dlen;
! 
!       if (n == 0)
!               return(dlen + strlen(s));
!       while (*s != '\0') {
!               if (n != 1) {
!                       *d++ = *s;
!                       n--;
!               }
!               s++;
        }
!       *d = '\0';
! 
!       return(dlen + (s - src));       /* count does not include NUL */
  }
--- 20,44 ----
  #include <string.h>
  
  /*
!  * Appends src to string dst of size dsize (unlike strncat, dsize is the
!  * full size of dst, not space left).  At most dsize-1 characters
!  * will be copied.  Always NUL terminates (unless dsize <= strlen(dst)).
!  * Returns strlen(src) + MIN(dsize, strlen(initial dst)).
!  * If retval >= dsize, truncation occurred.
   */
  size_t
! strlcat(char *dst, const char *src, size_t dsize)
  {
!       const size_t slen = strlen(src);
!       const size_t dlen = strnlen(dst, dsize);
  
!       if (dlen != dsize) {
!               size_t count = slen;
!               if (count > dsize - dlen - 1)
!                       count = dsize - dlen - 1;
!               dst += dlen;
!               memcpy(dst, src, count);
!               dst[count] = '\0';
        }
!       return slen + dlen;
  }
Index: lib/libc/string/strlcpy.c
===================================================================
RCS file: /cvs/src/lib/libc/string/strlcpy.c,v
retrieving revision 1.11
diff -c -r1.11 strlcpy.c
*** lib/libc/string/strlcpy.c   5 May 2006 15:27:38 -0000       1.11
--- lib/libc/string/strlcpy.c   2 Dec 2014 17:51:48 -0000
***************
*** 1,7 ****
  /*    $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $    */
  
  /*
!  * Copyright (c) 1998 Todd C. Miller <[email protected]>
   *
   * Permission to use, copy, modify, and distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
--- 1,7 ----
  /*    $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $    */
  
  /*
!  * Copyright (c) 1998, 2014 Todd C. Miller <[email protected]>
   *
   * Permission to use, copy, modify, and distribute this software for any
   * purpose with or without fee is hereby granted, provided that the above
***************
*** 20,51 ****
  #include <string.h>
  
  /*
!  * Copy src to string dst of size siz.  At most siz-1 characters
!  * will be copied.  Always NUL terminates (unless siz == 0).
!  * Returns strlen(src); if retval >= siz, truncation occurred.
   */
  size_t
! strlcpy(char *dst, const char *src, size_t siz)
  {
!       char *d = dst;
!       const char *s = src;
!       size_t n = siz;
  
!       /* Copy as many bytes as will fit */
!       if (n != 0) {
!               while (--n != 0) {
!                       if ((*d++ = *s++) == '\0')
!                               break;
!               }
        }
! 
!       /* Not enough room in dst, add NUL and traverse rest of src */
!       if (n == 0) {
!               if (siz != 0)
!                       *d = '\0';              /* NUL-terminate dst */
!               while (*s++)
!                       ;
!       }
! 
!       return(s - src - 1);    /* count does not include NUL */
  }
--- 20,38 ----
  #include <string.h>
  
  /*
!  * Copy src to string dst of size dsize.  At most dsize-1 characters
!  * will be copied.  Always NUL terminates (unless dsize == 0).
!  * Returns strlen(src); if retval >= dsize, truncation occurred.
   */
  size_t
! strlcpy(char *dst, const char *src, size_t dsize)
  {
!       const size_t slen = strlen(src);
  
!       if (dsize != 0) {
!               const size_t dlen = dsize > slen ? slen : dsize - 1;
!               memcpy(dst, src, dlen);
!               dst[dlen] = '\0';
        }
!       return slen;
  }

Reply via email to