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 */
strcpy(char * dst,const char * src)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
strnlen(const char * src,unsigned long maxlen)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 */
strcmp(const char * l,const char * r)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
__stpncpy(char * restrict d,const char * restrict s,size_t n)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
strncpy(char * restrict d,const char * restrict s,size_t n)58 char *strncpy(char *restrict d, const char *restrict s, size_t n)
59 {
60 __stpncpy(d, s, n);
61 return d;
62 }
63
strncpy_from_user(char * dst,const char * src,unsigned long size)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 */
strnlen_user(const char * src,unsigned long maxlen)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 */
strcat(char * dest,const char * src)97 char *strcat(char *dest, const char *src)
98 {
99 strcpy(dest + strlen(dest), src);
100 return dest;
101 }