00001
00005 #include "system.h"
00006
00007 #include "rpmio_internal.h"
00008 #include <argv.h>
00009
00010 #include "debug.h"
00011
00012
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( ARGV_t argv)
00040 {
00041 ARGV_t av;
00042
00043
00044 if (argv)
00045 for (av = argv; *av; av++)
00046 *av = _free(*av);
00047
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
00080 return argv;
00081
00082 }
00083
00084 int argvCmp(const void * a, const void * b)
00085 {
00086
00087 ARGstr_t astr = *(ARGV_t)a;
00088 ARGstr_t bstr = *(ARGV_t)b;
00089
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( 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( 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
00141 *argvp = xrealloc(*argvp, (argc + 1 + 1) * sizeof(**argvp));
00142
00143 argv = *argvp;
00144 argv[argc++] = xstrdup(val);
00145 argv[argc ] = NULL;
00146 return 0;
00147 }
00148
00149 int argvAppend( 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
00197 return 0;
00198
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) - 1;
00238 while (strchr("\r\n", *be) != NULL)
00239 *be-- = '\0';
00240 rc = argvAdd(&av, b);
00241 }
00242
00243 if (!rc)
00244 rc = ferror(fp);
00245 if (!rc)
00246 rc = (feof(fp) ? 0 : 1);
00247 if (!rc && argvp)
00248 *argvp = av;
00249 else
00250 av = argvFree(av);
00251
00252 return rc;
00253 }
00254
00255