xref: /DragonOS/kernel/src/libs/string.c (revision 4fda81ce81939d83b74c8042d6fb4223deff3685)
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 }