From: markus schnalke Date: Sat, 24 Mar 2012 14:58:50 +0000 (+0100) Subject: Merged folder_pack.c into folder.c. X-Git-Tag: mmh-thesis-end~203 X-Git-Url: http://git.marmaro.de/?a=commitdiff_plain;h=69b07982861716d278845f962c2f2c1365a3153f;p=mmh Merged folder_pack.c into folder.c. --- diff --git a/h/prototypes.h b/h/prototypes.h index 3c0dc3c..94ee2b9 100644 --- a/h/prototypes.h +++ b/h/prototypes.h @@ -47,7 +47,6 @@ int ext_hook(char *, char *, char *); int folder_addmsg(struct msgs **, char *, int, int, int, int, char *); int folder_delmsgs(struct msgs *, int, int); void folder_free(struct msgs *); -int folder_pack(struct msgs **, int); struct msgs *folder_read(char *); struct msgs *folder_realloc(struct msgs *, int, int); int gans(char *, struct swit *); diff --git a/sbr/Makefile.in b/sbr/Makefile.in index 5de54a2..ed1f64c 100644 --- a/sbr/Makefile.in +++ b/sbr/Makefile.in @@ -52,7 +52,7 @@ SRCS = addrsbr.c ambigsw.c brkstring.c \ cpydata.c cpydgst.c crawl_folders.c \ discard.c done.c dtime.c dtimep.c \ error.c ext_hook.c folder_addmsg.c folder_delmsgs.c \ - folder_free.c folder_pack.c folder_read.c \ + folder_free.c folder_read.c \ folder_realloc.c gans.c getans.c getanswer.c \ getarguments.c getcpy.c getpass.c \ fmt_addr.c fmt_compile.c fmt_new.c fmt_rfc2047.c \ diff --git a/sbr/folder_pack.c b/sbr/folder_pack.c deleted file mode 100644 index c2b5911..0000000 --- a/sbr/folder_pack.c +++ /dev/null @@ -1,102 +0,0 @@ -/* -** folder_pack.c -- pack (renumber) the messages in a folder -** -- into a contiguous range from 1 to n. -** -** This code is Copyright (c) 2002, by the authors of nmh. See the -** COPYRIGHT file in the root directory of the nmh distribution for -** complete copyright information. -*/ - -#include - -/* -** Pack the message in a folder. -** Return -1 if error, else return 0. -*/ - -int -folder_pack(struct msgs **mpp, int verbose) -{ - int hole, msgnum, newcurrent = 0; - char newmsg[BUFSIZ], oldmsg[BUFSIZ]; - struct msgs *mp; - - mp = *mpp; - - /* - ** Just return if folder is empty. - */ - if (mp->nummsg == 0) - return 0; - - /* - ** Make sure we have message status space allocated - ** for all numbers from 1 to current high message. - */ - if (mp->lowoff > 1) { - if ((mp = folder_realloc(mp, 1, mp->hghmsg))) - *mpp = mp; - else { - advise(NULL, "unable to allocate folder storage"); - return -1; - } - } - - for (msgnum = mp->lowmsg, hole = 1; msgnum <= mp->hghmsg; msgnum++) { - if (does_exist(mp, msgnum)) { - if (msgnum != hole) { - strncpy(newmsg, m_name(hole), sizeof(newmsg)); - strncpy(oldmsg, m_name(msgnum), sizeof(oldmsg)); - if (verbose) - printf("message %s becomes %s\n", oldmsg, newmsg); - - /* - ** Invoke the external refile hook for each - ** message being renamed. This is done - ** before the file is renamed so that the - ** old message file is around for the hook. - */ - - snprintf(oldmsg, sizeof (oldmsg), "%s/%d", - mp->foldpath, msgnum); - snprintf(newmsg, sizeof (newmsg), "%s/%d", - mp->foldpath, hole); - ext_hook("ref-hook", oldmsg, newmsg); - - /* move the message file */ - if (rename(oldmsg, newmsg) == -1) { - advise(newmsg, "unable to rename %s to", oldmsg); - return -1; - } - - /* check if this is the current message */ - if (msgnum == mp->curmsg) - newcurrent = hole; - - /* copy the attribute flags for this message */ - copy_msg_flags(mp, hole, msgnum); - - if (msgnum == mp->lowsel) - mp->lowsel = hole; - if (msgnum == mp->hghsel) - mp->hghsel = hole; - - /* - ** mark that sequence information has - ** been modified - */ - mp->msgflags |= SEQMOD; - } - hole++; - } - } - - /* record the new number for the high/low message */ - mp->lowmsg = 1; - mp->hghmsg = hole - 1; - - if (newcurrent) - seq_setcur(mp, newcurrent); - - return 0; -} diff --git a/uip/folder.c b/uip/folder.c index b1398e4..616f57b 100644 --- a/uip/folder.c +++ b/uip/folder.c @@ -109,6 +109,7 @@ static crawl_callback_t get_folder_info_callback; static void print_folders(void); static int sfold(struct msgs *, char *); static void readonly_folders(void); +static int folder_pack(struct msgs **, int); int @@ -661,3 +662,96 @@ readonly_folders(void) /* Why do we exclude absolute path names? --meillo */ get_folder_info(np->n_name + atrlen, NULL); } + + +/* +** pack (renumber) the messages in a folder +** into a contiguous range from 1 to n. +** Return -1 if error, else return 0. +*/ +static int +folder_pack(struct msgs **mpp, int verbose) +{ + int hole, msgnum, newcurrent = 0; + char newmsg[BUFSIZ], oldmsg[BUFSIZ]; + struct msgs *mp; + + mp = *mpp; + + /* + ** Just return if folder is empty. + */ + if (mp->nummsg == 0) + return 0; + + /* + ** Make sure we have message status space allocated + ** for all numbers from 1 to current high message. + */ + if (mp->lowoff > 1) { + if ((mp = folder_realloc(mp, 1, mp->hghmsg))) + *mpp = mp; + else { + advise(NULL, "unable to allocate folder storage"); + return -1; + } + } + + for (msgnum = mp->lowmsg, hole = 1; msgnum <= mp->hghmsg; msgnum++) { + if (does_exist(mp, msgnum)) { + if (msgnum != hole) { + strncpy(newmsg, m_name(hole), sizeof(newmsg)); + strncpy(oldmsg, m_name(msgnum), sizeof(oldmsg)); + if (verbose) + printf("message %s becomes %s\n", oldmsg, newmsg); + + /* + ** Invoke the external refile hook for each + ** message being renamed. This is done + ** before the file is renamed so that the + ** old message file is around for the hook. + */ + + snprintf(oldmsg, sizeof (oldmsg), "%s/%d", + mp->foldpath, msgnum); + snprintf(newmsg, sizeof (newmsg), "%s/%d", + mp->foldpath, hole); + ext_hook("ref-hook", oldmsg, newmsg); + + /* move the message file */ + if (rename(oldmsg, newmsg) == -1) { + advise(newmsg, "unable to rename %s to", oldmsg); + return -1; + } + + /* check if this is the current message */ + if (msgnum == mp->curmsg) + newcurrent = hole; + + /* copy the attribute flags for this message */ + copy_msg_flags(mp, hole, msgnum); + + if (msgnum == mp->lowsel) + mp->lowsel = hole; + if (msgnum == mp->hghsel) + mp->hghsel = hole; + + /* + ** mark that sequence information has + ** been modified + */ + mp->msgflags |= SEQMOD; + } + hole++; + } + } + + /* record the new number for the high/low message */ + mp->lowmsg = 1; + mp->hghmsg = hole - 1; + + if (newcurrent) + seq_setcur(mp, newcurrent); + + return 0; +}