/* Checking macros for wchar functions.
   Copyright (C) 2005-2022 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <https://www.gnu.org/licenses/>.  */

#ifndef _WCHAR_H
# error "Never include <bits/wchar2.h> directly; use <wchar.h> instead."
#endif

extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1,
			       const wchar_t *__restrict __s2, size_t __n,
			       size_t __ns1) __THROW;
extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
				(wchar_t *__restrict __s1,
				 const wchar_t *__restrict __s2, size_t __n),
				wmemcpy);

__fortify_potential_overload wchar_t *
__NTH (wmemcpy (wchar_t *__restrict const __clang_pass_object_size0 __s1,
	      const wchar_t *__restrict __s2, size_t __n))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS0_LT2 (__wmemcpy_warn, __n, __s1,
					 sizeof (wchar_t),
					 "wmemcpy called with length bigger "
					 "than size of destination buffer")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize0 (__s1) != (size_t)-1)
    return __wmemcpy_chk(__s1, __s2, __n,
			 __glibc_objsize0(__s1) / sizeof (wchar_t));
  return __wmemcpy_alias(__s1, __s2, __n);
}
__FORTIFY_FUNCTION_END

extern wchar_t *__wmemmove_chk (wchar_t *__s1, const wchar_t *__s2,
				size_t __n, size_t __ns1) __THROW;
extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
						   const wchar_t *__s2,
						   size_t __n), wmemmove);

__fortify_potential_overload wchar_t *
__NTH (wmemmove (wchar_t *const __clang_pass_object_size0 __s1,
		 const wchar_t *__s2, size_t __n))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS0_LT2 (__wmemmove_warn, __n, __s1,
					 sizeof (wchar_t),
					 "wmemmove called with length bigger "
					 "than size of destination buffer")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize0 (__s1) != (size_t) -1)
    return __wmemmove_chk (__s1, __s2, __n,
			   __glibc_objsize0 (__s1) / sizeof (wchar_t));
  return __wmemmove_alias (__s1, __s2, __n);
}
__FORTIFY_FUNCTION_END


#ifdef __USE_GNU
extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1,
				const wchar_t *__restrict __s2, size_t __n,
				size_t __ns1) __THROW;
extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
				(wchar_t *__restrict __s1,
				 const wchar_t *__restrict __s2,
				 size_t __n), wmempcpy);

__fortify_potential_overload wchar_t *
__NTH(wmempcpy(wchar_t *__restrict const __clang_pass_object_size0 __s1,
               const wchar_t *__restrict __s2, size_t __n))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS0_LT2 (__wmempcpy_warn, __n, __s1,
					 sizeof (wchar_t),
					 "wmempcpy called with length bigger "
					 "than size of destination buffer")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize0 (__s1) != (size_t)-1)
    return __wmempcpy_chk(__s1, __s2, __n,
			  __glibc_objsize0(__s1) / sizeof (wchar_t));
  return __wmempcpy_alias(__s1, __s2, __n);
}
__FORTIFY_FUNCTION_END
#endif


extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
			       size_t __ns) __THROW;
extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
						  size_t __n), wmemset);

__fortify_potential_overload wchar_t *
__NTH (wmemset (wchar_t *const __clang_pass_object_size0 __s, wchar_t __c,
		size_t __n))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS0_LT2 (__wmemset_warn, __n, __s,
					 sizeof (wchar_t),
					 "wmemset called with length bigger "
					 "than size of destination buffer")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize0 (__s) != (size_t) -1)
    return __wmemset_chk (__s, __c, __n,
			  __glibc_objsize0 (__s) / sizeof (wchar_t));
  return __wmemset_alias (__s, __c, __n);
}
__FORTIFY_FUNCTION_END


extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest,
			      const wchar_t *__restrict __src,
			      size_t __n) __THROW;
extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
				(wchar_t *__restrict __dest,
				 const wchar_t *__restrict __src), wcscpy);

__fortify_potential_overload wchar_t *
__NTH (wcscpy (wchar_t *__restrict const __clang_pass_object_size __dest,
	       const wchar_t *__restrict __src))
{
  size_t sz = __glibc_objsize (__dest);
  if (sz != (size_t) -1)
    return __wcscpy_chk (__dest, __src, sz / sizeof (wchar_t));
  return __wcscpy_alias (__dest, __src);
}


