ubgpsuite/lonetix/strncpyz.c

60 lines
1.6 KiB
C

// SPDX-License-Identifier: LGPL-3.0-or-later
/**
* \file strncpyz.c
*
* Implements `Df_strncpyz()`.
*
* \copyright The DoubleFourteen Code Forge (C) All Rights Reserved
* \author Lorenzo Cogotti
*/
// THIS CODE IS DERIVED FROM OpenBSD strlcpy.c
// ORIGINAL LICENSE TERMS FOLLOW:
/* $OpenBSD: strlcpy.c,v 1.12 2015/01/15 03:54:12 millert Exp $ */
/*
* Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
*
* 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.
*/
// ORIGINAL LICENSE TERMS END ***
#include "strlib.h"
size_t Df_strncpyz(char *dst, const char *src, size_t n)
{
const char *osrc = src;
size_t nleft = n;
// 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 and traverse rest of src
if (nleft == 0) {
if (n > 0)
*dst = '\0'; // NUL-terminate dst
while (*src++ != '\0');
}
return src - osrc - 1; // count does not include NUL
}