xref: /DragonOS/kernel/src/libs/string.c (revision 338f6903262c5031abad3c8e361813355a27fcdb)
1 #include <common/string.h>
2 #include <common/glib.h>
3 
4 /**
5  * @brief 拷贝整个字符串
6  *
7  * @param dst 目标地址
8  * @param src 源地址
9  * @return char* 目标字符串
10  */
11 char *strcpy(char *dst, const char *src)
12 {
13     while (*src)
14     {
15         *(dst++) = *(src++);
16     }
17     *dst = 0;
18 
19     return dst;
20 }
21 
22 long strnlen(const char *src, unsigned long maxlen)
23 {
24 
25     if (src == NULL)
26         return 0;
27     register int __res = 0;
28     while (src[__res] != '\0' && __res < maxlen)
29     {
30         ++__res;
31     }
32     return __res;
33 }
34 
35 /*
36         比较字符串 FirstPart and SecondPart
37         FirstPart = SecondPart =>  0
38         FirstPart > SecondPart =>  1
39         FirstPart < SecondPart => -1
40 */
41 int strcmp(const char *l, const char *r)
42 {
43     for (; *l == *r && *l; l++, r++)
44         ;
45     return *(unsigned char *)l - *(unsigned char *)r;
46 }
47 
48 char *__stpncpy(char *restrict d, const char *restrict s, size_t n)
49 {
50 
51     for (; n && (*d = *s); n--, s++, d++)
52         ;
53 tail:
54     memset(d, 0, n);
55     return d;
56 }
57 
58 char *strncpy(char *restrict d, const char *restrict s, size_t n)
59 {
60     __stpncpy(d, s, n);
61     return d;
62 }
63 
64 long strncpy_from_user(char *dst, const char *src, unsigned long size)
65 {
66     if (!verify_area((uint64_t)src, size))
67         return 0;
68 
69     strncpy(dst, src, size);
70     return size;
71 }
72 
73 /**
74  * @brief 测量来自用户空间的字符串的长度,会检验地址空间是否属于用户空间
75  * @param src
76  * @param maxlen
77  * @return long
78  */
79 long strnlen_user(const char *src, unsigned long maxlen)
80 {
81 
82     unsigned long size = strlen(src);
83     // 地址不合法
84     if (!verify_area((uint64_t)src, size))
85         return 0;
86 
87     return size <= maxlen ? size : maxlen;
88 }
89 
90 /**
91  * @brief 拼接两个字符串(将src接到dest末尾)
92  *
93  * @param dest 目标串
94  * @param src 源串
95  * @return char*
96  */
97 char *strcat(char *dest, const char *src)
98 {
99     strcpy(dest + strlen(dest), src);
100     return dest;
101 }