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