X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=5ad138c795ff5a10b6ef445d78f4b783fb4d0bfe;hp=c5be0b78dfb816e6c7c8790d5e41f849a26ee333;hb=2a2f2f9a5bad73c883b7f9c9b4166d932b6aaf37;hpb=22601f25ede6703ba7cd06ee84eddd2045308570 diff --git a/muttlib.c b/muttlib.c index c5be0b7..5ad138c 100644 --- a/muttlib.c +++ b/muttlib.c @@ -12,20 +12,36 @@ # include "config.h" #endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include #include #include #include #include +#include #include +#include +#include + +#include "alias.h" #include "mutt.h" -#include "enter.h" -#include "mutt_curses.h" #include "mx.h" -#include "url.h" #include "attach.h" #include "version.h" @@ -35,20 +51,6 @@ #include -#include "lib/debug.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #define SW (option(OPTMBOXPANE)?SidebarWidth:0) BODY *mutt_new_body (void) @@ -67,12 +69,12 @@ 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 (const char* dir, char *s, size_t l) +void mutt_adv_mktemp (const char* dir, char *s, ssize_t l) { char buf[_POSIX_PATH_MAX]; char tmp[_POSIX_PATH_MAX]; char *period; - size_t sl; + ssize_t sl; struct stat sb; m_strcpy(buf, sizeof(buf), m_strisempty(dir) ? NONULL(Tempdir) : dir); @@ -166,23 +168,14 @@ int mutt_copy_body (FILE * fp, BODY ** tgt, BODY * src) } - -void mutt_free_body (BODY ** p) +static void body_wipe(BODY *b) { - BODY *a = *p, *b; - - while (a) { - b = a; - a = a->next; - if (b->parameter) - parameter_delete(&b->parameter); + parameter_list_wipe(&b->parameter); + if (b->unlink && b->filename) { - debug_print (1, ("unlinking %s.\n", b->filename)); - unlink (b->filename); + unlink (b->filename); } - else if (b->filename) - debug_print (1, ("not unlinking %s.\n", b->filename)); p_delete(&b->filename); p_delete(&b->content); @@ -192,18 +185,25 @@ void mutt_free_body (BODY ** p) p_delete(&b->form_name); if (b->hdr) { - /* Don't free twice (b->hdr->content = b->parts) */ - b->hdr->content = NULL; - header_delete(&b->hdr); + /* Don't free twice (b->hdr->content = b->parts) */ + b->hdr->content = NULL; + header_delete(&b->hdr); } if (b->parts) - mutt_free_body (&b->parts); + mutt_free_body(&b->parts); +} - p_delete(&b); - } +DO_DELETE(BODY, body); - *p = 0; +void mutt_free_body(BODY **p) +{ + while (*p) { + BODY *b = *p; + *p = b->next; + + body_delete(&b); + } } HEADER *mutt_dup_header (HEADER * h) @@ -216,7 +216,7 @@ HEADER *mutt_dup_header (HEADER * h) } /* returns true if the header contained in "s" is in list "t" */ -int mutt_matches_ignore (const char *s, LIST * t) +int mutt_matches_ignore (const char *s, string_list_t * t) { for (; t; t = t->next) { if (!ascii_strncasecmp (s, t->data, m_strlen(t->data)) @@ -230,7 +230,7 @@ int mutt_matches_ignore (const char *s, LIST * t) void mutt_expand_link (char *newpath, const char *path, const char *lnk) { const char *lb = NULL; - size_t len; + ssize_t len; /* lnk is full path */ if (*lnk == '/') { @@ -249,12 +249,12 @@ void mutt_expand_link (char *newpath, const char *path, const char *lnk) m_strcpy(newpath + len, _POSIX_PATH_MAX - len, lnk); } -char *mutt_expand_path (char *s, size_t slen) +char *mutt_expand_path (char *s, ssize_t slen) { return _mutt_expand_path (s, slen, 0); } -char *_mutt_expand_path (char *s, size_t slen, int rx) +char *_mutt_expand_path (char *s, ssize_t slen, int rx) { char p[_POSIX_PATH_MAX] = ""; char q[_POSIX_PATH_MAX] = ""; @@ -320,9 +320,10 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) case '@': { HEADER *h; + /* FIXME: BUG ? */ address_t *alias; - if ((alias = mutt_lookup_alias (s + 1))) { + if ((alias = alias_lookup(s + 1))) { h = header_new(); h->env = envelope_new(); h->env->from = h->env->to = alias; @@ -387,7 +388,7 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) } if (rx && *p && !recurse) { - mutt_rx_sanitize_string (q, sizeof (q), p); + rx_sanitize_string (q, sizeof (q), p); snprintf (tmp, sizeof (tmp), "%s%s", q, tail); } else @@ -400,96 +401,40 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) return (s); } -/* Extract the real name from /etc/passwd's GECOS field. - * When set, honor the regular expression in GecosMask, - * otherwise assume that the GECOS field is a - * comma-separated list. - * Replace "&" by a capitalized version of the user's login - * name. - */ - -char *mutt_gecos_name (char *dest, size_t destlen, struct passwd *pw) -{ - regmatch_t pat_match[1]; - size_t pwnl; - int idx; - char *p; - - if (!pw || !pw->pw_gecos) - return NULL; - - p_clear(dest, destlen); - - if (GecosMask.rx) { - if (regexec (GecosMask.rx, pw->pw_gecos, 1, pat_match, 0) == 0) - 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, ','))) - m_strcpy(dest, MIN(destlen, p - pw->pw_gecos + 1), pw->pw_gecos); - else - m_strcpy(dest, destlen, pw->pw_gecos); - - pwnl = m_strlen(pw->pw_name); - - for (idx = 0; dest[idx]; idx++) { - if (dest[idx] == '&') { - memmove (&dest[idx + pwnl], &dest[idx + 1], - MAX (destlen - idx - pwnl - 1, 0)); - memcpy (&dest[idx], pw->pw_name, MIN (destlen - idx - 1, pwnl)); - dest[idx] = toupper ((unsigned char) dest[idx]); - } - } - - return dest; -} - - -char *mutt_get_parameter (const char *s, PARAMETER * p) -{ - for (; p; p = p->next) - if (ascii_strcasecmp (s, p->attribute) == 0) - return (p->value); - - return NULL; -} - void mutt_set_parameter (const char *attribute, const char *value, PARAMETER ** p) { - PARAMETER *q; + PARAMETER *q; - if (!value) { - mutt_delete_parameter (attribute, p); - return; - } + if (!value) { + mutt_delete_parameter (attribute, p); + return; + } - for (q = *p; q; q = q->next) { - if (ascii_strcasecmp (attribute, q->attribute) == 0) { - m_strreplace(&q->value, value); - return; + for (q = *p; q; q = q->next) { + if (ascii_strcasecmp (attribute, q->attribute) == 0) { + m_strreplace(&q->value, value); + return; + } } - } - q = parameter_new(); - q->attribute = m_strdup(attribute); - q->value = m_strdup(value); - q->next = *p; - *p = q; + q = parameter_new(); + q->attribute = m_strdup(attribute); + q->value = m_strdup(value); + parameter_list_push(p, q); } void mutt_delete_parameter (const char *attribute, PARAMETER ** p) { - PARAMETER *q; + while (*p) { + if (!ascii_strcasecmp(attribute, (*p)->attribute)) { + PARAMETER *q = parameter_list_pop(p); + parameter_delete(&q); + return; + } - for (q = *p; q; p = &q->next, q = q->next) { - if (ascii_strcasecmp (attribute, q->attribute) == 0) { - *p = q->next; - q->next = NULL; - parameter_delete(&q); - return; + p = &(*p)->next; } - } } /* returns 1 if Mutt can't display this type of data, 0 otherwise */ @@ -579,7 +524,7 @@ void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra) /* spam and user headers should never be hashed, and the new envelope may * have better values. Use new versions regardless. */ mutt_buffer_free (&base->spam); - mutt_free_list (&base->userhdrs); + string_list_wipe(&base->userhdrs); MOVE_ELEM(spam); MOVE_ELEM(userhdrs); #undef MOVE_ELEM @@ -590,31 +535,17 @@ void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** 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)); unlink (s); } -void mutt_free_alias (ALIAS ** p) -{ - ALIAS *t; - - while (*p) { - t = *p; - *p = (*p)->next; - p_delete(&t->name); - address_delete (&t->addr); - p_delete(&t); - } -} - /* collapse the pathname using ~ or = when possible */ void mutt_pretty_mailbox (char *s) { char *p = s, *q = s; - size_t len; + ssize_t len; url_scheme_t scheme; scheme = url_check_scheme (s); @@ -661,7 +592,7 @@ void mutt_pretty_mailbox (char *s) } } -void mutt_pretty_size (char *s, size_t len, long n) +void mutt_pretty_size (char *s, ssize_t len, long n) { if (n == 0) m_strcpy(s, len, "0K"); @@ -680,7 +611,7 @@ void mutt_pretty_size (char *s, size_t len, long n) } } -void mutt_expand_file_fmt (char *dest, size_t destlen, const char *fmt, +void mutt_expand_file_fmt (char *dest, ssize_t destlen, const char *fmt, const char *src) { char tmp[LONG_STRING]; @@ -689,12 +620,12 @@ void mutt_expand_file_fmt (char *dest, size_t destlen, const char *fmt, mutt_expand_fmt (dest, destlen, fmt, tmp); } -void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, +void mutt_expand_fmt (char *dest, ssize_t destlen, const char *fmt, const char *src) { const char *p; char *d; - size_t slen; + ssize_t slen; int found = 0; slen = m_strlen(src); @@ -737,7 +668,7 @@ void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, /* return 0 on success, -1 on abort, 1 on error */ int mutt_check_overwrite (const char *attname, const char *path, - char *fname, size_t flen, int *append, + char *fname, ssize_t flen, int *append, char **directory) { int rc = 0; @@ -805,7 +736,7 @@ int mutt_check_overwrite (const char *attname, const char *path, return 0; } -void mutt_save_path (char *d, size_t dsize, address_t * a) +void mutt_save_path (char *d, ssize_t dsize, address_t * a) { if (a && a->mailbox) { m_strcpy(d, dsize, a->mailbox); @@ -821,7 +752,7 @@ void mutt_save_path (char *d, size_t dsize, address_t * a) *d = 0; } -void mutt_safe_path (char *s, size_t l, address_t * a) +void mutt_safe_path (char *s, ssize_t l, address_t * a) { char *p; @@ -853,7 +784,7 @@ int mutt_skipchars (const char *s, const char *c) } 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 */ @@ -861,7 +792,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 */ @@ -888,7 +819,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++; @@ -910,7 +841,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++; @@ -922,7 +853,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++; } @@ -1219,10 +1150,10 @@ const char *mutt_make_version (int full) if (full) snprintf (vstring, sizeof (vstring), - "Mutt-ng %s-r%s (based on Mutt 1.5.11)", + "Madmutt/%s-r%s (based on Mutt 1.5.11)", MUTT_VERSION, MUTT_REVISION); else - snprintf (vstring, sizeof (vstring), "mutt-ng/%s-r%s", + snprintf (vstring, sizeof (vstring), "Madmutt/%s-%s", MUTT_VERSION, MUTT_REVISION); return vstring; } @@ -1236,7 +1167,7 @@ void mutt_free_spam_list (SPAM_LIST ** list) while (*list) { p = *list; *list = (*list)->next; - rx_free (&p->rx); + rx_delete(&p->rx); p_delete(&p->template); p_delete(&p); } @@ -1262,11 +1193,8 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) } /* Does this pattern match? */ - if (regexec - (l->rx->rx, s, (size_t) l->nmatch, (regmatch_t *) pmatch, - (int) 0) == 0) { - debug_print (5, ("%s matches %s\n%d subst", s, l->rx->pattern, l->rx->rx->re_nsub)); - + if (regexec(l->rx->rx, s, l->nmatch, (regmatch_t *)pmatch, (int) 0) == 0) + { /* Copy template into text, with substitutions. */ for (p = l->template; *p;) { if (*p == '%') { @@ -1281,7 +1209,6 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) } } text[tlen] = '\0'; - debug_print (5, ("\"%s\"\n", text)); return 1; } } @@ -1330,7 +1257,7 @@ int mutt_cmp_addr (const address_t * a, const address_t * b) return (1); } -int mutt_cmp_list (const LIST * a, const LIST * b) +int mutt_cmp_list (const string_list_t * a, const string_list_t * b) { while (a && b) { if (m_strcmp(a->data, b->data))