int mcview_get_utf (mcview_t * view, off_t byte_index, int *char_width, gboolean * result) { gchar *str = NULL; int res = -1; gunichar ch; gchar *next_ch = NULL; int width = 0; *result = TRUE; switch (view->datasource) { case DS_STDIO_PIPE: case DS_VFS_PIPE: str = mcview_get_ptr_growing_buffer (view, byte_index); break; case DS_FILE: str = mcview_get_ptr_file (view, byte_index); break; case DS_STRING: str = mcview_get_ptr_string (view, byte_index); break; case DS_NONE: break; } if (str == NULL) { *result = FALSE; width = 0; return 0; } res = g_utf8_get_char_validated (str, -1); if (res < 0) { ch = *str; width = 0; } else { ch = res; /* Calculate UTF-8 char width */ next_ch = g_utf8_next_char (str); if (next_ch) { width = next_ch - str; } else { ch = 0; width = 0; } } *char_width = width; return ch; }
void mcview_moveto_eol (mcview_t * view) { off_t bol; if (view->hex_mode) { off_t filesize; bol = mcview_offset_rounddown (view->hex_cursor, view->bytes_per_line); if (mcview_get_byte_indexed (view, bol, view->bytes_per_line - 1, NULL) == TRUE) { view->hex_cursor = bol + view->bytes_per_line - 1; } else { filesize = mcview_get_filesize (view); view->hex_cursor = mcview_offset_doz (filesize, 1); } } else { off_t eol; bol = mcview_bol (view, view->dpy_start, 0); eol = mcview_eol (view, view->dpy_start, mcview_get_filesize (view)); if (!view->utf8) { if (eol > bol) view->dpy_text_column = eol - bol; } else { char *str = NULL; switch (view->datasource) { case DS_STDIO_PIPE: case DS_VFS_PIPE: str = mcview_get_ptr_growing_buffer (view, bol); break; case DS_FILE: str = mcview_get_ptr_file (view, bol); break; case DS_STRING: str = mcview_get_ptr_string (view, bol); break; case DS_NONE: break; } if (str != NULL && eol > bol) view->dpy_text_column = g_utf8_strlen (str, eol - bol); else view->dpy_text_column = eol - bol; } view->dpy_text_column = max (0, view->dpy_text_column - view->data_area.width); } mcview_movement_fixups (view, FALSE); }
gboolean mcview_get_byte_string (WView * view, off_t byte_index, int *retval) { char *p; if (retval != NULL) *retval = -1; p = mcview_get_ptr_string (view, byte_index); if (p == NULL) return FALSE; if (retval != NULL) *retval = (unsigned char) (*p); return TRUE; }
int mcview_get_utf (mcview_t * view, off_t byte_index, int *char_width, gboolean * result) { gchar *str = NULL; int res = -1; gunichar ch; gchar *next_ch = NULL; gchar utf8buf[UTF8_CHAR_LEN + 1]; *char_width = 0; *result = FALSE; switch (view->datasource) { case DS_STDIO_PIPE: case DS_VFS_PIPE: str = mcview_get_ptr_growing_buffer (view, byte_index); break; case DS_FILE: str = mcview_get_ptr_file (view, byte_index); break; case DS_STRING: str = mcview_get_ptr_string (view, byte_index); break; case DS_NONE: break; } if (str == NULL) return 0; res = g_utf8_get_char_validated (str, -1); if (res < 0) { /* Retry with explicit bytes to make sure it's not a buffer boundary */ int i; for (i = 0; i < UTF8_CHAR_LEN; i++) { if (mcview_get_byte (view, byte_index + i, &res)) utf8buf[i] = res; else { utf8buf[i] = '\0'; break; } } utf8buf[UTF8_CHAR_LEN] = '\0'; str = utf8buf; res = g_utf8_get_char_validated (str, -1); } if (res < 0) { ch = *str; *char_width = 1; } else { ch = res; /* Calculate UTF-8 char width */ next_ch = g_utf8_next_char (str); if (next_ch) *char_width = next_ch - str; else return 0; } *result = TRUE; return ch; }