xiaohu.huang | 1fd6f11 | 2022-05-24 11:02:05 +0800 | [diff] [blame] | 1 | /* |
2 | * Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved. | ||||
3 | * | ||||
4 | * SPDX-License-Identifier: MIT | ||||
5 | */ | ||||
6 | |||||
7 | #include "aml_strncpy.h" | ||||
8 | |||||
9 | char *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 | |||||
44 | last_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 | |||||
56 | zero_fill: | ||||
57 | do | ||||
58 | *++dest = '\0'; | ||||
59 | while (--n > 0); | ||||
60 | |||||
61 | return s; | ||||
62 | } |