static void _ecore_imf_context_xim_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cursor_pos) { Ecore_IMF_Context_Data *imf_context_data = ecore_imf_context_data_get(ctx); char *utf8; int len; DBG("ctx=%p, imf_context_data=%p, str=%p, cursor_pos=%p", ctx, imf_context_data, str, cursor_pos); EINA_SAFETY_ON_NULL_RETURN(imf_context_data); if (imf_context_data->preedit_chars) { utf8 = eina_unicode_unicode_to_utf8(imf_context_data->preedit_chars, &len); if (str) *str = utf8; else free(utf8); } else { if (str) *str = NULL; } if (cursor_pos) *cursor_pos = imf_context_data->preedit_cursor; }
static inline const char * _escaped_char_get(const char *s, const char *s_end) { /* Handle numeric escape codes. */ if (s[1] == '#') { static char utf8_escape[7]; /* Support up to 6 bytes utf8 */ char ustr[10]; Eina_Unicode uchar[2] = { 0, 0 }; char *utf8_char; size_t len = 0; int base = 10; s += 2; /* Skip "&#" */ if ((*s == 'x') || (*s == 'X')) { s++; base = 16; } len = s_end - s; if (len > sizeof(ustr)) len = sizeof(ustr); memcpy(ustr, s, len); ustr[len - 1] = '\0'; uchar[0] = strtol(ustr, NULL, base); if (uchar[0] == 0) return NULL; utf8_char = eina_unicode_unicode_to_utf8(uchar, NULL); // eina_unicode_unicode_to_utf8() always creates a string that // is nul terminated - guaranteed if (utf8_char) { strcpy(utf8_escape, utf8_char); free(utf8_char); } return utf8_escape; } else { const char *map_itr, *map_end; map_itr = escape_strings; map_end = map_itr + sizeof(escape_strings); while (map_itr < map_end) { if (_escaped_is_eq_and_advance(s, s_end, &map_itr, map_end)) return map_itr; if (map_itr < map_end) _escaped_advance_after_end_of_string(&map_itr); } } return NULL; }
static void _ecore_imf_context_xim_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cursor_pos) { EINA_LOG_DBG("in"); #ifdef ENABLE_XIM Ecore_IMF_Context_Data *imf_context_data; char *utf8; int len; imf_context_data = ecore_imf_context_data_get(ctx); EINA_SAFETY_ON_NULL_RETURN(imf_context_data); if (imf_context_data->preedit_chars) { utf8 = eina_unicode_unicode_to_utf8(imf_context_data->preedit_chars, &len); if (str) *str = utf8; else free(utf8); } else { if (str) *str = NULL; if (cursor_pos) *cursor_pos = 0; } if (cursor_pos) *cursor_pos = imf_context_data->preedit_cursor; #else (void)ctx; if (str) *str = NULL; if (cursor_pos) *cursor_pos = 0; #endif }