X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=2e15ea043e7ecb8332012bbcc045f559fc2cb9cc;hp=de3a41b8c6cef353c92f1cf5d5af46a122aca05c;hb=3e611c4b53a33408955152e1c9336f8643ea096e;hpb=f5b0e714a215eddd4d9f8084b434b713f0a580b4 diff --git a/muttlib.c b/muttlib.c index de3a41b..2e15ea0 100644 --- a/muttlib.c +++ b/muttlib.c @@ -12,9 +12,13 @@ # include "config.h" #endif +#include +#include +#include +#include +#include + #include "mutt.h" -#include "ascii.h" -#include "buffer.h" #include "enter.h" #include "mutt_curses.h" #include "mime.h" @@ -23,6 +27,7 @@ #include "attach.h" #include "reldate.h" +#include "version.h" #ifdef USE_IMAP #include "imap.h" @@ -31,9 +36,6 @@ #include "mutt_crypt.h" -#include "lib/mem.h" -#include "lib/intl.h" -#include "lib/str.h" #include "lib/debug.h" #include @@ -48,9 +50,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; @@ -64,7 +68,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]; @@ -72,7 +76,7 @@ void mutt_adv_mktemp (char *s, size_t l) size_t sl; struct stat sb; - strfcpy (buf, NONULL (Tempdir), sizeof (buf)); + strfcpy (buf, dir && *dir ? dir : NONULL (Tempdir), sizeof (buf)); mutt_expand_path (buf, sizeof (buf)); if (s[0] == '\0') { snprintf (s, l, "%s/muttXXXXXX", buf); @@ -90,7 +94,7 @@ void mutt_adv_mktemp (char *s, size_t l) mktemp (s); if (period != NULL) { *period = '.'; - sl = str_len (s); + sl = m_strlen(s); strfcpy (s + sl, period, l - sl); } } @@ -116,7 +120,7 @@ int mutt_copy_body (FILE * fp, BODY ** tgt, BODY * src) 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; @@ -127,19 +131,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. @@ -153,8 +157,8 @@ int mutt_copy_body (FILE * fp, BODY ** tgt, BODY * src) 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)->attribute = m_strdup(par->attribute); + (*ppar)->value = m_strdup(par->value); } mutt_stamp_attachment (b); @@ -181,12 +185,12 @@ 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) */ @@ -197,7 +201,7 @@ void mutt_free_body (BODY ** p) if (b->parts) mutt_free_body (&b->parts); - mem_free (&b); + p_delete(&b); } *p = 0; @@ -209,11 +213,11 @@ void mutt_free_parameter (PARAMETER ** p) PARAMETER *o; while (t) { - mem_free (&t->attribute); - mem_free (&t->value); + p_delete(&t->attribute); + p_delete(&t->value); o = t; t = t->next; - mem_free (&o); + p_delete(&o); } *p = 0; } @@ -233,50 +237,50 @@ void mutt_free_header (HEADER ** 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); + p_delete(&(*h)->maildir_flags); + p_delete(&(*h)->tree); + p_delete(&(*h)->path); #ifdef MIXMASTER mutt_free_list (&(*h)->chain); #endif #if defined USE_POP || defined USE_IMAP || defined USE_NNTP - mem_free (&(*h)->data); + p_delete(&(*h)->data); #endif - mem_free (h); + p_delete(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 == '/') { + strfcpy (newpath, lnk, _POSIX_PATH_MAX); return; } if ((lb = strrchr (path, '/')) == NULL) { - /* no path in link */ - strfcpy (newpath, link, _POSIX_PATH_MAX); + /* no path in lnk */ + strfcpy (newpath, lnk, _POSIX_PATH_MAX); return; } len = lb - path + 1; memcpy (newpath, path, len); - strfcpy (newpath + len, link, _POSIX_PATH_MAX - len); + strfcpy (newpath + len, lnk, _POSIX_PATH_MAX - len); } char *mutt_expand_path (char *s, size_t slen) @@ -291,7 +295,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; @@ -337,7 +341,7 @@ char *_mutt_expand_path (char *s, size_t slen, int rx) #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] == '/') + Maildir[m_strlen(Maildir) - 1] == '/') strfcpy (p, NONULL (Maildir), sizeof (p)); else #endif @@ -450,7 +454,7 @@ char *mutt_gecos_name (char *dest, size_t destlen, struct passwd *pw) 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) @@ -462,7 +466,7 @@ char *mutt_gecos_name (char *dest, size_t destlen, struct passwd *pw) else strfcpy (dest, pw->pw_gecos, destlen); - pwnl = str_len (pw->pw_name); + pwnl = m_strlen(pw->pw_name); for (idx = 0; dest[idx]; idx++) { if (dest[idx] == '&') { @@ -504,8 +508,8 @@ void mutt_set_parameter (const char *attribute, const char *value, } q = mutt_new_parameter (); - q->attribute = str_dup (attribute); - q->value = str_dup (value); + q->attribute = m_strdup(attribute); + q->value = m_strdup(value); q->next = *p; *p = q; } @@ -588,26 +592,26 @@ void mutt_free_envelope (ENVELOPE ** p) rfc822_free_address (&(*p)->reply_to); rfc822_free_address (&(*p)->mail_followup_to); - mem_free (&(*p)->list_post); - mem_free (&(*p)->subject); + p_delete(&(*p)->list_post); + p_delete(&(*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); + p_delete(&(*p)->message_id); + p_delete(&(*p)->supersedes); + p_delete(&(*p)->date); + p_delete(&(*p)->x_label); + p_delete(&(*p)->organization); #ifdef USE_NNTP - mem_free (&(*p)->newsgroups); - mem_free (&(*p)->xref); - mem_free (&(*p)->followup_to); - mem_free (&(*p)->x_comment_to); + p_delete(&(*p)->newsgroups); + p_delete(&(*p)->xref); + p_delete(&(*p)->followup_to); + p_delete(&(*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); + p_delete(p); } /* move all the headers from extra not present in base into base */ @@ -671,9 +675,9 @@ void mutt_free_alias (ALIAS ** p) while (*p) { t = *p; *p = (*p)->next; - mem_free (&t->name); + p_delete(&t->name); rfc822_free_address (&t->addr); - mem_free (&t); + p_delete(&t); } } @@ -718,15 +722,15 @@ void mutt_pretty_mailbox (char *s) } *q = 0; - if (str_ncmp (s, Maildir, (len = str_len (Maildir))) == 0 && + if (str_ncmp (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 (str_ncmp (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); } } @@ -766,7 +770,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++) { @@ -827,13 +831,13 @@ int mutt_check_overwrite (const char *attname, const char *path, str_replace (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; } } @@ -918,7 +922,7 @@ 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 */ @@ -1012,13 +1016,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); @@ -1049,12 +1051,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; @@ -1066,7 +1068,7 @@ void mutt_FormatString (char *dest, /* output buffer */ callback (buf, sizeof (buf), ch, src, prefix, ifstring, elsestring, data, flags); - if (tolower) + if (lower) str_tolower (buf); if (nodots) { char *p = buf; @@ -1076,7 +1078,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); @@ -1115,15 +1117,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; @@ -1144,32 +1145,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 */ @@ -1261,7 +1256,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; @@ -1284,12 +1278,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 (based on Mutt 1.5.10/%s)", - MUTT_VERSION, ReleaseDate); + if (full) + snprintf (vstring, sizeof (vstring), "Mutt-ng %s-r%s (based " + "on Mutt 1.5.11/%s)", MUTT_VERSION, MUTT_REVISION, + ReleaseDate); + else + snprintf (vstring, sizeof (vstring), "mutt-ng/%s-r%s", + MUTT_VERSION, MUTT_REVISION); return vstring; } @@ -1303,8 +1314,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); } } @@ -1323,7 +1334,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; } @@ -1337,7 +1348,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];