acl  3.5.3.0
acl_vstring.h
浏览该文件的文档.
1 #ifndef ACL_VSTRING_INCLUDE_H
2 #define ACL_VSTRING_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "acl_define.h"
9 #include <stdarg.h>
10 #include "acl_vbuf.h"
11 #include "acl_dbuf_pool.h"
12 #include "acl_slice.h"
13 
14 /**
15  * 封装了 ACL_VBUF,ACL_VSTRING 结构类型定义
16  */
17 typedef struct ACL_VSTRING {
21  ssize_t maxlen;
22 } ACL_VSTRING;
23 
24 /**
25  * 初始化 ACL_VSTRING 结构并指定缺省的缓冲区大小,当用户在自己的函数或
26  * 内部以 ACL_VSTRING str 方式(非动态分配方式)使用时需要用此函数进行初始化,
27  * 另外,必须用 acl_vstring_free_buf 方式来释放由该函数分配的内部缓冲区
28  * @param vp {ACL_VSTRING*} 对象地址,不能为空
29  * @param len {size_t} 初始时缓冲区大小
30  */
31 ACL_API void acl_vstring_init(ACL_VSTRING *vp, size_t len);
32 
33 /**
34  * 当以 acl_vstring_init 初始化 ACL_VSTRING 对象时需要调用此函数释放缓冲区内存
35  * @param vp {ACL_VSTRING*} 对象地址,不能为空
36  */
37 ACL_API void acl_vstring_free_buf(ACL_VSTRING *vp);
38 
39 /**
40  * 动态分配一个 ACL_VSTRING 对象并指定内部缓冲区的初始化大小
41  * @param len {size_t} 初始时缓冲区大小
42  * @return {ACL_VSTRING*} 新分配的 ACL_VSTRING 对象
43  */
44 ACL_API ACL_VSTRING *acl_vstring_alloc(size_t len);
45 
46 /**
47  * 动态分配一个 ACL_VSTRING 对象并指定内部缓冲区的初始化大小,
48  * 同时指定内存池对象,优化内存分配
49  * @param slice {ACL_SLICE_POOL*} 切片内存池管理对象
50  * @param len {size_t} 初始时缓冲区大小
51  * @return {ACL_VSTRING*} 新分配的 ACL_VSTRING 对象
52  */
53 ACL_API ACL_VSTRING *acl_vstring_slice_alloc(ACL_SLICE_POOL *slice, size_t len);
54 
55 /**
56  * 动态分配一个 ACL_VSTRING 对象并指定内部缓冲区的初始化大小,
57  * 同时指定内存池对象,优化内存分配
58  * @param len {size_t} 初始时缓冲区大小
59  * @return {ACL_VSTRING*} 新分配的 ACL_VSTRING 对象
60  */
61 ACL_API ACL_VSTRING *acl_vstring_dbuf_alloc(ACL_DBUF_POOL *dbuf, size_t len);
62 
63 /**
64  * 采用内存映射文件方式分配内存时,调用此函数创建 ACL_VSTRING 动态缓冲区对象
65  * @param fd {ACL_FILE_HANDLE} 有效的文件句柄
66  * @param max_len {ssize_t} 所映射的最大内存大小
67  * @param init_len {ssize_t} 初始化时的内存映射大小
68  * @return {ACL_VSTRING*} 新创建的 ACL_VSTRING 对象
69  */
70 ACL_API ACL_VSTRING *acl_vstring_mmap_alloc(ACL_FILE_HANDLE fd,
71  ssize_t max_len, ssize_t init_len);
72 
73 /**
74  * 设置 ACL_VSTRING 对象的属性, 目前该函数的功能还不够完善
75  * @param vp {ACL_VSTRING*}
76  * @param ... 由 ACL_VSTRING_CTL_XXX 表示的控制参数,结束标志为
77  * ACL_VSTRING_CTL_END
78  */
79 ACL_API void acl_vstring_ctl(ACL_VSTRING *vp,...);
80 
81 #define ACL_VSTRING_CTL_MAXLEN 1
82 #define ACL_VSTRING_CTL_END 0
83 
84 /**
85  * 将缓冲区内的数据截短至指定长度,同时保证缓冲区数据以 '\0' 结尾
86  * @param vp {ACL_VSTRING*}
87  * @param len {size_t} 截短后的长度
88  * @return {ACL_VSTRING*} 与 vp 相同
89  */
90 ACL_API ACL_VSTRING *acl_vstring_truncate(ACL_VSTRING *vp, size_t len);
91 
92 /**
93  * 释放由 acl_vstring_alloc 动态分配的 ACL_VSTRING 对象
94  * @param vp {ACL_VSTRING*}
95  */
96 ACL_API void acl_vstring_free(ACL_VSTRING *vp);
97 
98 /**
99  * 拷贝字符串
100  * @param vp {ACL_VSTRING*}
101  * @param src {const char*} 源字符串
102  * @return {ACL_VSTRING*} 与 vp 相同
103  */
104 ACL_API ACL_VSTRING *acl_vstring_strcpy(ACL_VSTRING *vp, const char *src);
105 
106 /**
107  * 拷贝字符串,但不得超过规定长度限制
108  * @param vp {ACL_VSTRING*}
109  * @param src {const char*} 源字符串
110  * @param len {size_t} 规定长度限制
111  * @return {ACL_VSTRING*} 与 vp 相同
112  */
114  const char *src, size_t len);
115 
116 /**
117  * 附加拷贝字符串
118  * @param vp {ACL_VSTRING*}
119  * @param src {const char*} 源字符串
120  * @return {ACL_VSTRING*} 与 vp 相同
121  */
122 ACL_API ACL_VSTRING *acl_vstring_strcat(ACL_VSTRING *vp, const char *src);
123 
124 /**
125  * 附加拷贝字符串,但不得超过规定长度限制
126  * @param vp {ACL_VSTRING*}
127  * @param src {const char*} 源字符串
128  * @param len {size_t} 规定长度限制
129  * @return {ACL_VSTRING*} 与 vp 相同
130  */
132  const char *src, size_t len);
133 
134 /**
135  * 拷贝内存区数据,同时保证目标缓冲区尾部置 '\0'
136  * @param vp {ACL_VSTRING*}
137  * @param src {const char*} 源数据地址
138  * @param len {size_t} 源数据长度
139  * @return {ACL_VSTRING*} 与 vp 相同
140  */
142  const char *src, size_t len);
143 
144 /**
145  * 移动内存区数据, 源数据与目标地址的内存区可以是同一块内存区也可以不是
146  * 同一块内存区,该函数保证目标地址尾部以 '\0' 结尾
147  * @param vp {ACL_VSTRING*}
148  * @param src {const char*} 源数据地址
149  * @param len {size_t} 源数据长度
150  * @return {ACL_VSTRING*} 与 vp 相同
151  */
153  const char *src, size_t len);
154 
155 /**
156  * 拷贝内存区,该函数保证目标缓冲区以 '\0' 结尾
157  * @param vp {ACL_VSTRING*}
158  * @param src {const char*} 源数据地址
159  * @param len {size_t} 源数据长度
160  * @return {ACL_VSTRING*} 与 vp 相同
161  */
163  const char *src, size_t len);
164 
165 /**
166  * 查找某个字符
167  * @param vp {ACL_VSTRING*}
168  * @param ch {int} 要查找的字符
169  * @return {char*} 目标字符所在位置的地址, 如果未查到则返回 NULL,
170  * 注:该返回地址是不能被单独释放的,因为其由 ACL_VSTRING 对象统一进行管理
171  */
172 ACL_API char *acl_vstring_memchr(ACL_VSTRING *vp, int ch);
173 
174 /**
175  * 查找某个字符串,字符串大小写敏感
176  * @param vp {ACL_VSTRING*}
177  * @param needle {const char*} 要查找的字符
178  * @return {char*} 目标字符所在位置的地址, 如果未查到则返回 NULL,
179  * 注:该返回地址是不能被单独释放的,因为其由 ACL_VSTRING 对象统一进行管理
180  */
181 ACL_API char *acl_vstring_strstr(ACL_VSTRING *vp, const char *needle);
182 
183 /**
184  * 查找某个字符串,忽略字符串大小写
185  * @param vp {ACL_VSTRING*}
186  * @param needle {const char*} 要查找的字符
187  * @return {char*} 目标字符所在位置的地址, 如果未查到则返回 NULL,
188  * 注:该返回地址是不能被单独释放的,因为其由 ACL_VSTRING 对象统一进行管理
189  */
190 ACL_API char *acl_vstring_strcasestr(ACL_VSTRING *vp, const char *needle);
191 
192 /**
193  * 从后向前查找字符串,字符串大小写敏感
194  * @param vp {ACL_VSTRING*}
195  * @param needle {const char*} 要查找的字符
196  * @return {char*} 目标字符所在位置的地址, 如果未查到则返回 NULL,
197  * 注:该返回地址是不能被单独释放的,因为其由 ACL_VSTRING 对象统一进行管理
198  */
199 ACL_API char *acl_vstring_rstrstr(ACL_VSTRING *vp, const char *needle);
200 
201 /**
202  * 从后向前查找字符串,字符串大小写不敏感
203  * @param vp {ACL_VSTRING*}
204  * @param needle {const char*} 要查找的字符
205  * @return {char*} 目标字符所在位置的地址, 如果未查到则返回 NULL,
206  * 注:该返回地址是不能被单独释放的,因为其由 ACL_VSTRING 对象统一进行管理
207  */
208 ACL_API char *acl_vstring_rstrcasestr(ACL_VSTRING *vp, const char *needle);
209 
210 /**
211  * 向缓冲区的某个指定位置后添加数据,同时保证目标缓冲区数据以 '\0' 结尾
212  * @param vp {ACL_VSTRING*}
213  * @param start {size_t} 指定的位置
214  * @param buf {const char*} 数据地址
215  * @param len {size_t} 数据长度
216  * @return {ACL_VSTRING*} 与 vp 相同
217  */
218 ACL_API ACL_VSTRING *acl_vstring_insert(ACL_VSTRING *vp, size_t start,
219  const char *buf, size_t len);
220 
221 /**
222  * 向缓冲区的头部添加数据,同时保证目标缓冲区数据以 '\0' 结尾
223  * @param vp {ACL_VSTRING*}
224  * @param buf {const char*} 数据地址
225  * @param len {size_t} 数据长度
226  * @return {ACL_VSTRING*} 与 vp 相同
227  */
229  const char *buf, size_t len);
230 
231 /**
232  * 向缓冲区按格式方式添加数据
233  * @param vp {ACL_VSTRING*}
234  * @param format {const char*} 格式化字符串
235  * @param ... 变参序列
236  * @return {ACL_VSTRING*} 与 vp 相同
237  */
238 ACL_API ACL_VSTRING *ACL_PRINTF(2, 3) acl_vstring_sprintf(ACL_VSTRING *vp,
239  const char *format,...);
240 
241 /**
242  * 以附加方式向缓冲区按格式方式添加数据
243  * @param vp {ACL_VSTRING*}
244  * @param format {const char*} 格式化字符串
245  * @param ... 变参序列
246  * @return {ACL_VSTRING*} 与 vp 相同
247  */
248 ACL_API ACL_VSTRING *ACL_PRINTF(2, 3) acl_vstring_sprintf_append(
249  ACL_VSTRING *vp, const char *format,...);
250 
251 /**
252  * 导出缓冲区内的数据区同时将 ACL_VSTRING 对象释放,用户需要单独调用
253  * acl_myfree 来释放返回的数据区内存
254  * @param vp {ACL_VSTRING*}
255  * @return {char*} 数据区地址,当返回值不为 NULL 时用户需要单独调用
256  * acl_myfree 来释放该地址,否则会造成内存泄漏
257  */
258 ACL_API char *acl_vstring_export(ACL_VSTRING *vp);
259 
260 /**
261  * 将用户的存储字符串的动态分配内存区导入并生成新的 ACL_VSTRING 对象
262  * @param str {char*} 外部动态分配的存储字符串的内存地址
263  * @return {ACL_VSTRING*} 新分配的 ACL_VSTRING 对象
264  */
265 ACL_API ACL_VSTRING *acl_vstring_import(char *str);
266 
267 /**
268  * 将动态内存区与 ACL_VSTRING 粘合
269  * 注:vp 不能是调用 acl_vstring_alloc 产生的,并且不能调用 acl_vstring_init
270  * 进行过初始化, vp 可以是由 acl_mymalloc 产生或位于栈上的一个变量
271  * (如: ACL_VSTRING v)
272  * @param vp {ACL_VSTRING*} 需由 acl_mymalloc 生成或是一个栈变量, 当以
273  * acl_mymalloc 方式生成的时应该通过 acl_myfree 释放它
274  * @param buf {void*} 用户传递的内存区, 可以是栈变量
275  * @param len {size_t} buf 内存区的长度
276  */
277 ACL_API void acl_vstring_glue(ACL_VSTRING *vp, void *buf, size_t len);
278 
279 /**
280  * 取得某个位置的字符
281  * @param vp {ACL_VSTRING*}
282  * @param len {size_t} 位置,如果该值越界,则函数内部会 fatal
283  * @return {char} 查找的字符
284  */
285 ACL_API char acl_vstring_charat(ACL_VSTRING *vp, size_t len);
286 
287 /**
288  * 按规定格式添加数据
289  * @param vp {ACL_VSTRING*}
290  * @param format {const char*}
291  * @param ap {va_list}
292  * @return {ACL_VSTRING*} 与 vp 相同
293  * @see acl_vstring_sprintf
294  */
296  const char *format, va_list ap);
297 
298 /**
299  * 按规定格式向尾部添加数据
300  * @param vp {ACL_VSTRING*}
301  * @param format {const char*}
302  * @param ap {va_list}
303  * @return {ACL_VSTRING*} 与 vp 相同
304  */
306  const char *format, va_list ap);
307 
308 /**
309  * 按规定格式向头部添加数据
310  * @param vp {ACL_VSTRING*}
311  * @param format {const char*}
312  * @param ... 变参序列
313  * @return {ACL_VSTRING*} 与 vp 相同
314  */
315 ACL_API ACL_VSTRING *ACL_PRINTF(2, 3) acl_vstring_sprintf_prepend(
316  ACL_VSTRING *vp, const char *format, ...);
317 
318 /**
319  * 从源串中获得一行数据(不含 "\r\n" 和 "\n"),同时将剩余数据缓存起来, 如果
320  * 未获得完整行,则只缓存源串
321  * @param vp {ACL_VSTRING*} 字符串数据缓存区
322  * @param src {const char**} 源字符串指针地址, 返回后指针地址移动至下一位置
323  * @param dlen {size_t} 源字符串数据长度
324  * @return {const ACL_VSTRING*} NULL, 表示未找到 "\r\n" 或 "\n",但会将剩余
325  * 的数据拷贝至缓冲区内,应用需要通过 ACL_VSTRING_LEN 判断缓冲区中是否还有
326  * 数据;!NULL,表示读到完整行
327  * 注:读到完整行后应该调用 ACL_VSTRING_RESET(vp) 将缓冲区清空
328  */
329 ACL_API const ACL_VSTRING *acl_buffer_gets_nonl(ACL_VSTRING *vp,
330  const char **src, size_t dlen);
331 
332 /**
333  * 从源串中获得一行数据(包含 "\r\n" 或 "\n"),同时将剩余数据缓存起来,
334  * 如果未获得完整行,则只缓存源串
335  * @param vp {ACL_VSTRING*} 字符串数据缓存区
336  * @param src {const char**} 源字符串指针地址, 返回后指针地址移动至下一位置
337  * @param dlen {size_t} 源字符串数据长度
338  * @return {const ACL_VSTRING*} NULL, 表示未找到 "\r\n" 或 "\n",但会将剩余
339  * 的数据拷贝至缓冲区内,应用需要通过 ACL_VSTRING_LEN 判断缓冲区中是否还有
340  * 数据;!NULL,表示读到完整行
341  * 注:读到完整行后应该调用 ACL_VSTRING_RESET(vp) 将缓冲区清空
342  */
343 ACL_API const ACL_VSTRING *acl_buffer_gets(ACL_VSTRING *vp,
344  const char **src, size_t dlen);
345 
346  /*
347  * Macros. Unsafe macros have UPPERCASE names.
348  */
349 #define ACL_VSTRING_SPACE(vp, len) ((vp)->vbuf.space(&(vp)->vbuf, len))
350 
351 /**
352  * 取得当前 ACL_VSTRING 数据存储地址
353  * @param vp {ACL_VSTRING*}
354  * @return {char*}
355  */
356 #define acl_vstring_str(vp) ((char *) (vp)->vbuf.data)
357 
358 /**
359  * 取得当前 ACL_VSTRING 所存储的数据的长度
360  * @param vp {ACL_VSTRING*}
361  * @return {int}
362  */
363 #define ACL_VSTRING_LEN(vp) (size_t) ((vp)->vbuf.ptr - (vp)->vbuf.data)
364 
365 /**
366  * 取得当前 ACL_VSTRING 内部缓冲区的总大小
367  * @param vp {ACL_VSTRING*}
368  * @return {int}
369  */
370 #define ACL_VSTRING_SIZE(vp) ((vp)->vbuf.len)
371 
372 /**
373  * 取得当前 ACL_VSTRING 的数据偏移指针位置
374  * @param vp {ACL_VSTRING*}
375  * @return {char*}
376  */
377 #define acl_vstring_end(vp) ((char *) (vp)->vbuf.ptr)
378 
379 /**
380  * 将 ACL_VSTRING 的数据偏移指针位置置 0
381  * @param vp {ACL_VSTRING*}
382  */
383 #define ACL_VSTRING_TERMINATE(vp) { \
384  if ((vp)->vbuf.cnt <= 0) \
385  ACL_VSTRING_SPACE((vp), 1); \
386  if ((vp)->vbuf.cnt > 0) \
387  *(vp)->vbuf.ptr = 0; \
388  else if ((vp)->vbuf.ptr > (vp)->vbuf.data) { \
389  (vp)->vbuf.ptr--; \
390  *(vp)->vbuf.ptr = 0; \
391  (vp)->vbuf.cnt++; \
392  } \
393 }
394 
395 /**
396  * 重置 ACL_VSTRING 内部缓冲区指针地址起始位置,但不会将尾部数据置 0,应用可以
397  * 通过调用 ACL_VSTRING_TERMINATE 将缓冲数据尾部置 0
398  * @param vp {ACL_VSTRING*}
399  */
400 #define ACL_VSTRING_RESET(vp) { \
401  (vp)->vbuf.ptr = (vp)->vbuf.data; \
402  (vp)->vbuf.cnt = (vp)->vbuf.len; \
403  acl_vbuf_clearerr(&(vp)->vbuf); \
404 }
405 
406 /**
407  * 添加一个字符至 ACL_VSTRING 缓冲区
408  * @param vp {ACL_VSTRING*}
409  * @param ch {int} 字符
410  */
411 #define ACL_VSTRING_ADDCH(vp, ch) ACL_VBUF_PUT(&(vp)->vbuf, ch)
412 
413 /**
414  * 移动数据偏移指针至内部缓冲区尾部
415  * @param vp {ACL_VSTRING*}
416  */
417 #define ACL_VSTRING_SKIP(vp) { \
418  while ((vp)->vbuf.cnt > 0 && *(vp)->vbuf.ptr) \
419  (vp)->vbuf.ptr++, (vp)->vbuf.cnt--; \
420 }
421 
422 /**
423  * 当前 ACL_VSTRING 中还有多少数据可用
424  * @param vp {ACL_VSTRING*}
425  */
426 #define acl_vstring_avail(vp) ((vp)->vbuf.cnt)
427 
428  /**
429  * The following macro is not part of the public interface, because it can
430  * really screw up a buffer by positioning past allocated memory.
431  */
432 #define ACL_VSTRING_AT_OFFSET(vp, offset) { \
433  (vp)->vbuf.ptr = (vp)->vbuf.data + (offset); \
434  (vp)->vbuf.cnt = (vp)->vbuf.len - (offset); \
435 }
436 
437 #ifdef __cplusplus
438 }
439 #endif
440 
441 #endif
ACL_API ACL_VSTRING * acl_vstring_slice_alloc(ACL_SLICE_POOL *slice, size_t len)
ACL_API char * acl_vstring_memchr(ACL_VSTRING *vp, int ch)
ACL_API ACL_VSTRING * acl_vstring_prepend(ACL_VSTRING *vp, const char *buf, size_t len)
ACL_API char * acl_vstring_strcasestr(ACL_VSTRING *vp, const char *needle)
ACL_API ACL_VSTRING const char * format
Definition: acl_vstring.h:239
ACL_API ACL_VSTRING * acl_vstring_dbuf_alloc(ACL_DBUF_POOL *dbuf, size_t len)
ACL_API ACL_VSTRING const char ACL_API ACL_VSTRING const char ACL_API char * acl_vstring_export(ACL_VSTRING *vp)
ACL_API ACL_VSTRING * acl_vstring_strcat(ACL_VSTRING *vp, const char *src)
ACL_API ACL_VSTRING * acl_vstring_memmove(ACL_VSTRING *vp, const char *src, size_t len)
ACL_API void acl_vstring_ctl(ACL_VSTRING *vp,...)
ACL_API void acl_vstring_free_buf(ACL_VSTRING *vp)
ACL_API ACL_VSTRING * acl_vstring_vsprintf_append(ACL_VSTRING *vp, const char *format, va_list ap)
ssize_t maxlen
Definition: acl_vstring.h:21
ACL_SLICE_POOL * slice
Definition: acl_vstring.h:19
ACL_API char * acl_vstring_rstrcasestr(ACL_VSTRING *vp, const char *needle)
ACL_API ACL_VSTRING * acl_vstring_strncpy(ACL_VSTRING *vp, const char *src, size_t len)
struct ACL_VSTRING ACL_VSTRING
ACL_VBUF vbuf
Definition: acl_vstring.h:18
ACL_DBUF_POOL * dbuf
Definition: acl_vstring.h:20
ACL_API void acl_vstring_glue(ACL_VSTRING *vp, void *buf, size_t len)
ACL_API const ACL_VSTRING * acl_buffer_gets(ACL_VSTRING *vp, const char **src, size_t dlen)
ACL_API ACL_VSTRING * acl_vstring_memcat(ACL_VSTRING *vp, const char *src, size_t len)
ACL_API ACL_VSTRING * acl_vstring_vsprintf(ACL_VSTRING *vp, const char *format, va_list ap)
ACL_API ACL_VSTRING * acl_vstring_insert(ACL_VSTRING *vp, size_t start, const char *buf, size_t len)
struct ACL_DBUF_POOL ACL_DBUF_POOL
Definition: acl_dbuf_pool.h:8
ACL_API ACL_VSTRING const char ACL_API const ACL_VSTRING * acl_buffer_gets_nonl(ACL_VSTRING *vp, const char **src, size_t dlen)
ACL_API char * acl_vstring_rstrstr(ACL_VSTRING *vp, const char *needle)
ACL_API ACL_VSTRING * acl_vstring_strcpy(ACL_VSTRING *vp, const char *src)
ACL_API ACL_VSTRING * acl_vstring_truncate(ACL_VSTRING *vp, size_t len)
ACL_API ACL_VSTRING * acl_vstring_alloc(size_t len)
ACL_API char * acl_vstring_strstr(ACL_VSTRING *vp, const char *needle)
ACL_API ACL_VSTRING * acl_vstring_memcpy(ACL_VSTRING *vp, const char *src, size_t len)
ACL_API ACL_VSTRING * acl_vstring_strncat(ACL_VSTRING *vp, const char *src, size_t len)
ACL_API void acl_vstring_init(ACL_VSTRING *vp, size_t len)
ACL_API char acl_vstring_charat(ACL_VSTRING *vp, size_t len)
ACL_API void acl_vstring_free(ACL_VSTRING *vp)
ACL_API ACL_VSTRING * acl_vstring_mmap_alloc(ACL_FILE_HANDLE fd, ssize_t max_len, ssize_t init_len)
ACL_API ACL_VSTRING * acl_vstring_import(char *str)
ACL_API ACL_VSTRING * ACL_PRINTF(2, 3) acl_vstring_sprintf(ACL_VSTRING *vp