X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/93cf33c07eed0e56b4f3a0d1c07ff183ac1510ef..3e7c0fe01050063cd415e667e7b99f537d41f689:/uip/folder.c diff --git a/uip/folder.c b/uip/folder.c index f3b4ba4e..8db9e3e6 100644 --- a/uip/folder.c +++ b/uip/folder.c @@ -1,6 +1,4 @@ - -/* - * folder(s).c -- set/list the current message and/or folder +/* folder.c -- set/list the current message and/or folder * -- push/pop a folder onto/from the folder stack * -- list the folder stack * @@ -12,59 +10,41 @@ #include #include #include -#include - -static struct swit switches[] = { -#define ALLSW 0 - { "all", 0 }, -#define NALLSW 1 - { "noall", 0 }, -#define CREATSW 2 - { "create", 0 }, -#define NCREATSW 3 - { "nocreate", 0 }, -#define FASTSW 4 - { "fast", 0 }, -#define NFASTSW 5 - { "nofast", 0 }, -#define HDRSW 6 - { "header", 0 }, -#define NHDRSW 7 - { "noheader", 0 }, -#define PACKSW 8 - { "pack", 0 }, -#define NPACKSW 9 - { "nopack", 0 }, -#define VERBSW 10 - { "verbose", 0 }, -#define NVERBSW 11 - { "noverbose", 0 }, -#define RECURSW 12 - { "recurse", 0 }, -#define NRECRSW 13 - { "norecurse", 0 }, -#define TOTALSW 14 - { "total", 0 }, -#define NTOTLSW 15 - { "nototal", 0 }, -#define LISTSW 16 - { "list", 0 }, -#define NLISTSW 17 - { "nolist", 0 }, -#define PRNTSW 18 - { "print", 0 }, -#define NPRNTSW 19 - { "noprint", -4 }, -#define PUSHSW 20 - { "push", 0 }, -#define POPSW 21 - { "pop", 0 }, -#define VERSIONSW 22 - { "version", 0 }, -#define HELPSW 23 - { "help", 0 }, - { NULL, 0 } -}; +#include "../sbr/m_maildir.h" + +#define FOLDER_SWITCHES \ + X("all", 0, ALLSW) \ + X("noall", 0, NALLSW) \ + X("create", 0, CREATSW) \ + X("nocreate", 0, NCREATSW) \ + X("fast", 0, FASTSW) \ + X("nofast", 0, NFASTSW) \ + X("header", 0, HDRSW) \ + X("noheader", 0, NHDRSW) \ + X("pack", 0, PACKSW) \ + X("nopack", 0, NPACKSW) \ + X("verbose", 0, VERBSW) \ + X("noverbose", 0, NVERBSW) \ + X("recurse", 0, RECURSW) \ + X("norecurse", 0, NRECRSW) \ + X("total", 0, TOTALSW) \ + X("nototal", 0, NTOTLSW) \ + X("list", 0, LISTSW) \ + X("nolist", 0, NLISTSW) \ + X("print", 0, PRNTSW) \ + X("noprint", 0, NPRNTSW) \ + X("push", 0, PUSHSW) \ + X("pop", 0, POPSW) \ + X("version", 0, VERSIONSW) \ + X("help", 0, HELPSW) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(FOLDER); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(FOLDER, switches); +#undef X static int fshort = 0; /* output only folder names */ static int fcreat = 0; /* should we ask to create new folders? */ @@ -111,6 +91,17 @@ static void print_folders (void); static int sfold (struct msgs *, char *); static void readonly_folders (void); +/* + * Function for printing error message if folder does not exist with + * -nocreate. + */ +static +void +nonexistent_folder (int status) { + NMH_UNUSED (status); + adios (NULL, "folder %s does not exist", folder); +} + int main (int argc, char **argv) @@ -120,20 +111,13 @@ main (int argc, char **argv) char *cp, *dp, *msg = NULL, *argfolder = NULL; char **ap, **argp, buf[BUFSIZ], **arguments; -#ifdef LOCALE - setlocale(LC_ALL, ""); -#endif - invo_name = r1bindex (argv[0], '/'); - - /* read user profile/context */ - context_read(); + if (nmh_init(argv[0], 1)) { return 1; } /* * If program was invoked with name ending * in `s', then add switch `-all'. */ - if (argv[0][strlen (argv[0]) - 1] == 's') - all = 1; + all = has_suffix_c(argv[0], 's'); arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -151,10 +135,10 @@ main (int argc, char **argv) snprintf (buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name); print_help (buf, switches, 1); - done (1); + done (0); case VERSIONSW: print_version(invo_name); - done (1); + done (0); case ALLSW: all = 1; @@ -242,13 +226,11 @@ main (int argc, char **argv) if (*cp == '+' || *cp == '@') { if (argfolder) adios (NULL, "only one folder at a time!"); - else - argfolder = pluspath (cp); + argfolder = pluspath (cp); } else { if (msg) adios (NULL, "only one (current) message at a time!"); - else - msg = cp; + msg = cp; } } @@ -269,7 +251,7 @@ main (int argc, char **argv) /* If no folder is given, the current folder and */ /* the top of the folder stack are swapped. */ if ((cp = context_find (stack))) { - dp = getcpy (cp); + dp = mh_xstrdup(cp); ap = brkstring (dp, " ", "\n"); argfolder = getcpy(*ap++); } else { @@ -293,7 +275,7 @@ main (int argc, char **argv) if (argfolder) adios (NULL, "sorry, no folders allowed with -pop"); if ((cp = context_find (stack))) { - dp = getcpy (cp); + dp = mh_xstrdup(cp); ap = brkstring (dp, " ", "\n"); argfolder = getcpy(*ap++); } else { @@ -321,14 +303,14 @@ main (int argc, char **argv) /* Listing the folder stack */ if (listsw) { - printf ("%s", argfolder ? argfolder : getfolder (1)); + fputs(argfolder ? argfolder : getfolder (1), stdout); if ((cp = context_find (stack))) { - dp = getcpy (cp); + dp = mh_xstrdup(cp); for (ap = brkstring (dp, " ", "\n"); *ap; ap++) printf (" %s", *ap); free (dp); } - printf ("\n"); + putchar('\n'); if (!printsw) done (0); @@ -341,18 +323,19 @@ main (int argc, char **argv) /* * Scan the folders */ + /* change directory to base of nmh directory for crawl_folders */ + if (chdir (nmhdir) == NOTOK) + adios (nmhdir, "unable to change directory to"); if (all || ftotal > 0) { /* * If no folder is given, do them all */ - /* change directory to base of nmh directory for crawl_folders */ - if (chdir (nmhdir) == NOTOK) - adios (nmhdir, "unable to change directory to"); if (!argfolder) { if (msg) - admonish (NULL, "no folder given for message %s", msg); + inform("no folder given for message %s, continuing...", msg); readonly_folders (); /* do any readonly folders */ - strncpy (folder, (cp = context_find (pfolder)) ? cp : "", sizeof(folder)); + cp = context_find(pfolder); + strncpy (folder, FENDNULL(cp), sizeof(folder)); crawl_folders (".", get_folder_info_callback, NULL); } else { strncpy (folder, argfolder, sizeof(folder)); @@ -374,7 +357,7 @@ main (int argc, char **argv) * Check if folder exists. If not, then see if * we should create it, or just exit. */ - create_folder (m_maildir (folder), fcreat, done); + create_folder (m_maildir (folder), fcreat, nonexistent_folder); if (get_folder_info (folder, msg) && argfolder) { /* update current folder */ @@ -421,8 +404,9 @@ get_folder_info_body (char *fold, char *msg, boolean *crawl_children) /* * create message structure and get folder info */ - if (!(mp = folder_read (fold))) { - admonish (NULL, "unable to read folder %s", fold); + if (!(mp = folder_read (fold, fpack))) { + inform("unable to read folder %s, continuing...", fold); + *crawl_children = FALSE; return 0; } @@ -431,8 +415,10 @@ get_folder_info_body (char *fold, char *msg, boolean *crawl_children) retval = 0; if (fpack) { - if (folder_pack (&mp, fverb) == -1) + if (folder_pack (&mp, fverb) == -1) { + *crawl_children = FALSE; /* to please clang static analyzer */ done (1); + } seq_save (mp); /* synchronize the sequences */ context_save (); /* save the context file */ } @@ -457,9 +443,9 @@ get_folder_info_body (char *fold, char *msg, boolean *crawl_children) static boolean get_folder_info_callback (char *fold, void *baton) { + boolean crawl_children; NMH_UNUSED (baton); - boolean crawl_children; get_folder_info_body (fold, NULL, &crawl_children); fflush (stdout); return crawl_children; @@ -558,7 +544,7 @@ print_folders (void) if (all || fshort || ftotal < 1) { for (i = 0; i < total_folders; i++) { if (fshort) { - printf ("%s\n", fi[i].name); + puts(fi[i].name); continue; } @@ -581,9 +567,9 @@ print_folders (void) nummsgdigits, "no", fi[i].others ? lowmsgdigits + hghmsgdigits + 5 : 0, ""); } else { - printf ("has %*d message%s (%*d-%*d)", + printf ("has %*d message%1s (%*d-%*d)", nummsgdigits, fi[i].nummsg, - (fi[i].nummsg == 1) ? " " : "s", + PLURALS(fi[i].nummsg), lowmsgdigits, fi[i].lowmsg, hghmsgdigits, fi[i].hghmsg); if (fi[i].curmsg >= fi[i].lowmsg && fi[i].curmsg <= fi[i].hghmsg) { @@ -594,7 +580,7 @@ print_folders (void) if (fi[i].others) printf (";%*s (others)", curprinted ? 0 : curmsgdigits + 6, ""); - printf (".\n"); + puts("."); } } @@ -603,17 +589,17 @@ print_folders (void) */ if (ftotal > 0 || (all && !fshort && ftotal >= 0)) { if (all) - printf ("\n"); - printf ("TOTAL = %d message%c in %d folder%s.\n", - total_msgs, total_msgs != 1 ? 's' : ' ', - total_folders, total_folders != 1 ? "s" : ""); + putchar('\n'); + printf ("TOTAL = %d message%s in %d folder%s.\n", + total_msgs, PLURALS(total_msgs), + total_folders, PLURALS(total_folders)); } fflush (stdout); } /* - * Set the current message and sychronize sequences + * Set the current message and synchronize sequences */ static int @@ -624,7 +610,7 @@ sfold (struct msgs *mp, char *msg) return 0; if (mp->numsel > 1) { - admonish (NULL, "only one message at a time!"); + inform("only one message at a time!, continuing..."); return 0; } seq_setprev (mp); /* set the previous-sequence */ @@ -645,7 +631,7 @@ readonly_folders (void) { int atrlen; char atrcur[BUFSIZ]; - register struct node *np; + struct node *np; snprintf (atrcur, sizeof(atrcur), "atr-%s-", current); atrlen = strlen (atrcur);