#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"
* 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;
*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 = mem_malloc (sizeof (LIST));
- tmp = tmp->next;
- } else
- head = tmp = mem_malloc (sizeof (LIST));
-
- tmp->data = mem_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;
- mem_free (&p->data);
- mem_free (&p);
- }
-}
-
HEADER *mutt_dup_header (HEADER * h)
{
HEADER *hnew;
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 = mem_malloc (sizeof (BUFFER));
- if (!b)
- return NULL;
- }
- else {
- mem_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;
-
- mem_free (&(*p)->data);
- /* dptr is just an offset to data and shouldn't be freed */
- mem_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;
- mem_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.10/%s)", MUTT_VERSION, MUTT_REVISION,
+ ReleaseDate);
+ else
+ snprintf (vstring, sizeof (vstring), "mutt-ng/%s-r%s",
+ MUTT_VERSION, MUTT_REVISION);
return vstring;
}