diff options
Diffstat (limited to '')
-rw-r--r-- | src/commands/grep.c | 55 |
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; } |