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