extern wchar_t *__wcpcpy_chk (wchar_t *__restrict __dest,
			      const wchar_t *__restrict __src,
			      size_t __destlen) __THROW;
extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias,
				(wchar_t *__restrict __dest,
				 const wchar_t *__restrict __src), wcpcpy);

__fortify_potential_overload wchar_t *
__NTH (wcpcpy (wchar_t *__restrict const __clang_pass_object_size __dest,
	       const wchar_t *__restrict __src))
{
  size_t sz = __glibc_objsize (__dest);
  if (sz != (size_t) -1)
    return __wcpcpy_chk (__dest, __src, sz / sizeof (wchar_t));
  return __wcpcpy_alias (__dest, __src);
}


extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest,
			       const wchar_t *__restrict __src, size_t __n,
			       size_t __destlen) __THROW;
extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
				(wchar_t *__restrict __dest,
				 const wchar_t *__restrict __src,
				 size_t __n), wcsncpy);

__fortify_potential_overload wchar_t *
__NTH (wcsncpy (wchar_t *__restrict const __clang_pass_object_size __dest,
		const wchar_t *__restrict __src, size_t __n))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS_LT2 (__wcsncpy_warn, __n, __dest,
					sizeof (wchar_t),
					"wcsncpy called with length bigger "
					"than size of destination buffer")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize (__dest) != (size_t) -1)
    return __wcsncpy_chk (__dest, __src, __n,
			  __glibc_objsize (__dest) / sizeof (wchar_t));
  return __wcsncpy_alias (__dest, __src, __n);
}
__FORTIFY_FUNCTION_END


extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest,
			       const wchar_t *__restrict __src, size_t __n,
			       size_t __destlen) __THROW;
extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
				(wchar_t *__restrict __dest,
				 const wchar_t *__restrict __src,
				 size_t __n), wcpncpy);

__fortify_potential_overload wchar_t *
__NTH (wcpncpy (wchar_t *__restrict const __clang_pass_object_size __dest,
		const wchar_t *__restrict __src, size_t __n))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS_LT2 (__wcpncpy_warn, __n, __dest,
					sizeof (wchar_t),
					"wcpncpy called with length bigger "
					"than size of destination buffer")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize (__dest) != (size_t) -1)
    return __wcpncpy_chk (__dest, __src, __n,
			  __glibc_objsize (__dest) / sizeof (wchar_t));
  return __wcpncpy_alias (__dest, __src, __n);
}
__FORTIFY_FUNCTION_END

extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest,
			      const wchar_t *__restrict __src,
			      size_t __destlen) __THROW;
extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
				(wchar_t *__restrict __dest,
				 const wchar_t *__restrict __src), wcscat);

__fortify_potential_overload wchar_t *
__NTH (wcscat (wchar_t *__restrict const __clang_pass_object_size __dest,
	       const wchar_t *__restrict __src))
{
  size_t sz = __glibc_objsize (__dest);
  if (sz != (size_t) -1)
    return __wcscat_chk (__dest, __src, sz / sizeof (wchar_t));
  return __wcscat_alias (__dest, __src);
}


extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest,
			       const wchar_t *__restrict __src,
			       size_t __n, size_t __destlen) __THROW;
extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
				(wchar_t *__restrict __dest,
				 const wchar_t *__restrict __src,
				 size_t __n), wcsncat);

__fortify_potential_overload wchar_t *
__NTH (wcsncat (wchar_t *__restrict const __clang_pass_object_size __dest,
		const wchar_t *__restrict __src, size_t __n))
{
  size_t sz = __glibc_objsize (__dest);
  if (sz != (size_t) -1)
    return __wcsncat_chk (__dest, __src, __n, sz / sizeof (wchar_t));
  return __wcsncat_alias (__dest, __src, __n);
}


extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
			   int __flag, size_t __s_len,
			   const wchar_t *__restrict __format, ...)
     __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;

