Calculate filename buffer len lazily in rpmfiFN() as needed
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 5 Nov 2008 13:44:35 +0000 (15:44 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 5 Nov 2008 13:44:35 +0000 (15:44 +0200)
- avoids having to separately calculate in genCpioListAndHeader()
- avoids unnecessary fnlen field in rpmfi struct
- avoids having to calculate it at all if rpmfiFN() is never called

build/files.c
lib/rpmfi.c
lib/rpmfi_internal.h

index 5d58564..088c8b3 100644 (file)
@@ -1039,7 +1039,6 @@ static void genCpioListAndHeader(FileList fl,
     size_t apathlen = 0;
     size_t dpathlen = 0;
     size_t skipLen = 0;
-    size_t fnlen;
     FileListRec flp;
     char buf[BUFSIZ];
     int i;
@@ -1298,9 +1297,6 @@ static void genCpioListAndHeader(FileList fl,
            continue;
        }
 
-       if ((fnlen = strlen(flp->diskPath) + 1) > fi->fnlen)
-           fi->fnlen = fnlen;
-
        /* Create disk directory and base name. */
        fi->dil[i] = i;
 /* FIX: artifact of spoofing headerGetEntry */
index 5f25f4b..cb7f089 100644 (file)
@@ -117,8 +117,18 @@ const char * rpmfiFN(rpmfi fi)
 
     if (fi != NULL && fi->i >= 0 && fi->i < fi->fc) {
        char * t;
-       if (fi->fn == NULL)
-           fi->fn = xmalloc(fi->fnlen);
+       if (fi->fn == NULL) {
+           size_t dnlmax = 0, bnlmax = 0, len;
+           for (int i = 0; i < fi->dc; i++) {
+               if ((len = strlen(fi->dnl[i])) > dnlmax)
+                   dnlmax = len;
+           }
+           for (int i = 0; i < fi->fc; i++) {
+               if ((len = strlen(fi->bnl[i])) > bnlmax)
+                   bnlmax = len;
+           }
+           fi->fn = xmalloc(dnlmax + bnlmax + 1);
+       }
        FN = t = fi->fn;
        *t = '\0';
        t = stpcpy(t, fi->dnl[fi->dil[fi->i]]);
@@ -1185,15 +1195,12 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags)
     rpmfi fi = NULL;
     const char * Type;
     rpm_loff_t *asize = NULL;
-    int dnlmax, bnlmax;
     unsigned char * t;
     struct rpmtd_s fdigests, digalgo;
     struct rpmtd_s td;
     headerGetFlags scareFlags = (flags & RPMFI_KEEPHEADER) ? 
                                HEADERGET_MINMEM : HEADERGET_ALLOC;
     headerGetFlags defFlags = HEADERGET_ALLOC;
-    int len;
-    int i;
 
     if (tagN == RPMTAG_BASENAMES) {
        Type = "Files";
@@ -1343,17 +1350,7 @@ rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, rpmfiFlags flags)
        fi->h = headerFree(fi->h);
     }
 
-    dnlmax = -1;
-    for (i = 0; i < fi->dc; i++) {
-       if ((len = strlen(fi->dnl[i])) > dnlmax)
-           dnlmax = len;
-    }
-    bnlmax = -1;
-    for (i = 0; i < fi->fc; i++) {
-       if ((len = strlen(fi->bnl[i])) > bnlmax)
-           bnlmax = len;
-    }
-    fi->fnlen = dnlmax + bnlmax + 1;
+    /* lazily alloced from rpmfiFN() */
     fi->fn = NULL;
 
 exit:
index 349d111..1049036 100644 (file)
@@ -96,7 +96,6 @@ struct rpmfi_s {
     int transscripts;          /*!< pre/posttrans script existence */
 
     char * fn;                 /*!< File name buffer. */
-    size_t fnlen;              /*!< FIle name buffer length. */
 
     size_t astriplen;
     size_t striplen;