Sat, 25 Jul 2020 18:28:01 +0200
preparing changes for individual sum feature
| 10 | 1 | /* | 
| 34 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | 
| 57 
68018eac46c3
adds simple tiny test suite and updates license headers
 Mike Becker <universe@uap-core.de> parents: 
54diff
changeset | 3 | * Copyright 2018 Mike Becker. All rights reserved. | 
| 34 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 4 | * | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 5 | * Redistribution and use in source and binary forms, with or without | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 6 | * modification, are permitted provided that the following conditions are met: | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 7 | * | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 8 | * 1. Redistributions of source code must retain the above copyright | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 9 | * notice, this list of conditions and the following disclaimer. | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 10 | * | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 11 | * 2. Redistributions in binary form must reproduce the above copyright | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 12 | * notice, this list of conditions and the following disclaimer in the | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 13 | * documentation and/or other materials provided with the distribution. | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 14 | * | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 16 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 18 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 19 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 20 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 21 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 22 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
| 
fa9bda32de17
moved src files to src subdirectory and added licence text
 Mike Becker <universe@uap-core.de> parents: 
30diff
changeset | 23 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
| 57 
68018eac46c3
adds simple tiny test suite and updates license headers
 Mike Becker <universe@uap-core.de> parents: 
54diff
changeset | 24 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| 10 | 25 | */ | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 26 | |
| 8 
28319b20968c
encapsulated common operations
 Mike Becker <universe@uap-core.de> parents: 
6diff
changeset | 27 | |
| 10 | 28 | #include "scanner.h" | 
| 29 | #include "suffix_fnc.h" | |
| 21 
91e0890464b0
implemented bfile heuristics option + TODO: implement algorithm
 Mike Becker <universe@uap-core.de> parents: 
20diff
changeset | 30 | #include "bfile_heuristics.h" | 
| 27 
95a958e3de88
added regexp_parser struct and compile function
 Mike Becker <universe@uap-core.de> parents: 
