1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <string.h>
20: #include <memcopy.h>
21:
22:
23: char *
24: __strncpy_chk (s1, s2, n, s1len)
25: char *s1;
26: const char *s2;
27: size_t n;
28: size_t s1len;
29: {
30: reg_char c;
31: char *s = s1;
32:
33: if (__builtin_expect (s1len < n, 0))
34: __chk_fail ();
35:
36: --s1;
37:
38: if (n >= 4)
39: {
40: size_t n4 = n >> 2;
41:
42: for (;;)
43: {
44: c = *s2++;
45: *++s1 = c;
46: if (c == '\0')
47: break;
48: c = *s2++;
49: *++s1 = c;
50: if (c == '\0')
51: break;
52: c = *s2++;
53: *++s1 = c;
54: if (c == '\0')
55: break;
56: c = *s2++;
57: *++s1 = c;
58: if (c == '\0')
59: break;
60: if (--n4 == 0)
61: goto last_chars;
62: }
63: n = n - (s1 - s) - 1;
64: if (n == 0)
65: return s;
66: goto zero_fill;
67: }
68:
69: last_chars:
70: n &= 3;
71: if (n == 0)
72: return s;
73:
74: do
75: {
76: c = *s2++;
77: *++s1 = c;
78: if (--n == 0)
79: return s;
80: }
81: while (c != '\0');
82:
83: zero_fill:
84: do
85: *++s1 = '\0';
86: while (--n > 0);
87:
88: return s;
89: }