summaryrefslogtreecommitdiff
path: root/mh
diff options
context:
space:
mode:
Diffstat (limited to 'mh')
-rw-r--r--mh/mh_format.c32
-rw-r--r--mh/mh_init.c33
-rw-r--r--mh/mh_list.c9
-rw-r--r--mh/mh_stream.c2
4 files changed, 44 insertions, 32 deletions
diff --git a/mh/mh_format.c b/mh/mh_format.c
index fdf995cb6..36afd2035 100644
--- a/mh/mh_format.c
+++ b/mh/mh_format.c
@@ -1822,40 +1822,12 @@ builtin_isreply (struct mh_machine *mach)
static void
decode_string (strobj_t *obj)
{
- char *charset = NULL;
char *tmp;
- int rc;
-
+
if (strobj_is_null (obj))
return;
- charset = mh_global_profile_get ("Charset", NULL);
- if (!charset)
- return;
- if (strcasecmp (charset, "auto") == 0)
- {
- /* Try to deduce the charset from LC_ALL variable */
-
- tmp = getenv ("LC_ALL");
- if (tmp)
- {
- char *sp;
- char *lang;
- char *terr;
- lang = strtok_r (tmp, "_", &sp);
- terr = strtok_r (NULL, ".", &sp);
- charset = strtok_r (NULL, "@", &sp);
-
- if (!charset)
- charset = mu_charset_lookup (lang, terr);
- }
- }
-
- if (!charset)
- return;
-
- rc = rfc2047_decode (charset, strobj_ptr (obj), &tmp);
- if (!rc)
+ if (mh_decode_2047 (strobj_ptr (obj), &tmp) == 0)
{
strobj_free (obj);
strobj_create (obj, tmp);
diff --git a/mh/mh_init.c b/mh/mh_init.c
index 4d49be31a..db011fdbd 100644
--- a/mh/mh_init.c
+++ b/mh/mh_init.c
@@ -806,3 +806,36 @@ mh_set_reply_regex (const char *str)
err ? ": " : "",
err ? err : "");
}
+
+int
+mh_decode_2047 (char *text, char **decoded_text)
+{
+ char *charset = mh_global_profile_get ("Charset", NULL);
+
+ if (!charset)
+ return 1;
+ if (strcasecmp (charset, "auto") == 0)
+ {
+ /* Try to deduce the charset from LC_ALL variable */
+
+ char *tmp = getenv ("LC_ALL");
+ if (tmp)
+ {
+ char *sp;
+ char *lang;
+ char *terr;
+
+ lang = strtok_r (tmp, "_", &sp);
+ terr = strtok_r (NULL, ".", &sp);
+ charset = strtok_r (NULL, "@", &sp);
+
+ if (!charset)
+ charset = mu_charset_lookup (lang, terr);
+ }
+ }
+
+ if (!charset)
+ return 1;
+
+ return rfc2047_decode (charset, text, decoded_text);
+}
diff --git a/mh/mh_list.c b/mh/mh_list.c
index eecdc2eb3..962a08b21 100644
--- a/mh/mh_list.c
+++ b/mh/mh_list.c
@@ -408,7 +408,8 @@ static mhl_variable_t vartab[] = {
{ B_NEWLINE, "newline", dt_flag },
{ B_ADDRFIELD, "addrfield", dt_flag },
{ B_DATEFIELD, "datefield", dt_flag },
-
+ { B_DECODE, "decode", dt_flag },
+
/* String variables */
{ S_OVERFLOWTEXT, "overflowtext", dt_string },
{ S_COMPONENT, "component", dt_string },
@@ -620,6 +621,12 @@ print_header_value (struct eval_env *env, char *val)
val = p;
}
+ if (env->bvar[B_DECODE])
+ {
+ if (mh_decode_2047 (val, &p) == 0)
+ val = p;
+ }
+
if (env->bvar[B_UPPERCASE])
{
for (p = val; *p; p++)
diff --git a/mh/mh_stream.c b/mh/mh_stream.c
index 8f7e05750..2f18b584a 100644
--- a/mh/mh_stream.c
+++ b/mh/mh_stream.c
@@ -206,7 +206,7 @@ restore_envelope (stream_t str, struct _mhdraft_message **pmenv)
char *env_from = NULL;
char *env_date = NULL;
int rc;
- char buffer[80];
+ char buffer[128];
size_t len;
off_t body_start, body_end;

Return to:

Send suggestions and report system problems to the System administrator.