4221
|
1 /* Copyright (C) 1993, 1995-1997, 2002-2003 Free Software Foundation, Inc. |
|
2 |
|
3 NOTE: The canonical source of this file is maintained with the GNU C Library. |
|
4 Bugs can be reported to bug-glibc@gnu.org. |
|
5 |
|
6 This program is free software; you can redistribute it and/or modify it |
|
7 under the terms of the GNU General Public License as published by the |
|
8 Free Software Foundation; either version 2, or (at your option) any |
|
9 later version. |
|
10 |
|
11 This program is distributed in the hope that it will be useful, |
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
14 GNU General Public License for more details. |
|
15 |
|
16 You should have received a copy of the GNU General Public License |
|
17 along with this program; if not, write to the Free Software |
|
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
|
19 USA. */ |
|
20 |
|
21 /* This is almost copied from strncpy.c, written by Torbjorn Granlund. */ |
|
22 |
|
23 #ifdef HAVE_CONFIG_H |
|
24 # include <config.h> |
|
25 #endif |
|
26 |
|
27 /* Specification. */ |
|
28 #include "stpncpy.h" |
|
29 |
|
30 #ifdef _LIBC |
|
31 # include <string.h> |
|
32 #else |
|
33 # include <sys/types.h> |
|
34 #endif |
|
35 |
|
36 #ifndef weak_alias |
|
37 # define __stpncpy stpncpy |
|
38 #endif |
|
39 |
|
40 /* Copy no more than N characters of SRC to DEST, returning the address of |
|
41 the terminating '\0' in DEST, if any, or else DEST + N. */ |
|
42 char * |
|
43 __stpncpy (char *dest, const char *src, size_t n) |
|
44 { |
|
45 char c; |
|
46 char *s = dest; |
|
47 |
|
48 if (n >= 4) |
|
49 { |
|
50 size_t n4 = n >> 2; |
|
51 |
|
52 for (;;) |
|
53 { |
|
54 c = *src++; |
|
55 *dest++ = c; |
|
56 if (c == '\0') |
|
57 break; |
|
58 c = *src++; |
|
59 *dest++ = c; |
|
60 if (c == '\0') |
|
61 break; |
|
62 c = *src++; |
|
63 *dest++ = c; |
|
64 if (c == '\0') |
|
65 break; |
|
66 c = *src++; |
|
67 *dest++ = c; |
|
68 if (c == '\0') |
|
69 break; |
|
70 if (--n4 == 0) |
|
71 goto last_chars; |
|
72 } |
|
73 n -= dest - s; |
|
74 goto zero_fill; |
|
75 } |
|
76 |
|
77 last_chars: |
|
78 n &= 3; |
|
79 if (n == 0) |
|
80 return dest; |
|
81 |
|
82 for (;;) |
|
83 { |
|
84 c = *src++; |
|
85 --n; |
|
86 *dest++ = c; |
|
87 if (c == '\0') |
|
88 break; |
|
89 if (n == 0) |
|
90 return dest; |
|
91 } |
|
92 |
|
93 zero_fill: |
|
94 while (n-- > 0) |
|
95 dest[n] = '\0'; |
|
96 |
|
97 return dest - 1; |
|
98 } |
|
99 #ifdef weak_alias |
|
100 weak_alias (__stpncpy, stpncpy) |
|
101 #endif |