Add an enhanced argvSplitString() function for splitting strings to argv's
[platform/upstream/rpm.git] / rpmio / argv.h
1 #ifndef _H_ARGV_
2 #define _H_ARGV_
3
4 /** \ingroup rpmargv
5  * \file rpmio/argv.h
6  */
7
8 #include <stdio.h>
9
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13
14 typedef char ** ARGV_t;
15 typedef char * const *ARGV_const_t;
16
17 typedef int * ARGint_t;
18 struct ARGI_s {
19     unsigned nvals;
20     ARGint_t vals;
21 };
22 typedef struct ARGI_s * ARGI_t;
23 typedef struct ARGI_s const * const ARGI_const_t;
24
25 /** \ingroup rpmargv
26  * Print argv array elements.
27  * @param msg           output message prefix (or NULL)
28  * @param argv          argv array
29  * @param fp            output file handle (NULL uses stderr)
30  */
31 void argvPrint(const char * msg, ARGV_const_t argv, FILE * fp);
32
33 /** \ingroup rpmargv
34  * Destroy an argi array.
35  * @param argi          argi array
36  * @return              NULL always
37  */
38 ARGI_t argiFree(ARGI_t argi);
39
40
41 /** \ingroup rpmargv
42  * Create an empty argv array.
43  * @return              pointer to empty argv
44  */
45 ARGV_t argvNew(void);
46
47 /** \ingroup rpmargv
48  * Destroy an argv array.
49  * @param argv          argv array
50  * @return              NULL always
51  */
52 ARGV_t argvFree(ARGV_t argv);
53
54 /** \ingroup rpmargv
55  * Return no. of elements in argi array.
56  * @param argi          argi array
57  * @return              no. of elements
58  */
59 int argiCount(ARGI_const_t argi);
60
61 /** \ingroup rpmargv
62  * Return data from argi array.
63  * @param argi          argi array
64  * @return              argi array data address
65  */
66 ARGint_t argiData(ARGI_const_t argi);
67
68 /** \ingroup rpmargv
69  * Return no. of elements in argv array.
70  * @param argv          argv array
71  * @return              no. of elements
72  */
73 int argvCount(ARGV_const_t argv);
74
75 /** \ingroup rpmargv
76  * Return data from argv array.
77  * @param argv          argv array
78  * @return              argv array data address
79  */
80 ARGV_t argvData(ARGV_t argv);
81
82 /** \ingroup rpmargv
83  * Compare argv arrays (qsort/bsearch).
84  * @param a             1st instance address
85  * @param b             2nd instance address
86  * @return              result of comparison
87  */
88 int argvCmp(const void * a, const void * b);
89
90 /** \ingroup rpmargv
91  * Sort an argv array.
92  * @param argv          argv array
93  * @param compar        strcmp-like comparison function, or NULL for argvCmp()
94  * @return              0 always
95  */
96 int argvSort(ARGV_t argv, int (*compar)(const void *, const void *));
97
98 /** \ingroup rpmargv
99  * Find an element in an argv array.
100  * @param argv          argv array
101  * @param val           string to find
102  * @param compar        strcmp-like comparison function, or NULL for argvCmp()
103  * @return              found string (NULL on failure)
104  */
105 ARGV_t argvSearch(ARGV_const_t argv, const char *val,
106                 int (*compar)(const void *, const void *));
107
108 /** \ingroup rpmargv
109  * Add an int to an argi array.
110  * @retval *argip       argi array
111  * @param ix            argi array index (or -1 to append)
112  * @param val           int arg to add
113  * @return              0 always
114  */
115 int argiAdd(ARGI_t * argip, int ix, int val);
116
117 /** \ingroup rpmargv
118  * Add a string to an argv array.
119  * @retval *argvp       argv array
120  * @param val           string arg to append
121  * @return              0 always
122  */
123 int argvAdd(ARGV_t * argvp, const char *val);
124
125 /** \ingroup rpmargv
126  * Add a number to an argv array (converting to a string).
127  * @retval *argvp       argv array
128  * @param val           numeric arg to append
129  * @return              0 always
130  */
131 int argvAddNum(ARGV_t * argvp, int val);
132
133 /** \ingroup rpmargv
134  * Append one argv array to another.
135  * @retval *argvp       argv array
136  * @param av            argv array to append
137  * @return              0 always
138  */
139 int argvAppend(ARGV_t * argvp, ARGV_const_t av);
140
141 typedef enum argvFlags_e {
142     ARGV_NONE           = 0,
143     ARGV_SKIPEMPTY      = (1 << 0),     /* omit empty strings from result */
144 } argvFlags;
145
146 /** \ingroup rpmargv
147  * Split a string into an argv array.
148  * @param str           string arg to split
149  * @param seps          seperator characters
150  * @param flags         flags to control behavior
151  * @return              argv array
152  */
153 ARGV_t argvSplitString(const char * str, const char * seps, argvFlags flags);
154
155 /** \ingroup rpmargv
156  * Split a string into an argv array.
157  * @retval *argvp       argv array
158  * @param str           string arg to split
159  * @param seps          seperator characters
160  * @return              0 always
161  */
162 int argvSplit(ARGV_t * argvp, const char * str, const char * seps);
163
164 /** \ingroup rpmargv
165  * Join an argv array into a string.
166  * @param *argv         argv array to join
167  * @param sep           seperator string to use
168  * @return              malloc'ed string
169  */
170 char *argvJoin(ARGV_const_t argv, const char *sep);
171
172 #ifdef __cplusplus
173 }
174 #endif
175
176 #endif /* _H_ARGV_ */