summaryrefslogtreecommitdiff
path: root/src/commands/grep.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/commands/grep.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/src/commands/grep.c b/src/commands/grep.c
index ffa1a41..4062734 100644
--- a/src/commands/grep.c
+++ b/src/commands/grep.c
@@ -92,10 +92,11 @@ static bool match_literal(char** string, char* pattern) {
char* match = *string;
size_t match_len = strlen(match);
size_t pattern_len = strlen(pattern);
+ size_t i;
if (match_len < pattern_len) return false;
- for (size_t i = 0; i < match_len - pattern_len + 1; i++) {
+ for (i = 0; i < match_len - pattern_len + 1; i++) {
if (
(!flags.ignore_case && strncmp(match + i, pattern, pattern_len) == 0) ||
(flags.ignore_case && strncasecmp(match + i, pattern, pattern_len) == 0)
@@ -122,17 +123,18 @@ static bool match(char** string, void* pattern) {
}
static bool match_any(char* path, void* pattern) {
- FILE* file = get_file_s(path, "r");
- if (file == NULL) return false;
-
+ FILE* file;
char* buf = NULL;
size_t offset;
bool matched = false;
-
int read;
+
+ file = get_file_s(path, "r");
+ if (file == NULL) return false;
+
while ((read = getline(&buf, &offset, file)) > 0) {
- if (buf[read-1] == '\n') buf[read-1] = '\0';
char* save = buf;
+ if (buf[read-1] == '\n') buf[read-1] = '\0';
if (match(&save, pattern)) {
matched = true;
break;
@@ -145,31 +147,39 @@ static bool match_any(char* path, void* pattern) {
}
static bool match_file(char* path, void* pattern, bool many) {
- FILE* file = get_file_s(path, "r");
- if (file == NULL) return false;
-
- int num_matched = 0;
- int line_num = 0;
+ FILE* file;
char* buf = NULL;
size_t offset;
-
+ int num_matched = 0;
+ int line_num = 0;
int read;
+
+ file = get_file_s(path, "r");
+ if (file == NULL) return false;
+
while((read = getline(&buf, &offset, file)) > 0) {
- if (buf[read-1] == '\n') buf[read-1] = '\0';
char* matched = buf;
+
+ if (buf[read-1] == '\n') buf[read-1] = '\0';
line_num++;
- if (!match(&matched, pattern)) {
+
+ if (!match(&matched, pattern)) {
continue;
}
+
num_matched++;
+
if (flags.only_line_count || flags.quiet) continue;
+
if ((many || flags.filename_prefix) && !flags.never_file_prefix) {
print_file_path(path);
putchar(':');
}
+
if (flags.line_number) {
printf("%d:", line_num);
}
+
if (flags.only_matching_part) {
printf("%s\n", matched);
} else {
@@ -215,6 +225,11 @@ static bool run_match(char* path, void* pattern, bool many) {
COMMAND(grep) {
+ int start, i;
+ char* pattern;
+ bool many, ok;
+ void* compiled;
+
flags.only_matching_part = false;
flags.only_non_matching_names = false;
flags.only_matching_names = false;
@@ -226,19 +241,19 @@ COMMAND(grep) {
flags.filename_prefix = false;
flags.inverse = false;
- int start = parse_args(argc, argv, help, short_arg, NULL);
+ start = parse_args(argc, argv, help, short_arg, NULL);
if (argc - start < 1) global_help(help);
- char* pattern = argv[start++];
+ pattern = argv[start++];
- bool many = argc - start > 0;
- bool ok = false;
+ many = argc - start > 0;
+ ok = false;
- void* compiled = compile(pattern);
+ compiled = compile(pattern);
if (run_match("-", compiled, many)) ok = true;
- for (int i = start; i < argc; i++) {
+ for (i = start; i < argc; i++) {
if (run_match(argv[i], compiled, many)) ok = true;
}