Lose rpmfiBuildFClasses() completely
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 21 May 2008 09:45:34 +0000 (12:45 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 21 May 2008 09:45:34 +0000 (12:45 +0300)
- only fileclassTag() needs it, move it inline there
- simplify a lot: as we now can deallocate regular string arrays too,
  don't bother creating a single allocation blob for the classes

lib/tagexts.c

index 9b72314..2bb160e 100644 (file)
@@ -22,57 +22,6 @@ static const struct headerTagFunc_s rpmHeaderTagExtensions[];
 
 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)
 {
@@ -403,9 +352,30 @@ static int filenamesTag(Header h, rpmtd td)
  */
 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; 
 }