src/scanner.c

changeset 61
9c8d768f0244
parent 60
69be673a4fd0
child 66
be2084398c37
--- a/src/scanner.c	Sat Jul 25 18:28:01 2020 +0200
+++ b/src/scanner.c	Mon Jul 27 17:19:56 2020 +0200
@@ -26,7 +26,6 @@
 
 
 #include "scanner.h"
-#include "suffix_fnc.h"
 #include "bfile_heuristics.h"
 #include "regex_parser.h"
 #include <sys/stat.h>
@@ -37,11 +36,82 @@
   char *displayname;
   int displayname_len;
   char *filename;
+  char *ext;
   int st_mode;
   filelist_t *next;
 };
 
-filelist_t *buildFileList(scanner_t scanner, settings_t* settings,
+static bool testSuffix(char* filename, string_list_t* list) {
+  bool ret = false;
+  int tokenlen, fnamelen = strlen(filename);
+  for (int t = 0 ; t < list->count ; t++) {
+    tokenlen = strlen(list->items[t]);
+    if (fnamelen >= tokenlen && tokenlen > 0) {
+      if (strncmp(filename+fnamelen-tokenlen,
+                  list->items[t], tokenlen) == 0) {
+        ret = true;
+        break;
+      }
+    }
+  }
+  return ret;
+}
+
+static void addLinesPerExtension(scanresult_ext_t* result,
+        char* ext, int lines) {
+  if (!result) return;
+  
+  if (!ext) ext = "w/o";
+  
+  for (int i = 0 ; i < result->count ; i++) {
+    if (strcasecmp(result->extensions[i], ext) == 0) {
+      result->lines[i] += lines;
+      return;
+    }
+  }
+  
+  if (result->count == result->capacity) {
+    int newcap = result->capacity+8;
+    char** extarr = realloc(result->extensions, newcap*sizeof(char*));
+    int* linesarr = realloc(result->lines, newcap*sizeof(int));
+    if (!extarr || !linesarr) {
+      fprintf(stderr, "Memory allocation error.\n");
+      abort();
+    }
+    result->extensions = extarr;
+    result->lines = linesarr;
+    result->capacity = newcap;
+  }
+  
+  result->extensions[result->count] = strdup(ext);
+  result->lines[result->count] = lines;
+  result->count++;
+}
+
+scanresult_t* new_scanresult_t(settings_t* settings) {
+  scanresult_t* result = calloc(1, sizeof(scanresult_t));
+  if (settings->individual_sums) {
+    result->ext = calloc(1, sizeof(scanresult_ext_t));
+  }
+  return result;
+}
+
+void destroy_scanresult_t(scanresult_t* result) {
+  if (result->ext) {
+    if (result->ext->count > 0) {
+      for (int i = 0 ; i < result->ext->count ; i++) {
+        free(result->ext->extensions[i]);
+      }
+      free(result->ext->extensions);
+      free(result->ext->lines);
+    }
+    free(result->ext);
+  }
+  free(result);
+}
+
+
+static filelist_t *buildFileList(scanner_t scanner, settings_t* settings,
     filelist_t* list) {
   
   DIR *dirf;
@@ -76,6 +146,9 @@
       memcpy(filename+dirnamelen+1, entry->d_name, newentry->displayname_len);
       filename[1+dirnamelen+newentry->displayname_len] = 0;
       newentry->filename = filename;
+      
+      /* Obtain file extension */
+      newentry->ext = strrchr(newentry->displayname, '.');
 
       /* Check for subdirectory */
       if (stat(filename, &statbuf) == 0) {
@@ -115,7 +188,7 @@
 void scanDirectory(scanner_t scanner, settings_t* settings,
     string_list_t* output, scanresult_t* result) {
 
-  result->directory = 0;
+  result->lines = 0;
   int a;
   bool bfile;
   char *outbuf;
@@ -129,16 +202,17 @@
       if (settings->recursive && S_ISDIR(filelist->st_mode)) {
         string_list_t *recoutput = new_string_list_t();
         scanresult_t recresult;
+        recresult.ext = result->ext;
         scanDirectory(
             (scanner_t) {filelist->filename, scanner.spaces+1},
             settings, recoutput, &recresult);
-        result->directory += recresult.directory;
+        result->lines += recresult.lines;
         if (!settings->matchesOnly || recoutput->count > 0) {
           outbuf = (char*) malloc(81);
           snprintf(outbuf, 81, "%*s/%*s%13d lines\n",
               filelist->displayname_len+scanner.spaces, filelist->displayname,
               60-filelist->displayname_len-scanner.spaces-1, "",
-              recresult.directory);
+              recresult.lines);
           add_string(output, outbuf);
           for (int i = 0 ; i < recoutput->count ; i++) {
             add_string(output, recoutput->items[i]);
@@ -211,7 +285,8 @@
               add_string(output, outbuf);
             }
           } else {
-            result->directory += lines;
+            addLinesPerExtension(result->ext, filelist->ext, lines);
+            result->lines += lines;
             outbuf = (char*) malloc(81);
             snprintf(outbuf, 81, "%*s%*s%13d lines\n",
                 filelist->displayname_len+scanner.spaces, filelist->displayname,

mercurial