Skip to content

Instantly share code, notes, and snippets.

@amakukha
Created December 17, 2021 08:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amakukha/5e4356105ff5e463266da72eb62e4f36 to your computer and use it in GitHub Desktop.
Save amakukha/5e4356105ff5e463266da72eb62e4f36 to your computer and use it in GitHub Desktop.
fast_strlcpy
/* Copyright (c) 1998, 2015 Todd C. Miller <millert@openbsd.org>
* (c) 2021 Andrii Makukha
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* @brief Copy string src to buffer dst of size dsize. At most dsize-1 chars
* will be copied. Always NUL-terminates (unless dsize == 0).
*
* @return dsize if truncation occured
* zero if dsize is zero
* othersize - length of string copied
*
* Based on https://github.com/libressl-portable/openbsd/blob/master/src/lib/libc/string/strlcpy.c
*/
size_t fast_strlcpy(char *dst, const char *src, size_t dsize)
{
const char *osrc = src;
size_t nleft = dsize;
// Copy as many bytes as will fit.
if (nleft != 0) {
while (--nleft != 0) {
if ((*dst++ = *src++) == '\0')
break;
}
}
// Not enough room in dst, add NUL.
if (nleft == 0) {
if (dsize != 0)
*dst = '\0'; // NUL-terminate dst
//while (*src++); // Original strlcpy from OpenBSD - this is slow and unsafe
src++; // Change in this "fast" version
}
// Count does not include NUL
return (src - osrc - 1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment