universe@10: /* universe@20: * scanner.c universe@10: * universe@10: * Created on: 23.05.2011 universe@20: * Author: Mike universe@10: */ universe@1: universe@1: universe@10: #include "scanner.h" universe@10: #include "suffix_fnc.h" universe@21: #include "bfile_heuristics.h" universe@23: #include universe@3: universe@23: int scanDirectory(scanner_t scanner, settings_t* settings) { universe@23: universe@23: DIR *dirf; universe@3: struct dirent *entry; universe@18: int lines, a; universe@3: int lineSum = 0; universe@21: bool bfile; universe@23: struct stat statbuf; universe@3: universe@23: if ((dirf = opendir(scanner.dir)) == NULL) { universe@23: printf(scanner.dir); universe@23: perror(" Directory access failed"); universe@23: return 0; universe@23: } universe@23: universe@23: while ((entry = readdir(dirf)) != NULL) { universe@3: if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { universe@23: /* Construct tree view and absolute pathname strings */ universe@23: char entryname[strlen(entry->d_name)+scanner.spaces]; universe@23: for (int t = 0 ; t < scanner.spaces ; t++) { universe@3: entryname[t]=' '; universe@3: } universe@23: entryname[scanner.spaces] = 0; universe@3: strcat(entryname, entry->d_name); universe@3: universe@23: char filename[(1+strlen(scanner.dir)+strlen(entry->d_name))]; universe@23: strcpy(filename, scanner.dir); universe@14: strncat(filename, &settings->fileSeparator, 1); universe@14: strcat(filename, entry->d_name); universe@14: universe@22: /* Check for subdirectory */ universe@23: if (stat(filename, &statbuf) == 0) { universe@23: if (!(statbuf.st_mode & S_IFREG)) { universe@23: printf("%-60s\n", entryname); universe@23: if (settings->recursive && (statbuf.st_mode & S_IFDIR)) { universe@23: lineSum += scanDirectory( universe@23: (scanner_t) {filename, scanner.spaces+1}, settings); universe@23: } universe@23: continue; universe@3: } universe@23: } else { universe@23: perror(" Error in stat call"); universe@3: continue; universe@3: } universe@3: universe@3: if (testSuffix(filename, settings)) { universe@25: /* Count lines */ universe@25: lines = 0; universe@25: bfile = false; universe@25: bfile_reset(settings->bfileHeuristics); universe@25: char line_buffer[2048]; universe@25: int line_buffer_offset = 0; universe@25: universe@3: FILE *file = fopen(filename, "r"); universe@3: if (file == NULL) { universe@23: printf(entryname); universe@3: perror(" File acces failed"); universe@3: continue; universe@3: } universe@3: universe@3: do { universe@3: a = fgetc(file); universe@3: universe@21: bfile = bfile_check(settings->bfileHeuristics, a); universe@21: universe@3: if (a == 10) { universe@25: line_buffer[line_buffer_offset] = 0; universe@25: /* TODO: do regex parsing */ universe@25: universe@25: line_buffer_offset = 0; universe@3: lines++; universe@25: } else { universe@25: if (line_buffer_offset < 2048) { universe@25: line_buffer[line_buffer_offset] = a; universe@25: line_buffer_offset++; universe@25: } else { universe@25: line_buffer[line_buffer_offset-1] = 0; universe@25: settings->confusing_lnlen = true; universe@25: } universe@3: } universe@21: } while (!bfile && a != EOF); universe@3: fclose(file); universe@3: universe@22: /* Print and sum line count */ universe@21: if (bfile) { universe@22: if (!settings->matchesOnly) { universe@22: printf("%-60s%19s\n", entryname, "binary"); universe@22: } universe@21: } else { universe@22: lineSum += lines; universe@3: printf("%-60s%13d lines\n", entryname, lines); universe@21: } universe@16: } else { universe@3: if (!settings->matchesOnly) { universe@22: /* Print hint */ universe@21: printf("%-60s%19s\n", entryname, "no match"); universe@3: } universe@3: } universe@3: } universe@3: } universe@23: universe@23: closedir(dirf); universe@23: universe@3: return lineSum; universe@3: }