#endif
#include "mutt.h"
+#include "buffer.h"
+#include "enter.h"
+#include "ascii.h"
+#include "recvattach.h"
#include "mx.h"
#include "mime.h"
#include "rfc2047.h"
* lines. ``line'' must point to a dynamically allocated string; it is
* increased if more space is required to fit the whole line.
*/
-static char *read_rfc822_line (FILE * f, char *line, size_t * linelen)
+char *mutt_read_rfc822_line (FILE * f, char *line, size_t * linelen)
{
char *buf = line;
char ch;
return (line);
}
- buf += safe_strlen (buf) - 1;
+ buf += str_len (buf) - 1;
if (*buf == '\n') {
/* we did get a full line. remove trailing space */
while (ISSPACE (*buf))
if (*linelen < offset + STRING) {
/* grow the buffer */
*linelen += STRING;
- safe_realloc (&line, *linelen);
+ mem_realloc (&line, *linelen);
buf = line + offset;
}
}
new = NULL;
if (*s == '<') {
- n = safe_strlen (s);
+ n = str_len (s);
if (s[n - 1] != '>') {
o = s;
s = NULL;
continue;
}
- new = safe_strdup (s);
+ new = str_dup (s);
}
else if (o) {
- m = safe_strlen (s);
+ m = str_len (s);
if (s[m - 1] == '>') {
- new = safe_malloc (sizeof (char) * (n + m + 1));
+ new = mem_malloc (sizeof (char) * (n + m + 1));
strcpy (new, o); /* __STRCPY_CHECKED__ */
strcpy (new + n, s); /* __STRCPY_CHECKED__ */
}
*/
if (!(at = strchr (new, '@')) || strchr (at + 1, '@')
|| (in_reply_to && at - new <= 8))
- FREE (&new);
+ mem_free (&new);
else {
- t = (LIST *) safe_malloc (sizeof (LIST));
+ t = (LIST *) mem_malloc (sizeof (LIST));
t->data = new;
t->next = lst;
lst = t;
new = mutt_new_parameter ();
- new->attribute = safe_malloc (i + 1);
+ new->attribute = mem_malloc (i + 1);
memcpy (new->attribute, s, i);
new->attribute[i] = 0;
buffer[i] = 0;
}
- new->value = safe_strdup (buffer);
+ new->value = str_dup (buffer);
debug_print (2, ("`%s' = `%s'\n", new->attribute ? new->attribute : "",
new->value ? new->value : ""));
char *pc;
char *subtype;
- FREE (&ct->subtype);
+ mem_free (&ct->subtype);
mutt_free_parameter (&ct->parameter);
/* First extract any existing parameters */
* let that take precedence, and don't set it here */
if ((pc = mutt_get_parameter ("name", ct->parameter)) != 0
&& !ct->filename)
- ct->filename = safe_strdup (pc);
+ ct->filename = str_dup (pc);
#ifdef SUN_ATTACHMENT
/* this is deep and utter perversion */
*subtype++ = '\0';
for (pc = subtype; *pc && !ISSPACE (*pc) && *pc != ';'; pc++);
*pc = '\0';
- ct->subtype = safe_strdup (subtype);
+ ct->subtype = str_dup (subtype);
}
/* Finally, get the major type */
#ifdef SUN_ATTACHMENT
if (ascii_strcasecmp ("x-sun-attachment", s) == 0)
- ct->subtype = safe_strdup ("x-sun-attachment");
+ ct->subtype = str_dup ("x-sun-attachment");
#endif
if (ct->type == TYPEOTHER) {
- ct->xtype = safe_strdup (s);
+ ct->xtype = str_dup (s);
}
if (ct->subtype == NULL) {
* field, so we can attempt to convert the type to BODY here.
*/
if (ct->type == TYPETEXT)
- ct->subtype = safe_strdup ("plain");
+ ct->subtype = str_dup ("plain");
else if (ct->type == TYPEAUDIO)
- ct->subtype = safe_strdup ("basic");
+ ct->subtype = str_dup ("basic");
else if (ct->type == TYPEMESSAGE)
- ct->subtype = safe_strdup ("rfc822");
+ ct->subtype = str_dup ("rfc822");
else if (ct->type == TYPEOTHER) {
char buffer[SHORT_STRING];
ct->type = TYPEAPPLICATION;
snprintf (buffer, sizeof (buffer), "x-%s", s);
- ct->subtype = safe_strdup (buffer);
+ ct->subtype = str_dup (buffer);
}
else
- ct->subtype = safe_strdup ("x-unknown");
+ ct->subtype = str_dup ("x-unknown");
}
/* Default character set for text types. */
(parms = parse_parameters (s)))) != 0)
str_replace (&ct->filename, s);
if ((s = mutt_get_parameter ("name", parms)) != 0)
- ct->form_name = safe_strdup (s);
+ ct->form_name = str_dup (s);
mutt_free_parameter (&parms);
}
}
{
BODY *p = mutt_new_body ();
char *c;
- char *line = safe_malloc (LONG_STRING);
+ char *line = mem_malloc (LONG_STRING);
size_t linelen = LONG_STRING;
p->hdr_offset = ftell (fp);
p->type = digest ? TYPEMESSAGE : TYPETEXT;
p->disposition = DISPINLINE;
- while (*(line = read_rfc822_line (fp, line, &linelen)) != 0) {
+ while (*(line = mutt_read_rfc822_line (fp, line, &linelen)) != 0) {
/* Find the value of the current header */
if ((c = strchr (line, ':'))) {
*c = 0;
}
p->offset = ftell (fp); /* Mark the start of the real data */
if (p->type == TYPETEXT && !p->subtype)
- p->subtype = safe_strdup ("plain");
+ p->subtype = str_dup ("plain");
else if (p->type == TYPEMESSAGE && !p->subtype)
- p->subtype = safe_strdup ("rfc822");
+ p->subtype = str_dup ("rfc822");
- FREE (&line);
+ mem_free (&line);
return (p);
}
return (NULL);
}
- blen = safe_strlen (boundary);
+ blen = str_len (boundary);
while (ftell (fp) < end_off && fgets (buffer, LONG_STRING, fp) != NULL) {
- len = safe_strlen (buffer);
+ len = str_len (buffer);
crlf = (len > 1 && buffer[len - 2] == '\r') ? 1 : 0;
if (buffer[0] == '-' && buffer[1] == '-' &&
- safe_strncmp (buffer + 2, boundary, blen) == 0) {
+ str_ncmp (buffer + 2, boundary, blen) == 0) {
if (last) {
last->length = ftell (fp) - last->offset - len - 1 - crlf;
if (last->parts && last->parts->length == 0)
buffer[i] = 0;
/* Check for the end boundary */
- if (safe_strcmp (buffer + blen + 2, "--") == 0) {
+ if (str_cmp (buffer + blen + 2, "--") == 0) {
final = 1;
break; /* done parsing */
}
if ((s = strchr (s, '<')) == NULL || (p = strchr (s, '>')) == NULL)
return (NULL);
l = (size_t) (p - s) + 1;
- r = safe_malloc (l + 1);
+ r = mem_malloc (l + 1);
memcpy (r, s, l);
r[l] = 0;
return (r);
* bothered me for _years_ */
if (!e->from) {
e->from = rfc822_new_address ();
- e->from->personal = safe_strdup (line + 6);
+ e->from->personal = str_dup (p);
}
matched = 1;
}
#ifdef USE_NNTP
- else if (!safe_strcasecmp (line + 1, "ollowup-to")) {
+ else if (!str_casecmp (line + 1, "ollowup-to")) {
if (!e->followup_to) {
- mutt_remove_trailing_ws (p);
- e->followup_to = safe_strdup (mutt_skip_whitespace (p));
+ str_skip_trailws (p);
+ e->followup_to = str_dup (str_skip_initws (p));
}
matched = 1;
}
/* Take the first mailto URL */
if (url_check_scheme (beg) == U_MAILTO) {
- FREE (&e->list_post);
+ mem_free (&e->list_post);
e->list_post = str_substrdup (beg, end);
break;
}
}
else if (!ascii_strcasecmp (line + 1, "essage-id")) {
/* We add a new "Message-Id:" when building a message */
- FREE (&e->message_id);
+ mem_free (&e->message_id);
e->message_id = extract_message_id (p);
matched = 1;
}
#ifdef USE_NNTP
case 'n':
- if (!safe_strcasecmp (line + 1, "ewsgroups")) {
- FREE (&e->newsgroups);
- mutt_remove_trailing_ws (p);
- e->newsgroups = safe_strdup (mutt_skip_whitespace (p));
+ if (!str_casecmp (line + 1, "ewsgroups")) {
+ mem_free (&e->newsgroups);
+ str_skip_trailws (p);
+ e->newsgroups = str_dup (str_skip_initws (p));
matched = 1;
}
break;
case 'o':
/* field `Organization:' saves only for pager! */
- if (!safe_strcasecmp (line + 1, "rganization")) {
- if (!e->organization && safe_strcasecmp (p, "unknown"))
- e->organization = safe_strdup (p);
+ if (!str_casecmp (line + 1, "rganization")) {
+ if (!e->organization && str_casecmp (p, "unknown"))
+ e->organization = str_dup (p);
}
break;
case 's':
if (!ascii_strcasecmp (line + 1, "ubject")) {
if (!e->subject)
- e->subject = safe_strdup (p);
+ e->subject = str_dup (p);
matched = 1;
}
else if (!ascii_strcasecmp (line + 1, "ender")) {
}
else if ((!ascii_strcasecmp ("upersedes", line + 1) ||
!ascii_strcasecmp ("upercedes", line + 1)) && hdr)
- e->supersedes = safe_strdup (p);
+ e->supersedes = str_dup (p);
break;
case 't':
matched = 1;
}
else if (ascii_strcasecmp (line + 1, "-label") == 0) {
- e->x_label = safe_strdup (p);
+ e->x_label = str_dup (p);
matched = 1;
}
#ifdef USE_NNTP
- else if (!safe_strcasecmp (line + 1, "-comment-to")) {
+ else if (!str_casecmp (line + 1, "-comment-to")) {
if (!e->x_comment_to)
- e->x_comment_to = safe_strdup (p);
+ e->x_comment_to = str_dup (p);
matched = 1;
}
- else if (!safe_strcasecmp (line + 1, "ref")) {
+ else if (!str_casecmp (line + 1, "ref")) {
if (!e->xref)
- e->xref = safe_strdup (p);
+ e->xref = str_dup (p);
matched = 1;
}
#endif
/* Keep track of the user-defined headers */
if (!matched && user_hdrs) {
/* restore the original line */
- line[safe_strlen (line)] = ':';
+ line[str_len (line)] = ':';
if (weed && option (OPTWEED) && mutt_matches_ignore (line, Ignore)
&& !mutt_matches_ignore (line, UnIgnore))
}
else
last = e->userhdrs = mutt_new_list ();
- last->data = safe_strdup (line);
+ last->data = str_dup (line);
if (do_2047)
rfc2047_decode (&last->data);
}
{
ENVELOPE *e = mutt_new_envelope ();
LIST *last = NULL;
- char *line = safe_malloc (LONG_STRING);
+ char *line = mem_malloc (LONG_STRING);
char *p;
long loc;
int matched;
/* set the defaults from RFC1521 */
hdr->content->type = TYPETEXT;
- hdr->content->subtype = safe_strdup ("plain");
+ hdr->content->subtype = str_dup ("plain");
hdr->content->encoding = ENC7BIT;
hdr->content->length = -1;
}
while ((loc = ftell (f)),
- *(line = read_rfc822_line (f, line, &linelen)) != 0) {
+ *(line = mutt_read_rfc822_line (f, line, &linelen)) != 0) {
matched = 0;
if ((p = strpbrk (line, ": \t")) == NULL || *p != ':') {
time_t t;
/* some bogus MTAs will quote the original "From " line */
- if (safe_strncmp (">From ", line, 6) == 0)
+ if (str_ncmp (">From ", line, 6) == 0)
continue; /* just ignore */
else if (is_from (line, return_path, sizeof (return_path), &t)) {
/* MH somtimes has the From_ line in the middle of the header! */
}
- FREE (&line);
+ mem_free (&line);
if (hdr) {
hdr->content->hdr_offset = hdr->offset;
hdr->content->offset = ftell (f);
-
- /* 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) {
- regmatch_t pmatch[1];
-
- rfc2047_decode (&e->subject);
-
- if (regexec (ReplyRegexp.rx, e->subject, 1, pmatch, 0) == 0)
- e->real_subj = e->subject + pmatch[0].rm_eo;
- else
- e->real_subj = e->subject;
- }
-
+ rfc2047_decode_envelope (e);
/* check for missing or invalid date */
if (hdr->date_sent <= 0) {
- debug_print (1, ("no date found, using received time from msg separator\n"));
+ debug_print (1, ("no date found, using received "
+ "time from msg separator\n"));
hdr->date_sent = hdr->received;
}
}