blob: b105183dfe1d167bd5d40dcdb5894ebbda656b44 [file] [log] [blame]
xiaohu.huang1fd6f112022-05-24 11:02:05 +08001/*
2 * Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7#include "aml_strncpy.h"
8
9char *strncpy(char *dest, const char *src, size_t n)
10{
11 char c;
12 char *s = dest;
13
14 --dest;
15 if (n >= 4) {
16 size_t n4 = n >> 2;
17
18 for (;;) {
19 c = *src++;
20 *++dest = c;
21 if (c == '\0')
22 break;
23 c = *src++;
24 *++dest = c;
25 if (c == '\0')
26 break;
27 c = *src++;
28 *++dest = c;
29 if (c == '\0')
30 break;
31 c = *src++;
32 *++dest = c;
33 if (c == '\0')
34 break;
35 if (--n4 == 0)
36 goto last_chars;
37 }
38 n = n - (dest - s) - 1;
39 if (n == 0)
40 return s;
41 goto zero_fill;
42 }
43
44last_chars:
45 n &= 3;
46 if (n == 0)
47 return s;
48
49 do {
50 c = *src++;
51 *++dest = c;
52 if (--n == 0)
53 return s;
54 } while (c != '\0');
55
56zero_fill:
57 do
58 *++dest = '\0';
59 while (--n > 0);
60
61 return s;
62}