/* Prints success or error message, determined by the found argument, about * search results to a user. */ static void print_result(const FileView *const view, int found, int backward) { if(found) { print_search_msg(view, backward); } else { print_search_fail_msg(view, backward); } }
void print_search_msg(const FileView *view, int backward) { if(view->matches == 0) { print_search_fail_msg(view, backward); } else { status_bar_messagef("%d of %d matching file%s for: %s", get_current_entry(view)->search_match, view->matches, (view->matches == 1) ? "" : "s", cfg_get_last_search_pattern()); } }
int find_pattern(FileView *view, const char pattern[], int backward, int move, int *const found, int interactive) { int cflags; int nmatches = 0; regex_t re; int err; FileView *other; if(move && cfg.hl_search) { clean_selected_files(view); } reset_search_results(view); if(pattern[0] == '\0') { *found = 1; return 0; } *found = 0; cflags = get_regexp_cflags(pattern); if((err = regcomp(&re, pattern, cflags)) == 0) { int i; for(i = 0; i < view->list_rows; ++i) { regmatch_t matches[1]; dir_entry_t *const entry = &view->dir_entry[i]; if(is_parent_dir(entry->name)) { continue; } if(regexec(&re, entry->name, 1, matches, 0) != 0) { continue; } entry->search_match = nmatches + 1; entry->match_left = matches[0].rm_so; entry->match_right = matches[0].rm_eo; if(cfg.hl_search) { entry->selected = 1; ++view->selected_files; } ++nmatches; } regfree(&re); } else { if(interactive) { status_bar_errorf("Regexp error: %s", get_regexp_error(err, &re)); } regfree(&re); return 1; } other = (view == &lwin) ? &rwin : &lwin; if(other->matches != 0 && strcmp(other->last_search, pattern) != 0) { other->last_search[0] = '\0'; ui_view_reset_search_highlight(other); } view->matches = nmatches; copy_str(view->last_search, sizeof(view->last_search), pattern); /* Need to redraw the list so that the matching files are highlighted */ draw_dir_list(view); view->matches = nmatches; if(nmatches > 0) { const int was_found = move ? goto_search_match(view, backward) : 1; *found = was_found; if(cfg.hl_search && !was_found) { /* Update the view. It look might have changed, because of selection. */ fview_cursor_redraw(view); } if(!cfg.hl_search) { if(interactive) { print_result(view, was_found, backward); } return 1; } return 0; } else { fview_cursor_redraw(view); if(interactive) { print_search_fail_msg(view, backward); } return 1; } }
int find_pattern(FileView *view, const char pattern[], int backward, int move, int *const found, int print_errors) { int cflags; int nmatches = 0; regex_t re; int err; FileView *other; if(move && cfg.hl_search) { flist_sel_stash(view); } reset_search_results(view); /* We at least could wipe out previous search results, so schedule a * redraw. */ ui_view_schedule_redraw(view); if(pattern[0] == '\0') { *found = 1; return 0; } *found = 0; cflags = get_regexp_cflags(pattern); if((err = regcomp(&re, pattern, cflags)) == 0) { int i; for(i = 0; i < view->list_rows; ++i) { regmatch_t matches[1]; dir_entry_t *const entry = &view->dir_entry[i]; const char *name = entry->name; char *free_this = NULL; if(is_parent_dir(name)) { continue; } if(fentry_is_dir(entry)) { free_this = format_str("%s/", name); name = free_this; } if(regexec(&re, name, 1, matches, 0) != 0) { free(free_this); continue; } free(free_this); entry->search_match = nmatches + 1; entry->match_left = matches[0].rm_so; entry->match_right = matches[0].rm_eo; if(cfg.hl_search) { entry->selected = 1; ++view->selected_files; } ++nmatches; } regfree(&re); } else { if(print_errors) { status_bar_errorf("Regexp error: %s", get_regexp_error(err, &re)); } regfree(&re); return -1; } other = (view == &lwin) ? &rwin : &lwin; if(other->matches != 0 && strcmp(other->last_search, pattern) != 0) { other->last_search[0] = '\0'; ui_view_reset_search_highlight(other); } view->matches = nmatches; copy_str(view->last_search, sizeof(view->last_search), pattern); view->matches = nmatches; if(nmatches > 0) { const int was_found = move ? goto_search_match(view, backward) : 1; *found = was_found; if(!cfg.hl_search) { if(print_errors) { print_result(view, was_found, backward); } return 1; } return 0; } else { if(print_errors) { print_search_fail_msg(view, backward); } return 1; } }