rpm
4.5
|
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@*/