void mcview_moveto_bottom (mcview_t * view) { off_t filesize; mcview_update_filesize (view); if (view->growbuf_in_use) mcview_growbuf_read_until (view, OFFSETTYPE_MAX); filesize = mcview_get_filesize (view); if (view->hex_mode) { view->hex_cursor = mcview_offset_doz (filesize, 1); mcview_movement_fixups (view, TRUE); } else { const off_t datalines = view->data_area.height; view->dpy_start = filesize; mcview_move_up (view, datalines); } }
gboolean mcview_get_byte_growing_buffer (mcview_t * view, off_t byte_index, int *retval) { off_t pageno; off_t pageindex; if (retval != NULL) *retval = -1; pageno = byte_index / VIEW_PAGE_SIZE; pageindex = byte_index % VIEW_PAGE_SIZE; assert (view->growbuf_in_use); if (pageno < 0) return FALSE; mcview_growbuf_read_until (view, byte_index + 1); if (view->growbuf_blockptr->len == 0) return FALSE; if (pageno < (off_t) view->growbuf_blockptr->len - 1) { if (retval != NULL) *retval = *((byte *) (g_ptr_array_index (view->growbuf_blockptr, pageno) + pageindex)); return TRUE; } if (pageno == (off_t) view->growbuf_blockptr->len - 1 && pageindex < (off_t) view->growbuf_lastindex) { if (retval != NULL) *retval = *((byte *) (g_ptr_array_index (view->growbuf_blockptr, pageno) + pageindex)); return TRUE; } return FALSE; }
char * mcview_get_ptr_growing_buffer (WView * view, off_t byte_index) { off_t pageno, pageindex; #ifdef HAVE_ASSERT_H assert (view->growbuf_in_use); #endif if (byte_index < 0) return NULL; pageno = byte_index / VIEW_PAGE_SIZE; pageindex = byte_index % VIEW_PAGE_SIZE; mcview_growbuf_read_until (view, byte_index + 1); if (view->growbuf_blockptr->len == 0) return NULL; if (pageno < (off_t) view->growbuf_blockptr->len - 1) return ((char *) g_ptr_array_index (view->growbuf_blockptr, pageno) + pageindex); if (pageno == (off_t) view->growbuf_blockptr->len - 1 && pageindex < (off_t) view->growbuf_lastindex) return ((char *) g_ptr_array_index (view->growbuf_blockptr, pageno) + pageindex); return NULL; }
char * mcview_get_ptr_growing_buffer (mcview_t * view, off_t byte_index) { off_t pageno = byte_index / VIEW_PAGE_SIZE; off_t pageindex = byte_index % VIEW_PAGE_SIZE; assert (view->growbuf_in_use); if (pageno < 0) return NULL; mcview_growbuf_read_until (view, byte_index + 1); if (view->growbuf_blockptr->len == 0) return NULL; if (pageno < (off_t) view->growbuf_blockptr->len - 1) return (char *) (g_ptr_array_index (view->growbuf_blockptr, pageno) + pageindex); if (pageno == (off_t) view->growbuf_blockptr->len - 1 && pageindex < (off_t) view->growbuf_lastindex) return (char *) (g_ptr_array_index (view->growbuf_blockptr, pageno) + pageindex); return NULL; }
gboolean mcview_dialog_goto (WView * view, off_t * offset) { typedef enum { MC_VIEW_GOTO_LINENUM = 0, MC_VIEW_GOTO_PERCENT = 1, MC_VIEW_GOTO_OFFSET_DEC = 2, MC_VIEW_GOTO_OFFSET_HEX = 3 } mcview_goto_type_t; const char *mc_view_goto_str[] = { N_("&Line number"), N_("Pe&rcents"), N_("&Decimal offset"), N_("He&xadecimal offset") }; static mcview_goto_type_t current_goto_type = MC_VIEW_GOTO_LINENUM; size_t num_of_types; char *exp = NULL; int qd_result; gboolean res; num_of_types = G_N_ELEMENTS (mc_view_goto_str); #ifdef ENABLE_NLS { size_t i; for (i = 0; i < num_of_types; i++) mc_view_goto_str[i] = _(mc_view_goto_str[i]); } #endif { quick_widget_t quick_widgets[] = { /* *INDENT-OFF* */ QUICK_INPUT (INPUT_LAST_TEXT, MC_HISTORY_VIEW_GOTO, &exp, NULL, FALSE, FALSE, INPUT_COMPLETE_NONE), QUICK_RADIO (num_of_types, (const char **) mc_view_goto_str, (int *) ¤t_goto_type, NULL), QUICK_BUTTONS_OK_CANCEL, QUICK_END /* *INDENT-ON* */ }; quick_dialog_t qdlg = { -1, -1, 40, N_("Goto"), "[Input Line Keys]", quick_widgets, NULL, NULL }; /* run dialog */ qd_result = quick_dialog (&qdlg); } *offset = -1; /* check input line value */ res = (qd_result != B_CANCEL && exp != NULL && exp[0] != '\0'); if (res) { int base = (current_goto_type == MC_VIEW_GOTO_OFFSET_HEX) ? 16 : 10; off_t addr; char *error; addr = (off_t) g_ascii_strtoll (exp, &error, base); if ((*error == '\0') && (addr >= 0)) { switch (current_goto_type) { case MC_VIEW_GOTO_LINENUM: /* Line number entered by user is 1-based. */ if (addr > 0) addr--; mcview_coord_to_offset (view, offset, addr, 0); *offset = mcview_bol (view, *offset, 0); break; case MC_VIEW_GOTO_PERCENT: if (addr > 100) addr = 100; /* read all data from pipe to get real size */ if (view->growbuf_in_use) mcview_growbuf_read_all_data (view); *offset = addr * mcview_get_filesize (view) / 100; if (!view->mode_flags.hex) *offset = mcview_bol (view, *offset, 0); break; case MC_VIEW_GOTO_OFFSET_DEC: case MC_VIEW_GOTO_OFFSET_HEX: if (!view->mode_flags.hex) { if (view->growbuf_in_use) mcview_growbuf_read_until (view, addr); *offset = mcview_bol (view, addr, 0); } else { /* read all data from pipe to get real size */ if (view->growbuf_in_use) mcview_growbuf_read_all_data (view); *offset = addr; addr = mcview_get_filesize (view); if (*offset > addr) *offset = addr; } break; default: *offset = 0; break; } } } g_free (exp); return res; }