X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Ffolder.c;h=584bb768c0e19d4b6d1703a4140e139ab9f25e54;hp=224bb03479a53681ac3e2517ca3e07b995be55e1;hb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;hpb=3cc8ed080f6e741b8df04a3ebe764c659e75cb38 diff --git a/uip/folder.c b/uip/folder.c index 224bb03..584bb76 100644 --- a/uip/folder.c +++ b/uip/folder.c @@ -26,41 +26,37 @@ static struct swit switches[] = { { "fast", 0 }, #define NFASTSW 5 { "nofast", 0 }, -#define HDRSW 6 - { "header", 0 }, -#define NHDRSW 7 - { "noheader", 0 }, -#define PACKSW 8 +#define PACKSW 6 { "pack", 0 }, -#define NPACKSW 9 +#define NPACKSW 7 { "nopack", 0 }, -#define VERBSW 10 +#define VERBSW 8 { "verbose", 0 }, -#define NVERBSW 11 +#define NVERBSW 9 { "noverbose", 0 }, -#define RECURSW 12 +#define RECURSW 10 { "recurse", 0 }, -#define NRECRSW 13 +#define NRECRSW 11 { "norecurse", 0 }, -#define TOTALSW 14 +#define TOTALSW 12 { "total", 0 }, -#define NTOTLSW 15 +#define NTOTLSW 13 { "nototal", 0 }, -#define LISTSW 16 +#define LISTSW 14 { "list", 0 }, -#define NLISTSW 17 +#define NLISTSW 15 { "nolist", 0 }, -#define PRNTSW 18 +#define PRNTSW 16 { "print", 0 }, -#define NPRNTSW 19 +#define NPRNTSW 17 { "noprint", -4 }, -#define PUSHSW 20 +#define PUSHSW 18 { "push", 0 }, -#define POPSW 21 +#define POPSW 19 { "pop", 0 }, -#define VERSIONSW 22 - { "version", 0 }, -#define HELPSW 23 +#define VERSIONSW 20 + { "Version", 0 }, +#define HELPSW 21 { "help", 0 }, { NULL, 0 } }; @@ -69,7 +65,6 @@ static int fshort = 0; /* output only folder names */ static int fcreat = 0; /* should we ask to create new folders? */ static int fpack = 0; /* are we packing the folder? */ static int fverb = 0; /* print actions taken while packing folder */ -static int fheader = 0; /* should we output a header? */ static int frecurse = 0; /* recurse through subfolders */ static int ftotal = 0; /* should we output the totals? */ static int all = 0; /* should we output all folders */ @@ -109,6 +104,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 @@ -176,13 +172,6 @@ main(int argc, char **argv) fshort = 0; continue; - case HDRSW: - fheader = 1; - continue; - case NHDRSW: - fheader = -1; - continue; - case PACKSW: fpack++; continue; @@ -543,17 +532,6 @@ print_folders(void) nummsgdigits = 2; /* - ** Print the header - */ - if (fheader > 0 || (all && !fshort && fheader >= 0)) - printf("%-*s %*s %-*s; %-*s %*s\n", - maxlen+1, "FOLDER", - nummsgdigits + 13, "# MESSAGES", - lowmsgdigits + hghmsgdigits + 4, " RANGE", - curmsgdigits + 4, "CUR", - 9, "(OTHERS)"); - - /* ** Print folder information */ if (all || fshort || ftotal < 1) { @@ -564,7 +542,7 @@ print_folders(void) } /* Add `+' to end of name, if folder is current */ - if (strcmp(folder, fi[i].name)) + if (strcmp(folder, fi[i].name)!=0) snprintf(tmpname, sizeof(tmpname), "%s", fi[i].name); else @@ -599,7 +577,7 @@ print_folders(void) if (fi[i].others) printf(";%*s (others)", curprinted ? 0 : curmsgdigits + 6, ""); - printf(".\n"); + printf("\n"); } } @@ -609,7 +587,7 @@ print_folders(void) if (ftotal > 0 || (all && !fshort && ftotal >= 0)) { if (all) printf("\n"); - printf("TOTAL = %d message%c in %d folder%s.\n", + printf("TOTAL = %d message%c in %d folder%s\n", total_msgs, total_msgs != 1 ? 's' : ' ', total_folders, total_folders != 1 ? "s" : ""); } @@ -656,7 +634,101 @@ readonly_folders(void) atrlen = strlen(atrcur); for (np = m_defs; np; np = np->n_next) - if (isprefix(atrcur, np->n_name) - && !isprefix(nmhdir, np->n_name + atrlen)) + if (strncmp(np->n_name, atrcur, atrlen)==0 && + strncmp(np->n_name+atrlen, nmhdir, strlen(nmhdir))!=0) + /* 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; +}