summaryrefslogtreecommitdiff
path: root/rpmio/argv.c
diff options
context:
space:
mode:
authorjbj <devnull@localhost>2002-12-24 17:06:35 +0000
committerjbj <devnull@localhost>2002-12-24 17:06:35 +0000
commit268376a208ce942e92088315d383a4e09974cbc2 (patch)
tree71bfbb1f02b66623727186a65efbec11979c2a04 /rpmio/argv.c
parentfec28fa0043b8071e0fa2cadd465eeb0c1cdbb81 (diff)
downloadrpm-268376a208ce942e92088315d383a4e09974cbc2.tar.gz
rpm-268376a208ce942e92088315d383a4e09974cbc2.tar.bz2
rpm-268376a208ce942e92088315d383a4e09974cbc2.zip
Rescusitate doxygen file manifest.
CVS patchset: 5968 CVS date: 2002/12/24 17:06:35
Diffstat (limited to 'rpmio/argv.c')
-rw-r--r--rpmio/argv.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/rpmio/argv.c b/rpmio/argv.c
new file mode 100644
index 000000000..b29468fb0
--- /dev/null
+++ b/rpmio/argv.c
@@ -0,0 +1,207 @@
+/** \ingroup rpmio
+ * \file rpmio/argv.c
+ */
+
+#include "system.h"
+
+#include <argv.h>
+
+#include "debug.h"
+
+/*@-bounds@*/
+/**
+ * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
+ * @param p memory to free
+ * @return NULL always
+ */
+/*@unused@*/ static inline /*@null@*/
+void * _free(/*@only@*/ /*@null@*/ /*@out@*/ const void * p)
+ /*@modifies p @*/
+{
+ if (p != NULL) free((void *)p);
+ return NULL;
+}
+
+void argvPrint(const char * msg, ARGV_t argv, FILE * fp)
+{
+ ARGV_t av;
+
+ if (fp == NULL) fp = stderr;
+
+ if (msg)
+ fprintf(fp, "===================================== %s\n", msg);
+
+ if (argv)
+ for (av = argv; *av; av++)
+ fprintf(fp, "%s\n", *av);
+
+}
+
+ARGI_t argiFree(ARGI_t argi)
+{
+ if (argi) {
+ argi->nvals = 0;
+ argi->vals = _free(argi->vals);
+ }
+ argi = _free(argi);
+ return NULL;
+}
+
+ARGV_t argvFree(/*@only@*/ /*@null@*/ ARGV_t argv)
+{
+ ARGV_t av;
+
+/*@-branchstate@*/
+ if (argv)
+ for (av = argv; *av; av++)
+ *av = _free(*av);
+/*@=branchstate@*/
+ argv = _free(argv);
+ return NULL;
+}
+
+int argiCount(ARGI_t argi)
+{
+ int nvals = 0;
+ if (argi)
+ nvals = argi->nvals;
+ return nvals;
+}
+
+const ARGint_t argiData(const ARGI_t argi)
+{
+ ARGint_t vals = NULL;
+ if (argi && argi->nvals > 0)
+ vals = argi->vals;
+ return vals;
+}
+
+int argvCount(const ARGV_t argv)
+{
+ int argc = 0;
+ if (argv)
+ while (argv[argc] != NULL)
+ argc++;
+ return argc;
+}
+
+const ARGV_t argvData(const ARGV_t argv)
+{
+/*@-retalias -temptrans @*/
+ return argv;
+/*@=retalias =temptrans @*/
+}
+
+int argvCmp(const void * a, const void * b)
+{
+/*@-boundsread@*/
+ ARGstr_t astr = *(ARGV_t)a;
+ ARGstr_t bstr = *(ARGV_t)b;
+/*@=boundsread@*/
+ return strcmp(astr, bstr);
+}
+
+int argvSort(ARGV_t argv, int (*compar)(const void *, const void *))
+{
+ if (compar == NULL)
+ compar = argvCmp;
+ qsort(argv, argvCount(argv), sizeof(*argv), compar);
+ return 0;
+}
+
+ARGV_t argvSearch(ARGV_t argv, ARGstr_t val,
+ int (*compar)(const void *, const void *))
+{
+ if (argv == NULL)
+ return NULL;
+ if (compar == NULL)
+ compar = argvCmp;
+ return bsearch(&val, argv, argvCount(argv), sizeof(*argv), compar);
+}
+
+int argiAdd(/*@out@*/ ARGI_t * argip, int ix, int val)
+{
+ ARGI_t argi;
+
+ if (argip == NULL)
+ return -1;
+ if (*argip == NULL)
+ *argip = xcalloc(1, sizeof(**argip));
+ argi = *argip;
+ if (ix < 0)
+ ix = argi->nvals;
+ if (ix >= argi->nvals) {
+ argi->vals = xrealloc(argi->vals, (ix + 1) * sizeof(*argi->vals));
+ memset(argi->vals + argi->nvals, 0,
+ (ix - argi->nvals) * sizeof(*argi->vals));
+ argi->nvals = ix + 1;
+ }
+ argi->vals[ix] = val;
+ return 0;
+}
+
+int argvAdd(/*@out@*/ ARGV_t * argvp, ARGstr_t val)
+{
+ ARGV_t argv;
+ int argc;
+
+ if (argvp == NULL)
+ return -1;
+ argc = argvCount(*argvp);
+/*@-unqualifiedtrans@*/
+ *argvp = xrealloc(*argvp, (argc + 1 + 1) * sizeof(**argvp));
+/*@=unqualifiedtrans@*/
+ argv = *argvp;
+ argv[argc++] = xstrdup(val);
+ argv[argc ] = NULL;
+ return 0;
+}
+
+int argvAppend(/*@out@*/ ARGV_t * argvp, const ARGV_t av)
+{
+ ARGV_t argv = *argvp;
+ int argc = argvCount(argv);
+ int ac = argvCount(av);
+ int i;
+
+ argv = xrealloc(argv, (argc + ac + 1) * sizeof(*argv));
+ for (i = 0; i < ac; i++)
+ argv[argc + i] = xstrdup(av[i]);
+ argv[argc + ac] = NULL;
+ *argvp = argv;
+ return 0;
+}
+
+int argvSplit(ARGV_t * argvp, const char * str, const char * seps)
+{
+ char * dest = alloca(strlen(str) + 1);
+ ARGV_t argv;
+ int argc = 1;
+ const char * s;
+ char * t;
+ int c;
+
+ for (argc = 1, s = str, t = dest; (c = *s); s++, t++) {
+ if (strchr(seps, c)) {
+ argc++;
+ c = '\0';
+ }
+ *t = c;
+ }
+ *t = '\0';
+
+ argv = xmalloc( (argc + 1) * sizeof(*argv));
+
+ for (c = 0, s = dest; s < t; s+= strlen(s) + 1) {
+ if (*s == '\0')
+ continue;
+ argv[c] = xstrdup(s);
+ c++;
+ }
+ argv[c] = NULL;
+ *argvp = argv;
+/*@-nullstate@*/
+ return 0;
+/*@=nullstate@*/
+}
+/*@=bounds@*/