acl  3.5.3.0
acl_mystring.h
浏览该文件的文档.
1 #ifndef ACL_MYSTRING_INCLUDE_H
2 #define ACL_MYSTRING_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 
10 #include <string.h>
11 
12 /**
13  * 功能: 安全的字符串拷贝宏函数, 可以保证最后一个字节为 "\0"
14  * @param _obj {char*} 目的内存区指针
15  * @param _src {const char*} 源字符串指针
16  * @param _size {int} 目的内存区的空间大小
17  */
18 #ifndef ACL_SAFE_STRNCPY
19 #define ACL_SAFE_STRNCPY(_obj, _src, _size) do { \
20  if (_size > 0) { \
21  size_t _n = strlen(_src); \
22  _n = _n > (size_t ) _size - 1? (size_t) _size - 1 : _n; \
23  memcpy(_obj, _src, _n); \
24  _obj[_n] = 0; \
25  } \
26 } while (0)
27 #endif
28 
29 /**
30  * 将字符串转换为小写,直接在原内存空间进行操作
31  * @param s {char *} 给定的字符串
32  * @return {char*} 成功返回字符串地址,否则返回 NULL
33  */
34 ACL_API char *acl_lowercase(char *s);
35 
36 /**
37  * 将给定字符串的前 n 个字节转换为小写
38  * @param s {char *} 给定的字符串
39  * @param n {int} 最多仅转换的字节数
40  * @return {char*} 成功返回字符串地址,否则返回 NULL
41  */
42 ACL_API char *acl_lowercase2(char *s, size_t n);
43 
44 /**
45  * 将给定字符串转换为小写,结果存储于另一个内存区内
46  * @param s {const char*} 源字符串
47  * @param buf {char*} 存储转换结果的内存指针
48  * @param size {size_t} buf 的空间大小
49  * @return {char*} 成功返回字符串地址,否则返回 NULL
50  */
51 ACL_API char *acl_lowercase3(const char *s, char *buf, size_t size);
52 
53 /**
54  * 将字符串转换为大写,直接在原内存空间进行操作
55  * @param s {char *} 给定的字符串
56  * @return {char*} 成功返回字符串地址,否则返回 NULL
57  */
58 ACL_API char *acl_uppercase(char *s);
59 
60 /**
61  * 将字符串转换为大写,直接在原内存空间进行操作, 最大转换长度有限制
62  * @param s {char *} 给定的字符串
63  * @param n {int} 最多仅转换的字节数
64  * @return {char*} 成功返回字符串地址,否则返回 NULL
65  */
66 ACL_API char *acl_uppercase2(char *s, size_t n);
67 
68 /**
69  * 将给定字符串的前 n 个字节转换为大写
70  * @param s {char *} 给定的字符串
71  * @param buf {char*} 存储转换结果的内存区
72  * @param size {size_t} buf 的空间大小(字节)
73  * @return {char*} 成功返回字符串地址,否则返回 NULL
74  */
75 ACL_API char *acl_uppercase3(const char *s, char *buf, size_t size);
76 
77 /**
78  * 将给定字符串用另一个分隔符字符串进行分割
79  * @param src {char**} 需要被分割的字符串的地址的指针,必须是非空指针,
80  * 可以是空字符串,此时该函数返回 NULL
81  * @param sep {const char*} 分隔符,非空字符串
82  * @return {char*} 当前被分割的字符串的指针位置,src 指向下一个将要进行
83  * 分隔的起始位置;
84  * 1)当返回 NULL 时,则表示分隔过程结束,此时 src 的指针位置被赋予 '\0';
85  * 2)当返回非 NULL 时,则此时 src 指向的字符串可能是或不是空字符串,
86  * 如果指向空字符串,则再次分隔时函数肯定能返回 NULL,否则,当再次分隔时
87  * 函数返回非 NULL 指针
88  * 举例: 源字符串:"abcd=|efg=|hijk", 分隔符 "=|",则第一次分隔后
89  * src 将指向 "efg",而返回的地址为 "abcd"
90  */
91 ACL_API char *acl_strtok(char **src, const char *sep);
92 #define acl_mystrtok acl_strtok
93 
94 /**
95  * 获得一个逻辑行, 如果某行的尾部由连接符 "\\" 连接,则将下一行合并至本行,
96  * 同时将一行字符串中的以及转义字符回车换行("\r\n" or "\n")去掉
97  * @param src {char**} 源字符串的地址指针
98  * @return {char*} 返回一行数据, 如果返回空则表示没有可用的逻辑行
99  */
100 ACL_API char *acl_strline(char **src);
101 #define acl_mystrline acl_strline
102 
103 /**
104  * 去掉给定字符串中的 " ", "\t"
105  * @param str {char*} 源字符串
106  * @return {char*} 与源字符串相同的地址
107  */
108 ACL_API char *acl_strtrim(char *str);
109 #define acl_mystr_trim acl_strtrim
110 
111 /**
112  * 从源字符串中去掉给定字符串
113  * @param haystack {const char*} 源字符串
114  * @param needle {const char*} 需要从源字符串中被整体去掉的字符串
115  * @param buf {char*} 存储结果的内存开始位置
116  * @param bsize {int} buf 的空间大小
117  * @return {int} 拷贝至 buf 中的字符串长度
118  */
119 ACL_API int acl_strstrip(const char *haystack, const char *needle,
120  char *buf, int bsize);
121 #define acl_mystr_strip acl_strstrip
122 
123 /**
124  * 从源字符串中找到一行的结束位置并去掉包含回车换行符及其以后的字符串
125  * @param str {char*} 源字符串
126  * @return {int} 0 表示成功,-1表示失败, 也许应该返回最后转换结果的长度!
127  */
128 ACL_API int acl_strtrunc_byln(char *str);
129 #define acl_mystr_truncate_byln acl_strtrunc_byln
130 
131 /**
132  * 从后向前比较两个给定字符串,大小写不敏感且限定最大比较范围
133  * @param s1 {const char*} 字符串地址
134  * @param s2 {const char*} 字符串地址
135  * @param n {size_t} 最大比较范围
136  * @return {int} 比较结果. 0: 相等, >0: 第一个字符串大于第二个字符串,
137  * < 0: 第一个字符串小第二个字符串
138  */
139 ACL_API int acl_strrncasecmp(const char *s1, const char *s2, size_t n);
140 
141 /**
142  * 从后向前比较两个给定字符串, 大小写敏感且限定最大比较范围
143  * @param s1 {const char*} 字符串地址
144  * @param s2 {const char*} 字符串地址
145  * @param n {size_t} 最大比较范围
146  * @return {int} 比较结果. 0: 相等, >0: 第一个字符串大于第二个字符串,
147  * < 0: 第一个字符串小第二个字符串
148  */
149 ACL_API int acl_strrncmp(const char *s1, const char *s2, size_t n);
150 
151 /**
152  * 从后向前扫描查找字符串,大小写敏感
153  * @param haystack {char *} 源字符串
154  * @param needle {const char *} 匹配查找的字符串
155  * @return {char *} != NULL: Ok, NULL: 未发现
156  */
157 ACL_API char *acl_rstrstr(const char *haystack, const char *needle);
158 
159 /**
160  * 从前向后扫描查找字符串,大小写不敏感
161  * @param haystack {const char *} 源字符串
162  * @param needle {const char *} 匹配查找的字符串
163  * @return {char *} != NULL: Ok, NULL: 未发现
164  */
165 ACL_API char *acl_strcasestr(const char *haystack, const char *needle);
166 
167 /**
168  * 从后向前扫描查找字符串,大小写不敏感
169  * @param haystack {char *} 源字符串
170  * @param needle {const char *} 匹配查找的字符串
171  * @return {char *} != NULL: Ok, NULL: 未发现
172  */
173 ACL_API char *acl_rstrcasestr(const char *haystack, const char *needle);
174 
175 /**
176  * 计算给定字符串的长度,但限制了最大计算长度,以免产生越界现象,要比 strlen
177  * 安全,如,如果给定字符串没有以 "\0" 结尾,则该函数就不会产生越界
178  * @param s {const char*} 字符串
179  * @param count {size_t} 最大计算长度
180  * @return {size_t} 字符串 s 的实际长度
181  */
182 ACL_API size_t acl_strnlen(const char * s, size_t count);
183 
184 /**
185  * 比较两个字符串是否相同,大小写不敏感
186  * @param s1 {const char*}
187  * @param s2 {cosnt char*}
188  * @return {int} 0: 相同; < 0: s1 < s2; > 0: s1 > s2
189  */
190 ACL_API int acl_strcasecmp(const char *s1, const char *s2);
191 
192 /**
193  * 比较两个字符串是否相同,大小写不敏感,同时限定最大比较长度
194  * @param s1 {const char*}
195  * @param s2 {cosnt char*}
196  * @param n {size_t} 限定比较的最大长度
197  * @return {int} 0: 相同; < 0: s1 < s2; > 0: s1 > s2
198  */
199 ACL_API int acl_strncasecmp(const char *s1, const char *s2, size_t n);
200 /**
201  * WINDOWS下不支持一些字符串比较函数
202  */
203 #if defined(_WIN32) || defined(_WIN64)
204 # ifndef strcasestr
205 # define strcasestr acl_strcasestr
206 # endif
207 # ifndef strcasecmp
208 # define strcasecmp acl_strcasecmp
209 # endif
210 # ifndef strncasecmp
211 # define strncasecmp acl_strncasecmp
212 # endif
213 #endif
214 
215 #ifndef strrncasecmp
216 # define strrncasecmp acl_strrncasecmp
217 #endif
218 #ifndef strrncmp
219 # define strrncmp acl_strrncmp
220 #endif
221 
222 /*----------------------------------------------------------------------------
223  * 保证结果类似于如下形式:
224  * /home/avwall/test.txt
225  * @param psrc_file_path {const char*} 源字符串
226  * @param pbuf {char*} 存储结果的内存区
227  * @param sizeb {int} pbuf 的空间大小
228  * @return {int} 0 成功,-1失败
229  */
230 ACL_API int acl_file_path_correct(const char *psrc_file_path,
231  char *pbuf, int sizeb);
232 
233 /*----------------------------------------------------------------------------
234  * 保证路径名经过此函数后都为如下格式:
235  * 源: /home/avwall/, /home//////avwall/, /home/avwall, /////home/avwall///
236  * /home/avwall////, /home///avwall///, ///home///avwall///
237  * 结果: /home/avwall/
238  * @param psrc_dir {const char*} 源字符串
239  * @param pbuf {char*} 存储结果的内存区
240  * @param sizeb {int} pbuf 的空间大小
241  * @return {int} 0 表示成功,-1表示失败
242  */
243 ACL_API int acl_dir_correct(const char *psrc_dir, char *pbuf, int sizeb);
244 
245 /*----------------------------------------------------------------------------
246  * 从类似: /home/avwall/log.txt 中提取 /home/avwall/ 作为结果返回
247  * @param pathname {const char*} 源字符串
248  * @param pbuf {char*} 存储结果的内存区
249  * @param bsize {int} pbuf 的空间大小
250  * @return {int} 0 成功,-1失败
251  */
252 ACL_API int acl_dir_getpath(const char *pathname, char *pbuf, int bsize);
253 
254 /**
255  * 将数据字符串转换为64位有符号长整型
256  * @param s {const char*} 字符串指针
257  * @return {long long} 有符号长整型
258  */
259 ACL_API long long acl_atoll(const char *s);
260 
261 /**
262  * 将数据字符串转换为64位无符号长整型
263  * @param str {const char*} 字符串指针
264  * @return {acl_uint64} 无符号长整型
265  */
266 ACL_API acl_uint64 acl_atoui64(const char *str);
267 
268 /**
269 * 将数据字符串转换为64位符号长整型
270 * @param str {const char*} 字符串指针
271 * @return {acl_int64} 无符号长整型
272 */
273 ACL_API acl_int64 acl_atoi64(const char *str);
274 
275 /**
276  * 将64位无符号长整型转换为字符串
277  * @param value {acl_uint64} 64位无符号长整型
278  * @param buf {char*} 用来存取转换结果的内存空间
279  * @param size {sizt_t} buf 的空间大小,其中要求其最小为21个字节
280  * @return {const char*} 转换的结果,如果转换成功则不为空,否则为空
281  */
282 ACL_API const char *acl_ui64toa(acl_uint64 value, char *buf, size_t size);
283 
284 /**
285  * 将64位符号长整型转换为字符串
286  * @param value {acl_int64} 64位符号长整型
287  * @param buf {char*} 用来存取转换结果的内存空间
288  * @param size {sizt_t} buf 的空间大小,其中要求其最小为21个字节
289  * @return {const char*} 转换的结果,如果转换成功则不为空,否则为空
290  */
291 ACL_API const char *acl_i64toa(acl_int64 value, char *buf, size_t size);
292 
293 /**
294  * 将64位符号长整型转换为某进制的字符串
295  * @param value {acl_int64} 64位符号长整型
296  * @param buf {char*} 用来存取转换结果的内存空间
297  * @param size {sizt_t} buf 的空间大小,其中要求其最小为21个字节
298  * @param radix {int} 进制, 如: 8 表示八进制, 10 表示十进制, 16 表示十六进制
299  * @return {const char*} 转换的结果,如果转换成功则不为空,否则为空
300  */
301 ACL_API const char *acl_i64toa_radix(acl_int64 value, char *buf,
302  size_t size, int radix);
303 
304 /**
305  * 将64位无符号长整型转换为某进制的字符串
306  * @param value {acl_int64} 64位符号长整型
307  * @param buf {char*} 用来存取转换结果的内存空间
308  * @param size {sizt_t} buf 的空间大小,其中要求其最小为21个字节
309  * @param radix {int} 进制, 如: 8 表示八进制, 10 表示十进制, 16 表示十六进制
310  * @return {const char*} 转换的结果,如果转换成功则不为空,否则为空
311  */
312 ACL_API const char *acl_ui64toa_radix(acl_uint64 value, char *buf,
313  size_t size, int radix);
314 
315 /*--------------------------------------------------------------------------*/
316 
317 typedef struct ACL_LINE_STATE {
318  int offset; /* 解析器的当前偏移量 */
319  char finish; /* 是否成功找到了一个空行 */
320  char last_ch; /* 解析器存放的最后一个字符 */
321  char last_lf; /* 解析器上一个字符是否为换行符 LF */
323 
324 /**
325  * 分配一个 ACL_LINE_STATE 对象用作 acl_find_blank_line 函数的参数
326  * @return {ACL_LINE_STATE*} 永远返回非空指针
327  */
328 ACL_API ACL_LINE_STATE *acl_line_state_alloc(void);
329 
330 /**
331  * 释放由 acl_line_state_alloc 分配的 ACL_LINE_STATE 对象
332  * @param state {ACL_LINE_STATE*} 非空 ACL_LINE_STATE 对象
333  */
334 ACL_API void acl_line_state_free(ACL_LINE_STATE *state);
335 
336 /**
337  * 重置 ACL_LINE_STATE 对象的状态
338  * @param state {ACL_LINE_STATE*} 由 acl_line_state_alloc 动态分配的对象或者
339  * 栈变量或直接调用 malloc 或其它内存池分配的对象,但只有 acl_line_state_alloc
340  * 分配的对象才可以使用 acl_line_state_free 释放
341  * @param offset {int} 设置 ACL_LINE_STATE 对象中 offset 的初始值
342  * @return {ACL_LINE_STATE*} 传入的 state 对象指针
343  */
344 ACL_API ACL_LINE_STATE *acl_line_state_reset(ACL_LINE_STATE *state, int offset);
345 
346 /**
347  * 从所给数据缓冲区中查找一个空行(空行可以为: \r\n 或 \n),该函数支持流式
348  * 解析,可以循环调用本函数
349  * @param s {const char*} 传入数据缓冲区地址
350  * @param n {int} s 数据缓冲区的长度
351  * @param state {ACL_LINE_STATE*} 由 acl_line_state_alloc 分配的对象
352  * @return {int} 剩余的的字节数
353  */
354 ACL_API int acl_find_blank_line(const char *s, int n, ACL_LINE_STATE *state);
355 
356 /*--------------------------------------------------------------------------*/
357 
358 #ifdef __cplusplus
359 }
360 #endif
361 
362 #endif
ACL_API char * acl_lowercase3(const char *s, char *buf, size_t size)
ACL_API int acl_file_path_correct(const char *psrc_file_path, char *pbuf, int sizeb)
ACL_API int acl_strstrip(const char *haystack, const char *needle, char *buf, int bsize)
ACL_API int acl_strcasecmp(const char *s1, const char *s2)
ACL_API int acl_strtrunc_byln(char *str)
ACL_API acl_uint64 acl_atoui64(const char *str)
ACL_API char * acl_strline(char **src)
ACL_API int acl_dir_correct(const char *psrc_dir, char *pbuf, int sizeb)
ACL_API char * acl_lowercase(char *s)
ACL_API const char * acl_ui64toa(acl_uint64 value, char *buf, size_t size)
ACL_API void acl_line_state_free(ACL_LINE_STATE *state)
ACL_API int acl_strncasecmp(const char *s1, const char *s2, size_t n)
ACL_API ACL_LINE_STATE * acl_line_state_alloc(void)
ACL_API ACL_LINE_STATE * acl_line_state_reset(ACL_LINE_STATE *state, int offset)
ACL_API const char * acl_ui64toa_radix(acl_uint64 value, char *buf, size_t size, int radix)
ACL_API long long acl_atoll(const char *s)
ACL_API const char * acl_i64toa_radix(acl_int64 value, char *buf, size_t size, int radix)
ACL_API char * acl_rstrcasestr(const char *haystack, const char *needle)
ACL_API char * acl_lowercase2(char *s, size_t n)
ACL_API char * acl_uppercase3(const char *s, char *buf, size_t size)
ACL_API int acl_dir_getpath(const char *pathname, char *pbuf, int bsize)
struct ACL_LINE_STATE ACL_LINE_STATE
ACL_API char * acl_strcasestr(const char *haystack, const char *needle)
ACL_API char * acl_uppercase2(char *s, size_t n)
ACL_API size_t acl_strnlen(const char *s, size_t count)
ACL_API int acl_find_blank_line(const char *s, int n, ACL_LINE_STATE *state)
ACL_API char * acl_strtrim(char *str)
ACL_API char * acl_strtok(char **src, const char *sep)
ACL_API acl_int64 acl_atoi64(const char *str)
ACL_API int acl_strrncasecmp(const char *s1, const char *s2, size_t n)
ACL_API int acl_strrncmp(const char *s1, const char *s2, size_t n)
ACL_API const char * acl_i64toa(acl_int64 value, char *buf, size_t size)
ACL_API char * acl_uppercase(char *s)
ACL_API char * acl_rstrstr(const char *haystack, const char *needle)