25diff
changeset | 31 | #include "regex_parser.h" | 
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 32 | #include <sys/stat.h> | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 33 | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 34 | typedef struct filelist filelist_t; | 
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 35 | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 36 | struct filelist { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 37 | char *displayname; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 38 | int displayname_len; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 39 | char *filename; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 40 | int st_mode; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 41 | filelist_t *next; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 42 | }; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 43 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 44 | filelist_t *buildFileList(scanner_t scanner, settings_t* settings, | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 45 | filelist_t* list) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 46 | |
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 47 | DIR *dirf; | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 48 | struct dirent *entry; | 
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 49 | struct stat statbuf; | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 50 | |
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 51 | if ((dirf = opendir(scanner.dir)) == NULL) { | 
| 58 
bb512754aaf3
fixes error message when directory access fails
 Mike Becker <universe@uap-core.de> parents: 
57diff
changeset | 52 | fprintf(stderr, "%s - ", scanner.dir); | 
| 
bb512754aaf3
fixes error message when directory access fails
 Mike Becker <universe@uap-core.de> parents: 
57diff
changeset | 53 | perror("Directory access failed"); | 
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 54 | return 0; | 
| 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 55 | } | 
| 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 56 | |
| 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 57 | while ((entry = readdir(dirf)) != NULL) { | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 58 | if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 59 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 60 | /* Create new filelist entry */ | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 61 | filelist_t *newentry = (filelist_t*) malloc(sizeof(filelist_t)); | 
| 42 | 62 | newentry->next = NULL; | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 63 | |
| 42 | 64 | newentry->displayname_len = strlen(entry->d_name); | 
| 65 | newentry->displayname = (char*) malloc(newentry->displayname_len+1); | |
| 66 | memcpy(newentry->displayname, entry->d_name, newentry->displayname_len); | |
| 67 | newentry->displayname[newentry->displayname_len] = 0; | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 68 | |
| 42 | 69 | newentry->st_mode = 0; | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 70 | |
| 40 
5938a9b74e8e
improved printing the results and fixed bug where the filename was displayed as an empty string
 Mike Becker <universe@uap-core.de> parents: 
36diff
changeset | 71 | /* Construct absolute pathname string */ | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 72 | size_t dirnamelen = strlen(scanner.dir); | 
| 42 | 73 | char *filename = (char*) malloc(2+dirnamelen+newentry->displayname_len); | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 74 | memcpy(filename, scanner.dir, dirnamelen); | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 75 | filename[dirnamelen] = settings->fileSeparator; | 
| 42 | 76 | memcpy(filename+dirnamelen+1, entry->d_name, newentry->displayname_len); | 
| 77 | filename[1+dirnamelen+newentry->displayname_len] = 0; | |
| 78 | newentry->filename = filename; | |
| 14 
ee9333c91dda
some minor fixes + makefile now injects revisionnumber into cline.h
 Mike Becker <universe@uap-core.de> parents: 
10diff
changeset | 79 | |
| 22 
4508da679ffb
completed binary file heuristics
 Mike Becker <universe@uap-core.de> parents: 
21diff
changeset | 80 | /* Check for subdirectory */ | 
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 81 | if (stat(filename, &statbuf) == 0) { | 
| 42 | 82 | newentry->st_mode = statbuf.st_mode; | 
| 23 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 83 | } else { | 
| 
778388400f7b
encapsulated scanner arguments + enabled optimizer + empty file is no bfile
 Mike Becker <universe@uap-core.de> parents: 
22diff
changeset | 84 | perror(" Error in stat call"); | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 85 | continue; | 
| 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 86 | } | 
| 42 | 87 | |
| 88 | if (list) { | |
| 89 | // create fake root to have a pointer on the true root | |
| 90 | filelist_t root; | |
| 91 | root.next = list; | |
| 92 | filelist_t *parent = &root; | |
| 93 | while (parent->next && | |
| 94 | (strcasecmp(parent->next->displayname, newentry->displayname) < 0 || | |
| 95 | (!S_ISDIR(newentry->st_mode) && S_ISDIR(parent->next->st_mode)) | |
| 96 | ) && | |
| 97 | (!S_ISDIR(newentry->st_mode) || S_ISDIR(parent->next->st_mode)) | |
| 98 | ) { | |
| 99 | parent = parent->next; | |
| 100 | } | |
| 101 | newentry->next = parent->next; | |
| 102 | parent->next = newentry; | |
| 103 | list = root.next; | |
| 104 | } else { | |
| 105 | list = newentry; | |
| 106 | } | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 107 | } | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 108 | } | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 109 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 110 | closedir(dirf); | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 111 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 112 | return list; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 113 | } | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 114 | |
| 60 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 115 | void scanDirectory(scanner_t scanner, settings_t* settings, | 
| 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 116 | string_list_t* output, scanresult_t* result) { | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 117 | |
| 60 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 118 | result->directory = 0; | 
| 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 119 | int a; | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 120 | bool bfile; | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 121 | char *outbuf; | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 122 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 123 | filelist_t *filelist = buildFileList(scanner, settings, NULL); | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 124 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 125 | while (filelist != NULL) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 126 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 127 | /* Scan subdirectories */ | 
| 42 | 128 | if (!S_ISREG(filelist->st_mode)) { | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 129 | if (settings->recursive && S_ISDIR(filelist->st_mode)) { | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 130 | string_list_t *recoutput = new_string_list_t(); | 
| 60 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 131 | scanresult_t recresult; | 
| 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 132 | scanDirectory( | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 133 | (scanner_t) {filelist->filename, scanner.spaces+1}, | 
| 60 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 134 | settings, recoutput, &recresult); | 
| 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 135 | result->directory += recresult.directory; | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 136 | if (!settings->matchesOnly || recoutput->count > 0) { | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 137 | outbuf = (char*) malloc(81); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 138 | snprintf(outbuf, 81, "%*s/%*s%13d lines\n", | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 139 | filelist->displayname_len+scanner.spaces, filelist->displayname, | 
| 60 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 140 | 60-filelist->displayname_len-scanner.spaces-1, "", | 
| 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 141 | recresult.directory); | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 142 | add_string(output, outbuf); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 143 | for (int i = 0 ; i < recoutput->count ; i++) { | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 144 | add_string(output, recoutput->items[i]); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 145 | } | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 146 | } | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 147 | destroy_string_list_t(recoutput); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 148 | } else { | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 149 | outbuf = (char*) malloc(81); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 150 | snprintf(outbuf, 81, "%*s\n", filelist->displayname_len+scanner.spaces, | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 151 | filelist->displayname); | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 152 | add_string(output, outbuf); | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 153 | } | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 154 | } else { | 
| 30 
d642fdb6745e
allow parallel use of -s and -S
 Mike Becker <universe@uap-core.de> parents: 
28diff
changeset | 155 | if ((settings->includeSuffixes->count == 0 | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 156 | || testSuffix(filelist->displayname, settings->includeSuffixes)) | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 157 | && !testSuffix(filelist->displayname, settings->excludeSuffixes)) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 158 | |
| 25 
802c5382f499
Added line buffer (and warning message - there is no regexp parser, though)
 Mike Becker <universe@uap-core.de> parents: 
23diff
changeset | 159 | /* Count lines */ | 
| 60 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 160 | int lines = 0; | 
| 25 
802c5382f499
Added line buffer (and warning message - there is no regexp parser, though)
 Mike Becker <universe@uap-core.de> parents: 
23diff
changeset | 161 | bfile = false; | 
| 
802c5382f499
Added line buffer (and warning message - there is no regexp parser, though)
 Mike Becker <universe@uap-core.de> parents: 
23diff
changeset | 162 | bfile_reset(settings->bfileHeuristics); | 
| 54 
76d46533b9a9
regex parser was not properly reset before each file, sometimes resulting in wrong line counts, when the previous scanned file ended with a match
 Mike Becker <universe@uap-core.de> parents: 
48diff
changeset | 163 | regex_parser_reset(settings->regex); | 
| 27 
95a958e3de88
added regexp_parser struct and compile function
 Mike Becker <universe@uap-core.de> parents: 
25diff
changeset | 164 | char line_buffer[REGEX_MAX_LINELENGTH]; | 
| 25 
802c5382f499
Added line buffer (and warning message - there is no regexp parser, though)
 Mike Becker <universe@uap-core.de> parents: 
23diff
changeset | 165 | int line_buffer_offset = 0; | 
| 
802c5382f499
Added line buffer (and warning message - there is no regexp parser, though)
 Mike Becker <universe@uap-core.de> parents: 
23diff
changeset | 166 | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 167 | FILE *file = fopen(filelist->filename, "r"); | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 168 | if (file == NULL) { | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 169 | outbuf = (char*) malloc(81); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 170 | snprintf(outbuf, 81, "%*s", filelist->displayname_len+scanner.spaces, | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 171 | filelist->displayname); | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 172 | add_string(output, outbuf); | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 173 | perror(" File acces failed"); | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 174 | } else { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 175 | do { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 176 | a = fgetc(file); | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 177 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 178 | bfile = bfile_check(settings->bfileHeuristics, a); | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 179 | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 180 | if (a == 10 || a == EOF) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 181 | line_buffer[line_buffer_offset] = 0; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 182 | if (regex_parser_do(settings->regex, line_buffer) == 0) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 183 | /* Only subtract lines when matching has finished */ | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 184 | if (!regex_parser_matching(settings->regex)) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 185 | lines -= settings->regex->matched_lines; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 186 | } | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 187 | } | 
| 21 
91e0890464b0
implemented bfile heuristics option + TODO: implement algorithm
 Mike Becker <universe@uap-core.de> parents: 
20diff
changeset | 188 | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 189 | line_buffer_offset = 0; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 190 | lines++; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 191 | } else { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 192 | if (line_buffer_offset < REGEX_MAX_LINELENGTH) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 193 | line_buffer[line_buffer_offset] = a; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 194 | line_buffer_offset++; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 195 | } else { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 196 | line_buffer[line_buffer_offset-1] = 0; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 197 | settings->confusing_lnlen = true; | 
| 28 | 198 | } | 
| 199 | } | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 200 | } while (!bfile && a != EOF); | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 201 | fclose(file); | 
| 25 
802c5382f499
Added line buffer (and warning message - there is no regexp parser, though)
 Mike Becker <universe@uap-core.de> parents: 
