#include <lib-lib/lib-lib.h>
-#ifdef HAVE_LANGINFO_CODESET
+#ifdef HAVE_LANGINFO_H
# include <langinfo.h>
#endif
static char *charset_init(void)
{
const char *res = "iso-8859-1";
-#ifdef HAVE_LANGINFO_CODESET
+#ifdef HAVE_LANGINFO_H
char buff[STRING];
char buff2[STRING];
res = buff2;
}
#endif
-#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
bind_textdomain_codeset(PACKAGE, res);
-#endif
+ return m_strdup(res);
+}
- Charset_is_utf8 = charset_is_utf8(res);
+static void charset_onchange(const char *cset)
+{
+ Charset_is_utf8 = charset_is_utf8(cset);
CharsetReplacement = Charset_is_utf8 ? 0xfffd : '?';
- return m_strdup(res);
}
-@package MCharset {
+@package mod_cset {
/*
** .pp
** This variable is a colon-separated list of character encoding
** .pp
** Character set your terminal uses to display and enter textual data.
*/
- string_t charset = charset_init();
+ string_t charset = {
+ .init = charset_init();
+ .onchange = charset_onchange($$);
+ };
/*
** .pp
void charset_hook(rx_t local, const string_t alias) {
rx_set_template(local, alias);
- rx_list_append(&charset_hooks, local);
+ rx_list_add2(&charset_hooks, &local);
RETURN();
};
void iconv_hook(rx_t local, const string_t alias) {
rx_set_template(local, alias);
- rx_list_append(&iconv_hooks, local);
+ rx_list_add2(&iconv_hooks, &local);
RETURN();
};
};
/* Like iconv_open, but canonicalises the charsets */
iconv_t mutt_iconv_open(const char *tocode, const char *fromcode, int flags)
{
- char to1[STRING];
- char from1[STRING];
+ char to1[STRING], to2[STRING];
+ char from1[STRING], from2[STRING];
char tmp[STRING];
iconv_t cd;
if ((cd = iconv_open(to1, from1)) != MUTT_ICONV_ERROR)
return cd;
- {
- char to2[STRING];
- char from2[STRING];
+ if (rx_list_match2(iconv_hooks, to1, to2, sizeof(to2))
+ && rx_list_match2(iconv_hooks, from1, from2, sizeof(from2)))
+ return iconv_open(to2, from2);
- if (rx_list_match2(iconv_hooks, to1, to2, sizeof(to2))
- && rx_list_match2(iconv_hooks, from1, from2, sizeof(from2)))
- return iconv_open(to2, from2);
- }
return MUTT_ICONV_ERROR;
}
int mutt_convert_nonmime_string(char **ps)
{
- const char *p = MCharset.assumed_charset;
+ const char *p = mod_cset.assumed_charset;
ssize_t ulen = m_strlen(*ps);
char *u = *ps;
m_strncpy(fromcode, sizeof(fromcode), p, q - p);
p = q;
- if (convert_string(u, ulen, fromcode, MCharset.charset, &s, &slen) >= 0) {
+ if (convert_string(u, ulen, fromcode, mod_cset.charset, &s, &slen) >= 0) {
p_delete(ps);
*ps = s;
return 0;