changeset 2396:679732e4cfed

Implement counting of matching files for each match sequence.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 10 Jan 2020 01:23:02 +0200
parents e149fc273f2b
children 698ee976fb23
files tools/fanalyze.c
diffstat 1 files changed, 35 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/tools/fanalyze.c	Thu Jan 09 21:14:18 2020 +0200
+++ b/tools/fanalyze.c	Fri Jan 10 01:23:02 2020 +0200
@@ -52,6 +52,7 @@
     size_t size;
     DMStats stats;
     BOOL analyzed;
+    size_t index;
 } DMSourceFile;
 
 
@@ -528,8 +529,10 @@
 {
     if (nsrcFiles < SET_MAX_FILES)
     {
-        DMSourceFile *file = &srcFiles[nsrcFiles++];
+        DMSourceFile *file = &srcFiles[nsrcFiles];
         file->filename = currArg;
+        file->index = nsrcFiles;
+        nsrcFiles++;
         return TRUE;
     }
     else
@@ -641,7 +644,8 @@
 int main(int argc, char *argv[])
 {
     DMCompElem *compBuf = NULL;
-    size_t compBufSize = 0, totalSize = 0;
+    size_t compBufSize = 0, totalSize = 0, fileFlagsSize;
+    BOOL *fileFlags = NULL;
     int res;
 
     memset(&dmSequences, 0, sizeof(dmSequences));
@@ -663,6 +667,15 @@
         goto out;
     }
 
+    // Allocate file flags
+    fileFlagsSize = sizeof(BOOL) * nsrcFiles;
+    if ((fileFlags = dmMalloc(fileFlagsSize)) == NULL)
+    {
+        dmErrorMsg("Could not allocate %" DM_PRIu_SIZE_T " bytes of memory for file flag array.\n",
+            fileFlagsSize);
+        goto out;
+    }
+
     // Read input files
     for (int nfile = 0; nfile < nsrcFiles; nfile++)
     {
@@ -1003,6 +1016,25 @@
         }
 
         //
+        // Count number of files
+        //
+        for (int nmatch = 0; nmatch < ndmSequences; nmatch++)
+        {
+            DMMatchSeq *seq = &dmSequences[nmatch];
+            memset(fileFlags, 0, fileFlagsSize);
+
+            for (int nplace = 0; nplace < seq->nplaces; nplace++)
+            {
+                DMMatchPlace *place = &seq->places[nplace];
+                if (!fileFlags[place->file->index])
+                {
+                    fileFlags[place->file->index] = TRUE;
+                    seq->nfiles++;
+                }
+            }
+        }
+
+        //
         // Display results
         //
         dmPrint(0, "Found %d matching sequence groups of %" DM_PRIu_SIZE_T " bytes minimum.\n",
@@ -1012,7 +1044,7 @@
         {
             DMMatchSeq *seq = &dmSequences[nmatch];
 
-            printf("\nSeq of %" DM_PRIu_SIZE_T " bytes in %d places (%d files)\n",
+            printf("\nSeq of %" DM_PRIu_SIZE_T " bytes in %d places (in %d files)\n",
                 seq->len, seq->nplaces, seq->nfiles);
 
             if (dmVerbosity > 0)