# include "config.h"
#endif
+#include <lib-lib/mem.h>
+
#include "mutt.h"
#include "ascii.h"
#include "mime.h"
#include "charset.h"
#include "rfc2047.h"
+#include "thread.h"
-#include "lib/mem.h"
#include "lib/str.h"
#include <ctype.h>
extern char RFC822Specials[];
-typedef size_t (*encoder_t) (char *, ICONV_CONST char *, size_t,
+typedef size_t (*encoder_t) (char *, const char *, size_t,
const char *);
-static size_t convert_string (ICONV_CONST char *f, size_t flen,
+static size_t convert_string (const char *f, size_t flen,
const char *from, const char *to,
char **t, size_t * tlen)
{
if (cd == (iconv_t) (-1))
return (size_t) (-1);
obl = 4 * flen + 1;
- ob = buf = mem_malloc (obl);
- n = iconv (cd, &f, &flen, &ob, &obl);
- if (n == (size_t) (-1) || iconv (cd, 0, 0, &ob, &obl) == (size_t) (-1)) {
+ ob = buf = p_new(char, obl);
+ n = my_iconv(cd, &f, &flen, &ob, &obl);
+ if (n == (size_t) (-1) || my_iconv(cd, 0, 0, &ob, &obl) == (size_t) (-1)) {
e = errno;
- mem_free (&buf);
+ p_delete(&buf);
iconv_close (cd);
errno = e;
return (size_t) (-1);
*tlen = ob - buf;
- mem_realloc (&buf, ob - buf + 1);
+ p_realloc(&buf, ob - buf + 1);
*t = buf;
iconv_close (cd);
n > (ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 2 - 12))
continue;
- t = mem_malloc (n + 1);
- memcpy (t, p, n);
- t[n] = '\0';
+ t = p_dupstr(p, n);
n = convert_string (u, ulen, fromcode, t, &s, &slen);
if (n == (size_t) (-1))
if (!tocode || n < bestn) {
bestn = n;
- mem_free (&tocode);
+ p_delete(&tocode);
tocode = t;
if (d) {
- mem_free (&e);
+ p_delete(&e);
e = s;
}
else
- mem_free (&s);
+ p_delete(&s);
elen = slen;
if (!bestn)
break;
}
else {
- mem_free (&t);
- mem_free (&s);
+ p_delete(&t);
+ p_delete(&s);
}
}
if (tocode) {
return tocode;
}
-static size_t b_encoder (char *s, ICONV_CONST char *d, size_t dlen,
+static size_t b_encoder (char *s, const char *d, size_t dlen,
const char *tocode)
{
char *s0 = s;
return s - s0;
}
-static size_t q_encoder (char *s, ICONV_CONST char *d, size_t dlen,
+static size_t q_encoder (char *s, const char *d, size_t dlen,
const char *tocode)
{
char hex[] = "0123456789ABCDEF";
* tocode, unless fromcode is 0, in which case the data is assumed to
* be already in tocode, which should be 8-bit and stateless.
*/
-static size_t try_block (ICONV_CONST char *d, size_t dlen,
+static size_t try_block (const char *d, size_t dlen,
const char *fromcode, const char *tocode,
encoder_t * encoder, size_t * wlen)
{
char buf1[ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 1];
iconv_t cd;
- ICONV_CONST char *ib;
+ const char *ib;
char *ob, *p;
size_t ibl, obl;
int count, len, len_b, len_q;
cd = mutt_iconv_open (tocode, fromcode, 0);
assert (cd != (iconv_t) (-1));
ib = d, ibl = dlen, ob = buf1, obl = sizeof (buf1) - str_len (tocode);
- if (iconv (cd, &ib, &ibl, &ob, &obl) == (size_t) (-1) ||
- iconv (cd, 0, 0, &ob, &obl) == (size_t) (-1)) {
+ if (my_iconv(cd, &ib, &ibl, &ob, &obl) == (size_t) (-1) ||
+ my_iconv(cd, 0, 0, &ob, &obl) == (size_t) (-1)) {
assert (errno == E2BIG);
iconv_close (cd);
assert (ib > d);
{
char buf1[ENCWORD_LEN_MAX - ENCWORD_LEN_MIN + 1];
iconv_t cd;
- ICONV_CONST char *ib;
+ const char *ib;
char *ob;
size_t ibl, obl, n1, n2;
cd = mutt_iconv_open (tocode, fromcode, 0);
assert (cd != (iconv_t) (-1));
ib = d, ibl = dlen, ob = buf1, obl = sizeof (buf1) - str_len (tocode);
- n1 = iconv (cd, &ib, &ibl, &ob, &obl);
- n2 = iconv (cd, 0, 0, &ob, &obl);
+ n1 = my_iconv(cd, &ib, &ibl, &ob, &obl);
+ n2 = my_iconv(cd, 0, 0, &ob, &obl);
assert (n1 != (size_t) (-1) && n2 != (size_t) (-1));
iconv_close (cd);
return (*encoder) (s, buf1, ob - buf1, tocode);
* The input data is assumed to be a single line starting at column col;
* if col is non-zero, the preceding character was a space.
*/
-static int rfc2047_encode (ICONV_CONST char *d, size_t dlen, int col,
+static int rfc2047_encode (const char *d, size_t dlen, int col,
const char *fromcode, const char *charsets,
char **e, size_t * elen, char *specials)
{
encoder_t encoder;
char *tocode1 = 0;
const char *tocode;
- char *icode = "UTF-8";
+ const char *icode = "UTF-8";
/* Try to convert to UTF-8. */
if (convert_string (d, dlen, fromcode, icode, &u, &ulen)) {
ret = 1;
icode = 0;
- u = mem_malloc ((ulen = dlen) + 1);
- memcpy (u, d, dlen);
- u[ulen] = 0;
+ u = p_dupstr(d, ulen = dlen);
}
/* Find earliest and latest things we must encode. */
/* Initialise the output buffer with the us-ascii prefix. */
buflen = 2 * ulen;
- buf = mem_malloc (buflen);
+ buf = p_new(char, buflen);
bufpos = t0 - u;
memcpy (buf, u, t0 - u);
#define LINEBREAK "\n\t"
if (bufpos + wlen + str_len (LINEBREAK) > buflen) {
buflen = bufpos + wlen + str_len (LINEBREAK);
- mem_realloc (&buf, buflen);
+ p_realloc(&buf, buflen);
}
r = encode_block (buf + bufpos, t, n, icode, tocode, encoder);
assert (r == wlen);
/* Add last encoded word and us-ascii suffix to buffer. */
buflen = bufpos + wlen + (u + ulen - t1);
- mem_realloc (&buf, buflen + 1);
+ p_realloc(&buf, buflen + 1);
r = encode_block (buf + bufpos, t, t1 - t, icode, tocode, encoder);
assert (r == wlen);
bufpos += wlen;
memcpy (buf + bufpos, t1, u + ulen - t1);
- mem_free (&tocode1);
- mem_free (&u);
+ p_delete(&tocode1);
+ p_delete(&u);
buf[buflen] = '\0';
{
char *e;
size_t elen;
- char *charsets;
+ const char *charsets;
if (!Charset || !*pd)
return;
Charset, charsets, &e, &elen,
encode_specials ? RFC822Specials : NULL);
- mem_free (pd);
+ p_delete(pd);
*pd = e;
}
int enc = 0, count = 0;
char *charset = NULL;
- pd = d0 = mem_malloc (str_len (s));
+ pd = d0 = p_new(char, str_len(s));
for (pp = s; (pp1 = strchr (pp, '?')); pp = pp1 + 1) {
count++;
t = pp1;
if ((t1 = memchr (pp, '*', t - pp)))
t = t1;
- charset = mem_malloc (t - pp + 1);
- memcpy (charset, pp, t - pp);
- charset[t - pp] = '\0';
+ charset = p_dupstr(pp, t - pp);
break;
case 3:
if (toupper ((unsigned char) *pp) == 'Q')
else if (toupper ((unsigned char) *pp) == 'B')
enc = ENCBASE64;
else {
- mem_free (&charset);
- mem_free (&d0);
+ p_delete(&charset);
+ p_delete(&d0);
return (-1);
}
break;
if (charset)
mutt_convert_string (&d0, charset, Charset, M_ICONV_HOOK_FROM);
strfcpy (d, d0, len);
- mem_free (&charset);
- mem_free (&d0);
+ p_delete(&charset);
+ p_delete(&d0);
return (0);
}
return;
dlen = 4 * str_len (s); /* should be enough */
- d = d0 = mem_malloc (dlen + 1);
+ d = d0 = p_new(char, dlen + 1);
while (*s && dlen > 0) {
if (!(p = find_encoded_word (s, &q))) {
char *t;
size_t tlen;
- t = mem_malloc (n + 1);
- strfcpy (t, s, n + 1);
+ t = p_dupstr(s, n);
if (mutt_convert_nonmime_string (&t) == 0) {
tlen = str_len (t);
strncpy (d, t, tlen);
strncpy (d, s, n);
d += n;
}
- mem_free (&t);
+ p_delete(&t);
break;
}
}
}
*d = 0;
- mem_free (pd);
+ p_delete(pd);
*pd = d0;
str_adjust (pd);
}
a = a->next;
}
}
+
+void rfc2047_decode_envelope (ENVELOPE* e) {
+
+ if (!e)
+ return;
+
+ /* do RFC2047 decoding */
+ rfc2047_decode_adrlist (e->from);
+ rfc2047_decode_adrlist (e->to);
+ rfc2047_decode_adrlist (e->cc);
+ rfc2047_decode_adrlist (e->bcc);
+ rfc2047_decode_adrlist (e->reply_to);
+ rfc2047_decode_adrlist (e->mail_followup_to);
+ rfc2047_decode_adrlist (e->return_path);
+ rfc2047_decode_adrlist (e->sender);
+
+ if (e->subject) {
+ rfc2047_decode (&e->subject);
+ mutt_adjust_subject (e);
+ }
+}