void mcview_do_search (mcview_t * view) { off_t search_start = 0; gboolean isFound = FALSE; gboolean need_search_again = TRUE; Dlg_head *d = NULL; size_t match_len; if (verbose) { d = create_message (D_NORMAL, _("Search"), _("Searching %s"), view->last_search_string); tty_refresh (); } /*for avoid infinite search loop we need to increase or decrease start offset of search */ if (view->search_start != 0) { if (!view->text_nroff_mode) search_start = view->search_start + (mcview_search_options.backwards ? -2 : 0); else { if (mcview_search_options.backwards) { mcview_nroff_t *nroff; nroff = mcview_nroff_seq_new_num (view, view->search_start); if (mcview_nroff_seq_prev (nroff) != -1) search_start = -(mcview__get_nroff_real_len (view, nroff->index - 1, 2) + nroff->char_width + 1); else search_start = -2; mcview_nroff_seq_free (&nroff); } else { search_start = mcview__get_nroff_real_len (view, view->search_start + 1, 2); } search_start += view->search_start; } } if (mcview_search_options.backwards && (int) search_start < 0) search_start = 0; /* Compute the percent steps */ mcview_search_update_steps (view); view->update_activate = 0; tty_enable_interrupt_key (); do { off_t growbufsize; if (view->growbuf_in_use) growbufsize = mcview_growbuf_filesize (view); else growbufsize = view->search->original_len; if (mcview_find (view, search_start, &match_len)) { mcview_search_show_result (view, &d, match_len); need_search_again = FALSE; isFound = TRUE; break; } if (view->search->error_str == NULL) break; search_start = growbufsize - view->search->original_len; if (search_start <= 0) { search_start = 0; break; } } while (mcview_may_still_grow (view)); if (view->search_start != 0 && !isFound && need_search_again && !mcview_search_options.backwards) { int result; mcview_update (view); result = query_dialog (_("Search done"), _("Continue from beginning?"), D_NORMAL, 2, _("&Yes"), _("&No")); if (result != 0) isFound = TRUE; else search_start = 0; } if (!isFound && view->search->error_str != NULL && mcview_find (view, search_start, &match_len)) { mcview_search_show_result (view, &d, match_len); isFound = TRUE; } tty_disable_interrupt_key (); if (verbose) { dlg_run_done (d); destroy_dlg (d); } if (!isFound && view->search->error_str != NULL) message (D_NORMAL, _("Search"), "%s", view->search->error_str); view->dirty++; mcview_update (view); }
void mcview_growbuf_read_until (mcview_t * view, off_t ofs) { ssize_t nread; byte *p; size_t bytesfree; gboolean short_read; #ifdef HAVE_ASSERT_H assert (view->growbuf_in_use); #endif if (view->growbuf_finished) return; short_read = FALSE; while (mcview_growbuf_filesize (view) < ofs || short_read) { if (view->growbuf_lastindex == VIEW_PAGE_SIZE) { /* Append a new block to the growing buffer */ byte *newblock = g_try_malloc (VIEW_PAGE_SIZE); if (newblock == NULL) return; g_ptr_array_add (view->growbuf_blockptr, newblock); view->growbuf_lastindex = 0; } p = g_ptr_array_index (view->growbuf_blockptr, view->growbuf_blockptr->len - 1) + view->growbuf_lastindex; bytesfree = VIEW_PAGE_SIZE - view->growbuf_lastindex; if (view->datasource == DS_STDIO_PIPE) { nread = fread (p, 1, bytesfree, view->ds_stdio_pipe); if (nread == 0) { view->growbuf_finished = TRUE; (void) pclose (view->ds_stdio_pipe); mcview_display (view); close_error_pipe (D_NORMAL, NULL); view->ds_stdio_pipe = NULL; return; } } else { #ifdef HAVE_ASSERT_H assert (view->datasource == DS_VFS_PIPE); #endif do { nread = mc_read (view->ds_vfs_pipe, p, bytesfree); } while (nread == -1 && errno == EINTR); if (nread == -1 || nread == 0) { view->growbuf_finished = TRUE; (void) mc_close (view->ds_vfs_pipe); view->ds_vfs_pipe = -1; return; } } short_read = ((size_t) nread < bytesfree); view->growbuf_lastindex += nread; } }
void mcview_growbuf_read_until (WView * view, off_t ofs) { gboolean short_read = FALSE; #ifdef HAVE_ASSERT_H assert (view->growbuf_in_use); #endif if (view->growbuf_finished) return; while (mcview_growbuf_filesize (view) < ofs || short_read) { ssize_t nread = 0; byte *p; size_t bytesfree; if (view->growbuf_lastindex == VIEW_PAGE_SIZE) { /* Append a new block to the growing buffer */ byte *newblock = g_try_malloc (VIEW_PAGE_SIZE); if (newblock == NULL) return; g_ptr_array_add (view->growbuf_blockptr, newblock); view->growbuf_lastindex = 0; } p = (byte *) g_ptr_array_index (view->growbuf_blockptr, view->growbuf_blockptr->len - 1) + view->growbuf_lastindex; bytesfree = VIEW_PAGE_SIZE - view->growbuf_lastindex; if (view->datasource == DS_STDIO_PIPE) { mc_pipe_t *sp = view->ds_stdio_pipe; GError *error = NULL; if (bytesfree > MC_PIPE_BUFSIZE) bytesfree = MC_PIPE_BUFSIZE; sp->out.len = bytesfree; sp->err.len = MC_PIPE_BUFSIZE; mc_pread (sp, &error); if (error != NULL) { mcview_show_error (view, error->message); g_error_free (error); mcview_growbuf_done (view); return; } if (view->pipe_first_err_msg && sp->err.len > 0) { /* ignore possible following errors */ /* reset this flag before call of mcview_show_error() to break * endless recursion: mcview_growbuf_read_until() -> mcview_show_error() -> * MSG_DRAW -> mcview_display() -> mcview_get_byte() -> mcview_growbuf_read_until() */ view->pipe_first_err_msg = FALSE; mcview_show_error (view, sp->err.buf); } if (sp->out.len > 0) { memmove (p, sp->out.buf, sp->out.len); nread = sp->out.len; } else if (sp->out.len == MC_PIPE_STREAM_EOF || sp->out.len == MC_PIPE_ERROR_READ) { if (sp->out.len == MC_PIPE_ERROR_READ) { char *err_msg; err_msg = g_strdup_printf (_("Failed to read data from child stdout:\n%s"), unix_error_string (sp->out.error)); mcview_show_error (view, err_msg); g_free (err_msg); } if (view->ds_stdio_pipe != NULL) { /* when switch from parse to raw mode and back, * do not close the already closed pipe after following loop: * mcview_growbuf_read_until() -> mcview_show_error() -> * MSG_DRAW -> mcview_display() -> mcview_get_byte() -> mcview_growbuf_read_until() */ mcview_growbuf_done (view); } mcview_display (view); return; } } else { #ifdef HAVE_ASSERT_H assert (view->datasource == DS_VFS_PIPE); #endif do { nread = mc_read (view->ds_vfs_pipe, p, bytesfree); } while (nread == -1 && errno == EINTR); if (nread <= 0) { mcview_growbuf_done (view); return; } } short_read = ((size_t) nread < bytesfree); view->growbuf_lastindex += nread; } }