X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/788c353a8bee07520ae1a1de6fb7bdcdf1f4f1c7..e98c2d0fee3d656633ae897576b3d8d0f0fddfe2:/uip/new.c diff --git a/uip/new.c b/uip/new.c index 4ff8c049..e88a0dd7 100644 --- a/uip/new.c +++ b/uip/new.c @@ -4,8 +4,6 @@ * -- as fnext, move to next folder with unseen messages * -- as fprev, move to previous folder with unseen messages * -- as unseen, scan all unseen messages - * $Id$ - * * This code is Copyright (c) 2008, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. @@ -23,17 +21,19 @@ #include #include -static struct swit switches[] = { -#define MODESW 0 - { "mode", 1 }, -#define FOLDERSSW 1 - { "folders", 1 }, -#define VERSIONSW 2 - { "version", 1 }, -#define HELPSW 3 - { "help", 1 }, - { NULL, 0 } -}; +#define NEW_SWITCHES \ + X("mode", 1, MODESW) \ + X("folders", 1, FOLDERSSW) \ + X("version", 1, VERSIONSW) \ + X("help", 1, HELPSW) \ + +#define X(sw, minchars, id) id, +DEFINE_SWITCH_ENUM(NEW); +#undef X + +#define X(sw, minchars, id) { sw, minchars, id }, +DEFINE_SWITCH_ARRAY(NEW, switches); +#undef X static enum { NEW, FNEXT, FPREV, UNSEEN } run_mode = NEW; @@ -220,6 +220,8 @@ crawl_callback(char *folder, void *baton) * `cur' points to the name of the current folder, `folders' points to the * name of a .folder (if NULL, crawl all folders), and `sequences' points to * the array of sequences for which to look. + * + * An empty list is returned as first=last=NULL. */ static void check_folders(struct node **first, struct node **last, @@ -231,7 +233,7 @@ check_folders(struct node **first, struct node **last, char *line; size_t len; - *first = *cur_node = NULL; + *first = *last = *cur_node = NULL; *maxlen = 0; b.first = first; @@ -300,7 +302,7 @@ doit(char *cur, char *folders, char *sequences[]) struct node *first, *cur_node, *node, *last, *prev; size_t folder_len; int count, total = 0; - char *command, *sequences_s; + char *command = NULL, *sequences_s = NULL; if (cur == NULL || cur[0] == '\0') { cur = "inbox"; @@ -310,7 +312,10 @@ doit(char *cur, char *folders, char *sequences[]) folders, sequences); if (run_mode == FNEXT || run_mode == FPREV) { - if (first->n_next == NULL) { + if (first == NULL) { + /* No folders at all... */ + return NULL; + } else if (first->n_next == NULL) { /* We have only one node; any desired messages in it? */ if (first->n_field == NULL) { return NULL; @@ -374,7 +379,7 @@ doit(char *cur, char *folders, char *sequences[]) total += count; printf("%-*s %6d.%c %s\n", - folder_len, node->n_name, + (int) folder_len, node->n_name, count, (strcmp(node->n_name, cur) == 0 ? '*' : ' '), node->n_field); @@ -388,7 +393,7 @@ doit(char *cur, char *folders, char *sequences[]) } if (run_mode == NEW) { - printf("%-*s %6d.\n", folder_len, " total", total); + printf("%-*s %6d.\n", (int) folder_len, " total", total); } return cur_node; @@ -405,6 +410,9 @@ main(int argc, char **argv) char *unseen; struct node *folder; + sequences[0] = NULL; + sequences[1] = NULL; + #ifdef LOCALE setlocale(LC_ALL, ""); #endif @@ -432,10 +440,10 @@ main(int argc, char **argv) snprintf (help, sizeof(help), "%s [switches] [sequences]", invo_name); print_help (help, switches, 1); - done (1); + done (0); case VERSIONSW: print_version(invo_name); - done (1); + done (0); case FOLDERSSW: if (!(folders = *argp++) || *folders == '-') @@ -451,6 +459,7 @@ main(int argc, char **argv) /* have a sequence argument */ if (!seq_in_list(cp, sequences)) { sequences[i++] = cp; + sequences[i] = NULL; } }