X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=81a0788ad6c25645754361f02c1be79aaef4c408;hp=efb991bc35805474589648939802fe1ef5f6590d;hb=c8b8b9539aaf11b48c4c1e5baba434db09722111;hpb=f288d1771c814e6104da83e6f0f1761a40de1224 diff --git a/muttlib.c b/muttlib.c index efb991b..81a0788 100644 --- a/muttlib.c +++ b/muttlib.c @@ -15,21 +15,18 @@ #include #include - #include #include - #include +#include #include "alias.h" #include "mutt.h" -#include "mx.h" #include "attach.h" #include "version.h" #include -#include #include @@ -73,72 +70,6 @@ void mutt_adv_mktemp (const char* dir, char *s, ssize_t l) } } -/* create a send-mode duplicate from a receive-mode body */ - -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) { @@ -150,156 +81,113 @@ int mutt_matches_ignore (const char *s, string_list_t * t) return 0; } -char *mutt_expand_path (char *s, ssize_t slen) -{ - return _mutt_expand_path (s, slen, 0); -} - -char *_mutt_expand_path (char *s, ssize_t slen, int rx) +ssize_t _mutt_expand_path(char *s, ssize_t slen, int rx) { - char p[_POSIX_PATH_MAX] = ""; - char q[_POSIX_PATH_MAX] = ""; - char tmp[_POSIX_PATH_MAX]; - char *t; + char p[_POSIX_PATH_MAX] = ""; + char tmp[_POSIX_PATH_MAX]; + const char *tail = ""; + + 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, '/'); - const char *tail = ""; + m_strncpy(tmp, sizeof(tmp), s + 1, tail - s - 1); - int recurse = 0; + 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); + } else { + snprintf(p, sizeof(p), "%s/", NONULL(Maildir)); + } - do { - recurse = 0; + 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 '>': + m_strcpy(p, sizeof(p), Inbox); + tail = s + 1; + break; + + case '<': + m_strcpy(p, sizeof(p), Outbox); + tail = s + 1; + break; + + case '!': + if (s[1] == '!') { + m_strcpy(p, sizeof(p), LastFolder); + tail = s + 2; + } else { + m_strcpy(p, sizeof(p), Spoolfile); + tail = s + 1; + } + break; - switch (*s) { - case '~': - { - if (*(s + 1) == '/' || *(s + 1) == 0) { - m_strcpy(p, sizeof(p), NONULL(Homedir)); - tail = s + 1; - } - else { - struct passwd *pw; + case '-': + m_strcpy(p, sizeof(p), NONULL(LastFolder)); + tail = s + 1; + break; - if ((t = strchr (s + 1, '/'))) - *t = 0; + case '^': + m_strcpy(p, sizeof(p), NONULL(CurrentFolder)); + tail = s + 1; + break; - if ((pw = getpwnam (s + 1))) { - m_strcpy(p, sizeof(p), pw->pw_dir); - if (t) { - *t = '/'; - tail = t; - } - else - tail = ""; - } - else { - /* user not found! */ - if (t) - *t = '/'; + default: *p = '\0'; 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), NONULL(Maildir)); - else - snprintf (p, sizeof (p), "%s/", NONULL (Maildir)); - - tail = s + 1; - } - break; - - /* elm compatibility, @ expands alias to user name */ - - case '@': - { - HEADER *h; - /* FIXME: BUG ? */ - address_t *alias; - - 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 = ""; } - } - break; - - case '>': - { - m_strcpy(p, sizeof(p), NONULL(Inbox)); - tail = s + 1; - } - break; - - case '<': - { - m_strcpy(p, sizeof(p), NONULL(Outbox)); - tail = s + 1; - } - 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; - } - } - 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; - } - } + } while (0); - 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); + return m_strcpy(s, slen, tmp); } void mutt_mktemp (char *s) @@ -362,66 +250,13 @@ void mutt_pretty_mailbox (char *s) } } -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); - } + m_snsubst(dest, destlen, fmt, tmp); } /* return 0 on success, -1 on abort, 1 on error */