extern int __REDIRECT_NTH_LDBL (__swprintf_alias,
				(wchar_t *__restrict __s, size_t __n,
				 const wchar_t *__restrict __fmt, ...),
				swprintf);

extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
			    int __flag, size_t __s_len,
			    const wchar_t *__restrict __format,
			    __gnuc_va_list __arg)
     __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;

extern int __REDIRECT_NTH_LDBL (__vswprintf_alias,
				(wchar_t *__restrict __s, size_t __n,
				 const wchar_t *__restrict __fmt,
				 __gnuc_va_list __ap), vswprintf);

#ifdef __FORTIFY_ARG_PACK_OK
__fortify_potential_overload int
__NTH (swprintf (wchar_t *__restrict const __clang_pass_object_size __s,
		 size_t __n, const wchar_t *__restrict __fmt, ...))
{
  __FORTIFY_INIT_ARG_PACK(__fmt);
  int __result;
  if (__glibc_objsize (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
    __result = __FORTIFY_CALL_VA_CHK(swprintf, __s, __n,
				     __USE_FORTIFY_LEVEL - 1,
				     __glibc_objsize (__s) / sizeof (wchar_t), __fmt,
				     __FORTIFY_ARG_PACK);
  else
    __result = __FORTIFY_CALL_VA_ALIAS(swprintf, __s, __n, __fmt,
				       __FORTIFY_ARG_PACK);
  __FORTIFY_FREE_ARG_PACK();
  return __result;
}
#elif !defined __cplusplus
/* XXX We might want to have support in gcc for swprintf.  */
# define swprintf(s, n, ...) \
  (__glibc_objsize (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1		      \
   ? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1,			      \
		     __glibc_objsize (s) / sizeof (wchar_t), __VA_ARGS__)	      \
   : swprintf (s, n, __VA_ARGS__))
#endif

__fortify_potential_overload int
__NTH (vswprintf (wchar_t *__restrict const __clang_pass_object_size __s,
		  size_t __n, const wchar_t *__restrict __fmt,
		  __gnuc_va_list __ap))
{
  size_t sz = __glibc_objsize (__s);
  if (sz != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
    return __vswprintf_chk (__s, __n,  __USE_FORTIFY_LEVEL - 1,
			    sz / sizeof (wchar_t), __fmt, __ap);
  return __vswprintf_alias (__s, __n, __fmt, __ap);
}


#if __USE_FORTIFY_LEVEL > 1

extern int __fwprintf_chk (__FILE *__restrict __stream, int __flag,
			   const wchar_t *__restrict __format, ...);
extern int __wprintf_chk (int __flag, const wchar_t *__restrict __format,
			  ...);
extern int __vfwprintf_chk (__FILE *__restrict __stream, int __flag,
			    const wchar_t *__restrict __format,
			    __gnuc_va_list __ap);
extern int __vwprintf_chk (int __flag, const wchar_t *__restrict __format,
			   __gnuc_va_list __ap);


#ifdef __FORTIFY_ARG_PACK_OK
__fortify_potential_overload int
wprintf (const wchar_t *__restrict const __clang_pass_object_size __fmt, ...)
{
  __FORTIFY_INIT_ARG_PACK(__fmt);
  int __r = __FORTIFY_CALL_VA_CHK (wprintf, __USE_FORTIFY_LEVEL - 1, __fmt,
				   __FORTIFY_ARG_PACK);
  __FORTIFY_FREE_ARG_PACK();
  return __r;
}

__fortify_potential_overload int
fwprintf (__FILE *__restrict const __clang_pass_object_size __stream,
	  const wchar_t *__restrict __fmt, ...)
{
  __FORTIFY_INIT_ARG_PACK(__fmt);
  int __r = __FORTIFY_CALL_VA_CHK (fwprintf, __stream, __USE_FORTIFY_LEVEL - 1,
				   __fmt, __FORTIFY_ARG_PACK);
  __FORTIFY_FREE_ARG_PACK();
  return __r;
}
# elif !defined __cplusplus
#  define wprintf(...) \
  __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
#  define fwprintf(stream, ...) \
  __fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# endif

__fortify_potential_overload int
vwprintf (const wchar_t *__restrict const __clang_pass_object_size __fmt,
	  __gnuc_va_list __ap)
{
  return __vwprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
}

__fortify_potential_overload int
vfwprintf (__FILE *__restrict const __clang_pass_object_size __stream,
	   const wchar_t *__restrict __fmt, __gnuc_va_list __ap)
{
  return __vfwprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
}

#endif

extern wchar_t *__fgetws_chk (wchar_t *__restrict __s, size_t __size, int __n,
			      __FILE *__restrict __stream) __wur;
extern wchar_t *__REDIRECT (__fgetws_alias,
			    (wchar_t *__restrict __s, int __n,
			     __FILE *__restrict __stream), fgetws) __wur;

__fortify_potential_overload __wur wchar_t *
fgetws (wchar_t *__restrict const __clang_pass_object_size __s, int __n,
	__FILE *__restrict __stream)
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS_LT2 (__fgetws_warn, __n, __s,
					sizeof (wchar_t),
					"fgetws called with length bigger "
					"than size of destination buffer")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize (__s) != (size_t) -1)
    return __fgetws_chk (__s, __glibc_objsize (__s) / sizeof (wchar_t),
			 __n, __stream);
  return __fgetws_alias (__s, __n, __stream);
}
__FORTIFY_FUNCTION_END

#ifdef __USE_GNU
extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s, size_t __size,
				       int __n, __FILE *__restrict __stream)
  __wur;
extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
			    (wchar_t *__restrict __s, int __n,
			     __FILE *__restrict __stream), fgetws_unlocked)
  __wur;

__fortify_potential_overload __wur wchar_t *
fgetws_unlocked (wchar_t *__restrict const __clang_pass_object_size __s,
		 int __n, __FILE *__restrict __stream)
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_IF (__fgetws_unlocked_warn,
			   __n > 0
			    && __bos_static_lt2 (__n, __s,
							   sizeof (wchar_t)),
			   "fgetws_unlocked called with bigger size than "
			   "length of destination buffer")
{
  if (__glibc_objsize (__s) != (size_t) -1)
    return __fgetws_unlocked_chk (__s, __glibc_objsize (__s) / sizeof (wchar_t),
				  __n, __stream);
  return __fgetws_unlocked_alias (__s, __n, __stream);
}
__FORTIFY_FUNCTION_END
#endif


extern size_t __wcrtomb_chk (char *__restrict __s, wchar_t __wchar,
			     mbstate_t *__restrict __p,
			     size_t __buflen) __THROW __wur;
extern size_t __REDIRECT_NTH (__wcrtomb_alias,
			      (char *__restrict __s, wchar_t __wchar,
			       mbstate_t *__restrict __ps), wcrtomb) __wur;

__fortify_potential_overload __wur size_t
__NTH (wcrtomb (char *__restrict const __clang_pass_object_size __s,
		wchar_t __wchar, mbstate_t *__restrict __ps))
{
  /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
     But this would only disturb the namespace.  So we define our own
     version here.  */
#define __WCHAR_MB_LEN_MAX	16
#if defined MB_LEN_MAX && MB_LEN_MAX != __WCHAR_MB_LEN_MAX
# error "Assumed value of MB_LEN_MAX wrong"
#endif
  if (__glibc_objsize (__s) != (size_t) -1
      && __WCHAR_MB_LEN_MAX > __glibc_objsize (__s))
    return __wcrtomb_chk (__s, __wchar, __ps, __glibc_objsize (__s));
  return __wcrtomb_alias (__s, __wchar, __ps);
}


extern size_t __mbsrtowcs_chk (wchar_t *__restrict __dst,
			       const char **__restrict __src,
			       size_t __len, mbstate_t *__restrict __ps,
			       size_t __dstlen) __THROW;
extern size_t __REDIRECT_NTH (__mbsrtowcs_alias,
			      (wchar_t *__restrict __dst,
			       const char **__restrict __src,
			       size_t __len, mbstate_t *__restrict __ps),
			      mbsrtowcs);

