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 }