char * mcview_get_ptr_file (mcview_t * view, off_t byte_index) { assert (view->datasource == DS_FILE); mcview_file_load_data (view, byte_index); if (mcview_already_loaded (view->ds_file_offset, byte_index, view->ds_file_datalen)) return (char *) (view->ds_file_data + (byte_index - view->ds_file_offset)); return NULL; }
char * mcview_get_ptr_file (WView * view, off_t byte_index) { #ifdef HAVE_ASSERT_H assert (view->datasource == DS_FILE); #endif mcview_file_load_data (view, byte_index); if (mcview_already_loaded (view->ds_file_offset, byte_index, view->ds_file_datalen)) return (char *) (view->ds_file_data + (byte_index - view->ds_file_offset)); return NULL; }
/*static */ void mcview_file_load_data (mcview_t * view, off_t byte_index) { off_t blockoffset; ssize_t res; size_t bytes_read; #ifdef HAVE_ASSERT_H assert (view->datasource == DS_FILE); #endif if (mcview_already_loaded (view->ds_file_offset, byte_index, view->ds_file_datalen)) return; if (byte_index >= view->ds_file_filesize) return; blockoffset = mcview_offset_rounddown (byte_index, view->ds_file_datasize); if (mc_lseek (view->ds_file_fd, blockoffset, SEEK_SET) == -1) goto error; bytes_read = 0; while (bytes_read < view->ds_file_datasize) { res = mc_read (view->ds_file_fd, view->ds_file_data + bytes_read, view->ds_file_datasize - bytes_read); if (res == -1) goto error; if (res == 0) break; bytes_read += (size_t) res; } view->ds_file_offset = blockoffset; if ((off_t) bytes_read > view->ds_file_filesize - view->ds_file_offset) { /* the file has grown in the meantime -- stick to the old size */ view->ds_file_datalen = view->ds_file_filesize - view->ds_file_offset; } else { view->ds_file_datalen = bytes_read; } return; error: view->ds_file_datalen = 0; }