# HG changeset patch # User Matti Hamalainen # Date 1578612182 -7200 # Node ID 679732e4cfed747b5cd09525ef6a22627aa82b9a # Parent e149fc273f2b8bf1a72ef563f3f3613fd3aa2e0a Implement counting of matching files for each match sequence. diff -r e149fc273f2b -r 679732e4cfed tools/fanalyze.c --- 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)