# include "config.h"
#endif
+#include <lib-lib/mem.h>
+
#include "mutt.h"
#include "buffer.h"
#include "enter.h"
else if (o) {
m = str_len (s);
if (s[m - 1] == '>') {
- new = mem_malloc (sizeof (char) * (n + m + 1));
+ new = p_new(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))
- mem_free (&new);
+ p_delete(&new);
else {
- t = (LIST *) mem_malloc (sizeof (LIST));
+ t = p_new(LIST, 1);
t->data = new;
t->next = lst;
lst = t;
new = mutt_new_parameter ();
- new->attribute = mem_malloc (i + 1);
- memcpy (new->attribute, s, i);
- new->attribute[i] = 0;
+ new->attribute = p_dupstr(s, i);
/* remove whitespace from the end of the attribute name */
while (ISSPACE (new->attribute[--i]))
new->value = str_dup (buffer);
- debug_print (2, ("`%s' = `%s'\n", new->attribute ? new->attribute : "",
+ debug_print (2, ("`%s' = `%s'\n", new->attribute ? new->attribute : "",
new->value ? new->value : ""));
/* Add this parameter to the list */
char *pc;
char *subtype;
- mem_free (&ct->subtype);
+ p_delete(&ct->subtype);
mutt_free_parameter (&ct->parameter);
/* First extract any existing parameters */
{
BODY *p = mutt_new_body ();
char *c;
- char *line = mem_malloc (LONG_STRING);
+ char *line = p_new(char, LONG_STRING);
size_t linelen = LONG_STRING;
p->hdr_offset = ftello (fp);
else if (p->type == TYPEMESSAGE && !p->subtype)
p->subtype = str_dup ("rfc822");
- mem_free (&line);
+ p_delete(&line);
return (p);
}
* digest 1 if reading a multipart/digest, 0 otherwise
*/
-BODY *mutt_parse_multipart (FILE * fp, const char *boundary, LOFF_T end_off,
+BODY *mutt_parse_multipart (FILE * fp, const char *boundary, off_t end_off,
int digest)
{
#ifdef SUN_ATTACHMENT
char scratch[SHORT_STRING];
/* Don't modify our argument. Fixed-size buffer is ok here since
- * the date format imposes a natural limit.
+ * the date format imposes a natural limit.
*/
strfcpy (scratch, s, sizeof (scratch));
}
/* extract the first substring that looks like a message-id */
-static char *extract_message_id (const char *s)
+static char *extract_message_id(const char *s)
{
- const char *p;
- char *r;
- size_t l;
+ const char *p;
- if ((s = strchr (s, '<')) == NULL || (p = strchr (s, '>')) == NULL)
- return (NULL);
- l = (size_t) (p - s) + 1;
- r = mem_malloc (l + 1);
- memcpy (r, s, l);
- r[l] = 0;
- return (r);
+ if ((s = strchr(s, '<')) == NULL || (p = strchr(s, '>')) == NULL)
+ return NULL;
+ return p_dupstr(s, (p - s) + 1);
}
void mutt_parse_mime_message (CONTEXT * ctx, HEADER * cur)
if (hdr) {
hdr->lines = atoi (p);
- /*
+ /*
* HACK - mutt has, for a very short time, produced negative
- * Lines header values. Ignore them.
+ * Lines header values. Ignore them.
*/
if (hdr->lines < 0)
hdr->lines = 0;
/* Take the first mailto URL */
if (url_check_scheme (beg) == U_MAILTO) {
- mem_free (&e->list_post);
+ p_delete(&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 */
- mem_free (&e->message_id);
+ p_delete(&e->message_id);
e->message_id = extract_message_id (p);
matched = 1;
}
#ifdef USE_NNTP
case 'n':
if (!str_casecmp (line + 1, "ewsgroups")) {
- mem_free (&e->newsgroups);
+ p_delete(&e->newsgroups);
str_skip_trailws (p);
e->newsgroups = str_dup (str_skip_initws (p));
matched = 1;
* f stream to read from
*
* hdr header structure of current message (optional).
- *
+ *
* user_hdrs If set, store user headers. Used for recall-message and
* postpone modes.
- *
+ *
* weed If this parameter is set and the user has activated the
* $weed option, honor the header weed list for user headers.
* Used for recall-message.
- *
+ *
* Returns: newly allocated envelope structure. You should free it by
* mutt_free_envelope() when envelope stay unneeded.
*/
{
ENVELOPE *e = mutt_new_envelope ();
LIST *last = NULL;
- char *line = mem_malloc (LONG_STRING);
+ char *line = p_new(char, LONG_STRING);
char *p;
- LOFF_T loc;
+ off_t loc;
int matched;
size_t linelen = LONG_STRING;
char buf[LONG_STRING + 1];
}
- mem_free (&line);
+ p_delete(&line);
if (hdr) {
hdr->content->hdr_offset = hdr->offset;
int count_body_parts_check(LIST **checklist, BODY *b, int dflt) {
LIST *type;
ATTACH_MATCH *a;
-
+
/* If list is null, use default behavior. */
if (! *checklist) {
/*return dflt;*/
return 0;
}
-
+
for (type = *checklist; type; type = type->next) {
a = (ATTACH_MATCH *)type->data;
debug_print(5, ("cbpc: %s %d/%s ?? %s/%s [%d]... ",
#define AT_COUNT(why) { shallcount = 1; }
#define AT_NOCOUNT(why) { shallcount = 0; }
-int count_body_parts (BODY *body, int flags) {
+int count_body_parts (BODY *body, int flags) {
int count = 0;
int shallcount, shallrecurse;
BODY *bp;
-
+
if (body == NULL)
return 0;
-
+
for (bp = body; bp != NULL; bp = bp->next) {
/* Initial disposition is to count and not to recurse this part. */
AT_COUNT("default");
shallrecurse = 0;
-
+
debug_print(5, ("bp: desc=\"%s\"; fn=\"%s\", type=\"%d/%s\"\n",
bp->description ? bp->description : ("none"),
bp->filename ? bp->filename :
bp->d_filename ? bp->d_filename : "(none)",
bp->type, bp->subtype ? bp->subtype : "*"));
-
+
if (bp->type == TYPEMESSAGE) {
shallrecurse = 1;
-
+
/* If it's an external body pointer, don't recurse it. */
if (!ascii_strcasecmp (bp->subtype, "external-body"))
shallrecurse = 0;
-
+
/* Don't count containers if they're top-level. */
if (flags & M_PARTS_TOPLEVEL)
AT_NOCOUNT("top-level message/*");
shallrecurse = 1;
if (!str_casecmp(bp->subtype, "alternative"))
shallrecurse = 0;
-
+
/* Don't count containers if they're top-level. */
if (flags & M_PARTS_TOPLEVEL)
AT_NOCOUNT("top-level multipart");
}
-
+
if (bp->disposition == DISPINLINE &&
bp->type != TYPEMULTIPART && bp->type != TYPEMESSAGE && bp == body)
AT_NOCOUNT("ignore fundamental inlines");
-
+
/* If this body isn't scheduled for enumeration already, don't bother
* profiling it further. */
-
+
if (shallcount) {
/* Turn off shallcount if message type is not in ok list,
* or if it is in except list. Check is done separately for
AT_NOCOUNT("excluded");
}
}
-
+
if (shallcount)
count++;
bp->attach_qualifies = shallcount ? 1 : 0;
-
- debug_print(5, ("cbp: %08x shallcount = %d\n", (unsigned int)bp, shallcount));
-
+
+ debug_print(5, ("cbp: %p shallcount = %d\n", bp, shallcount));
+
if (shallrecurse) {
- debug_print(5, ("cbp: %08x pre count = %d\n", (unsigned int)bp, count));
+ debug_print(5, ("cbp: %p pre count = %d\n", bp, count));
bp->attach_count = count_body_parts(bp->parts, flags & ~M_PARTS_TOPLEVEL);
count += bp->attach_count;
- debug_print(5, ("cbp: %08x post count = %d\n", (unsigned int)bp, count));
+ debug_print(5, ("cbp: %p post count = %d\n", bp, count));
}
}
-
+
debug_print(5, ("bp: return %d\n", count < 0 ? 0 : count));
return count < 0 ? 0 : count;
}
return (0);
if (hdr->attach_valid && !(flags & M_PARTS_RECOUNT))
return hdr->attach_total;
-
+
if (AttachAllow || AttachExclude || InlineAllow || InlineExclude)
hdr->attach_total = count_body_parts(hdr->content, flags | M_PARTS_TOPLEVEL);
else
hdr->attach_total = 0;
-
+
hdr->attach_valid = 1;
return hdr->attach_total;
}