23diff
changeset | 202 | |
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 203 | /* Print and sum line count */ | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 204 | if (bfile) { | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 205 | if (!settings->matchesOnly) { | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 206 | outbuf = (char*) malloc(81); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 207 | snprintf(outbuf, 81, | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 208 | "%*s%*s%19s\n", filelist->displayname_len+scanner.spaces, | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 209 | filelist->displayname, | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 210 | 60-filelist->displayname_len-scanner.spaces, "", "binary"); | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 211 | add_string(output, outbuf); | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 212 | } | 
| 25 
802c5382f499
Added line buffer (and warning message - there is no regexp parser, though)
 Mike Becker <universe@uap-core.de> parents: 
23diff
changeset | 213 | } else { | 
| 60 
69be673a4fd0
preparing changes for individual sum feature
 Mike Becker <universe@uap-core.de> parents: 
58diff
changeset | 214 | result->directory += lines; | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 215 | outbuf = (char*) malloc(81); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 216 | snprintf(outbuf, 81, "%*s%*s%13d lines\n", | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 217 | filelist->displayname_len+scanner.spaces, filelist->displayname, | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 218 | 60-filelist->displayname_len-scanner.spaces, "", lines); | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 219 | add_string(output, outbuf); | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 220 | } | 
| 21 
91e0890464b0
implemented bfile heuristics option + TODO: implement algorithm
 Mike Becker <universe@uap-core.de> parents: 
