X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=0d86826b1c2de1411455063a905608cbd4e310fb;hp=caf5fd97915c5c9bbcc73161675212d97e647950;hb=20e55d4252ca2db1fc2b1099acf8393c22903575;hpb=ac1ea3143e61def7fc9000bee6d0d59d56c5b997 diff --git a/muttlib.c b/muttlib.c index caf5fd9..0d86826 100644 --- a/muttlib.c +++ b/muttlib.c @@ -12,27 +12,16 @@ #include #include -#include - -#include - -#include -#include +#include #include +#include #include "alias.h" #include "mutt.h" -#include "mx.h" #include "attach.h" -#include "version.h" - -#include - -#include - -#define SW (option(OPTMBOXPANE)?SidebarWidth:0) +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 @@ -42,272 +31,129 @@ */ void mutt_adv_mktemp (const char* dir, char *s, ssize_t l) { - char buf[_POSIX_PATH_MAX]; - char tmp[_POSIX_PATH_MAX]; - char *period; - ssize_t sl; - struct stat sb; - - 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 { - 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) - return; - if ((period = strrchr (tmp, '.')) != NULL) - *period = 0; - snprintf (s, l, "%s/%s.XXXXXX", buf, tmp); - mktemp (s); - if (period != NULL) { - *period = '.'; - sl = m_strlen(s); - m_strcpy(s + sl, l - sl, period); - } - } -} - -/* create a send-mode duplicate from a receive-mode body */ + int fd; -int mutt_copy_body (FILE * fp, BODY ** tgt, BODY * src) -{ - char tmp[_POSIX_PATH_MAX]; - BODY *b; - - parameter_t *par, **ppar; - - short use_disp; - - if (src->filename) { - use_disp = 1; - m_strcpy(tmp, sizeof(tmp), src->filename); - } - else { - use_disp = 0; - tmp[0] = '\0'; - } - - mutt_adv_mktemp (NULL, tmp, sizeof (tmp)); - if (mutt_save_attachment (fp, src, tmp, 0, NULL) == -1) - return -1; - - *tgt = body_new(); - b = *tgt; - - memcpy (b, src, sizeof (BODY)); - b->parts = NULL; - b->next = NULL; - - b->filename = m_strdup(tmp); - b->use_disp = use_disp; - b->unlink = 1; - - if (mutt_is_text_part (b)) - b->noconv = 1; - - 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. - * XXX - this may change in the future - */ - - if (b->hdr) - b->hdr = NULL; - - /* copy parameters */ - for (par = b->parameter, ppar = &b->parameter; par; - ppar = &(*ppar)->next, par = par->next) { - *ppar = parameter_new(); - (*ppar)->attribute = m_strdup(par->attribute); - (*ppar)->value = m_strdup(par->value); - } - - mutt_stamp_attachment (b); - - return 0; -} - -/* returns true if the header contained in "s" is in 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)) - || *t->data == '*') - return 1; - } - return 0; + fd = m_tempfd(s, l, m_strisempty(dir) ? NONULL(mod_core.tmpdir) : dir, s); + if (fd < 0) { + *s = '\0'; + } else { + close(fd); + unlink(s); + } } -char *mutt_expand_path (char *s, ssize_t slen) +void mutt_mktemp(char *s) { - return _mutt_expand_path (s, slen, 0); + int fd = m_tempfd(s, _POSIX_PATH_MAX, NONULL(mod_core.tmpdir), NULL); + if (fd < 0) { + *s = '\0'; + } else { + close(fd); + unlink(s); + } } -char *_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 q[_POSIX_PATH_MAX] = ""; - char tmp[_POSIX_PATH_MAX]; - char *t; - - const char *tail = ""; - - int recurse = 0; - - do { - recurse = 0; + char p[_POSIX_PATH_MAX] = ""; + char tmp[_POSIX_PATH_MAX]; + const char *tail = ""; + const address_t *alias; switch (*s) { - case '~': - { - if (*(s + 1) == '/' || *(s + 1) == 0) { - m_strcpy(p, sizeof(p), NONULL(Homedir)); - tail = s + 1; - } - else { - struct passwd *pw; + 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, '/'); - if ((t = strchr (s + 1, '/'))) - *t = 0; + m_strncpy(tmp, sizeof(tmp), s + 1, tail - s - 1); - if ((pw = getpwnam (s + 1))) { - m_strcpy(p, sizeof(p), pw->pw_dir); - if (t) { - *t = '/'; - tail = t; + if ((pw = getpwnam(tmp))) { + m_strcpy(p, sizeof(p), pw->pw_dir); + } else { + /* user not found! */ + tail = s; } - else - tail = ""; - } - else { - /* user not found! */ - if (t) - *t = '/'; - *p = '\0'; - tail = s; - } } - } - break; + break; - case '=': - case '+': - { + 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), NONULL(Maildir)); - else - snprintf (p, sizeof (p), "%s/", NONULL (Maildir)); + if (imap_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)); + } tail = s + 1; - } - break; - - /* elm compatibility, @ expands alias to user name */ + break; - case '@': - { - HEADER *h; - /* FIXME: BUG ? */ - address_t *alias; + /* elm compatibility, @ expands alias to user name */ + case '@': if ((alias = alias_lookup(s + 1))) { - 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; - header_delete(&h); - /* Avoid infinite recursion if the resulting folder starts with '@' */ - if (*p != '@') - recurse = 1; - - tail = ""; + 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 != '@') + return _mutt_expand_path(buf, len, p, rx); } - } - break; + break; - case '>': - { - m_strcpy(p, sizeof(p), NONULL(Inbox)); + case '>': + m_strcpy(p, sizeof(p), Inbox); tail = s + 1; - } - break; + break; - case '<': - { - m_strcpy(p, sizeof(p), NONULL(Outbox)); + case '<': + m_strcpy(p, sizeof(p), MAlias.record); tail = s + 1; - } - break; + break; - case '!': - { - if (*(s + 1) == '!') { - m_strcpy(p, sizeof(p), NONULL(LastFolder)); - tail = s + 2; - } - else { - m_strcpy(p, sizeof(p), NONULL(Spoolfile)); - tail = s + 1; + case '!': + if (s[1] == '!') { + m_strcpy(p, sizeof(p), LastFolder); + tail = s + 2; + } else { + m_strcpy(p, sizeof(p), Spoolfile); + tail = s + 1; } - } - break; + break; - case '-': - { + case '-': m_strcpy(p, sizeof(p), NONULL(LastFolder)); tail = s + 1; - } - break; + break; - case '^': - { + case '^': m_strcpy(p, sizeof(p), NONULL(CurrentFolder)); tail = s + 1; - } - break; + break; - default: - { + default: *p = '\0'; tail = s; - } } - if (rx && *p && !recurse) { - rx_sanitize_string (q, sizeof (q), p); - snprintf (tmp, sizeof (tmp), "%s%s", q, tail); + if (rx) { + char q[_POSIX_PATH_MAX]; + rx_sanitize_string(q, sizeof(q), p); + snprintf(tmp, sizeof(tmp), "%s%s", q, tail); + } else { + snprintf(tmp, sizeof(tmp), "%s%s", p, tail); } - else - snprintf (tmp, sizeof (tmp), "%s%s", p, tail); - m_strcpy(s, slen, tmp); - } - while (recurse); - - return (s); -} - -void mutt_mktemp (char *s) -{ - - 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()); - unlink (s); + return m_strcpy(buf, len, tmp); } /* collapse the pathname using ~ or = when possible */ @@ -327,7 +173,7 @@ void mutt_pretty_mailbox (char *s) /* if s is an url, only collapse path component */ if (scheme != U_UNKNOWN) { p = strchr (s, ':') + 1; - if (!strncmp (p, "//", 2)) + if (!m_strncmp (p, "//", 2)) q = strchr (p + 2, '/'); if (!q) q = strchr (p, '\0'); @@ -354,75 +200,13 @@ 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); } } -void mutt_pretty_size (char *s, ssize_t len, long n) -{ - if (n == 0) - 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 */ - /* 51 is magic which causes 10189/10240 to be rounded up to 10 */ - snprintf (s, len, "%ldK", (n + 51) / 1024); - } - else if (n < 10433332) /* 1.0M - 9.9M */ - snprintf (s, len, "%3.1fM", n / 1048576.0); - else { /* 10M+ */ - - /* (10433332 + 52428) / 1048576 = 10 */ - snprintf (s, len, "%ldM", (n + 52428) / 1048576); - } -} - -void mutt_expand_file_fmt(char *dest, ssize_t destlen, - const char *fmt, const char *src) -{ - char tmp[LONG_STRING]; - - mutt_quote_filename(tmp, sizeof(tmp), src); - mutt_expand_fmt(dest, destlen, fmt, tmp); -} - -void mutt_expand_fmt(char *dst, ssize_t dlen, - const char *fmt, const char *src) -{ - ssize_t pos = 0; - int found = 0; - - while (*fmt && pos < dlen - 1) { - if (*fmt == '%') { - switch (*++fmt) { - case 's': - found = 1; - pos += m_strcpy(dst + pos, dlen - pos, src); - break; - - case '%': - dst[pos++] = *fmt++; - break; - - default: - dst[pos++] = '%'; - break; - } - } else { - dst[pos++] = *fmt++; - } - } - - dst[pos] = '\0'; - if (!found) { - pos += m_strcpy(dst + pos, dlen - pos, " "); - pos += m_strcpy(dst + pos, dlen - pos, src); - } -} - /* return 0 on success, -1 on abort, 1 on error */ int mutt_check_overwrite (const char *attname, const char *path, char *fname, ssize_t flen, int *append, @@ -457,16 +241,15 @@ int mutt_check_overwrite (const char *attname, const char *path, } } else - if ((rc = - mutt_yesorno (_("File is a directory, save under it?"), - M_YES)) != M_YES) + if ((rc = mutt_yesorno(_("File is a directory, save under it?"), + M_YES)) != M_YES) return (rc == M_NO) ? 1 : -1; if (!attname || !attname[0]) { 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 @@ -496,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'; @@ -520,221 +297,6 @@ void mutt_safe_path(char *s, ssize_t l, address_t *a) } } -void mutt_FormatString (char *dest, /* output buffer */ - ssize_t destlen, /* output buffer len */ - const char *src, /* template string */ - format_t * callback, /* callback for processing */ - unsigned long data, /* callback data */ - format_flag flags) -{ /* callback flags */ - char prefix[SHORT_STRING], buf[LONG_STRING], *cp, *wptr = dest, ch; - char ifstring[SHORT_STRING], elsestring[SHORT_STRING]; - ssize_t wlen, wid, count, col, len; - - prefix[0] = '\0'; - destlen--; /* save room for the terminal \0 */ - wlen = (flags & M_FORMAT_ARROWCURSOR && option (OPTARROWCURSOR)) ? 3 : 0; - col = wlen; - - while (*src && wlen < destlen) { - if (*src == '%') { - if (*++src == '%') { - *wptr++ = '%'; - wlen++; - col++; - src++; - continue; - } - - if (*src == '?') { - flags |= M_FORMAT_OPTIONAL; - src++; - } - else { - flags &= ~M_FORMAT_OPTIONAL; - - /* eat the format string */ - cp = prefix; - count = 0; - while (count < ssizeof (prefix) && - (isdigit ((unsigned char) *src) || *src == '.' || *src == '-')) - { - *cp++ = *src++; - count++; - } - *cp = 0; - } - - if (!*src) - break; /* bad format */ - - ch = *src++; /* save the character to switch on */ - - if (flags & M_FORMAT_OPTIONAL) { - if (*src != '?') - break; /* bad format */ - src++; - - /* eat the `if' part of the string */ - cp = ifstring; - count = 0; - while (count < ssizeof (ifstring) && *src && *src != '?' - && *src != '&') { - *cp++ = *src++; - count++; - } - *cp = 0; - - /* eat the `else' part of the string (optional) */ - if (*src == '&') - src++; /* skip the & */ - cp = elsestring; - count = 0; - while (count < ssizeof (elsestring) && *src && *src != '?') { - *cp++ = *src++; - count++; - } - *cp = 0; - - if (!*src) - break; /* bad format */ - - src++; /* move past the trailing `?' */ - } - - /* handle generic cases first */ - if (ch == '>') { - /* right justify to EOL */ - ch = *src++; /* pad char */ - /* calculate space left on line. if we've already written more data - than will fit on the line, ignore the rest of the line */ - if (DrawFullLine || option (OPTSTATUSONTOP)) - count = (COLS < destlen ? COLS : destlen); - else - 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 = m_strlen(buf); - if (count > wid) { - count -= wid; /* how many chars to pad */ - memset (wptr, ch, count); - wptr += count; - col += count; - } - if (wid + wlen > destlen) - len = destlen - wlen; - else - len = wid; - memcpy (wptr, buf, len); - wptr += len; - wlen += len; - col += mutt_strwidth (buf); - } - break; /* skip rest of input */ - } - else if (ch == '|') { - /* pad to EOL */ - ch = *src++; - if (destlen > COLS) - destlen = COLS; - if (destlen > wlen) { - count = destlen - wlen; - memset (wptr, ch, count); - wptr += count; - } - break; /* skip rest of input */ - } - else { - short lower = 0; - short nodots = 0; - - while (ch == '_' || ch == ':') { - if (ch == '_') - lower = 1; - else if (ch == ':') - nodots = 1; - - ch = *src++; - } - - /* use callback function to handle this case */ - src = - callback (buf, sizeof (buf), ch, src, prefix, ifstring, elsestring, - data, flags); - - if (lower) - m_strtolower(buf); - if (nodots) { - char *p = buf; - - for (; *p; p++) - if (*p == '.') - *p = '_'; - } - - if ((len = m_strlen(buf)) + wlen > destlen) - len = (destlen - wlen > 0) ? (destlen - wlen) : 0; - - memcpy (wptr, buf, len); - wptr += len; - wlen += len; - col += mutt_strwidth (buf); - } - } - else if (*src == '\\') { - if (!*++src) - break; - switch (*src) { - case 'n': - *wptr = '\n'; - break; - case 't': - *wptr = '\t'; - break; - case 'r': - *wptr = '\r'; - break; - case 'f': - *wptr = '\f'; - break; - case 'v': - *wptr = '\v'; - break; - default: - *wptr = *src; - break; - } - src++; - wptr++; - wlen++; - col++; - } - else { - unsigned int bar = strcspn(src, "%\\"); - char *bar2 = p_dupstr(src, bar); - - while (bar--) { - *wptr++ = *src++; - wlen++; - } - col += mutt_strwidth (bar2); - p_delete(&bar2); - } - } - *wptr = 0; - -#if 0 - if (flags & M_FORMAT_MAKEPRINT) { - /* Make sure that the string is printable by changing all non-printable - chars to dots, or spaces for non-printable whitespace */ - for (cp = dest; *cp; cp++) - if (!isprint(*cp) && !((flags & M_FORMAT_TREE) && (*cp <= M_TREE_MAX))) - *cp = isspace ((unsigned char) *cp) ? ' ' : '.'; - } -#endif -} - /* returns 0 if OK to proceed, -1 to abort, 1 to retry */ int mutt_save_confirm (const char *s, struct stat *st) { @@ -751,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))) { @@ -776,8 +330,7 @@ int mutt_save_confirm (const char *s, struct stat *st) mutt_error (_("%s is not a mailbox!"), s); return 1; } - } - else { + } else { if (magic != M_IMAP) { st->st_mtime = 0; @@ -791,16 +344,13 @@ int mutt_save_confirm (const char *s, struct stat *st) else if (rc == -1) ret = -1; } - } - else { + } else { mutt_perror (s); return 1; } } } - - CLEARLINE (LINES - 1); - return (ret); + return ret; } void mutt_sleep (short s) @@ -808,131 +358,30 @@ void mutt_sleep (short s) sleep(MAX(s, SleepTime)); } -/* Decrease a file's modification time by 1 second */ -time_t mutt_decrease_mtime (const char *f, struct stat *st) -{ - struct utimbuf utim; - struct stat _st; - time_t mtime; - - if (!st) { - if (stat (f, &_st) == -1) - return -1; - st = &_st; - } - - if ((mtime = st->st_mtime) == time (NULL)) { - mtime -= 1; - utim.actime = mtime; - utim.modtime = mtime; - utime (f, &utim); - } - - return mtime; -} - -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; -} - -void mutt_free_spam_list (SPAM_LIST ** list) -{ - SPAM_LIST *p; - - if (!list) - return; - while (*list) { - p = *list; - *list = (*list)->next; - rx_delete(&p->rx); - p_delete(&p->template); - p_delete(&p); - } -} - -int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x) -{ - static regmatch_t *pmatch = NULL; - static int nmatch = 0; - int i, n, tlen; - char *p; - - if (!s) - return 0; - - tlen = 0; - - for (; l; l = l->next) { - /* If this pattern needs more matches, expand pmatch. */ - if (l->nmatch > nmatch) { - p_realloc(&pmatch, l->nmatch); - nmatch = l->nmatch; - } - - /* Does this pattern match? */ - 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 == '%') { - n = atoi (++p); /* find pmatch index */ - 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]; - } - else { - text[tlen++] = *p++; - } - } - text[tlen] = '\0'; - return 1; - } - } - - return 0; -} - /* 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) @@ -947,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); - else - return (1); - } - else { - if (e1 == NULL && e2 == NULL) - return (1); + return 0; else - return (0); + return 1; } + return e1 == NULL && e2 == NULL; } static int mutt_cmp_body (const BODY * b1, const BODY * b2) @@ -967,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) { @@ -982,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); - else - return (1); - } - else { - if (h1 == NULL && h2 == NULL) - return (1); + return 0; else - return (0); + return 1; } + return h1 == NULL && h2 == NULL; } @@ -1010,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; @@ -1035,7 +473,7 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags) if (!*tok->dptr) return -1; /* premature end of token */ mutt_buffer_addch(dest, - (ascii_toupper(*tok->dptr) - 'A' + 1) & 0x7f); + (toupper((unsigned char)*tok->dptr) - 'A' + 1) & 0x7f); tok->dptr++; break; case 'r': @@ -1077,7 +515,7 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags) mutt_buffer_addch(dest, '\033'); } else if (isalpha((unsigned char)ch)) { - mutt_buffer_addch(dest, ascii_toupper(ch) - 'A' + 1); + mutt_buffer_addch(dest, toupper((unsigned char)ch) - 'A' + 1); } else { mutt_buffer_addch(dest, '^'); mutt_buffer_addch(dest, ch); @@ -1100,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); @@ -1115,7 +553,7 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags) /* read line */ p_clear(&expn, 1); expn.data = mutt_read_line(NULL, &expn.dsize, fp, &line); - fclose(fp); + m_fclose(&fp); mutt_wait_filter(pid); /* if we got output, make a new string consiting of the shell ouptput @@ -1131,7 +569,7 @@ int mutt_extract_token(BUFFER *dest, BUFFER *tok, int flags) tok->dsize = expnlen + m_strlen(tok->dptr) + 1; ptr = xmalloc(tok->dsize); memcpy(ptr, expn.data, expnlen); - strcpy(ptr + expnlen, tok->dptr); /* __STRCPY_CHECKED__ */ + m_strcpy(ptr + expnlen, tok->dsize - expnlen, tok->dptr); if (tok->destroy) p_delete(&tok->data); tok->data = ptr;