__fortify_potential_overload size_t
__NTH (mbsrtowcs (wchar_t *__restrict const __clang_pass_object_size __dst,
		  const char **__restrict __src, size_t __len,
		  mbstate_t *__restrict __ps))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS_LT2 (__mbsrtowcs_warn, __len, __dst,
					sizeof (wchar_t),
					"mbsrtowcs called with dst buffer "
					"smaller than len * sizeof (wchar_t)")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize (__dst) != (size_t) -1)
    return __mbsrtowcs_chk (__dst, __src, __len, __ps,
			    __glibc_objsize (__dst) / sizeof (wchar_t));
  return __mbsrtowcs_alias (__dst, __src, __len, __ps);
}
__FORTIFY_FUNCTION_END


extern size_t __wcsrtombs_chk (char *__restrict __dst,
			       const wchar_t **__restrict __src,
			       size_t __len, mbstate_t *__restrict __ps,
			       size_t __dstlen) __THROW;
extern size_t __REDIRECT_NTH (__wcsrtombs_alias,
			      (char *__restrict __dst,
			       const wchar_t **__restrict __src,
			       size_t __len, mbstate_t *__restrict __ps),
			      wcsrtombs);

__fortify_potential_overload size_t
__NTH (wcsrtombs (char *__restrict const __clang_pass_object_size __dst,
		  const wchar_t **__restrict __src, size_t __len,
		  mbstate_t *__restrict __ps))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS_LT (__wcsrtombs_warn, __len, __dst,
				       "wcsrtombs called with dst buffer "
				       "smaller than len")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize (__dst) != (size_t) -1)
    return __wcsrtombs_chk (__dst, __src, __len, __ps, __glibc_objsize (__dst));
  return __wcsrtombs_alias (__dst, __src, __len, __ps);
}
__FORTIFY_FUNCTION_END


#ifdef	__USE_XOPEN2K8
extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst,
				const char **__restrict __src, size_t __nmc,
				size_t __len, mbstate_t *__restrict __ps,
				size_t __dstlen) __THROW;
extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias,
			      (wchar_t *__restrict __dst,
			       const char **__restrict __src, size_t __nmc,
			       size_t __len, mbstate_t *__restrict __ps),
			      mbsnrtowcs);

__fortify_potential_overload size_t
__NTH (mbsnrtowcs (wchar_t *__restrict const __clang_pass_object_size __dst,
		   const char **__restrict __src, size_t __nmc, size_t __len,
		   mbstate_t *__restrict __ps))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS_LT (__mbsnrtowcs_warn,
				       sizeof (wchar_t) * __len, __dst,
				       "mbsnrtowcs called with dst buffer "
				       "smaller than len * sizeof (wchar_t)")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize (__dst) != (size_t) -1)
    return __mbsnrtowcs_chk (__dst, __src, __nmc, __len, __ps,
			     __glibc_objsize (__dst) / sizeof (wchar_t));
  return __mbsnrtowcs_alias (__dst, __src, __nmc, __len, __ps);
}
__FORTIFY_FUNCTION_END


extern size_t __wcsnrtombs_chk (char *__restrict __dst,
				const wchar_t **__restrict __src,
				size_t __nwc, size_t __len,
				mbstate_t *__restrict __ps, size_t __dstlen)
     __THROW;
extern size_t __REDIRECT_NTH (__wcsnrtombs_alias,
			      (char *__restrict __dst,
			       const wchar_t **__restrict __src,
			       size_t __nwc, size_t __len,
			       mbstate_t *__restrict __ps), wcsnrtombs);

__fortify_potential_overload size_t
__NTH (wcsnrtombs (char *__restrict const __clang_pass_object_size __dst,
		   const wchar_t **__restrict __src, size_t __nwc, size_t __len,
		   mbstate_t *__restrict __ps))
__FORTIFY_PRECONDITIONS
     __FORTIFY_WARNING_ONLY_IF_BOS_LT (__wcsnrtombs_warn, __len, __dst,
				       "wcsnrtombs called with dst buffer "
				       "smaller than len")
{
  if (__FORTIFY_CALL_CHK && __glibc_objsize (__dst) != (size_t) -1)
    return __wcsnrtombs_chk (__dst, __src, __nwc, __len, __ps,
			     __glibc_objsize (__dst));
  return __wcsnrtombs_alias (__dst, __src, __nwc, __len, __ps);
}
__FORTIFY_FUNCTION_END
#endif
