scanner.c

Thu, 01 Dec 2011 17:04:30 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 01 Dec 2011 17:04:30 +0100
changeset 25
802c5382f499
parent 23
778388400f7b
child 27
95a958e3de88
permissions
-rw-r--r--

Added line buffer (and warning message - there is no regexp parser, though)

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

mercurial