20diff
changeset | 221 | } | 
| 16 
bc9a0fefd892
fixed makefile to run safely on compile errors + added -V option to cline
 Mike Becker <universe@uap-core.de> parents: 
14diff
changeset | 222 | } else { | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 223 | if (!settings->matchesOnly) { | 
| 22 
4508da679ffb
completed binary file heuristics
 Mike Becker <universe@uap-core.de> parents: 
21diff
changeset | 224 | /* Print hint */ | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 225 | outbuf = (char*) malloc(81); | 
| 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 226 | snprintf(outbuf, 81, "%*s%*s%19s\n", | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 227 | filelist->displayname_len+scanner.spaces, filelist->displayname, | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 228 | 60-filelist->displayname_len-scanner.spaces, "", "no match"); | 
| 44 
9574a181ec26
line sum per directory now displayed + directories without matching files are no longer displayed when -m is used + new buffering strategy replaces stream hack when -V is used
 Mike Becker <universe@uap-core.de> parents: 
43diff
changeset | 229 | add_string(output, outbuf); | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 230 | } | 
| 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 231 | } | 
| 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 232 | } | 
| 41 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 233 | |
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 234 | free(filelist->filename); | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 235 | free(filelist->displayname); | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 236 | filelist_t *freethis = filelist; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 237 | filelist = filelist->next; | 
| 
c2e73e175341
replaced direct scanning of directories with a two-step approach (first: create filename list, second: scan)
 Mike Becker <universe@uap-core.de> parents: 
40diff
changeset | 238 | free(freethis); | 
| 3 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 239 | } | 
| 
510d6b198dde
Moved some functions to functions.c
 Mike Becker <universe@uap-core.de> parents: 
1diff
changeset | 240 | } |