9 #include <rpm/rpmstring.h>
13 void argvPrint(const char * msg, ARGV_const_t argv, FILE * fp)
17 if (fp == NULL) fp = stderr;
20 fprintf(fp, "===================================== %s\n", msg);
23 for (av = argv; *av; av++)
24 fprintf(fp, "%s\n", *av);
30 ARGV_t argv = xcalloc(1, sizeof(*argv));
34 ARGI_t argiFree(ARGI_t argi)
38 argi->vals = _free(argi->vals);
44 ARGV_t argvFree(ARGV_t argv)
49 for (av = argv; *av; av++)
55 int argiCount(ARGI_const_t argi)
63 ARGint_t argiData(ARGI_const_t argi)
66 if (argi && argi->nvals > 0)
71 int argvCount(ARGV_const_t argv)
75 while (argv[argc] != NULL)
80 ARGV_t argvData(ARGV_t argv)
85 int argvCmp(const void * a, const void * b)
87 const char *astr = *(ARGV_t)a;
88 const char *bstr = *(ARGV_t)b;
89 return strcmp(astr, bstr);
92 int argvSort(ARGV_t argv, int (*compar)(const void *, const void *))
96 qsort(argv, argvCount(argv), sizeof(*argv), compar);
100 ARGV_t argvSearch(ARGV_const_t argv, const char *val,
101 int (*compar)(const void *, const void *))
107 return bsearch(&val, argv, argvCount(argv), sizeof(*argv), compar);
110 int argiAdd(ARGI_t * argip, int ix, int val)
117 *argip = xcalloc(1, sizeof(**argip));
121 if (ix >= argi->nvals) {
122 argi->vals = xrealloc(argi->vals, (ix + 1) * sizeof(*argi->vals));
123 memset(argi->vals + argi->nvals, 0,
124 (ix - argi->nvals) * sizeof(*argi->vals));
125 argi->nvals = ix + 1;
127 argi->vals[ix] = val;
131 int argvAdd(ARGV_t * argvp, const char *val)
138 argc = argvCount(*argvp);
139 *argvp = xrealloc(*argvp, (argc + 1 + 1) * sizeof(**argvp));
141 argv[argc++] = xstrdup(val);
146 int argvAddNum(ARGV_t *argvp, int val)
150 rasprintf(&valstr, "%d", val);
151 rc = argvAdd(argvp, valstr);
156 int argvAppend(ARGV_t * argvp, ARGV_const_t av)
158 ARGV_t argv = *argvp;
159 int argc = argvCount(argv);
160 int ac = argvCount(av);
163 argv = xrealloc(argv, (argc + ac + 1) * sizeof(*argv));
164 for (i = 0; i < ac; i++)
165 argv[argc + i] = xstrdup(av[i]);
166 argv[argc + ac] = NULL;
171 ARGV_t argvSplitString(const char * str, const char * seps, argvFlags flags)
180 if (str == NULL || seps == NULL)
183 dest = xmalloc(strlen(str) + 1);
184 for (argc = 1, s = str, t = dest; (c = *s); s++, t++) {
185 if (strchr(seps, c)) {
193 argv = xmalloc( (argc + 1) * sizeof(*argv));
195 for (c = 0, s = dest; s < t; s+= strlen(s) + 1) {
196 if (*s == '\0' && (flags & ARGV_SKIPEMPTY))
198 argv[c] = xstrdup(s);
206 /* Backwards compatibility */
207 int argvSplit(ARGV_t * argvp, const char * str, const char * seps)
210 *argvp = argvSplitString(str, seps, ARGV_SKIPEMPTY);
215 char *argvJoin(ARGV_const_t argv, const char *sep)
220 for (arg = argv; arg && *arg; arg++) {
221 rstrscat(&dest, *arg, *(arg+1) ? sep : "", NULL);