#define ALLSW 0
{ "all", 0 },
#define NALLSW 1
- { "noall", 0 },
+ { "noall", 2 },
#define CREATSW 2
{ "create", 0 },
#define NCREATSW 3
- { "nocreate", 0 },
+ { "nocreate", 2 },
#define FASTSW 4
{ "fast", 0 },
#define NFASTSW 5
- { "nofast", 0 },
-#define HDRSW 6
- { "header", 0 },
-#define NHDRSW 7
- { "noheader", 0 },
-#define PACKSW 8
+ { "nofast", 2 },
+#define PACKSW 6
{ "pack", 0 },
-#define NPACKSW 9
- { "nopack", 0 },
-#define VERBSW 10
+#define NPACKSW 7
+ { "nopack", 2 },
+#define VERBSW 8
{ "verbose", 0 },
-#define NVERBSW 11
- { "noverbose", 0 },
-#define RECURSW 12
+#define NVERBSW 9
+ { "noverbose", 2 },
+#define RECURSW 10
{ "recurse", 0 },
-#define NRECRSW 13
- { "norecurse", 0 },
-#define TOTALSW 14
+#define NRECRSW 11
+ { "norecurse", 2 },
+#define TOTALSW 12
{ "total", 0 },
-#define NTOTLSW 15
- { "nototal", 0 },
-#define LISTSW 16
+#define NTOTLSW 13
+ { "nototal", 2 },
+#define LISTSW 14
{ "list", 0 },
-#define NLISTSW 17
- { "nolist", 0 },
-#define PRNTSW 18
+#define NLISTSW 15
+ { "nolist", 2 },
+#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 }
};
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 */
static void print_folders(void);
static int sfold(struct msgs *, char *);
static void readonly_folders(void);
+static int folder_pack(struct msgs **, int);
int
char *cp, *dp, *msg = NULL, *argfolder = NULL;
char **ap, **argp, buf[BUFSIZ], **arguments;
-#ifdef LOCALE
setlocale(LC_ALL, "");
-#endif
invo_name = mhbasename(argv[0]);
/* read user profile/context */
while ((cp = *argp++)) {
if (*cp == '-') {
switch (smatch(++cp, switches)) {
- case AMBIGSW:
- ambigsw(cp, switches);
- done(1);
- case UNKWNSW:
- adios(NULL, "-%s unknown", cp);
-
- case HELPSW:
- snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name);
- print_help(buf, switches, 1);
- done(1);
- case VERSIONSW:
- print_version(invo_name);
- done(1);
-
- case ALLSW:
- all = 1;
- continue;
-
- case NALLSW:
- all = 0;
- continue;
-
- case CREATSW:
- fcreat = 1;
- continue;
- case NCREATSW:
- fcreat = -1;
- continue;
-
- case FASTSW:
- fshort++;
- continue;
- case NFASTSW:
- fshort = 0;
- continue;
-
- case HDRSW:
- fheader = 1;
- continue;
- case NHDRSW:
- fheader = -1;
- continue;
-
- case PACKSW:
- fpack++;
- continue;
- case NPACKSW:
- fpack = 0;
- continue;
-
- case VERBSW:
- fverb++;
- continue;
- case NVERBSW:
- fverb = 0;
- continue;
-
- case RECURSW:
- frecurse++;
- continue;
- case NRECRSW:
- frecurse = 0;
- continue;
-
- case TOTALSW:
- ftotal = 1;
- continue;
- case NTOTLSW:
- ftotal = -1;
- continue;
-
- case PRNTSW:
- printsw = 1;
- continue;
- case NPRNTSW:
- printsw = 0;
- continue;
-
- case LISTSW:
- listsw = 1;
- continue;
- case NLISTSW:
- listsw = 0;
- continue;
-
- case PUSHSW:
- pushsw = 1;
- listsw = 1;
- popsw = 0;
- continue;
- case POPSW:
- popsw = 1;
- listsw = 1;
- pushsw = 0;
- continue;
+ case AMBIGSW:
+ ambigsw(cp, switches);
+ done(1);
+ case UNKWNSW:
+ adios(NULL, "-%s unknown", cp);
+
+ case HELPSW:
+ snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name);
+ print_help(buf, switches, 1);
+ done(1);
+ case VERSIONSW:
+ print_version(invo_name);
+ done(1);
+
+ case ALLSW:
+ all = 1;
+ continue;
+
+ case NALLSW:
+ all = 0;
+ continue;
+
+ case CREATSW:
+ fcreat = 1;
+ continue;
+ case NCREATSW:
+ fcreat = -1;
+ continue;
+
+ case FASTSW:
+ fshort++;
+ continue;
+ case NFASTSW:
+ fshort = 0;
+ continue;
+
+ case PACKSW:
+ fpack++;
+ continue;
+ case NPACKSW:
+ fpack = 0;
+ continue;
+
+ case VERBSW:
+ fverb++;
+ continue;
+ case NVERBSW:
+ fverb = 0;
+ continue;
+
+ case RECURSW:
+ frecurse++;
+ continue;
+ case NRECRSW:
+ frecurse = 0;
+ continue;
+
+ case TOTALSW:
+ ftotal = 1;
+ continue;
+ case NTOTLSW:
+ ftotal = -1;
+ continue;
+
+ case PRNTSW:
+ printsw = 1;
+ continue;
+ case NPRNTSW:
+ printsw = 0;
+ continue;
+
+ case LISTSW:
+ listsw = 1;
+ continue;
+ case NLISTSW:
+ listsw = 0;
+ continue;
+
+ case PUSHSW:
+ pushsw = 1;
+ listsw = 1;
+ popsw = 0;
+ continue;
+ case POPSW:
+ popsw = 1;
+ listsw = 1;
+ pushsw = 0;
+ continue;
}
}
if (*cp == '+' || *cp == '@') {
if (access(cp, F_OK) == NOTOK)
adios(cp, "unable to find folder");
/* update current folder */
- context_replace(pfolder, argfolder);
+ context_replace(curfolder, argfolder);
context_save(); /* save the context file */
argfolder = NULL;
}
if (msg)
admonish(NULL, "no folder given for message %s", msg);
readonly_folders(); /* do any readonly folders */
- strncpy(folder, (cp = context_find(pfolder)) ?
+ strncpy(folder, (cp = context_find(curfolder)) ?
cp : "", sizeof(folder));
crawl_folders(".", get_folder_info_callback, NULL);
} else {
strncpy(folder, argfolder, sizeof(folder));
if (get_folder_info(argfolder, msg)) {
/* update current folder */
- context_replace(pfolder, argfolder);
+ context_replace(curfolder, argfolder);
context_save();
}
/*
if (get_folder_info(folder, msg) && argfolder) {
/* update current folder */
- context_replace(pfolder, argfolder);
+ context_replace(curfolder, argfolder);
}
}
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) {
}
/* 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
if (fi[i].others)
printf(";%*s (others)", curprinted ?
0 : curmsgdigits + 6, "");
- printf(".\n");
+ printf("\n");
}
}
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" : "");
}
char atrcur[BUFSIZ];
register struct node *np;
- snprintf(atrcur, sizeof(atrcur), "atr-%s-", current);
+ snprintf(atrcur, sizeof(atrcur), "atr-%s-", seq_cur);
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;
+}