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