scanner.c

Thu, 09 Feb 2012 15:56:18 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 09 Feb 2012 15:56:18 +0100
changeset 30
d642fdb6745e
parent 28
72a98cbcb9f1
permissions
-rw-r--r--

allow parallel use of -s and -S

universe@10 1 /*
universe@20 2 * scanner.c
universe@10 3 *
universe@10 4 * Created on: 23.05.2011
universe@20 5 * Author: Mike
universe@10 6 */
universe@1 7
universe@1 8
universe@10 9 #include "scanner.h"
universe@10 10 #include "suffix_fnc.h"
universe@21 11 #include "bfile_heuristics.h"
universe@27 12 #include "regex_parser.h"
universe@23 13 #include <sys/stat.h>
universe@3 14
universe@23 15 int scanDirectory(scanner_t scanner, settings_t* settings) {
universe@23 16
universe@23 17 DIR *dirf;
universe@3 18 struct dirent *entry;
universe@18 19 int lines, a;
universe@3 20 int lineSum = 0;
universe@21 21 bool bfile;
universe@23 22 struct stat statbuf;
universe@3 23
universe@23 24 if ((dirf = opendir(scanner.dir)) == NULL) {
universe@23 25 printf(scanner.dir);
universe@23 26 perror(" Directory access failed");
universe@23 27 return 0;
universe@23 28 }
universe@23 29
universe@23 30 while ((entry = readdir(dirf)) != NULL) {
universe@3 31 if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
universe@23 32 /* Construct tree view and absolute pathname strings */
universe@23 33 char entryname[strlen(entry->d_name)+scanner.spaces];
universe@23 34 for (int t = 0 ; t < scanner.spaces ; t++) {
universe@3 35 entryname[t]=' ';
universe@3 36 }
universe@23 37 entryname[scanner.spaces] = 0;
universe@3 38 strcat(entryname, entry->d_name);
universe@3 39
universe@23 40 char filename[(1+strlen(scanner.dir)+strlen(entry->d_name))];
universe@23 41 strcpy(filename, scanner.dir);
universe@14 42 strncat(filename, &settings->fileSeparator, 1);
universe@14 43 strcat(filename, entry->d_name);
universe@14 44
universe@22 45 /* Check for subdirectory */
universe@23 46 if (stat(filename, &statbuf) == 0) {
universe@23 47 if (!(statbuf.st_mode & S_IFREG)) {
universe@23 48 printf("%-60s\n", entryname);
universe@23 49 if (settings->recursive && (statbuf.st_mode & S_IFDIR)) {
universe@23 50 lineSum += scanDirectory(
universe@23 51 (scanner_t) {filename, scanner.spaces+1}, settings);
universe@23 52 }
universe@23 53 continue;
universe@3 54 }
universe@23 55 } else {
universe@23 56 perror(" Error in stat call");
universe@3 57 continue;
universe@3 58 }
universe@3 59
universe@30 60 if ((settings->includeSuffixes->count == 0
universe@30 61 || testSuffix(filename, settings->includeSuffixes))
universe@30 62 && !testSuffix(filename, settings->excludeSuffixes)) {
universe@25 63 /* Count lines */
universe@25 64 lines = 0;
universe@25 65 bfile = false;
universe@25 66 bfile_reset(settings->bfileHeuristics);
universe@27 67 char line_buffer[REGEX_MAX_LINELENGTH];
universe@25 68 int line_buffer_offset = 0;
universe@25 69
universe@3 70 FILE *file = fopen(filename, "r");
universe@3 71 if (file == NULL) {
universe@23 72 printf(entryname);
universe@3 73 perror(" File acces failed");
universe@3 74 continue;
universe@3 75 }
universe@3 76
universe@3 77 do {
universe@3 78 a = fgetc(file);
universe@3 79
universe@21 80 bfile = bfile_check(settings->bfileHeuristics, a);
universe@21 81
universe@28 82 if (a == 10 || a == EOF) {
universe@25 83 line_buffer[line_buffer_offset] = 0;
universe@28 84 if (regex_parser_do(settings->regex, line_buffer) == 0) {
universe@28 85 /* Only subtract lines when matching has finished */
universe@28 86 if (!regex_parser_matching(settings->regex)) {
universe@28 87 lines -= settings->regex->matched_lines;
universe@28 88 }
universe@28 89 }
universe@25 90
universe@25 91 line_buffer_offset = 0;
universe@3 92 lines++;
universe@25 93 } else {
universe@27 94 if (line_buffer_offset < REGEX_MAX_LINELENGTH) {
universe@25 95 line_buffer[line_buffer_offset] = a;
universe@25 96 line_buffer_offset++;
universe@25 97 } else {
universe@25 98 line_buffer[line_buffer_offset-1] = 0;
universe@25 99 settings->confusing_lnlen = true;
universe@25 100 }
universe@3 101 }
universe@21 102 } while (!bfile && a != EOF);
universe@3 103 fclose(file);
universe@3 104
universe@22 105 /* Print and sum line count */
universe@21 106 if (bfile) {
universe@22 107 if (!settings->matchesOnly) {
universe@22 108 printf("%-60s%19s\n", entryname, "binary");
universe@22 109 }
universe@21 110 } else {
universe@22 111 lineSum += lines;
universe@3 112 printf("%-60s%13d lines\n", entryname, lines);
universe@21 113 }
universe@16 114 } else {
universe@3 115 if (!settings->matchesOnly) {
universe@22 116 /* Print hint */
universe@21 117 printf("%-60s%19s\n", entryname, "no match");
universe@3 118 }
universe@3 119 }
universe@3 120 }
universe@3 121 }
universe@23 122
universe@23 123 closedir(dirf);
universe@23 124
universe@3 125 return lineSum;
universe@3 126 }

mercurial