int gui_chat_string_real_pos (const char *string, int pos, int use_screen_size) { const char *real_pos, *real_pos_prev, *ptr_string; int size_on_screen; if (pos <= 0) return 0; real_pos = string; real_pos_prev = string; ptr_string = string; while (ptr_string && ptr_string[0] && (pos >= 0)) { ptr_string = gui_chat_string_next_char (NULL, NULL, (unsigned char *)ptr_string, 0, 0, 0); if (ptr_string) { size_on_screen = gui_chat_char_size_screen (ptr_string); if (size_on_screen > 0) pos -= (use_screen_size) ? size_on_screen : 1; ptr_string = utf8_next_char (ptr_string); real_pos_prev = real_pos; real_pos = ptr_string; } } if (pos < 0) real_pos = real_pos_prev; return 0 + (real_pos - string); }
void gui_chat_get_word_info (struct t_gui_window *window, const char *data, int *word_start_offset, int *word_end_offset, int *word_length_with_spaces, int *word_length) { const char *start_data; char *next_char, *next_char2; int leading_spaces, char_size_screen; *word_start_offset = 0; *word_end_offset = 0; *word_length_with_spaces = 0; *word_length = 0; start_data = data; leading_spaces = 1; while (data && data[0]) { next_char = gui_chat_string_next_char (window, NULL, (unsigned char *)data, 0, 0, 0); if (next_char) { next_char2 = utf8_next_char (next_char); if (next_char2) { if (next_char[0] != ' ') { if (leading_spaces) *word_start_offset = next_char - start_data; leading_spaces = 0; *word_end_offset = next_char2 - start_data - 1; char_size_screen = gui_chat_char_size_screen (next_char); (*word_length_with_spaces) += char_size_screen; (*word_length) += char_size_screen; } else { if (leading_spaces) { (*word_length_with_spaces)++; *word_end_offset = next_char2 - start_data - 1; } else { *word_end_offset = next_char - start_data - 1; return; } } data = next_char2; } } else { *word_end_offset = data + strlen (data) - start_data - 1; return; } } }
int gui_chat_string_real_pos (const char *string, int pos) { const char *real_pos, *ptr_string; int size_on_screen; if (pos <= 0) return 0; real_pos = string; ptr_string = string; while (ptr_string && ptr_string[0] && (pos > 0)) { ptr_string = gui_chat_string_next_char (NULL, (unsigned char *)ptr_string, 0); if (ptr_string) { size_on_screen = (((unsigned char)ptr_string[0]) < 32) ? 1 : utf8_char_size_screen (ptr_string); if (size_on_screen > 0) pos -= size_on_screen; ptr_string = utf8_next_char (ptr_string); real_pos = ptr_string; } } return 0 + (real_pos - string); }
const char * gui_chat_string_add_offset (const char *string, int offset) { while (string && string[0] && (offset > 0)) { string = gui_chat_string_next_char (NULL, NULL, (unsigned char *)string, 0, 0, 0); if (string) { string = utf8_next_char (string); offset--; } } return string; }
const char * gui_chat_string_add_offset_screen (const char *string, int offset_screen) { int size_on_screen; while (string && string[0] && (offset_screen > 0)) { string = gui_chat_string_next_char (NULL, NULL, (unsigned char *)string, 0, 0, 0); if (string) { size_on_screen = gui_chat_char_size_screen (string); offset_screen -= size_on_screen; string = utf8_next_char (string); } } return string; }
int gui_chat_strlen_screen (const char *string) { int length, size_on_screen; length = 0; while (string && string[0]) { string = gui_chat_string_next_char (NULL, (unsigned char *)string, 0); if (string) { size_on_screen = (((unsigned char)string[0]) < 32) ? 1 : utf8_char_size_screen (string); if (size_on_screen > 0) length += size_on_screen; string = utf8_next_char (string); } } return length; }
int gui_chat_string_pos (const char *string, int real_pos) { const char *ptr_string, *limit; int count; count = 0; ptr_string = string; limit = ptr_string + real_pos; while (ptr_string && ptr_string[0] && (ptr_string < limit)) { ptr_string = gui_chat_string_next_char (NULL, NULL, (unsigned char *)ptr_string, 0, 0, 0); if (ptr_string) { ptr_string = utf8_next_char (ptr_string); count++; } } return count; }