#include <lib-mime/mime.h>
-#include "mutt.h"
#include "charset.h"
#include "thread.h"
/* try to decode anything that looks like a valid RFC2047 encoded
* header field, ignoring RFC822 parsing rules
*/
-void rfc2047_decode (char **pd)
+void rfc2047_decode(char **pd)
{
- const char *p, *q;
- size_t m, n;
- int found_encoded = 0;
- char *d0, *d;
+ const int strict_mime = option(OPTSTRICTMIME);
+
const char *s = *pd;
- size_t dlen;
+ char *d0, *d;
+ ssize_t dlen;
+ int found_encoded = 0;
if (!s || !*s)
return;
d = d0 = p_new(char, dlen + 1);
while (*s && dlen > 0) {
- if (!(p = find_encoded_word (s, &q))) {
+ const char *p, *q;
+
+ p = find_encoded_word(s, &q);
+
+ if (!p) {
/* no encoded words */
- if (!option (OPTSTRICTMIME)) {
+ if (!strict_mime) {
+ ssize_t m, n;
+
n = m_strlen(s);
- if (found_encoded && (m = lwslen (s, n)) != 0) {
+ if (found_encoded && (m = lwslen(s, n)) != 0) {
if (m != n)
- *d = ' ', d++, dlen--;
+ *d++ = ' ', dlen--;
n -= m, s += m;
}
- if (ascii_strcasecmp (AssumedCharset, "us-ascii")) {
+
+ if (ascii_strcasecmp(AssumedCharset, "us-ascii")) {
char *t;
- ssize_t tlen;
t = p_dupstr(s, n);
- if (mutt_convert_nonmime_string (&t) == 0) {
- tlen = m_strlen(t);
- strncpy (d, t, tlen);
- d += tlen;
- }
- else {
- strncpy (d, s, n);
- d += n;
+ if (mutt_convert_nonmime_string(&t) == 0) {
+ d += m_strcpy(d, dlen, t);
+ } else {
+ d += m_strcpy(d, dlen, s);
}
p_delete(&t);
break;
}
}
- strncpy (d, s, dlen);
- d += dlen;
+ d += m_strcpy(d, dlen, s);
break;
}
if (p != s) {
+ ssize_t m, n;
+
n = (p - s);
/* ignore spaces between encoded words
* and linear white spaces between encoded word and *text */
- if (!option (OPTSTRICTMIME)) {
- if (found_encoded && (m = lwslen (s, n)) != 0) {
+ if (!strict_mime) {
+ if (found_encoded && (m = lwslen(s, n)) != 0) {
if (m != n)
- *d = ' ', d++, dlen--;
+ *d++ = ' ', dlen--;
n -= m, s += m;
}
- if ((m = n - lwsrlen (s, n)) != 0) {
- if (m > dlen)
- m = dlen;
- memcpy (d, s, m);
+ if ((m = n - lwsrlen(s, n)) != 0) {
+ m = m_strncpy(d, dlen, s, m);
d += m;
dlen -= m;
if (m != n)
- *d = ' ', d++, dlen--;
+ *d++ = ' ', dlen--;
}
- }
- else if (!found_encoded || strspn (s, " \t\r\n") != n) {
- if (n > dlen)
- n = dlen;
- memcpy (d, s, n);
+ } else
+ if (!found_encoded || (ssize_t)strspn(s, " \t\r\n") != n) {
+ n = m_strncpy(d, dlen, s, n);
d += n;
dlen -= n;
}
rfc2047_decode_word(d, dlen, p);
found_encoded = 1;
s = q;
- n = m_strlen(d);
- dlen -= n;
- d += n;
+ while (*d && dlen)
+ d++, dlen--;
}
- *d = 0;
p_delete(pd);
*pd = d0;
- str_adjust (pd);
}
void rfc2047_decode_adrlist(address_t *a)