void *rpmHeaderTagFunc(rpmTag tag);
-static void rpmfiBuildFClasses(Header h, const char *** fclassp, rpm_count_t * fcp)
-{
- int scareMem = 0;
- rpmfi fi = rpmfiNew(NULL, h, RPMTAG_BASENAMES, scareMem);
- const char * FClass;
- const char ** av;
- int ac;
- size_t nb;
- char * t;
-
- if ((ac = rpmfiFC(fi)) <= 0) {
- av = NULL;
- ac = 0;
- goto exit;
- }
-
- /* Compute size of file class argv array blob. */
- nb = (ac + 1) * sizeof(*av);
- fi = rpmfiInit(fi, 0);
- if (fi != NULL)
- while (rpmfiNext(fi) >= 0) {
- FClass = rpmfiFClass(fi);
- if (FClass && *FClass != '\0')
- nb += strlen(FClass);
- nb += 1;
- }
-
- /* Create and load file class argv array. */
- av = xmalloc(nb);
- t = ((char *) av) + ((ac + 1) * sizeof(*av));
- ac = 0;
- fi = rpmfiInit(fi, 0);
- if (fi != NULL)
- while (rpmfiNext(fi) >= 0) {
- FClass = rpmfiFClass(fi);
- av[ac++] = t;
- if (FClass && *FClass != '\0')
- t = stpcpy(t, FClass);
- *t++ = '\0';
- }
- av[ac] = NULL; /* XXX tag arrays are not NULL terminated. */
-
-exit:
- fi = rpmfiFree(fi);
- if (fclassp)
- *fclassp = av;
- else
- av = _free(av);
- if (fcp) *fcp = ac;
-}
-
static void rpmfiBuildFDeps(Header h, rpmTag tagN,
const char *** fdepsp, rpm_count_t * fcp)
{
*/
static int fileclassTag(Header h, rpmtd td)
{
+ int scareMem = 0;
+ rpmfi fi = rpmfiNew(NULL, h, RPMTAG_BASENAMES, scareMem);
+ char **fclasses;
+ int ix, numfiles;
+
+ numfiles = rpmfiFC(fi);
+ if (numfiles <= 0) {
+ goto exit;
+ }
+
+ fclasses = xmalloc(numfiles * sizeof(*fclasses));
+ rpmfiInit(fi, 0);
+ while ((ix = rpmfiNext(fi)) >= 0) {
+ const char *fclass = rpmfiFClass(fi);
+ fclasses[ix] = xstrdup(fclass ? fclass : "");
+ }
+
+ td->data = fclasses;
+ td->count = numfiles;
+ td->flags = RPMTD_ALLOCED | RPMTD_PTR_ALLOCED;
+
+exit:
td->type = RPM_STRING_ARRAY_TYPE;
- rpmfiBuildFClasses(h, (const char ***) &(td->data), &(td->count));
- td->flags = RPMTD_ALLOCED;
+ fi = rpmfiFree(fi);
return 0;
}