diff options
Diffstat (limited to 'libc/string/strlcpy.c')
-rw-r--r-- | libc/string/strlcpy.c | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/libc/string/strlcpy.c b/libc/string/strlcpy.c index e8a435bce..3920db083 100644 --- a/libc/string/strlcpy.c +++ b/libc/string/strlcpy.c @@ -1,19 +1,56 @@ /* + * Copyright (C) 2002 Manuel Novoa III * Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org> * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ -#define L_strlcpy -#define Wstrlcpy __strlcpy +#include "_string.h" -#include "wstring.c" +#ifdef WANT_WIDE +# define __Wstrlcpy __wcslcpy +# define Wstrlcpy wcslcpy +#else +# define __Wstrlcpy __strlcpy +# define Wstrlcpy strlcpy +#endif -strong_alias(__strlcpy, strlcpy) +/* OpenBSD function: + * Copy at most n-1 chars from src to dst and nul-terminate dst. + * Returns strlen(src), so truncation occurred if the return value is >= n. */ -#ifdef __LOCALE_C_ONLY -hidden_strong_alias(__strlcpy, __strxfrm) -strong_alias(__strlcpy, strxfrm) -#endif +size_t attribute_hidden __Wstrlcpy(register Wchar *__restrict dst, + register const Wchar *__restrict src, + size_t n) +{ + const Wchar *src0 = src; + Wchar dummy[1]; + + if (!n) { + dst = dummy; + } else { + --n; + } + + while ((*dst = *src) != 0) { + if (n) { + --n; + ++dst; + } + ++src; + } -#undef L_strlcpy + return src - src0; +} + +strong_alias(__Wstrlcpy,Wstrlcpy) + +#ifndef __UCLIBC_HAS_LOCALE__ +# ifdef WANT_WIDE +hidden_strong_alias(__wcslcpy,__wcsxfrm) +strong_alias(__wcslcpy,wcsxfrm) +# else +hidden_strong_alias(__strlcpy,__strxfrm) +strong_alias(__strlcpy,strxfrm) +# endif +#endif |