#define hexval(c) Index_hex[(unsigned int)(c)]
#define base64val(c) Index_64[(unsigned int)(c)]
-#define OPTIGNORELWS 0
-
-static int option(int opt UNUSED)
-{
- return 1;
-}
+#define option_OPTIGNORELWS 1
static size_t convert_string (char *f, size_t flen,
const char *from, const char *to,
}
}
- size_t dlen;
if (charset && system_charset)
- convert_string (d0, strlen(d0), charset, system_charset, &d0, &dlen);
+ {
+ char *dnew;
+ size_t dlen;
+ if (convert_string (d0, strlen(d0), charset, system_charset, &dnew, &dlen) == (size_t) -1)
+ {
+ debug("Charset conversion failure: <%s> from %s (%m)\n", d0, charset);
+ free (charset);
+ free (d0);
+ return (-1);
+ }
+ free (d0);
+ d0 = dnew;
+ }
strfcpy (d, d0, len);
free (charset);
free (d0);
;
if (q[0] != '?' || !strchr ("BbQq", q[1]) || q[2] != '?')
continue;
- for (q = q + 3; 0x20 < *q && *q < 0x7f && *q != '?'; q++)
+ /* non-strict check since many MUAs will not encode spaces and question marks */
+ for (q = q + 3; 0x20 <= *q && *q < 0x7f && (*q != '?' || q[1] != '='); q++)
;
if (q[0] != '?' || q[1] != '=')
{
if (!(p = find_encoded_word (s, &q)))
{
/* no encoded words */
- if (option (OPTIGNORELWS))
+ if (option_OPTIGNORELWS)
{
n = strlen (s);
if (found_encoded && (m = lwslen (s, n)) != 0)
n = (size_t) (p - s);
/* ignore spaces between encoded word
* and linear-white-space between encoded word and *text */
- if (option (OPTIGNORELWS))
+ if (option_OPTIGNORELWS)
{
if (found_encoded && (m = lwslen (s, n)) != 0)
{
}
}
- rfc2047_decode_word (d, p, dlen);
+ if (rfc2047_decode_word (d, p, dlen) < 0)
+ {
+ n = q - p;
+ if (n > dlen)
+ n = dlen;
+ memcpy (d, p, n);
+ }
found_encoded = 1;
s = q;
n = strlen (d);
system_charset = nl_langinfo(CODESET);
if (!system_charset[0])
system_charset = NULL;
+ if (system_charset)
+ {
+ /* FIXME: Use iconvctl() if available? */
+ char *t = xmalloc(strlen(system_charset) + 11);
+ sprintf(t, "%s//TRANSLIT", system_charset);
+ system_charset = t;
+ }
debug("Charset is %s\n", system_charset);
}
*pos = 0;
}
+void
+add_snippet_raw(char **ppos, char *term, char *add)
+{
+ char *pos = *ppos;
+ while (pos < term && *add)
+ *pos++ = *add++;
+ *ppos = pos;
+ *pos = 0;
+}
+
void
add_subject_snippet(char **ppos, char *term, char *add)
{
add_subject_snippet(ppos, term, add);
return;
}
- // debug("%s: pers=%s mbox=%s\n", add, addr->personal, addr->mailbox);
rfc2047_decode(&addr->personal);
+ // debug("%s: pers=%s mbox=%s\n", add, addr->personal, addr->mailbox);
if (!addr->mailbox || !addr->mailbox[0])
add_mbox = 0;
if (!addr->personal || !addr->personal[0])
if (add_personal)
add_snippet(ppos, term, addr->personal);
if (add_mbox && add_personal)
- add_snippet(ppos, term, " <");
+ add_snippet_raw(ppos, term, " <");
if (add_mbox)
add_snippet(ppos, term, addr->mailbox);
if (add_mbox && add_personal)
- add_snippet(ppos, term, ">");
+ add_snippet_raw(ppos, term, ">");
}
else
- add_snippet(ppos, term, "???");
+ add_snippet_raw(ppos, term, "???");
rfc822_free_address(&addr);
}