X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=0f6114e6e1757eb2d2ba177c869ea8318ca0b4c7;hp=c037f76e49f219daf9aceaa8f9a9022388e3c285;hb=e7ca08ff86e3d01578d024a62385bafe7bceffd2;hpb=cf69ddd650f124d3aed242285434ba2b97fb4b79 diff --git a/muttlib.c b/muttlib.c index c037f76..0f6114e 100644 --- a/muttlib.c +++ b/muttlib.c @@ -12,24 +12,29 @@ # include "config.h" #endif +#include +#include +#include +#include +#include +#include + +#include + #include "mutt.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 "imap/mx_imap.h" -#endif +#include +#include -#include "mutt_crypt.h" +#include -#include "lib/mem.h" -#include "lib/intl.h" -#include "lib/str.h" #include "lib/debug.h" #include @@ -44,9 +49,11 @@ #include #include +#define SW (option(OPTMBOXPANE)?SidebarWidth:0) + BODY *mutt_new_body (void) { - BODY *p = (BODY *) mem_calloc (1, sizeof (BODY)); + BODY *p = p_new(BODY, 1); p->disposition = DISPATTACH; p->use_disp = 1; @@ -60,7 +67,7 @@ BODY *mutt_new_body (void) * 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]; @@ -68,14 +75,14 @@ void mutt_adv_mktemp (char *s, size_t l) size_t sl; struct stat sb; - strfcpy (buf, NONULL (Tempdir), sizeof (buf)); + m_strcpy(buf, sizeof(buf), m_strisempty(dir) ? NONULL(Tempdir) : dir); mutt_expand_path (buf, sizeof (buf)); if (s[0] == '\0') { snprintf (s, l, "%s/muttXXXXXX", buf); mktemp (s); } else { - strfcpy (tmp, s, sizeof (tmp)); + m_strcpy(tmp, sizeof(tmp), s); mutt_sanitize_filename (tmp, 1); snprintf (s, l, "%s/%s", buf, tmp); if (lstat (s, &sb) == -1 && errno == ENOENT) @@ -86,8 +93,8 @@ void mutt_adv_mktemp (char *s, size_t l) mktemp (s); if (period != NULL) { *period = '.'; - sl = str_len (s); - strfcpy (s + sl, period, l - sl); + sl = m_strlen(s); + m_strcpy(s + sl, l - sl, period); } } } @@ -105,14 +112,14 @@ int mutt_copy_body (FILE * fp, BODY ** tgt, BODY * src) if (src->filename) { use_disp = 1; - strfcpy (tmp, src->filename, sizeof (tmp)); + m_strcpy(tmp, sizeof(tmp), src->filename); } else { use_disp = 0; 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; @@ -123,19 +130,19 @@ int mutt_copy_body (FILE * fp, BODY ** tgt, BODY * src) b->parts = NULL; b->next = NULL; - b->filename = str_dup (tmp); + b->filename = m_strdup(tmp); b->use_disp = use_disp; b->unlink = 1; if (mutt_is_text_part (b)) b->noconv = 1; - b->xtype = str_dup (b->xtype); - b->subtype = str_dup (b->subtype); - b->form_name = str_dup (b->form_name); - b->filename = str_dup (b->filename); - b->d_filename = str_dup (b->d_filename); - b->description = str_dup (b->description); + b->xtype = m_strdup(b->xtype); + b->subtype = m_strdup(b->subtype); + b->form_name = m_strdup(b->form_name); + b->filename = m_strdup(b->filename); + b->d_filename = m_strdup(b->d_filename); + b->description = m_strdup(b->description); /* * we don't seem to need the HEADER structure currently. @@ -148,9 +155,9 @@ int mutt_copy_body (FILE * fp, BODY ** tgt, BODY * src) /* copy parameters */ for (par = b->parameter, ppar = &b->parameter; par; ppar = &(*ppar)->next, par = par->next) { - *ppar = mutt_new_parameter (); - (*ppar)->attribute = str_dup (par->attribute); - (*ppar)->value = str_dup (par->value); + *ppar = parameter_new(); + (*ppar)->attribute = m_strdup(par->attribute); + (*ppar)->value = m_strdup(par->value); } mutt_stamp_attachment (b); @@ -169,7 +176,7 @@ void mutt_free_body (BODY ** p) a = a->next; if (b->parameter) - mutt_free_parameter (&b->parameter); + parameter_delete(&b->parameter); if (b->unlink && b->filename) { debug_print (1, ("unlinking %s.\n", b->filename)); unlink (b->filename); @@ -177,139 +184,69 @@ void mutt_free_body (BODY ** p) else if (b->filename) debug_print (1, ("not unlinking %s.\n", b->filename)); - 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); + p_delete(&b->filename); + p_delete(&b->content); + p_delete(&b->xtype); + p_delete(&b->subtype); + p_delete(&b->description); + p_delete(&b->form_name); if (b->hdr) { /* Don't free twice (b->hdr->content = b->parts) */ b->hdr->content = NULL; - mutt_free_header (&b->hdr); + header_delete(&b->hdr); } if (b->parts) mutt_free_body (&b->parts); - mem_free (&b); + p_delete(&b); } *p = 0; } -void mutt_free_parameter (PARAMETER ** p) -{ - PARAMETER *t = *p; - PARAMETER *o; - - while (t) { - mem_free (&t->attribute); - mem_free (&t->value); - o = t; - t = t->next; - 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 = 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; - hnew = mutt_new_header (); + hnew = header_new(); memcpy (hnew, h, sizeof (HEADER)); return hnew; } -void mutt_free_header (HEADER ** h) -{ - if (!h || !*h) - return; - mutt_free_envelope (&(*h)->env); - mutt_free_body (&(*h)->content); - 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 - mem_free (&(*h)->data); -#endif - mem_free (h); -} - /* returns true if the header contained in "s" is in list "t" */ int mutt_matches_ignore (const char *s, LIST * t) { for (; t; t = t->next) { - if (!ascii_strncasecmp (s, t->data, str_len (t->data)) + if (!ascii_strncasecmp (s, t->data, m_strlen(t->data)) || *t->data == '*') return 1; } return 0; } -/* prepend the path part of *path to *link */ -void mutt_expand_link (char *newpath, const char *path, const char *link) +/* prepend the path part of *path to *lnk */ +void mutt_expand_link (char *newpath, const char *path, const char *lnk) { const char *lb = NULL; size_t len; - /* link is full path */ - if (*link == '/') { - strfcpy (newpath, link, _POSIX_PATH_MAX); + /* lnk is full path */ + if (*lnk == '/') { + m_strcpy(newpath, _POSIX_PATH_MAX, lnk); return; } if ((lb = strrchr (path, '/')) == NULL) { - /* no path in link */ - strfcpy (newpath, link, _POSIX_PATH_MAX); + /* no path in lnk */ + m_strcpy(newpath, _POSIX_PATH_MAX, lnk); return; } len = lb - path + 1; memcpy (newpath, path, len); - strfcpy (newpath + len, link, _POSIX_PATH_MAX - len); + m_strcpy(newpath + len, _POSIX_PATH_MAX - len, lnk); } char *mutt_expand_path (char *s, size_t slen) @@ -324,7 +261,7 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) char tmp[_POSIX_PATH_MAX]; char *t; - char *tail = ""; + const char *tail = ""; int recurse = 0; @@ -335,7 +272,7 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '~': { if (*(s + 1) == '/' || *(s + 1) == 0) { - strfcpy (p, NONULL (Homedir), sizeof (p)); + m_strcpy(p, sizeof(p), NONULL(Homedir)); tail = s + 1; } else { @@ -345,7 +282,7 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) *t = 0; if ((pw = getpwnam (s + 1))) { - strfcpy (p, pw->pw_dir, sizeof (p)); + m_strcpy(p, sizeof(p), pw->pw_dir); if (t) { *t = '/'; tail = t; @@ -367,13 +304,11 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '=': case '+': { -#ifdef USE_IMAP /* if folder = imap[s]://host/: don't append slash */ if (imap_is_magic (NONULL (Maildir), NULL) == M_IMAP && - Maildir[str_len (Maildir) - 1] == '/') - strfcpy (p, NONULL (Maildir), sizeof (p)); + Maildir[m_strlen(Maildir) - 1] == '/') + m_strcpy(p, sizeof(p), NONULL(Maildir)); else -#endif snprintf (p, sizeof (p), "%s/", NONULL (Maildir)); tail = s + 1; @@ -385,15 +320,15 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '@': { HEADER *h; - ADDRESS *alias; + address_t *alias; if ((alias = mutt_lookup_alias (s + 1))) { - h = mutt_new_header (); - h->env = mutt_new_envelope (); + h = header_new(); + h->env = envelope_new(); h->env->from = h->env->to = alias; mutt_default_save (p, sizeof (p), h); h->env->from = h->env->to = NULL; - mutt_free_header (&h); + header_delete(&h); /* Avoid infinite recursion if the resulting folder starts with '@' */ if (*p != '@') recurse = 1; @@ -405,14 +340,14 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '>': { - strfcpy (p, NONULL (Inbox), sizeof (p)); + m_strcpy(p, sizeof(p), NONULL(Inbox)); tail = s + 1; } break; case '<': { - strfcpy (p, NONULL (Outbox), sizeof (p)); + m_strcpy(p, sizeof(p), NONULL(Outbox)); tail = s + 1; } break; @@ -420,11 +355,11 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '!': { if (*(s + 1) == '!') { - strfcpy (p, NONULL (LastFolder), sizeof (p)); + m_strcpy(p, sizeof(p), NONULL(LastFolder)); tail = s + 2; } else { - strfcpy (p, NONULL (Spoolfile), sizeof (p)); + m_strcpy(p, sizeof(p), NONULL(Spoolfile)); tail = s + 1; } } @@ -432,14 +367,14 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '-': { - strfcpy (p, NONULL (LastFolder), sizeof (p)); + m_strcpy(p, sizeof(p), NONULL(LastFolder)); tail = s + 1; } break; case '^': { - strfcpy (p, NONULL (CurrentFolder), sizeof (p)); + m_strcpy(p, sizeof(p), NONULL(CurrentFolder)); tail = s + 1; } break; @@ -458,7 +393,7 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) else snprintf (tmp, sizeof (tmp), "%s%s", p, tail); - strfcpy (s, tmp, slen); + m_strcpy(s, slen, tmp); } while (recurse); @@ -473,29 +408,29 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) * name. */ -char *mutt_gecos_name (char *dest, size_t destlen, struct passwd *pw) +char *mutt_gecos_name (char *dest, ssize_t destlen, struct passwd *pw) { regmatch_t pat_match[1]; - size_t pwnl; + ssize_t pwnl; int idx; char *p; if (!pw || !pw->pw_gecos) return NULL; - memset (dest, 0, destlen); + p_clear(dest, destlen); if (GecosMask.rx) { if (regexec (GecosMask.rx, pw->pw_gecos, 1, pat_match, 0) == 0) - strfcpy (dest, pw->pw_gecos + pat_match[0].rm_so, - MIN (pat_match[0].rm_eo - pat_match[0].rm_so + 1, destlen)); + m_strcpy(dest, MIN(pat_match[0].rm_eo - pat_match[0].rm_so + 1, destlen), + pw->pw_gecos + pat_match[0].rm_so); } else if ((p = strchr (pw->pw_gecos, ','))) - strfcpy (dest, pw->pw_gecos, MIN (destlen, p - pw->pw_gecos + 1)); + m_strcpy(dest, MIN(destlen, p - pw->pw_gecos + 1), pw->pw_gecos); else - strfcpy (dest, pw->pw_gecos, destlen); + m_strcpy(dest, destlen, pw->pw_gecos); - pwnl = str_len (pw->pw_name); + pwnl = m_strlen(pw->pw_name); for (idx = 0; dest[idx]; idx++) { if (dest[idx] == '&') { @@ -531,14 +466,14 @@ void mutt_set_parameter (const char *attribute, const char *value, for (q = *p; q; q = q->next) { if (ascii_strcasecmp (attribute, q->attribute) == 0) { - str_replace (&q->value, value); + m_strreplace(&q->value, value); return; } } - q = mutt_new_parameter (); - q->attribute = str_dup (attribute); - q->value = str_dup (value); + q = parameter_new(); + q->attribute = m_strdup(attribute); + q->value = m_strdup(value); q->next = *p; *p = q; } @@ -551,7 +486,7 @@ void mutt_delete_parameter (const char *attribute, PARAMETER ** p) if (ascii_strcasecmp (attribute, q->attribute) == 0) { *p = q->next; q->next = NULL; - mutt_free_parameter (&q); + parameter_delete(&q); return; } } @@ -570,9 +505,9 @@ int mutt_needs_mailcap (BODY * m) break; case TYPEAPPLICATION: - if ((WithCrypto & APPLICATION_PGP) && mutt_is_application_pgp (m)) + if (mutt_is_application_pgp (m)) return 0; - if ((WithCrypto & APPLICATION_SMIME) && mutt_is_application_smime (m)) + if (mutt_is_application_smime (m)) return 0; break; @@ -589,7 +524,7 @@ int mutt_is_text_part (BODY * b) int t = b->type; char *s = b->subtype; - if ((WithCrypto & APPLICATION_PGP) && mutt_is_application_pgp (b)) + if (mutt_is_application_pgp (b)) return 0; if (t == TYPETEXT) @@ -600,7 +535,7 @@ int mutt_is_text_part (BODY * b) return 1; } - if ((WithCrypto & APPLICATION_PGP) && t == TYPEAPPLICATION) { + if (t == TYPEAPPLICATION) { if (!ascii_strcasecmp ("pgp-keys", s)) return 1; } @@ -608,46 +543,11 @@ int mutt_is_text_part (BODY * b) return 0; } -void mutt_free_envelope (ENVELOPE ** p) -{ - if (!*p) - return; - rfc822_free_address (&(*p)->return_path); - rfc822_free_address (&(*p)->from); - rfc822_free_address (&(*p)->to); - rfc822_free_address (&(*p)->cc); - rfc822_free_address (&(*p)->bcc); - rfc822_free_address (&(*p)->sender); - rfc822_free_address (&(*p)->reply_to); - rfc822_free_address (&(*p)->mail_followup_to); - - mem_free (&(*p)->list_post); - mem_free (&(*p)->subject); - /* real_subj is just an offset to subject and shouldn't be freed */ - 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 - 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); - mem_free (p); -} - /* move all the headers from extra not present in base into base */ void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra) { /* copies each existing element if necessary, and sets the element - * to NULL in the source so that mutt_free_envelope doesn't leave us + * to NULL in the source so that envelope_delete doesn't leave us * with dangling pointers. */ #define MOVE_ELEM(h) if (!base->h) { base->h = (*extra)->h; (*extra)->h = NULL; } MOVE_ELEM(return_path); @@ -684,13 +584,13 @@ void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra) MOVE_ELEM(userhdrs); #undef MOVE_ELEM - mutt_free_envelope(extra); + envelope_delete(extra); } void _mutt_mktemp (char *s, const char *src, int line) { - snprintf (s, _POSIX_PATH_MAX, "%s/muttng-%s-%d-%d-%d-%x%x", NONULL (Tempdir), + snprintf (s, _POSIX_PATH_MAX, "%s/madmutt-%s-%d-%d-%d-%x%x", NONULL (Tempdir), NONULL (Hostname), (int) getuid (), (int) getpid (), Counter++, (unsigned int) rand(), (unsigned int) rand()); debug_print (1, ("%s:%d: mutt_mktemp returns \"%s\".\n", src, line, s)); @@ -704,9 +604,9 @@ void mutt_free_alias (ALIAS ** p) while (*p) { t = *p; *p = (*p)->next; - mem_free (&t->name); - rfc822_free_address (&t->addr); - mem_free (&t); + p_delete(&t->name); + address_delete (&t->addr); + p_delete(&t); } } @@ -719,12 +619,10 @@ void mutt_pretty_mailbox (char *s) scheme = url_check_scheme (s); -#ifdef USE_IMAP if (scheme == U_IMAP || scheme == U_IMAPS) { imap_pretty_mailbox (s); return; } -#endif /* if s is an url, only collapse path component */ if (scheme != U_UNKNOWN) { @@ -751,22 +649,22 @@ void mutt_pretty_mailbox (char *s) } *q = 0; - if (str_ncmp (s, Maildir, (len = str_len (Maildir))) == 0 && + if (m_strncmp(s, Maildir, (len = m_strlen(Maildir))) == 0 && s[len] == '/') { *s++ = '='; - memmove (s, s + len, str_len (s + len) + 1); + memmove (s, s + len, m_strlen(s + len) + 1); } - else if (str_ncmp (s, Homedir, (len = str_len (Homedir))) == 0 && + else if (m_strncmp(s, Homedir, (len = m_strlen(Homedir))) == 0 && s[len] == '/') { *s++ = '~'; - memmove (s, s + len - 1, str_len (s + len - 1) + 1); + memmove (s, s + len - 1, m_strlen(s + len - 1) + 1); } } void mutt_pretty_size (char *s, size_t len, long n) { if (n == 0) - strfcpy (s, "0K", len); + m_strcpy(s, len, "0K"); else if (n < 10189) /* 0.1K - 9.9K */ snprintf (s, len, "%3.1fK", (n < 103) ? 0.1 : n / 1024.0); else if (n < 1023949) { /* 10K - 999K */ @@ -799,7 +697,7 @@ void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, size_t slen; int found = 0; - slen = str_len (src); + slen = m_strlen(src); destlen--; for (p = fmt, d = dest; destlen && *p; p++) { @@ -811,7 +709,7 @@ void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, break; case 's': found = 1; - strfcpy (d, src, destlen + 1); + m_strcpy(d, destlen + 1, src); d += destlen > slen ? slen : destlen; destlen -= destlen > slen ? slen : destlen; p++; @@ -831,8 +729,8 @@ void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, *d = '\0'; if (!found && destlen > 0) { - str_cat (dest, destlen, " "); - str_cat (dest, destlen, src); + m_strcat(dest, destlen, " "); + m_strcat(dest, destlen, src); } } @@ -846,7 +744,7 @@ int mutt_check_overwrite (const char *attname, const char *path, char tmp[_POSIX_PATH_MAX]; struct stat st; - strfcpy (fname, path, flen); + m_strcpy(fname, flen, path); if (access (fname, F_OK) != 0) return 0; if (stat (fname, &st) != 0) @@ -857,16 +755,16 @@ int mutt_check_overwrite (const char *attname, const char *path, (_("File is a directory, save under it? [(y)es, (n)o, (a)ll]"), _("yna"))) { case 3: /* all */ - str_replace (directory, fname); + m_strreplace(directory, fname); break; case 1: /* yes */ - mem_free (directory); + p_delete(directory); break; case -1: /* abort */ - mem_free (directory); + p_delete(directory); return -1; case 2: /* no */ - mem_free (directory); + p_delete(directory); return 1; } } @@ -881,10 +779,10 @@ int mutt_check_overwrite (const char *attname, const char *path, if (mutt_get_field (_("File under directory: "), tmp, sizeof (tmp), M_FILE | M_CLEAR) != 0 || !tmp[0]) return (-1); - mutt_concat_path (fname, path, tmp, flen); + mutt_concat_path(fname, flen, path, tmp); } else - mutt_concat_path (fname, path, mutt_basename (attname), flen); + mutt_concat_path(fname, flen, path, mutt_basename(attname)); } if (*append == 0 && access (fname, F_OK) == 0) { @@ -907,23 +805,23 @@ int mutt_check_overwrite (const char *attname, const char *path, return 0; } -void mutt_save_path (char *d, size_t dsize, ADDRESS * a) +void mutt_save_path (char *d, size_t dsize, address_t * a) { if (a && a->mailbox) { - strfcpy (d, a->mailbox, dsize); + m_strcpy(d, dsize, a->mailbox); if (!option (OPTSAVEADDRESS)) { char *p; if ((p = strpbrk (d, "%@"))) *p = 0; } - str_tolower (d); + m_strtolower(d); } else *d = 0; } -void mutt_safe_path (char *s, size_t l, ADDRESS * a) +void mutt_safe_path (char *s, size_t l, address_t * a) { char *p; @@ -951,11 +849,11 @@ int mutt_skipchars (const char *s, const char *c) ret++; s++; } - return (str_len (p)); + return (m_strlen(p)); } void mutt_FormatString (char *dest, /* output buffer */ - size_t destlen, /* output buffer len */ + ssize_t destlen, /* output buffer len */ const char *src, /* template string */ format_t * callback, /* callback for processing */ unsigned long data, /* callback data */ @@ -963,7 +861,7 @@ void mutt_FormatString (char *dest, /* output buffer */ { /* callback flags */ char prefix[SHORT_STRING], buf[LONG_STRING], *cp, *wptr = dest, ch; char ifstring[SHORT_STRING], elsestring[SHORT_STRING]; - size_t wlen, count, len, col, wid; + ssize_t wlen, wid, count, col, len; prefix[0] = '\0'; destlen--; /* save room for the terminal \0 */ @@ -990,7 +888,7 @@ void mutt_FormatString (char *dest, /* output buffer */ /* eat the format string */ cp = prefix; count = 0; - while (count < sizeof (prefix) && + while (count < ssizeof (prefix) && (isdigit ((unsigned char) *src) || *src == '.' || *src == '-')) { *cp++ = *src++; @@ -1012,7 +910,7 @@ void mutt_FormatString (char *dest, /* output buffer */ /* eat the `if' part of the string */ cp = ifstring; count = 0; - while (count < sizeof (ifstring) && *src && *src != '?' + while (count < ssizeof (ifstring) && *src && *src != '?' && *src != '&') { *cp++ = *src++; count++; @@ -1024,7 +922,7 @@ void mutt_FormatString (char *dest, /* output buffer */ src++; /* skip the & */ cp = elsestring; count = 0; - while (count < sizeof (elsestring) && *src && *src != '?') { + while (count < ssizeof (elsestring) && *src && *src != '?') { *cp++ = *src++; count++; } @@ -1045,13 +943,11 @@ void mutt_FormatString (char *dest, /* output buffer */ 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); - wid = str_len (buf); + wid = m_strlen(buf); if (count > wid) { count -= wid; /* how many chars to pad */ memset (wptr, ch, count); @@ -1082,12 +978,12 @@ void mutt_FormatString (char *dest, /* output buffer */ break; /* skip rest of input */ } else { - short tolower = 0; + short lower = 0; short nodots = 0; while (ch == '_' || ch == ':') { if (ch == '_') - tolower = 1; + lower = 1; else if (ch == ':') nodots = 1; @@ -1099,8 +995,8 @@ void mutt_FormatString (char *dest, /* output buffer */ callback (buf, sizeof (buf), ch, src, prefix, ifstring, elsestring, data, flags); - if (tolower) - str_tolower (buf); + if (lower) + m_strtolower(buf); if (nodots) { char *p = buf; @@ -1109,7 +1005,7 @@ void mutt_FormatString (char *dest, /* output buffer */ *p = '_'; } - if ((len = str_len (buf)) + wlen > destlen) + if ((len = m_strlen(buf)) + wlen > destlen) len = (destlen - wlen > 0) ? (destlen - wlen) : 0; memcpy (wptr, buf, len); @@ -1148,15 +1044,14 @@ void mutt_FormatString (char *dest, /* output buffer */ } else { unsigned int bar = mutt_skipchars (src, "%\\"); - char *bar2 = mem_malloc (bar + 1); + char *bar2 = p_dupstr(src, bar); - strfcpy (bar2, src, bar + 1); while (bar--) { *wptr++ = *src++; wlen++; } col += mutt_strwidth (bar2); - mem_free (&bar2); + p_delete(&bar2); } } *wptr = 0; @@ -1177,32 +1072,26 @@ void mutt_FormatString (char *dest, /* output buffer */ then we assume it is a commmand to run instead of a normal file. */ FILE *mutt_open_read (const char *path, pid_t * thepid) { - FILE *f; - struct stat s; - - int len = str_len (path); - - if (path[len - 1] == '|') { - /* read from a pipe */ - - char *s = str_dup (path); - - s[len - 1] = 0; - mutt_endwin (NULL); - *thepid = mutt_create_filter (s, NULL, &f, NULL); - mem_free (&s); - } - else { - if (stat (path, &s) < 0) - return (NULL); - if (S_ISDIR (s.st_mode)) { - errno = EINVAL; - return (NULL); + int len = m_strlen(path); + FILE *f; + + if (path[len - 1] == '|') { + char *s = m_strdup(path); + + /* read from a pipe */ + + s[len - 1] = 0; + mutt_endwin (NULL); + *thepid = mutt_create_filter (s, NULL, &f, NULL); + p_delete(&s); + } else { + f = fopen (path, "r"); + if (!f) + return NULL; + *thepid = -1; } - f = fopen (path, "r"); - *thepid = -1; - } - return (f); + + return (f); } /* returns 0 if OK to proceed, -1 to abort, 1 to retry */ @@ -1215,13 +1104,11 @@ int mutt_save_confirm (const char *s, struct stat *st) magic = mx_get_magic (s); -#ifdef USE_POP if (magic == M_POP) { mutt_error _("Can't save message to POP mailbox."); return 1; } -#endif #ifdef USE_NNTP if (magic == M_NNTP) { @@ -1233,7 +1120,7 @@ int mutt_save_confirm (const char *s, struct stat *st) if (magic > 0 && !mx_access (s, W_OK)) { if (option (OPTCONFIRMAPPEND) && - (!TrashPath || (str_cmp (s, TrashPath) != 0))) { + (!TrashPath || (m_strcmp(s, TrashPath) != 0))) { /* if we're appending to the trash, there's no point in asking */ snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s); if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO) @@ -1250,9 +1137,7 @@ int mutt_save_confirm (const char *s, struct stat *st) } } else { -#ifdef USE_IMAP if (magic != M_IMAP) -#endif /* execute the block unconditionally if we don't use imap */ { st->st_mtime = 0; st->st_atime = 0; @@ -1294,7 +1179,6 @@ void mutt_sleep (short s) } /* Decrease a file's modification time by 1 second */ - time_t mutt_decrease_mtime (const char *f, struct stat *st) { struct utimbuf utim; @@ -1317,12 +1201,29 @@ time_t mutt_decrease_mtime (const char *f, struct stat *st) 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), + "Madmutt/%s-r%s (based on Mutt 1.5.11)", + MUTT_VERSION, MUTT_REVISION); + else + snprintf (vstring, sizeof (vstring), "Madmutt/%s-%s", + MUTT_VERSION, MUTT_REVISION); return vstring; } @@ -1336,8 +1237,8 @@ void mutt_free_spam_list (SPAM_LIST ** list) p = *list; *list = (*list)->next; rx_free (&p->rx); - mem_free(&p->template); - mem_free(&p); + p_delete(&p->template); + p_delete(&p); } } @@ -1356,7 +1257,7 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) for (; l; l = l->next) { /* If this pattern needs more matches, expand pmatch. */ if (l->nmatch > nmatch) { - mem_realloc (&pmatch, l->nmatch * sizeof (regmatch_t)); + p_realloc(&pmatch, l->nmatch); nmatch = l->nmatch; } @@ -1370,7 +1271,7 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) 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]; @@ -1413,11 +1314,11 @@ int mutt_cmp_header (const HEADER * h1, const HEADER * h2) { } /* return 1 if address lists are strictly identical */ -int mutt_cmp_addr (const ADDRESS * a, const ADDRESS * b) +int mutt_cmp_addr (const address_t * a, const address_t * b) { while (a && b) { - if (str_cmp (a->mailbox, b->mailbox) || - str_cmp (a->personal, b->personal)) + if (m_strcmp(a->mailbox, b->mailbox) || + m_strcmp(a->personal, b->personal)) return (0); a = a->next; @@ -1432,7 +1333,7 @@ int mutt_cmp_addr (const ADDRESS * a, const ADDRESS * b) int mutt_cmp_list (const LIST * a, const LIST * b) { while (a && b) { - if (str_cmp (a->data, b->data)) + if (m_strcmp(a->data, b->data)) return (0); a = a->next; @@ -1447,8 +1348,8 @@ int mutt_cmp_list (const LIST * a, const LIST * b) int mutt_cmp_env (const ENVELOPE * e1, const ENVELOPE * e2) { if (e1 && e2) { - if (str_cmp (e1->message_id, e2->message_id) || - str_cmp (e1->subject, e2->subject) || + if (m_strcmp(e1->message_id, e2->message_id) || + m_strcmp(e1->subject, e2->subject) || !mutt_cmp_list (e1->references, e2->references) || !mutt_cmp_addr (e1->from, e2->from) || !mutt_cmp_addr (e1->sender, e2->sender) || @@ -1471,8 +1372,8 @@ int mutt_cmp_env (const ENVELOPE * e1, const ENVELOPE * e2) int mutt_cmp_param (const PARAMETER * p1, const PARAMETER * p2) { while (p1 && p2) { - if (str_cmp (p1->attribute, p2->attribute) || - str_cmp (p1->value, p2->value)) + if (m_strcmp(p1->attribute, p2->attribute) || + m_strcmp(p1->value, p2->value)) return (0); p1 = p1->next; @@ -1488,8 +1389,8 @@ int mutt_cmp_body (const BODY * b1, const BODY * b2) { if (b1->type != b2->type || b1->encoding != b2->encoding || - str_cmp (b1->subtype, b2->subtype) || - str_cmp (b1->description, b2->description) || + m_strcmp(b1->subtype, b2->subtype) || + m_strcmp(b1->description, b2->description) || !mutt_cmp_param (b1->parameter, b2->parameter) || b1->length != b2->length) return (0);