(root)/
glibc-2.38/
debug/
wcsncat_chk.c
       1  /* Copyright (C) 1995-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <wchar.h>
      19  
      20  
      21  /* Append no more than N wide-character of SRC onto DEST.  */
      22  wchar_t *
      23  __wcsncat_chk (wchar_t *dest, const wchar_t *src, size_t n, size_t destlen)
      24  {
      25    wchar_t c;
      26    wchar_t * const s = dest;
      27  
      28    /* Find the end of DEST.  */
      29    do
      30      {
      31        if (__glibc_unlikely (destlen-- == 0))
      32  	__chk_fail ();
      33        c = *dest++;
      34      }
      35    while (c != L'\0');
      36  
      37    /* Make DEST point before next character, so we can increment
      38       it while memory is read (wins on pipelined cpus).	*/
      39    ++destlen;
      40    dest -= 2;
      41  
      42    if (n >= 4)
      43      {
      44        size_t n4 = n >> 2;
      45        do
      46  	{
      47  	  if (__glibc_unlikely (destlen-- == 0))
      48  	    __chk_fail ();
      49  	  c = *src++;
      50  	  *++dest = c;
      51  	  if (c == L'\0')
      52  	    return s;
      53  	  if (__glibc_unlikely (destlen-- == 0))
      54  	    __chk_fail ();
      55  	  c = *src++;
      56  	  *++dest = c;
      57  	  if (c == L'\0')
      58  	    return s;
      59  	  if (__glibc_unlikely (destlen-- == 0))
      60  	    __chk_fail ();
      61  	  c = *src++;
      62  	  *++dest = c;
      63  	  if (c == L'\0')
      64  	    return s;
      65  	  if (__glibc_unlikely (destlen-- == 0))
      66  	    __chk_fail ();
      67  	  c = *src++;
      68  	  *++dest = c;
      69  	  if (c == L'\0')
      70  	    return s;
      71  	} while (--n4 > 0);
      72        n &= 3;
      73      }
      74  
      75    while (n > 0)
      76      {
      77        if (__glibc_unlikely (destlen-- == 0))
      78  	__chk_fail ();
      79        c = *src++;
      80        *++dest = c;
      81        if (c == L'\0')
      82  	return s;
      83        n--;
      84      }
      85  
      86    if (c != L'\0')
      87      {
      88        if (__glibc_unlikely (destlen-- == 0))
      89  	__chk_fail ();
      90        *++dest = L'\0';
      91      }
      92  
      93    return s;
      94  }