(linenum→info "unix/slp.c:2238")

glibc/2.7/debug/wcsncat_chk.c

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