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

Generated on Sun Nov 24 23:20:06 2013 for rpm by  doxygen 1.4.4