
1: /* Copyright (C) 1993,1995,1996,1997,2002,2005 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, write to the Free 16: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17: 02111-1307 USA. */ 18: 19: /* This is almost copied from strncpy.c, written by Torbjorn Granlund. */ 20: 21: #include <string.h> 22: 23: 24: /* Copy no more than N characters of SRC to DEST, returning the address of 25: the terminating '\0' in DEST, if any, or else DEST + N. */ 26: char * 27: __stpncpy_chk (char *dest, const char *src, size_t n, size_t destlen) 28: { 29: char c; 30: char *s = dest; 31: 32: if (__builtin_expect (destlen < n, 0)) 33: __chk_fail (); 34: 35: if (n >= 4) 36: { 37: size_t n4 = n >> 2; 38: 39: for (;;) 40: { 41: c = *src++; 42: *dest++ = c; 43: if (c == '\0') 44: break; 45: c = *src++; 46: *dest++ = c; 47: if (c == '\0') 48: break; 49: c = *src++; 50: *dest++ = c; 51: if (c == '\0') 52: break; 53: c = *src++; 54: *dest++ = c; 55: if (c == '\0') 56: break; 57: if (--n4 == 0) 58: goto last_chars; 59: } 60: n -= dest - s; 61: goto zero_fill; 62: } 63: 64: last_chars: 65: n &= 3; 66: if (n == 0) 67: return dest; 68: 69: for (;;) 70: { 71: c = *src++; 72: --n; 73: *dest++ = c; 74: if (c == '\0') 75: break; 76: if (n == 0) 77: return dest; 78: } 79: 80: zero_fill: 81: while (n-- > 0) 82: dest[n] = '\0'; 83: 84: return dest - 1; 85: }