diff options
| author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-01-07 02:32:27 +0000 | 
|---|---|---|
| committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-01-07 02:32:27 +0000 | 
| commit | e523bd15353350c3480b8a1820a0944b0fa8212e (patch) | |
| tree | 60485116f9c62c306bb753f12f9d4eb79d16aa4e /libc/string/strlcpy.c | |
| parent | 3b3434516a3415d7e0f4e1d50c553876dcb337b2 (diff) | |
| download | uClibc-alpine-e523bd15353350c3480b8a1820a0944b0fa8212e.tar.bz2 uClibc-alpine-e523bd15353350c3480b8a1820a0944b0fa8212e.tar.xz | |
Big fricking merge from trunk.
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 | 
