#endif
#include "mutt.h"
+#include "ascii.h"
+#include "buffer.h"
+#include "enter.h"
#include "mutt_curses.h"
#include "mime.h"
#include "mx.h"
#include "url.h"
+#include "attach.h"
#include "reldate.h"
+#include "version.h"
#ifdef USE_IMAP
#include "imap.h"
#include <sys/types.h>
#include <utime.h>
+#define SW (option(OPTMBOXPANE)?SidebarWidth:0)
+
BODY *mutt_new_body (void)
{
- BODY *p = (BODY *) safe_calloc (1, sizeof (BODY));
+ BODY *p = (BODY *) mem_calloc (1, sizeof (BODY));
p->disposition = DISPATTACH;
p->use_disp = 1;
* Renamed to mutt_adv_mktemp so I only have to change where it's
* called, and not all possible cases.
*/
-void mutt_adv_mktemp (char *s, size_t l)
+void mutt_adv_mktemp (const char* dir, char *s, size_t l)
{
char buf[_POSIX_PATH_MAX];
char tmp[_POSIX_PATH_MAX];
size_t sl;
struct stat sb;
- strfcpy (buf, NONULL (Tempdir), sizeof (buf));
+ strfcpy (buf, dir && *dir ? dir : NONULL (Tempdir), sizeof (buf));
mutt_expand_path (buf, sizeof (buf));
if (s[0] == '\0') {
snprintf (s, l, "%s/muttXXXXXX", buf);
tmp[0] = '\0';
}
- mutt_adv_mktemp (tmp, sizeof (tmp));
+ mutt_adv_mktemp (NULL, tmp, sizeof (tmp));
if (mutt_save_attachment (fp, src, tmp, 0, NULL) == -1)
return -1;
else if (b->filename)
debug_print (1, ("not unlinking %s.\n", b->filename));
- FREE (&b->filename);
- FREE (&b->content);
- FREE (&b->xtype);
- FREE (&b->subtype);
- FREE (&b->description);
- FREE (&b->form_name);
+ mem_free (&b->filename);
+ mem_free (&b->content);
+ mem_free (&b->xtype);
+ mem_free (&b->subtype);
+ mem_free (&b->description);
+ mem_free (&b->form_name);
if (b->hdr) {
/* Don't free twice (b->hdr->content = b->parts) */
if (b->parts)
mutt_free_body (&b->parts);
- FREE (&b);
+ mem_free (&b);
}
*p = 0;
PARAMETER *o;
while (t) {
- FREE (&t->attribute);
- FREE (&t->value);
+ mem_free (&t->attribute);
+ mem_free (&t->value);
o = t;
t = t->next;
- FREE (&o);
+ mem_free (&o);
}
*p = 0;
}
-LIST *mutt_add_list (LIST * head, const char *data) {
- size_t len = str_len (data);
- return (mutt_add_list_n (head, data, len ? len + 1 : 0));
-}
-
-LIST *mutt_add_list_n (LIST *head, const void *data, size_t len) {
- LIST *tmp;
-
- for (tmp = head; tmp && tmp->next; tmp = tmp->next);
-
- if (tmp) {
- tmp->next = safe_malloc (sizeof (LIST));
- tmp = tmp->next;
- } else
- head = tmp = safe_malloc (sizeof (LIST));
-
- tmp->data = safe_malloc (len);
- if (len)
- memcpy (tmp->data, data, len);
- tmp->next = NULL;
- return head;
-}
-
-void mutt_free_list (LIST ** list)
-{
- LIST *p;
-
- if (!list)
- return;
- while (*list) {
- p = *list;
- *list = (*list)->next;
- FREE (&p->data);
- FREE (&p);
- }
-}
-
HEADER *mutt_dup_header (HEADER * h)
{
HEADER *hnew;
return;
mutt_free_envelope (&(*h)->env);
mutt_free_body (&(*h)->content);
- FREE (&(*h)->maildir_flags);
- FREE (&(*h)->tree);
- FREE (&(*h)->path);
+ mem_free (&(*h)->maildir_flags);
+ mem_free (&(*h)->tree);
+ mem_free (&(*h)->path);
#ifdef MIXMASTER
mutt_free_list (&(*h)->chain);
#endif
#if defined USE_POP || defined USE_IMAP || defined USE_NNTP
- FREE (&(*h)->data);
+ mem_free (&(*h)->data);
#endif
- FREE (h);
+ mem_free (h);
}
/* returns true if the header contained in "s" is in list "t" */
rfc822_free_address (&(*p)->reply_to);
rfc822_free_address (&(*p)->mail_followup_to);
- FREE (&(*p)->list_post);
- FREE (&(*p)->subject);
+ mem_free (&(*p)->list_post);
+ mem_free (&(*p)->subject);
/* real_subj is just an offset to subject and shouldn't be freed */
- FREE (&(*p)->message_id);
- FREE (&(*p)->supersedes);
- FREE (&(*p)->date);
- FREE (&(*p)->x_label);
- FREE (&(*p)->organization);
+ mem_free (&(*p)->message_id);
+ mem_free (&(*p)->supersedes);
+ mem_free (&(*p)->date);
+ mem_free (&(*p)->x_label);
+ mem_free (&(*p)->organization);
#ifdef USE_NNTP
- FREE (&(*p)->newsgroups);
- FREE (&(*p)->xref);
- FREE (&(*p)->followup_to);
- FREE (&(*p)->x_comment_to);
+ mem_free (&(*p)->newsgroups);
+ mem_free (&(*p)->xref);
+ mem_free (&(*p)->followup_to);
+ mem_free (&(*p)->x_comment_to);
#endif
mutt_buffer_free (&(*p)->spam);
mutt_free_list (&(*p)->references);
mutt_free_list (&(*p)->in_reply_to);
mutt_free_list (&(*p)->userhdrs);
- FREE (p);
+ mem_free (p);
}
/* move all the headers from extra not present in base into base */
while (*p) {
t = *p;
*p = (*p)->next;
- FREE (&t->name);
+ mem_free (&t->name);
rfc822_free_address (&t->addr);
- FREE (&t);
+ mem_free (&t);
}
}
str_replace (directory, fname);
break;
case 1: /* yes */
- FREE (directory);
+ mem_free (directory);
break;
case -1: /* abort */
- FREE (directory);
+ mem_free (directory);
return -1;
case 2: /* no */
- FREE (directory);
+ mem_free (directory);
return 1;
}
}
if (DrawFullLine || option (OPTSTATUSONTOP))
count = (COLS < destlen ? COLS : destlen);
else
- count =
- ((COLS - SidebarWidth) <
- destlen ? (COLS - SidebarWidth) : destlen);
+ count = ((COLS - SW) < destlen ? (COLS - SW) : destlen);
if (count > col) {
count -= col; /* how many columns left on this line */
mutt_FormatString (buf, sizeof (buf), src, callback, data, flags);
}
else {
unsigned int bar = mutt_skipchars (src, "%\\");
- char *bar2 = safe_malloc (bar + 1);
+ char *bar2 = mem_malloc (bar + 1);
strfcpy (bar2, src, bar + 1);
while (bar--) {
wlen++;
}
col += mutt_strwidth (bar2);
- FREE (&bar2);
+ mem_free (&bar2);
}
}
*wptr = 0;
s[len - 1] = 0;
mutt_endwin (NULL);
*thepid = mutt_create_filter (s, NULL, &f, NULL);
- FREE (&s);
+ mem_free (&s);
}
else {
if (stat (path, &s) < 0)
return (ret);
}
-void state_prefix_putc (char c, STATE * s)
-{
- if (s->flags & M_PENDINGPREFIX) {
- int i;
-
- i = str_len (Quotebuf);
- Quotebuf[i++] = c;
- Quotebuf[i] = '\0';
- if (i == sizeof (Quotebuf) - 1 || c == '\n') {
- char buf[2 * SHORT_STRING];
- int j = 0, offset = 0;
- regmatch_t pmatch[1];
-
- state_reset_prefix (s);
- while (regexec
- ((regex_t *) QuoteRegexp.rx, &Quotebuf[offset], 1, pmatch,
- 0) == 0)
- offset += pmatch->rm_eo;
-
- if (!option (OPTQUOTEEMPTY) && Quotebuf[offset] == '\n') {
- buf[0] = '\n';
- buf[1] = '\0';
- }
- else if (option (OPTQUOTEQUOTED) && offset) {
- for (i = 0; i < offset; i++)
- if (Quotebuf[i] != ' ')
- j = i;
- strncpy (buf, Quotebuf, j + 1);
- strcpy (buf + j + 1, Quotebuf + j);
- }
- else
- snprintf (buf, sizeof (buf), "%s%s", NONULL (s->prefix), Quotebuf);
-
- state_puts (buf, s);
- }
- }
- else
- state_putc (c, s);
-
- if (c == '\n') {
- state_set_prefix (s);
- Quotebuf[0] = '\0';
- }
-}
-
-int state_printf (STATE * s, const char *fmt, ...)
-{
- int rv;
- va_list ap;
-
- va_start (ap, fmt);
- rv = vfprintf (s->fpout, fmt, ap);
- va_end (ap);
-
- return rv;
-}
-
-void state_mark_attach (STATE * s)
-{
- if ((s->flags & M_DISPLAY) && !str_cmp (Pager, "builtin"))
- state_puts (AttachmentMarker, s);
-}
-
-void state_attach_puts (const char *t, STATE * s)
-{
- if (*t != '\n')
- state_mark_attach (s);
- while (*t) {
- state_putc (*t, s);
- if (*t++ == '\n' && *t)
- if (*t != '\n')
- state_mark_attach (s);
- }
-}
-
void mutt_display_sanitize (char *s)
{
for (; *s; s++) {
sleep (s);
}
-/*
- * Creates and initializes a BUFFER*. If passed an existing BUFFER*,
- * just initializes. Frees anything already in the buffer.
- *
- * Disregards the 'destroy' flag, which seems reserved for caller.
- * This is bad, but there's no apparent protocol for it.
- */
-BUFFER *mutt_buffer_init (BUFFER * b)
-{
- if (!b) {
- b = safe_malloc (sizeof (BUFFER));
- if (!b)
- return NULL;
- }
- else {
- FREE(&b->data);
- }
- memset (b, 0, sizeof (BUFFER));
- return b;
-}
-
-/*
- * Creates and initializes a BUFFER*. If passed an existing BUFFER*,
- * just initializes. Frees anything already in the buffer. Copies in
- * the seed string.
- *
- * Disregards the 'destroy' flag, which seems reserved for caller.
- * This is bad, but there's no apparent protocol for it.
- */
-BUFFER *mutt_buffer_from (BUFFER * b, char *seed)
-{
- if (!seed)
- return NULL;
-
- b = mutt_buffer_init (b);
- b->data = str_dup (seed);
- b->dsize = str_len (seed);
- b->dptr = (char *) b->data + b->dsize;
- return b;
-}
-
-void mutt_buffer_addstr (BUFFER * buf, const char *s)
-{
- mutt_buffer_add (buf, s, str_len (s));
-}
-
-void mutt_buffer_addch (BUFFER * buf, char c)
-{
- mutt_buffer_add (buf, &c, 1);
-}
-
-void mutt_buffer_free (BUFFER ** p)
-{
- if (!p || !*p)
- return;
-
- FREE (&(*p)->data);
- /* dptr is just an offset to data and shouldn't be freed */
- FREE (p);
-}
-
-/* dynamically grows a BUFFER to accomodate s, in increments of 128 bytes.
- * Always one byte bigger than necessary for the null terminator, and
- * the buffer is always null-terminated */
-void mutt_buffer_add (BUFFER * buf, const char *s, size_t len)
-{
- size_t offset;
-
- if (buf->dptr + len + 1 > buf->data + buf->dsize) {
- offset = buf->dptr - buf->data;
- buf->dsize += len < 128 ? 128 : len + 1;
- safe_realloc ((void **) &buf->data, buf->dsize);
- buf->dptr = buf->data + offset;
- }
- memcpy (buf->dptr, s, len);
- buf->dptr += len;
- *(buf->dptr) = '\0';
-}
-
/* Decrease a file's modification time by 1 second */
-
time_t mutt_decrease_mtime (const char *f, struct stat *st)
{
struct utimbuf utim;
return mtime;
}
-const char *mutt_make_version (void)
+/* sets mtime of 'to' to mtime of 'from' */
+void mutt_set_mtime (const char* from, const char* to) {
+ struct utimbuf utim;
+ struct stat st;
+
+ if (stat (from, &st) != -1) {
+ utim.actime = st.st_mtime;
+ utim.modtime = st.st_mtime;
+ utime (to, &utim);
+ }
+}
+
+const char *mutt_make_version (int full)
{
static char vstring[STRING];
- snprintf (vstring, sizeof (vstring), "Mutt-ng %s (%s) based on Mutt 1.5.9",
- MUTT_VERSION, ReleaseDate);
+ if (full)
+ snprintf (vstring, sizeof (vstring), "Mutt-ng %s-r%s (based "
+ "on Mutt 1.5.11/%s)", MUTT_VERSION, MUTT_REVISION,
+ ReleaseDate);
+ else
+ snprintf (vstring, sizeof (vstring), "mutt-ng/%s-r%s",
+ MUTT_VERSION, MUTT_REVISION);
return vstring;
}
p = *list;
*list = (*list)->next;
rx_free (&p->rx);
- FREE(&p->template);
- FREE(&p);
+ mem_free(&p->template);
+ mem_free(&p);
}
}
for (; l; l = l->next) {
/* If this pattern needs more matches, expand pmatch. */
if (l->nmatch > nmatch) {
- safe_realloc (&pmatch, l->nmatch * sizeof (regmatch_t));
+ mem_realloc (&pmatch, l->nmatch * sizeof (regmatch_t));
nmatch = l->nmatch;
}
for (p = l->template; *p;) {
if (*p == '%') {
n = atoi (++p); /* find pmatch index */
- while (isdigit (*p))
+ while (isdigit ((unsigned char) *p))
++p; /* skip subst token */
for (i = pmatch[n].rm_so; (i < pmatch[n].rm_eo) && (tlen < x); i++)
text[tlen++] = s[i];