/** * Carries out the search. * * Returns TRUE if found. * * Returns FALSE if not found. In this case, lc_mc_search->error reveals * the reason: * * - MC_SEARCH_E_NOTFOUND: the pattern isn't in the subject string. * - MC_SEARCH_E_ABORT: the user aborted the search. * - For any other reason (but not for the above two!): the description * is in lc_mc_search->error_str. */ gboolean mc_search_run (mc_search_t * lc_mc_search, const void *user_data, gsize start_search, gsize end_search, gsize * found_len) { gboolean ret = FALSE; if (lc_mc_search == NULL || user_data == NULL) return FALSE; if (!mc_search_is_type_avail (lc_mc_search->search_type)) { mc_search_set_error (lc_mc_search, MC_SEARCH_E_INPUT, "%s", _(STR_E_UNKNOWN_TYPE)); return FALSE; } #ifdef SEARCH_TYPE_GLIB if (lc_mc_search->regex_match_info != NULL) { g_match_info_free (lc_mc_search->regex_match_info); lc_mc_search->regex_match_info = NULL; } #endif /* SEARCH_TYPE_GLIB */ mc_search_set_error (lc_mc_search, MC_SEARCH_E_OK, NULL); if ((lc_mc_search->conditions == NULL) && !mc_search_prepare (lc_mc_search)) return FALSE; switch (lc_mc_search->search_type) { case MC_SEARCH_T_NORMAL: ret = mc_search__run_normal (lc_mc_search, user_data, start_search, end_search, found_len); break; case MC_SEARCH_T_REGEX: ret = mc_search__run_regex (lc_mc_search, user_data, start_search, end_search, found_len); break; case MC_SEARCH_T_GLOB: ret = mc_search__run_glob (lc_mc_search, user_data, start_search, end_search, found_len); break; case MC_SEARCH_T_HEX: ret = mc_search__run_hex (lc_mc_search, user_data, start_search, end_search, found_len); break; default: break; } return ret; }
static gboolean mcview_find (mcview_search_status_msg_t * ssm, off_t search_start, off_t search_end, gsize * len) { WView *view = ssm->view; view->search_numNeedSkipChar = 0; search_cb_char_curr_index = -1; if (mcview_search_options.backwards) { search_end = mcview_get_filesize (view); while (search_start >= 0) { gboolean ok; view->search_nroff_seq->index = search_start; mcview_nroff_seq_info (view->search_nroff_seq); if (search_end > search_start + (off_t) view->search->original_len && mc_search_is_fixed_search_str (view->search)) search_end = search_start + view->search->original_len; ok = mc_search_run (view->search, (void *) ssm, search_start, search_end, len); if (ok && view->search->normal_offset == search_start) { if (view->text_nroff_mode) view->search->normal_offset++; return TRUE; } /* We abort the search in case of a pattern error, or if the user aborts the search. In other words: in all cases except "string not found". */ if (!ok && view->search->error != MC_SEARCH_E_NOTFOUND) return FALSE; search_start--; } mc_search_set_error (view->search, MC_SEARCH_E_NOTFOUND, "%s", _(STR_E_NOTFOUND)); return FALSE; } view->search_nroff_seq->index = search_start; mcview_nroff_seq_info (view->search_nroff_seq); return mc_search_run (view->search, (void *) ssm, search_start, search_end, len); }