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; }
