1 #pragma once
2 #include "glib.h"
3 /**
4 * @brief 拷贝整个字符串
5 *
6 * @param dst 目标地址
7 * @param src 源地址
8 * @return char* 目标字符串
9 */
10 char *strcpy(char *dst, const char *src);
11
12 //计算字符串的长度(经过测试,该版本比采用repne/scasb汇编的运行速度快16.8%左右)
strlen(const char * s)13 static inline int strlen(const char *s)
14 {
15 if (s == NULL)
16 return 0;
17 register int __res = 0;
18 while (s[__res] != '\0')
19 {
20 ++__res;
21 }
22 return __res;
23 }
24
25 /**
26 * @brief 测量字符串的长度
27 *
28 * @param src 字符串
29 * @param maxlen 最大长度
30 * @return long
31 */
32 long strnlen(const char *src, unsigned long maxlen);
33
34 /*
35 比较字符串 FirstPart and SecondPart
36 FirstPart = SecondPart => 0
37 FirstPart > SecondPart => 1
38 FirstPart < SecondPart => -1
39 */
40
41 int strcmp(const char *FirstPart, const char *SecondPart);
42
43 char *strncpy(char *dst, const char *src, long count);
44
45 long strncpy_from_user(char *dst, const char *src, unsigned long size);
46
47 /**
48 * @brief 测量来自用户空间的字符串的长度,会检验地址空间是否属于用户空间
49 * @param src
50 * @param maxlen
51 * @return long
52 */
53 long strnlen_user(const char *src, unsigned long maxlen);
54
55 /**
56 * @brief 逐字节比较指定内存区域的值,并返回s1、s2的第一个不相等的字节i处的差值(s1[i]-s2[i])。
57 * 若两块内存区域的内容相同,则返回0
58 *
59 * @param s1 内存区域1
60 * @param s2 内存区域2
61 * @param len 要比较的内存区域长度
62 * @return int s1、s2的第一个不相等的字节i处的差值(s1[i]-s2[i])。若两块内存区域的内容相同,则返回0
63 */
memcmp(const void * s1,const void * s2,size_t len)64 static inline int memcmp(const void *s1, const void *s2, size_t len)
65 {
66 int diff;
67
68 asm("cld \n\t" // 复位DF,确保s1、s2指针是自增的
69 "repz; cmpsb\n\t" CC_SET(nz)
70 : CC_OUT(nz)(diff), "+D"(s1), "+S"(s2)
71 : "c"(len)
72 : "memory");
73
74 if (diff)
75 diff = *(const unsigned char *)(s1 - 1) - *(const unsigned char *)(s2 - 1);
76
77 return diff;
78 }
79
80 /**
81 * @brief 拼接两个字符串(将src接到dest末尾)
82 *
83 * @param dest 目标串
84 * @param src 源串
85 * @return char*
86 */
87 char *strcat(char *dest, const char *src);