X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=dc07e8a18846581e590531930fd5ffb6a17e89c9;hp=946a2f5b5f8ff153b34693d1fff598fea91f9af8;hb=5a4ed6a80a95c870a3603350d2a1e99b99d99b5b;hpb=b23d5033080fe9f9fba038e3cf1e3ec2b0a0d33d diff --git a/muttlib.c b/muttlib.c index 946a2f5..dc07e8a 100644 --- a/muttlib.c +++ b/muttlib.c @@ -13,21 +13,15 @@ #include #include -#include -#include -#include +#include #include -#include +#include #include "alias.h" #include "mutt.h" #include "attach.h" -#include "version.h" - -#include - -#include +const char *madmutt_version = "Madmutt/" MUTT_VERSION; /* Modified by blong to accept a "suggestion" for file name. If * that file exists, then construct one with unique name but @@ -39,7 +33,7 @@ void mutt_adv_mktemp (const char* dir, char *s, ssize_t l) { int fd; - fd = m_tempfd(s, l, m_strisempty(dir) ? NONULL(Tempdir) : dir, s); + fd = m_tempfd(s, l, m_strisempty(dir) ? NONULL(mod_core.tmpdir) : dir, s); if (fd < 0) { *s = '\0'; } else { @@ -48,114 +42,108 @@ void mutt_adv_mktemp (const char* dir, char *s, ssize_t l) } } -/* returns true if the header contained in "s" is in list "t" */ -int mutt_matches_ignore (const char *s, string_list_t * t) +void mutt_mktemp(char *s) { - for (; t; t = t->next) { - if (!ascii_strncasecmp (s, t->data, m_strlen(t->data)) - || *t->data == '*') - return 1; - } - return 0; + int fd = m_tempfd(s, _POSIX_PATH_MAX, NONULL(mod_core.tmpdir), NULL); + if (fd < 0) { + *s = '\0'; + } else { + close(fd); + unlink(s); + } } -ssize_t _mutt_expand_path(char *s, ssize_t slen, int rx) +ssize_t _mutt_expand_path(char *buf, ssize_t len, const char *s, int rx) { char p[_POSIX_PATH_MAX] = ""; char tmp[_POSIX_PATH_MAX]; const char *tail = ""; + const address_t *alias; - do { - const address_t *alias; - - switch (*s) { - case '~': - if (s[1] == '/' || s[1] == '\0') { - m_strcpy(p, sizeof(p), Homedir); - tail = s + 1; - } else { - struct passwd *pw; - tail = m_strchrnul(s + 1, '/'); + switch (*s) { + case '~': + if (s[1] == '/' || s[1] == '\0') { + m_strcpy(p, sizeof(p), mod_core.homedir); + tail = s + 1; + } else { + struct passwd *pw; + tail = m_strchrnul(s + 1, '/'); - m_strncpy(tmp, sizeof(tmp), s + 1, tail - s - 1); + m_strncpy(tmp, sizeof(tmp), s + 1, tail - s - 1); - if ((pw = getpwnam(tmp))) { - m_strcpy(p, sizeof(p), pw->pw_dir); - } else { - /* user not found! */ - tail = s; - } - } - break; - - case '=': - case '+': - /* if folder = imap[s]://host/: don't append slash */ - if (imap_is_magic(NONULL(Maildir), NULL) == M_IMAP - && Maildir[m_strlen(Maildir) - 1] == '/') { - m_strcpy(p, sizeof(p), Maildir); + if ((pw = getpwnam(tmp))) { + m_strcpy(p, sizeof(p), pw->pw_dir); } else { - snprintf(p, sizeof(p), "%s/", NONULL(Maildir)); + /* user not found! */ + tail = s; } + } + break; - tail = s + 1; - break; - - /* elm compatibility, @ expands alias to user name */ - - case '@': - if ((alias = alias_lookup(s + 1))) { - HEADER h; - header_init(&h); - h.env = envelope_new(); - h.env->from = h.env->to = (address_t *)alias; - mutt_default_save(p, sizeof (p), &h); - h.env->from = h.env->to = NULL; - header_wipe(&h); - - if (*p != '@') { - /* recurse iff the result do not starts with '@' */ - m_strcpy(s, slen, p); - continue; - } - } - break; + case '=': + case '+': + /* if folder = imap[s]://host/: don't append slash */ + if (imap_mx.mx_is_magic(NONULL(Maildir), NULL) == M_IMAP + && Maildir[m_strlen(Maildir) - 1] == '/') { + m_strcpy(p, sizeof(p), Maildir); + } else { + snprintf(p, sizeof(p), "%s/", NONULL(Maildir)); + } - case '>': - m_strcpy(p, sizeof(p), Inbox); - tail = s + 1; - break; + tail = s + 1; + break; - case '<': - m_strcpy(p, sizeof(p), Outbox); - tail = s + 1; - break; + /* elm compatibility, @ expands alias to user name */ - case '!': - if (s[1] == '!') { - m_strcpy(p, sizeof(p), LastFolder); - tail = s + 2; - } else { - m_strcpy(p, sizeof(p), Spoolfile); - tail = s + 1; - } - break; + case '@': + if ((alias = alias_lookup(s + 1))) { + HEADER h; + header_init(&h); + h.env = envelope_new(); + h.env->from = h.env->to = (address_t *)alias; + mutt_default_save(p, sizeof (p), &h); + h.env->from = h.env->to = NULL; + header_wipe(&h); - case '-': - m_strcpy(p, sizeof(p), NONULL(LastFolder)); - tail = s + 1; - break; + if (*p != '@') + return _mutt_expand_path(buf, len, p, rx); + } + break; - case '^': - m_strcpy(p, sizeof(p), NONULL(CurrentFolder)); - tail = s + 1; - break; + case '>': + m_strcpy(p, sizeof(p), Inbox); + tail = s + 1; + break; + + case '<': + m_strcpy(p, sizeof(p), MAlias.record); + tail = s + 1; + break; - default: - *p = '\0'; - tail = s; + case '!': + if (s[1] == '!') { + m_strcpy(p, sizeof(p), LastFolder); + tail = s + 2; + } else { + m_strcpy(p, sizeof(p), Spoolfile); + tail = s + 1; } - } while (0); + break; + + case '-': + m_strcpy(p, sizeof(p), NONULL(LastFolder)); + tail = s + 1; + break; + + case '^': + m_strcpy(p, sizeof(p), NONULL(CurrentFolder)); + tail = s + 1; + break; + + default: + *p = '\0'; + tail = s; + } if (rx) { char q[_POSIX_PATH_MAX]; @@ -165,18 +153,7 @@ ssize_t _mutt_expand_path(char *s, ssize_t slen, int rx) snprintf(tmp, sizeof(tmp), "%s%s", p, tail); } - return m_strcpy(s, slen, tmp); -} - -void mutt_mktemp(char *s) -{ - int fd = m_tempfd(s, _POSIX_PATH_MAX, NONULL(Tempdir), NULL); - if (fd < 0) { - *s = '\0'; - } else { - close(fd); - unlink(s); - } + return m_strcpy(buf, len, tmp); } /* collapse the pathname using ~ or = when possible */ @@ -223,8 +200,8 @@ void mutt_pretty_mailbox (char *s) *s++ = '='; memmove (s, s + len, m_strlen(s + len) + 1); } - else if (m_strncmp(s, Homedir, (len = m_strlen(Homedir))) == 0 && - s[len] == '/') { + else if (m_strncmp(s, mod_core.homedir, (len = m_strlen(mod_core.homedir))) == 0 + && s[len] == '/') { *s++ = '~'; memmove (s, s + len - 1, m_strlen(s + len - 1) + 1); } @@ -272,7 +249,7 @@ int mutt_check_overwrite (const char *attname, const char *path, tmp[0] = 0; if (mutt_get_field (_("File under directory: "), tmp, sizeof (tmp), M_FILE | M_CLEAR) != 0 || !tmp[0]) - return (-1); + return -1; mutt_concat_path(fname, flen, path, tmp); } else @@ -302,13 +279,7 @@ int mutt_check_overwrite (const char *attname, const char *path, void mutt_save_path(char *d, ssize_t dsize, address_t *a) { if (a && a->mailbox) { - m_strcpy(d, dsize, a->mailbox); - - if (!option(OPTSAVEADDRESS)) { - char *p = strpbrk(d, "%@"); - if (p) - *p = '\0'; - } + m_strncpy(d, dsize, a->mailbox, strcspn(d, "%@")); m_strtolower(d); } else { *d = '\0'; @@ -326,142 +297,6 @@ void mutt_safe_path(char *s, ssize_t l, address_t *a) } } -ssize_t m_strformat(char *dst, ssize_t dlen, int width, const char *fmt, - format_t *callback, anytype cdata, format_flag flags) -{ - ssize_t pos = flags & M_FORMAT_ARROWCURSOR ? 3 : 0; - - m_strpad(dst, dlen, '\0', pos + 1); - if (!fmt) - return pos; - - while (*fmt) { - int ch; - - if (*fmt == '%') { - char ifstr[STRING], elstr[STRING], prefix[STRING]; - - *ifstr = *elstr = *prefix = '\0'; - - if (*++fmt == '%') { - pos += m_strputc(dst + pos, dlen - pos, *fmt++); - continue; - } - - if (*fmt == '?') { - flags |= M_FORMAT_OPTIONAL; - fmt++; - } else { - ssize_t pfxlen; - flags &= ~M_FORMAT_OPTIONAL; - - /* eat the format string */ - pfxlen = strspn(fmt, "0123456789.-"); - m_strncpy(prefix, sizeof(prefix), fmt, pfxlen); - fmt += pfxlen; - } - - /* save the character to switch on */ - if (!(ch = *fmt++)) - break; - - if (flags & M_FORMAT_OPTIONAL) { - ssize_t iflen; - const char *p; - - if (*fmt++ != '?') - break; /* bad format */ - - /* eat the `if' part of the string */ - iflen = strcspn(fmt, "?&"); - m_strncpy(ifstr, ssizeof(ifstr), fmt, iflen); - fmt += iflen; - - /* eat the `else' part of the string (optional) */ - if (*fmt == '&') - fmt++; /* skip the & */ - - p = m_strchrnul(fmt, '?'); - m_strncpy(elstr, ssizeof(elstr), fmt, p - fmt); - fmt = p; - - if (!*fmt++) /* move past the trailing `?' */ - break; /* bad format */ - } - - switch (ch) { - char lower, nodots, buf[LONG_STRING]; - - case '>': /* right justify to EOL */ - width -= mutt_strwidth(dst); - - ch = *fmt++; /* pad char */ - - if (width > 0) { - m_strformat(buf, sizeof(buf), 0, fmt, callback, cdata, flags); - width -= mutt_strwidth(buf); - pos += m_strpad(dst + pos, dlen - pos, ch, width); - pos += m_strcpy(dst + pos, dlen - pos, buf); - } - return pos; /* skip rest of input */ - - case '|': /* pad to EOL */ - width -= mutt_strwidth(dst); - return pos + m_strpad(dst + pos, dlen - pos, *fmt, width); - - default: - lower = nodots = 0; - - while (ch == '_' || ch == ':') { - lower |= ch == '_'; - nodots |= ch == ':'; - ch = *fmt++; - } - - /* use callback function to handle this case */ - fmt = callback(buf, sizeof (buf), ch, fmt, prefix, - ifstr, elstr, cdata, flags); - - if (lower) - m_strtolower(buf); - - if (nodots) { - char *p; - - for (p = buf; *p; p++) { - if (*p == '.') - *p = '_'; - } - } - - pos += m_strcpy(dst + pos, dlen - pos, buf); - break; - } - continue; - } - - if (*fmt == '\\') { - if (!*++fmt) - break; - switch ((ch = *fmt++)) { - case 'n': pos += m_strputc(dst + pos, dlen - pos, '\n'); break; - case 't': pos += m_strputc(dst + pos, dlen - pos, '\t'); break; - case 'r': pos += m_strputc(dst + pos, dlen - pos, '\r'); break; - case 'f': pos += m_strputc(dst + pos, dlen - pos, '\f'); break; - case 'v': pos += m_strputc(dst + pos, dlen - pos, '\v'); break; - default: pos += m_strputc(dst + pos, dlen - pos, ch); break; - } - } else { - ssize_t len = strcspn(fmt, "%\\"); - - pos += m_strncpy(dst + pos, dlen - pos, fmt, len); - fmt += len; - } - } - - return pos; -} - /* returns 0 if OK to proceed, -1 to abort, 1 to retry */ int mutt_save_confirm (const char *s, struct stat *st) { @@ -478,14 +313,6 @@ int mutt_save_confirm (const char *s, struct stat *st) return 1; } -#ifdef USE_NNTP - if (magic == M_NNTP) { - mutt_error _("Can't save message to newsserver."); - - return 0; - } -#endif - if (magic > 0 && !mx_access (s, W_OK)) { if (option (OPTCONFIRMAPPEND) && (!TrashPath || (m_strcmp(s, TrashPath) != 0))) { @@ -523,9 +350,7 @@ int mutt_save_confirm (const char *s, struct stat *st) } } } - - CLEARLINE (LINES - 1); - return (ret); + return ret; } void mutt_sleep (short s) @@ -533,50 +358,30 @@ void mutt_sleep (short s) sleep(MAX(s, SleepTime)); } -const char *mutt_make_version (int full) -{ - static char vstring[STRING]; - - 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; -} - /* return 1 if address lists are strictly identical */ static int mutt_cmp_addr (const address_t * a, const address_t * b) { while (a && b) { if (m_strcmp(a->mailbox, b->mailbox) || m_strcmp(a->personal, b->personal)) - return (0); + return 0; a = a->next; b = b->next; } - if (a || b) - return (0); - - return (1); + return !(a || b); } static int mutt_cmp_list (const string_list_t * a, const string_list_t * b) { while (a && b) { if (m_strcmp(a->data, b->data)) - return (0); + return 0; a = a->next; b = b->next; } - if (a || b) - return (0); - - return (1); + return !(a || b); } static int mutt_cmp_env (const ENVELOPE * e1, const ENVELOPE * e2) @@ -591,16 +396,11 @@ static int mutt_cmp_env (const ENVELOPE * e1, const ENVELOPE * e2) !mutt_cmp_addr (e1->to, e2->to) || !mutt_cmp_addr (e1->cc, e2->cc) || !mutt_cmp_addr (e1->return_path, e2->return_path)) - return (0); + return 0; else - return (1); - } - else { - if (e1 == NULL && e2 == NULL) - return (1); - else - return (0); + return 1; } + return e1 == NULL && e2 == NULL; } static int mutt_cmp_body (const BODY * b1, const BODY * b2) @@ -611,8 +411,8 @@ static int mutt_cmp_body (const BODY * b1, const BODY * b2) m_strcmp(b1->description, b2->description) || !parameter_equal(b1->parameter, b2->parameter) || b1->length != b2->length) - return (0); - return (1); + return 0; + return 1; } int mutt_cmp_header (const HEADER * h1, const HEADER * h2) { if (h1 && h2) { @@ -626,16 +426,11 @@ int mutt_cmp_header (const HEADER * h1, const HEADER * h2) { h1->mime != h2->mime || !mutt_cmp_env (h1->env, h2->env) || !mutt_cmp_body (h1->content, h2->content)) - return (0); + return 0; else - return (1); - } - else { - if (h1 == NULL && h2 == NULL) - return (1); - else - return (0); + return 1; } + return h1 == NULL && h2 == NULL; } @@ -654,7 +449,6 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags) if ((ISSPACE(ch) && !(flags & M_TOKEN_SPACE)) || (ch == '#' && !(flags & M_TOKEN_COMMENT)) || (ch == '=' && (flags & M_TOKEN_EQUAL)) - || (ch == ';' && !(flags & M_TOKEN_SEMICOLON)) || ((flags & M_TOKEN_PATTERN) && strchr("~=!|", ch))) { break; @@ -744,7 +538,7 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags) } } while (pc && *pc != '`'); if (!pc) { - return (-1); + return -1; } cmd = p_dupstr(tok->dptr, pc - tok->dptr);