acl  3.5.3.0
acl_argv.h
浏览该文件的文档.
1 #ifndef ACL_ARGV_INCLUDE_H
2 #define ACL_ARGV_INCLUDE_H
3 
4 # ifdef __cplusplus
5 extern "C" {
6 # endif
7 #include "acl_define.h"
8 #include <stdarg.h>
9 #include "acl_dbuf_pool.h"
10 #include "acl_iterator.h"
11 
12 /**
13  * External interface.
14  */
15 typedef struct ACL_ARGV {
16  int len; /**< number of array elements */
17  int argc; /**< array elements in use */
18  char **argv; /**< string array */
19 
20  /* 添加及弹出 */
21 
22  /* 向数组尾部添加字符串 (内部动态拷贝该字符串) */
23  void (*push_back)(struct ACL_ARGV*, const char*);
24  /* 向数组头部添加动态对象 (内部动态拷贝该字符串)*/
25  void (*push_front)(struct ACL_ARGV*, const char*);
26  /* 弹出数组尾部字符串 (用完后需调用 acl_myfree 释放) */
27  char *(*pop_back)(struct ACL_ARGV*);
28  /* 弹出数组头部字符串 (用完后需调用 acl_myfree 释放) */
29  char *(*pop_front)(struct ACL_ARGV*);
30 
31  /* for acl_iterator */
32 
33  /* 取迭代器头函数 */
34  void *(*iter_head)(ACL_ITER*, struct ACL_ARGV*);
35  /* 取迭代器下一个函数 */
36  void *(*iter_next)(ACL_ITER*, struct ACL_ARGV*);
37  /* 取迭代器尾函数 */
38  void *(*iter_tail)(ACL_ITER*, struct ACL_ARGV*);
39  /* 取迭代器上一个函数 */
40  void *(*iter_prev)(ACL_ITER*, struct ACL_ARGV*);
41 
42  /* private */
44 } ACL_ARGV;
45 
46 /* in acl_argv.c */
47 /**
48  * 分配一个字符串动态数组
49  * @param size {int} 动态数组的初始大小
50  * @return {ACL_ARGV*}
51  */
52 ACL_API ACL_ARGV *acl_argv_alloc(int size);
53 
54 ACL_API ACL_ARGV *acl_argv_alloc2(int size, ACL_DBUF_POOL *dbuf);
55 
56 /**
57  * 向字符串动态数组中添加一至多个字符串,最后一个NULL字符串表示结束
58  * @param argvp {ACL_ARGV*} 字符串动态数组指针
59  * @param ... 字符串列表,最后一个为NULL, 格式如:{s1}, {s2}, ..., NULL
60  */
61 ACL_API void acl_argv_add(ACL_ARGV *argvp,...);
62 
63 /**
64  * 在指定位置设置指定的字符串,同时释放旧的字符串
65  * @param argvp {ACL_ARGV *} 字符串动态数组
66  * @param idx {int} 指定下标位置,不应越界
67  * @param value {const char *} 非 NULL 字符串
68  * @return {int} 返回 -1 表示下标越界或 value 为 NULL,0 表示成功
69  */
70 ACL_API int acl_argv_set(ACL_ARGV *argvp, int idx, const char *value);
71 
72 /**
73  * 向字符串动态数组中添加字符串列表
74  * @param argvp {ACL_ARGV*} 字符串动态数组指针
75  * @param ap {va_list} 由多个字符串组成的变参列表
76  */
77 ACL_API void acl_argv_addv(ACL_ARGV *argvp, va_list ap);
78 
79 /**
80  * 向字符串动态数组中添加字段长度有限制的字符串列表
81  * @param argvp {ACL_ARGV*} 字符串动态数组指针
82  * @param ... 一组有长度限制的字符串列表,
83  * 如: {s1}, {len1}, {s2}, {len2}, ... NULL
84  */
85 ACL_API void acl_argv_addn(ACL_ARGV *argvp,...);
86 
87 /**
88  * 向字符串动态数组中添加字段长度有限制的字符串列表
89  * @param argvp {ACL_ARGV*} 字符串动态数组指针
90  * @param ap {va_list} 一组有长度限制的字符串组成的变参列表
91  */
92 ACL_API void acl_argv_addnv(ACL_ARGV *argvp, va_list ap);
93 
94 /**
95  * 设置字符串动态数组的结束位置
96  * @param argvp {ACL_ARGV*} 字符串动态数组指针
97  */
98 ACL_API void acl_argv_terminate(ACL_ARGV *argvp);
99 
100 /**
101  * 释放字符串动态数组
102  * @param argvp {ACL_ARGV*} 字符串动态数组指针
103  */
104 ACL_API ACL_ARGV *acl_argv_free(ACL_ARGV *argvp);
105 
106 /**
107  * 根据数组下标位置返回相对应的字符串指针
108  * @param argvp {ACL_ARGV*} 字符串动态数组指针
109  * @param idx {int} 下标位置
110  * @return {char*} NULL: 下标越界;!= NULL: 字符串指针位置
111  */
112 ACL_API char *acl_argv_index(ACL_ARGV *argvp, int idx);
113 
114 /**
115  * 返回当前字符串动态数组中已经存放的字符串个数
116  * @param argvp {ACL_ARGV*} 字符串动态数组指针
117  * @return {int}
118  */
119 ACL_API int acl_argv_size(ACL_ARGV *argvp);
120 
121 /* in acl_argv_split.c */
122 /**
123  * 根据源字符串及分隔字符串生成一个字符串动态数组
124  * @param str {const char*} 源字符串
125  * @param delim {const char*} 分隔字符串
126  * @return {ACL_ARGV*}
127  */
128 ACL_API ACL_ARGV *acl_argv_split(const char *str, const char *delim);
129 
130 /**
131  * 根据源字符串及分隔字符串生成一个字符串动态数组,同时将传入的内存池
132  * 对象做为内存分配器
133  * @param str {const char*} 源字符串
134  * @param delim {const char*} 分隔字符串
135  * @param dbuf {ACL_DBUF_POOL*} 内存池对象,可以为空,当为空时则采用
136  * 缺省的内存分配方式
137  * @return {ACL_ARGV*}
138  */
139 ACL_API ACL_ARGV *acl_argv_split3(const char *str, const char *delim,
141 
142 /**
143  * 根据源字符串及分隔字符串生成一个字符串动态数组, 但限定最大分隔次数
144  * @param str {const char*} 源字符串
145  * @param delim {const char*} 分隔字符串
146  * @param n {size_t} 最大分隔次数
147  * @return {ACL_ARGV*}
148  */
149 ACL_API ACL_ARGV *acl_argv_splitn(const char *str, const char *delim, size_t n);
150 
151 /**
152  * 根据源字符串及分隔字符串生成一个字符串动态数组, 但限定最大分隔次数,
153  * 同时传入内存池对象做为内存分配器
154  * @param str {const char*} 源字符串
155  * @param delim {const char*} 分隔字符串
156  * @param n {size_t} 最大分隔次数
157  * @param dbuf {ACL_DBUF_POOL*} 内存池对象,可以为空,当为空时则采用
158  * 缺省的内存分配方式
159  * @return {ACL_ARGV*}
160  */
161 ACL_API ACL_ARGV *acl_argv_splitn4(const char *str, const char *delim,
162  size_t n, ACL_DBUF_POOL *dbuf);
163 
164 /**
165  * 源字符串经分隔符分解后,其结果被附加至一个字符串动态数组
166  * @param argvp {ACL_ARGV*} 字符串动态数组指针
167  * @param str {const char*} 源字符串
168  * @param delim {const char*} 分隔字符串
169  * @return {ACL_ARGV*}
170  */
171 ACL_API ACL_ARGV *acl_argv_split_append(ACL_ARGV *argvp, const char *str,
172  const char *delim);
173 
174 /**
175  * 源字符串经分隔符分解后,其结果被附加至一个字符串动态数组, 但限定最大分隔次数
176  * @param argvp {ACL_ARGV*} 字符串动态数组指针
177  * @param str {const char*} 源字符串
178  * @param delim {const char*} 分隔字符串
179  * @param n {size_t} 最大分隔次数
180  * @return {ACL_ARGV*}
181  */
182 ACL_API ACL_ARGV *acl_argv_splitn_append(ACL_ARGV *argvp, const char *str,
183  const char *delim, size_t n);
184 
185 /**
186  * 根据源字符串及分隔字符串生成一个字符串动态数组,针对由 "" 或 '' 引用的
187  * 字符串不做分隔
188  * @param str {const char*} 源字符串
189  * @param delim {const char*} 分隔字符串
190  * @return {ACL_ARGV*}
191  */
192 ACL_API ACL_ARGV *acl_argv_quote_split(const char *str, const char *delim);
193 
194 /**
195  * 根据源字符串及分隔字符串生成一个字符串动态数组,针对由 "" 或 '' 引用的
196  * 字符串不做分隔,其中将传入的内存池对象做为内存分配器
197  * @param str {const char*} 源字符串
198  * @param delim {const char*} 分隔字符串
199  * @param dbuf {ACL_DBUF_POOL*} 内存池对象,可以为空,当为空时则采用
200  * 缺省的内存分配方式
201  * @return {ACL_ARGV*}
202  */
203 ACL_API ACL_ARGV *acl_argv_quote_split4(const char *str, const char *delim,
205 
206 #define ACL_ARGV_END ((char *) 0)
207 
208 # ifdef __cplusplus
209 }
210 # endif
211 
212 #endif
213 
ACL_DBUF_POOL * dbuf
Definition: acl_argv.h:43
ACL_API void acl_argv_add(ACL_ARGV *argvp,...)
ACL_API void acl_argv_terminate(ACL_ARGV *argvp)
void(* push_back)(struct ACL_ARGV *, const char *)
Definition: acl_argv.h:23
ACL_API ACL_ARGV * acl_argv_quote_split(const char *str, const char *delim)
ACL_API ACL_ARGV * acl_argv_splitn4(const char *str, const char *delim, size_t n, ACL_DBUF_POOL *dbuf)
ACL_API char * acl_argv_index(ACL_ARGV *argvp, int idx)
ACL_API int acl_argv_set(ACL_ARGV *argvp, int idx, const char *value)
ACL_API ACL_ARGV * acl_argv_splitn_append(ACL_ARGV *argvp, const char *str, const char *delim, size_t n)
int argc
Definition: acl_argv.h:17
ACL_API void acl_argv_addnv(ACL_ARGV *argvp, va_list ap)
ACL_API ACL_ARGV * acl_argv_splitn(const char *str, const char *delim, size_t n)
ACL_API ACL_ARGV * acl_argv_quote_split4(const char *str, const char *delim, ACL_DBUF_POOL *dbuf)
char ** argv
Definition: acl_argv.h:18
ACL_API void acl_argv_addv(ACL_ARGV *argvp, va_list ap)
int len
Definition: acl_argv.h:16
ACL_API ACL_ARGV * acl_argv_split_append(ACL_ARGV *argvp, const char *str, const char *delim)
struct ACL_DBUF_POOL ACL_DBUF_POOL
Definition: acl_dbuf_pool.h:8
ACL_API ACL_ARGV * acl_argv_alloc2(int size, ACL_DBUF_POOL *dbuf)
ACL_API int acl_argv_size(ACL_ARGV *argvp)
ACL_API ACL_ARGV * acl_argv_split(const char *str, const char *delim)
struct ACL_ARGV ACL_ARGV
ACL_API ACL_ARGV * acl_argv_free(ACL_ARGV *argvp)
void(* push_front)(struct ACL_ARGV *, const char *)
Definition: acl_argv.h:25
ACL_API void acl_argv_addn(ACL_ARGV *argvp,...)
ACL_API ACL_ARGV * acl_argv_alloc(int size)
ACL_API ACL_ARGV * acl_argv_split3(const char *str, const char *delim, ACL_DBUF_POOL *dbuf)