Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

rpmio/argv.c

Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 
00007 #include "rpmio_internal.h"     /* XXX fdGetFILE() */
00008 #include <argv.h>
00009 
00010 #include "debug.h"
00011 
00012 /*@-bounds@*/
00018 /*@unused@*/ static inline /*@null@*/
00019 void * _free(/*@only@*/ /*@null@*/ /*@out@*/ const void * p)
00020         /*@modifies p @*/
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(/*@only@*/ /*@null@*/ ARGV_t argv)
00052 {
00053     ARGV_t av;
00054     
00055 /*@-branchstate@*/
00056     if (argv)
00057     for (av = argv; *av; av++)
00058         *av = _free(*av);
00059 /*@=branchstate@*/
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 /*@-retalias -temptrans @*/
00092     return argv;
00093 /*@=retalias =temptrans @*/
00094 }
00095 
00096 int argvCmp(const void * a, const void * b)
00097 {
00098 /*@-boundsread@*/
00099     ARGstr_t astr = *(ARGV_t)a;
00100     ARGstr_t bstr = *(ARGV_t)b;
00101 /*@=boundsread@*/
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(/*@out@*/ 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(/*@out@*/ 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 /*@-unqualifiedtrans@*/
00153     *argvp = xrealloc(*argvp, (argc + 1 + 1) * sizeof(**argvp));
00154 /*@=unqualifiedtrans@*/
00155     argv = *argvp;
00156     argv[argc++] = xstrdup(val);
00157     argv[argc  ] = NULL;
00158     return 0;
00159 }
00160 
00161 int argvAppend(/*@out@*/ 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 /*@-nullstate@*/
00209     return 0;
00210 /*@=nullstate@*/
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 /*@=bounds@*/

Generated on Mon Aug 3 15:15:36 2009 for rpm by  doxygen 1.4.4