static void translate_file (char *filedata) { GIConv conv; GString *translated_data; /* initial allocation for largest whole help file */ translated_data = g_string_sized_new (32 * 1024); conv = str_crt_conv_from ("UTF-8"); if (conv == INVALID_CONV) g_string_free (translated_data, TRUE); else { g_free (fdata); if (str_convert (conv, filedata, translated_data) != ESTR_FAILURE) fdata = g_string_free (translated_data, FALSE); else { fdata = NULL; g_string_free (translated_data, TRUE); } str_close_conv (conv); } }
static gchar * str_8bit_conv_gerror_message (GError * mcerror, const char *def_msg) { GIConv conv; gchar *ret; /* glib messages are in UTF-8 charset */ conv = str_crt_conv_from ("UTF-8"); if (conv == INVALID_CONV) ret = g_strdup (def_msg != NULL ? def_msg : ""); else { GString *buf; buf = g_string_new (""); if (str_convert (conv, mcerror->message, buf) != ESTR_FAILURE) ret = g_string_free (buf, FALSE); else { ret = g_strdup (def_msg != NULL ? def_msg : ""); g_string_free (buf, TRUE); } str_close_conv (conv); } return ret; }
void mcview_set_codeset (mcview_t * view) { #ifdef HAVE_CHARSET const char *cp_id = NULL; view->utf8 = TRUE; cp_id = get_codepage_id (mc_global.source_codepage >= 0 ? mc_global.source_codepage : mc_global.display_codepage); if (cp_id != NULL) { GIConv conv; conv = str_crt_conv_from (cp_id); if (conv != INVALID_CONV) { if (view->converter != str_cnv_from_term) str_close_conv (view->converter); view->converter = conv; } view->utf8 = (gboolean) str_isutf8 (cp_id); } #else (void) view; #endif }
/** * Load history form the mc_config */ GList * history_load (struct mc_config_t * cfg, const char *name) { size_t i; GList *hist = NULL; char **keys; size_t keys_num = 0; GIConv conv = INVALID_CONV; GString *buffer; if (name == NULL || *name == '\0') return NULL; /* get number of keys */ keys = mc_config_get_keys (cfg, name, &keys_num); g_strfreev (keys); /* create charset conversion handler to convert strings from utf-8 to system codepage */ if (!mc_global.utf8_display) conv = str_crt_conv_from ("UTF-8"); buffer = g_string_sized_new (64); for (i = 0; i < keys_num; i++) { char key[BUF_TINY]; char *this_entry; g_snprintf (key, sizeof (key), "%lu", (unsigned long) i); this_entry = mc_config_get_string_raw (cfg, name, key, ""); if (this_entry == NULL) continue; if (conv == INVALID_CONV) hist = list_append_unique (hist, this_entry); else { g_string_set_size (buffer, 0); if (str_convert (conv, this_entry, buffer) == ESTR_FAILURE) hist = list_append_unique (hist, this_entry); else { hist = list_append_unique (hist, g_strdup (buffer->str)); g_free (this_entry); } } } g_string_free (buffer, TRUE); if (conv != INVALID_CONV) str_close_conv (conv); /* return pointer to the last entry in the list */ return g_list_last (hist); }
char * get_random_hint (int force) { char *data, *result = NULL, *eol; int len; int start; static int last_sec; static struct timeval tv; GIConv conv; GString *buffer; /* Do not change hints more often than one minute */ gettimeofday (&tv, NULL); if (!force && !(tv.tv_sec > last_sec + 60)) return g_strdup (""); last_sec = tv.tv_sec; data = load_mc_home_file (mc_global.share_data_dir, MC_HINT, NULL); if (data == NULL) return NULL; /* get a random entry */ srand (tv.tv_sec); len = strlen (data); start = rand () % len; for (; start != 0; start--) if (data[start] == '\n') { start++; break; } eol = strchr (data + start, '\n'); if (eol != NULL) *eol = '\0'; /* hint files are stored in utf-8 */ /* try convert hint file from utf-8 to terminal encoding */ conv = str_crt_conv_from ("UTF-8"); if (conv != INVALID_CONV) { buffer = g_string_new (""); if (str_convert (conv, &data[start], buffer) != ESTR_FAILURE) result = g_strdup (buffer->str); g_string_free (buffer, TRUE); str_close_conv (conv); } g_free (data); return result; }
gchar * mc_config_get_string (mc_config_t * mc_config, const gchar * group, const gchar * param, const gchar * def) { GIConv conv; GString *buffer; gchar *ret; estr_t conv_res; if (!mc_config || !group || !param) return g_strdup (def); if (!mc_config_has_param (mc_config, group, param)) { if (def != NULL) mc_config_set_string (mc_config, group, param, def); return g_strdup (def); } ret = g_key_file_get_string (mc_config->handle, group, param, NULL); if (ret == NULL) ret = g_strdup (def); if (mc_global.utf8_display) return ret; conv = str_crt_conv_from ("UTF-8"); if (conv == INVALID_CONV) return ret; buffer = g_string_new (""); conv_res = str_convert (conv, ret, buffer); str_close_conv (conv); if (conv_res == ESTR_FAILURE) { g_string_free (buffer, TRUE); return ret; } g_free (ret); return g_string_free (buffer, FALSE); }
GString * str_nconvert_to_display (char *str, int len) { GString *buff; GIConv conv; if (!str) return g_string_new (""); if (cp_display == cp_source) return g_string_new (str); conv = str_crt_conv_from (cp_source); buff = g_string_new (""); str_nconvert (conv, str, len, buff); str_close_conv (conv); return buff; }
char * get_random_hint (int force) { char *data, *result = NULL, *eop; int len; int start; static int last_sec; static struct timeval tv; GIConv conv; /* Do not change hints more often than one minute */ gettimeofday (&tv, NULL); if (!force && !(tv.tv_sec > last_sec + 60)) return g_strdup (""); last_sec = tv.tv_sec; data = load_mc_home_file (mc_global.share_data_dir, MC_HINT, NULL); if (data == NULL) return NULL; /* get a random entry */ srand (tv.tv_sec); len = strlen (data); start = rand () % (len - 1); /* Search the start of paragraph */ for (; start != 0; start--) if (data[start] == '\n' && data[start + 1] == '\n') { start += 2; break; } /* Search the end of paragraph */ for (eop = data + start; *eop != '\0'; eop++) { if (*eop == '\n' && *(eop + 1) == '\n') { *eop = '\0'; break; } if (*eop == '\n') *eop = ' '; } /* hint files are stored in utf-8 */ /* try convert hint file from utf-8 to terminal encoding */ conv = str_crt_conv_from ("UTF-8"); if (conv != INVALID_CONV) { GString *buffer; buffer = g_string_new (""); if (str_convert (conv, &data[start], buffer) != ESTR_FAILURE) result = g_string_free (buffer, FALSE); else g_string_free (buffer, TRUE); str_close_conv (conv); } else result = g_strdup (&data[start]); g_free (data); return result; }