00001
00005 #include "system.h"
00006
00007 #include "rpmio_internal.h"
00008 #include <argv.h>
00009
00010 #include "debug.h"
00011
00012
00018 static inline
00019 void * _free( const void * p)
00020
00021 {
00022 if (p != NULL) free((void *)p);
00023 return NULL;
00024 }
00025
00026 void argvPrint(const char * msg, ARGV_t argv, FILE * fp)
00027 {
00028 ARGV_t av;
00029
00030 if (fp == NULL) fp = stderr;
00031
00032 if (msg)
00033 fprintf(fp, "===================================== %s\n", msg);
00034
00035 if (argv)
00036 for (av = argv; *av; av++)
00037 fprintf(fp, "%s\n", *av);
00038
00039 }
00040
00041 ARGI_t argiFree(ARGI_t argi)
00042 {
00043 if (argi) {
00044 argi->nvals = 0;
00045 argi->vals = _free(argi->vals);
00046 }
00047 argi = _free(argi);
00048 return NULL;
00049 }
00050
00051 ARGV_t argvFree( ARGV_t argv)
00052 {
00053 ARGV_t av;
00054
00055
00056 if (argv)
00057 for (av = argv; *av; av++)
00058 *av = _free(*av);
00059
00060 argv = _free(argv);
00061 return NULL;
00062 }
00063
00064 int argiCount(ARGI_t argi)
00065 {
00066 int nvals = 0;
00067 if (argi)
00068 nvals = argi->nvals;
00069 return nvals;
00070 }
00071
00072 ARGint_t argiData(ARGI_t argi)
00073 {
00074 ARGint_t vals = NULL;
00075 if (argi && argi->nvals > 0)
00076 vals = argi->vals;
00077 return vals;
00078 }
00079
00080 int argvCount(const ARGV_t argv)
00081 {
00082 int argc = 0;
00083 if (argv)
00084 while (argv[argc] != NULL)
00085 argc++;
00086 return argc;
00087 }
00088
00089 ARGV_t argvData(ARGV_t argv)
00090 {
00091
00092 return argv;
00093
00094 }
00095
00096 int argvCmp(const void * a, const void * b)
00097 {
00098
00099 ARGstr_t astr = *(ARGV_t)a;
00100 ARGstr_t bstr = *(ARGV_t)b;
00101
00102 return strcmp(astr, bstr);
00103 }
00104
00105 int argvSort(ARGV_t argv, int (*compar)(const void *, const void *))
00106 {
00107 if (compar == NULL)
00108 compar = argvCmp;
00109 qsort(argv, argvCount(argv), sizeof(*argv), compar);
00110 return 0;
00111 }
00112
00113 ARGV_t argvSearch(ARGV_t argv, ARGstr_t val,
00114 int (*compar)(const void *, const void *))
00115 {
00116 if (argv == NULL)
00117 return NULL;
00118 if (compar == NULL)
00119 compar = argvCmp;
00120 return bsearch(&val, argv, argvCount(argv), sizeof(*argv), compar);
00121 }
00122
00123 int argiAdd( ARGI_t * argip, int ix, int val)
00124 {
00125 ARGI_t argi;
00126
00127 if (argip == NULL)
00128 return -1;
00129 if (*argip == NULL)
00130 *argip = xcalloc(1, sizeof(**argip));
00131 argi = *argip;
00132 if (ix < 0)
00133 ix = argi->nvals;
00134 if (ix >= argi->nvals) {
00135 argi->vals = xrealloc(argi->vals, (ix + 1) * sizeof(*argi->vals));
00136 memset(argi->vals + argi->nvals, 0,
00137 (ix - argi->nvals) * sizeof(*argi->vals));
00138 argi->nvals = ix + 1;
00139 }
00140 argi->vals[ix] = val;
00141 return 0;
00142 }
00143
00144 int argvAdd( ARGV_t * argvp, ARGstr_t val)
00145 {
00146 ARGV_t argv;
00147 int argc;
00148
00149 if (argvp == NULL)
00150 return -1;
00151 argc = argvCount(*argvp);
00152
00153 *argvp = xrealloc(*argvp, (argc + 1 + 1) * sizeof(**argvp));
00154
00155 argv = *argvp;
00156 argv[argc++] = xstrdup(val);
00157 argv[argc ] = NULL;
00158 return 0;
00159 }
00160
00161 int argvAppend( ARGV_t * argvp, const ARGV_t av)
00162 {
00163 ARGV_t argv = *argvp;
00164 int argc = argvCount(argv);
00165 int ac = argvCount(av);
00166 int i;
00167
00168 argv = xrealloc(argv, (argc + ac + 1) * sizeof(*argv));
00169 for (i = 0; i < ac; i++)
00170 argv[argc + i] = xstrdup(av[i]);
00171 argv[argc + ac] = NULL;
00172 *argvp = argv;
00173 return 0;
00174 }
00175
00176 int argvSplit(ARGV_t * argvp, const char * str, const char * seps)
00177 {
00178 static char whitespace[] = " \f\n\r\t\v";
00179 char * dest = xmalloc(strlen(str) + 1);
00180 ARGV_t argv;
00181 int argc = 1;
00182 const char * s;
00183 char * t;
00184 int c;
00185
00186 if (seps == NULL)
00187 seps = whitespace;
00188
00189 for (argc = 1, s = str, t = dest; (c = *s); s++, t++) {
00190 if (strchr(seps, c)) {
00191 argc++;
00192 c = '\0';
00193 }
00194 *t = c;
00195 }
00196 *t = '\0';
00197
00198 argv = xmalloc( (argc + 1) * sizeof(*argv));
00199
00200 for (c = 0, s = dest; s < t; s+= strlen(s) + 1) {
00201 if (*s == '\0')
00202 continue;
00203 argv[c] = xstrdup(s);
00204 c++;
00205 }
00206 argv[c] = NULL;
00207 *argvp = argv;
00208
00209 return 0;
00210
00211 }
00212
00213 char * argvJoin(ARGV_t argv)
00214 {
00215 size_t nb = 0;
00216 int argc;
00217 char *t, *te;
00218
00219 for (argc = 0; argv[argc] != NULL; argc++) {
00220 if (argc != 0)
00221 nb++;
00222 nb += strlen(argv[argc]);
00223 }
00224 nb++;
00225
00226 te = t = xmalloc(nb);
00227 *te = '\0';
00228 for (argc = 0; argv[argc] != NULL; argc++) {
00229 if (argc != 0)
00230 *te++ = ' ';
00231 te = stpcpy(te, argv[argc]);
00232 }
00233 *te = '\0';
00234 return t;
00235 }
00236
00237 int argvFgets(ARGV_t * argvp, void * fd)
00238 {
00239 FILE * fp = (fd ? fdGetFILE(fd) : stdin);
00240 ARGV_t av = NULL;
00241 char buf[BUFSIZ];
00242 char * b, * be;
00243 int rc = 0;
00244
00245 if (fp == NULL)
00246 return -2;
00247 while (!rc && (b = fgets(buf, sizeof(buf), fp)) != NULL) {
00248 buf[sizeof(buf)-1] = '\0';
00249 be = b + strlen(buf) - 1;
00250 while (strchr("\r\n", *be) != NULL)
00251 *be-- = '\0';
00252 rc = argvAdd(&av, b);
00253 }
00254
00255 if (!rc)
00256 rc = ferror(fp);
00257 if (!rc)
00258 rc = (feof(fp) ? 0 : 1);
00259 if (!rc && argvp)
00260 *argvp = av;
00261 else
00262 av = argvFree(av);
00263
00264 return rc;
00265 }
00266
00267