X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fpick.c;h=a4f61bdcd9c939e08911995bc198cb26e1db67e4;hp=24e6862c818044380967287968d773da005c94ba;hb=a485ed478abbd599d8c9aab48934e7a26733ecb1;hpb=f480c03187724e54e5391ee61b810827da319a6c diff --git a/uip/pick.c b/uip/pick.c index 24e6862..a4f61bd 100644 --- a/uip/pick.c +++ b/uip/pick.c @@ -1,4 +1,3 @@ - /* * pick.c -- search for messages by content * @@ -13,55 +12,55 @@ #include static struct swit switches[] = { -#define ANDSW 0 - { "and", 0 }, -#define ORSW 1 - { "or", 0 }, -#define NOTSW 2 - { "not", 0 }, -#define LBRSW 3 - { "lbrace", 0 }, -#define RBRSW 4 - { "rbrace", 0 }, -#define CCSW 5 - { "cc pattern", 0 }, -#define DATESW 6 - { "date pattern", 0 }, -#define FROMSW 7 - { "from pattern", 0 }, -#define SRCHSW 8 - { "search pattern", 0 }, -#define SUBJSW 9 - { "subject pattern", 0 }, -#define TOSW 10 - { "to pattern", 0 }, -#define OTHRSW 11 - { "-othercomponent pattern", 0 }, -#define AFTRSW 12 - { "after date", 0 }, -#define BEFRSW 13 - { "before date", 0 }, -#define DATFDSW 14 - { "datefield field", 5 }, -#define SEQSW 15 - { "sequence name", 0 }, -#define PUBLSW 16 - { "public", 0 }, -#define NPUBLSW 17 - { "nopublic", 0 }, -#define ZEROSW 18 - { "zero", 0 }, -#define NZEROSW 19 - { "nozero", 0 }, -#define LISTSW 20 - { "list", 0 }, -#define NLISTSW 21 - { "nolist", 0 }, -#define VERSIONSW 22 - { "version", 0 }, -#define HELPSW 23 - { "help", 0 }, - { NULL, 0 } +#define ANDSW 0 + { "and", 0 }, +#define ORSW 1 + { "or", 0 }, +#define NOTSW 2 + { "not", 0 }, +#define LBRSW 3 + { "lbrace", 0 }, +#define RBRSW 4 + { "rbrace", 0 }, +#define CCSW 5 + { "cc pattern", 0 }, +#define DATESW 6 + { "date pattern", 0 }, +#define FROMSW 7 + { "from pattern", 0 }, +#define SRCHSW 8 + { "search pattern", 0 }, +#define SUBJSW 9 + { "subject pattern", 0 }, +#define TOSW 10 + { "to pattern", 0 }, +#define OTHRSW 11 + { "-othercomponent pattern", 0 }, +#define AFTRSW 12 + { "after date", 0 }, +#define BEFRSW 13 + { "before date", 0 }, +#define DATFDSW 14 + { "datefield field", 5 }, +#define SEQSW 15 + { "sequence name", 0 }, +#define PUBLSW 16 + { "public", 0 }, +#define NPUBLSW 17 + { "nopublic", 0 }, +#define ZEROSW 18 + { "zero", 0 }, +#define NZEROSW 19 + { "nozero", 0 }, +#define LISTSW 20 + { "list", 0 }, +#define NLISTSW 21 + { "nolist", 0 }, +#define VERSIONSW 22 + { "version", 0 }, +#define HELPSW 23 + { "help", 0 }, + { NULL, 0 } }; static int listsw = -1; @@ -71,236 +70,236 @@ static void putzero_done (int) NORETURN; int main (int argc, char **argv) { - int publicsw = -1, zerosw = 1, seqp = 0, vecp = 0; - int lo, hi, msgnum; - char *maildir, *folder = NULL, buf[100]; - char *cp, **argp, **arguments; - char *seqs[NUMATTRS + 1], *vec[MAXARGS]; - struct msgs_array msgs = { 0, 0, NULL }; - struct msgs *mp; - register FILE *fp; + int publicsw = -1, zerosw = 1, seqp = 0, vecp = 0; + int lo, hi, msgnum; + char *maildir, *folder = NULL, buf[100]; + char *cp, **argp, **arguments; + char *seqs[NUMATTRS + 1], *vec[MAXARGS]; + struct msgs_array msgs = { 0, 0, NULL }; + struct msgs *mp; + register FILE *fp; - done=putzero_done; + done=putzero_done; #ifdef LOCALE - setlocale(LC_ALL, ""); + setlocale(LC_ALL, ""); #endif - invo_name = r1bindex (argv[0], '/'); - - /* read user profile/context */ - context_read(); - - arguments = getarguments (invo_name, argc, argv, 1); - argp = arguments; - - while ((cp = *argp++)) { - if (*cp == '-') { - if (*++cp == '-') { - vec[vecp++] = --cp; - goto pattern; - } - switch (smatch (cp, switches)) { - case AMBIGSW: - ambigsw (cp, switches); - listsw = 0; /* HACK */ - done (1); - case UNKWNSW: - adios (NULL, "-%s unknown", cp); - - case HELPSW: - snprintf (buf, sizeof(buf), "%s [+folder] [msgs] [switches]", - invo_name); - print_help (buf, switches, 1); - listsw = 0; /* HACK */ - done (1); - case VERSIONSW: - print_version(invo_name); - listsw = 0; /* HACK */ + invo_name = r1bindex (argv[0], '/'); + + /* read user profile/context */ + context_read(); + + arguments = getarguments (invo_name, argc, argv, 1); + argp = arguments; + + while ((cp = *argp++)) { + if (*cp == '-') { + if (*++cp == '-') { + vec[vecp++] = --cp; + goto pattern; + } + switch (smatch (cp, switches)) { + case AMBIGSW: + ambigsw (cp, switches); + listsw = 0; /* HACK */ + done (1); + case UNKWNSW: + adios (NULL, "-%s unknown", cp); + + case HELPSW: + snprintf (buf, sizeof(buf), "%s [+folder] [msgs] [switches]", + invo_name); + print_help (buf, switches, 1); + listsw = 0; /* HACK */ + done (1); + case VERSIONSW: + print_version(invo_name); + listsw = 0; /* HACK */ + done (1); + + case CCSW: + case DATESW: + case FROMSW: + case SUBJSW: + case TOSW: + case DATFDSW: + case AFTRSW: + case BEFRSW: + case SRCHSW: + vec[vecp++] = --cp; + pattern: + if (!(cp = *argp++))/* allow -xyz arguments */ + adios (NULL, "missing argument to %s", argp[-2]); + vec[vecp++] = cp; + continue; + case OTHRSW: + adios (NULL, "internal error!"); + + case ANDSW: + case ORSW: + case NOTSW: + case LBRSW: + case RBRSW: + vec[vecp++] = --cp; + continue; + + case SEQSW: + if (!(cp = *argp++) || *cp == '-') + adios (NULL, "missing argument to %s", argp[-2]); + + /* check if too many sequences specified */ + if (seqp >= NUMATTRS) + adios (NULL, "too many sequences (more than %d) specified", NUMATTRS); + + if (!seq_nameok (cp)) + done (1); + + seqs[seqp++] = cp; + continue; + case PUBLSW: + publicsw = 1; + continue; + case NPUBLSW: + publicsw = 0; + continue; + case ZEROSW: + zerosw++; + continue; + case NZEROSW: + zerosw = 0; + continue; + + case LISTSW: + listsw = 1; + continue; + case NLISTSW: + listsw = 0; + continue; + } + } + if (*cp == '+' || *cp == '@') { + if (folder) + adios (NULL, "only one folder at a time!"); + else + folder = pluspath (cp); + } else + app_msgarg(&msgs, cp); + } + vec[vecp] = NULL; + + if (!context_find ("path")) + free (path ("./", TFOLDER)); + + /* + * If we didn't specify which messages to search, + * then search the whole folder. + */ + if (!msgs.size) + app_msgarg(&msgs, "all"); + + if (!folder) + folder = getfolder (1); + maildir = m_maildir (folder); + + if (chdir (maildir) == NOTOK) + adios (maildir, "unable to change directory to"); + + /* read folder and create message structure */ + if (!(mp = folder_read (folder))) + adios (NULL, "unable to read folder %s", folder); + + /* check for empty folder */ + if (mp->nummsg == 0) + adios (NULL, "no messages in %s", folder); + + /* parse all the message ranges/sequences and set SELECTED */ + for (msgnum = 0; msgnum < msgs.size; msgnum++) + if (!m_convert (mp, msgs.msgs[msgnum])) + done (1); + seq_setprev (mp); /* set the previous-sequence */ + + /* + * If we aren't saving the results to a sequence, + * we default to list the results. + */ + if (listsw == -1) + listsw = !seqp; + + if (publicsw == 1 && is_readonly(mp)) + adios (NULL, "folder %s is read-only, so -public not allowed", folder); + + if (!pcompile (vec, NULL)) done (1); - case CCSW: - case DATESW: - case FROMSW: - case SUBJSW: - case TOSW: - case DATFDSW: - case AFTRSW: - case BEFRSW: - case SRCHSW: - vec[vecp++] = --cp; - pattern: - if (!(cp = *argp++))/* allow -xyz arguments */ - adios (NULL, "missing argument to %s", argp[-2]); - vec[vecp++] = cp; - continue; - case OTHRSW: - adios (NULL, "internal error!"); - - case ANDSW: - case ORSW: - case NOTSW: - case LBRSW: - case RBRSW: - vec[vecp++] = --cp; - continue; - - case SEQSW: - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - - /* check if too many sequences specified */ - if (seqp >= NUMATTRS) - adios (NULL, "too many sequences (more than %d) specified", NUMATTRS); - - if (!seq_nameok (cp)) - done (1); - - seqs[seqp++] = cp; - continue; - case PUBLSW: - publicsw = 1; - continue; - case NPUBLSW: - publicsw = 0; - continue; - case ZEROSW: - zerosw++; - continue; - case NZEROSW: - zerosw = 0; - continue; - - case LISTSW: - listsw = 1; - continue; - case NLISTSW: - listsw = 0; - continue; - } + lo = mp->lowsel; + hi = mp->hghsel; + + /* If printing message numbers to standard out, force line buffering on. + */ + if (listsw) + setvbuf (stdout, NULL, _IOLBF, 0); + + /* + * Scan through all the SELECTED messages and check for a + * match. If the message does not match, then unselect it. + */ + for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { + if (is_selected (mp, msgnum)) { + if ((fp = fopen (cp = m_name (msgnum), "r")) == NULL) + admonish (cp, "unable to read message"); + if (fp && pmatches (fp, msgnum, 0L, 0L)) { + if (msgnum < lo) + lo = msgnum; + if (msgnum > hi) + hi = msgnum; + + if (listsw) + printf ("%s\n", m_name (msgnum)); + } else { + /* if it doesn't match, then unselect it */ + unset_selected (mp, msgnum); + mp->numsel--; + } + if (fp) + fclose (fp); + } } - if (*cp == '+' || *cp == '@') { - if (folder) - adios (NULL, "only one folder at a time!"); - else - folder = pluspath (cp); - } else - app_msgarg(&msgs, cp); - } - vec[vecp] = NULL; - - if (!context_find ("path")) - free (path ("./", TFOLDER)); - - /* - * If we didn't specify which messages to search, - * then search the whole folder. - */ - if (!msgs.size) - app_msgarg(&msgs, "all"); - - if (!folder) - folder = getfolder (1); - maildir = m_maildir (folder); - - if (chdir (maildir) == NOTOK) - adios (maildir, "unable to change directory to"); - - /* read folder and create message structure */ - if (!(mp = folder_read (folder))) - adios (NULL, "unable to read folder %s", folder); - - /* check for empty folder */ - if (mp->nummsg == 0) - adios (NULL, "no messages in %s", folder); - - /* parse all the message ranges/sequences and set SELECTED */ - for (msgnum = 0; msgnum < msgs.size; msgnum++) - if (!m_convert (mp, msgs.msgs[msgnum])) - done (1); - seq_setprev (mp); /* set the previous-sequence */ - - /* - * If we aren't saving the results to a sequence, - * we default to list the results. - */ - if (listsw == -1) - listsw = !seqp; - - if (publicsw == 1 && is_readonly(mp)) - adios (NULL, "folder %s is read-only, so -public not allowed", folder); - - if (!pcompile (vec, NULL)) - done (1); - - lo = mp->lowsel; - hi = mp->hghsel; - - /* If printing message numbers to standard out, force line buffering on. - */ - if (listsw) - setvbuf (stdout, NULL, _IOLBF, 0); - - /* - * Scan through all the SELECTED messages and check for a - * match. If the message does not match, then unselect it. - */ - for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { - if (is_selected (mp, msgnum)) { - if ((fp = fopen (cp = m_name (msgnum), "r")) == NULL) - admonish (cp, "unable to read message"); - if (fp && pmatches (fp, msgnum, 0L, 0L)) { - if (msgnum < lo) - lo = msgnum; - if (msgnum > hi) - hi = msgnum; - - if (listsw) - printf ("%s\n", m_name (msgnum)); - } else { - /* if it doesn't match, then unselect it */ - unset_selected (mp, msgnum); - mp->numsel--; - } - if (fp) - fclose (fp); + + mp->lowsel = lo; + mp->hghsel = hi; + + if (mp->numsel <= 0) + adios (NULL, "no messages match specification"); + + seqs[seqp] = NULL; + + /* + * Add the matching messages to sequences + */ + for (seqp = 0; seqs[seqp]; seqp++) + if (!seq_addsel (mp, seqs[seqp], publicsw, zerosw)) + done (1); + + /* + * Print total matched if not printing each matched message number. + */ + if (!listsw) { + printf ("%d hit%s\n", mp->numsel, mp->numsel == 1 ? "" : "s"); } - } - - mp->lowsel = lo; - mp->hghsel = hi; - - if (mp->numsel <= 0) - adios (NULL, "no messages match specification"); - - seqs[seqp] = NULL; - - /* - * Add the matching messages to sequences - */ - for (seqp = 0; seqs[seqp]; seqp++) - if (!seq_addsel (mp, seqs[seqp], publicsw, zerosw)) - done (1); - - /* - * Print total matched if not printing each matched message number. - */ - if (!listsw) { - printf ("%d hit%s\n", mp->numsel, mp->numsel == 1 ? "" : "s"); - } - - context_replace (pfolder, folder); /* update current folder */ - seq_save (mp); /* synchronize message sequences */ - context_save (); /* save the context file */ - folder_free (mp); /* free folder/message structure */ - done (0); - return 1; + + context_replace (pfolder, folder); /* update current folder */ + seq_save (mp); /* synchronize message sequences */ + context_save (); /* save the context file */ + folder_free (mp); /* free folder/message structure */ + done (0); + return 1; } static void putzero_done (int status) { - if (listsw && status && !isatty (fileno (stdout))) - printf ("0\n"); - exit (status); + if (listsw && status && !isatty (fileno (stdout))) + printf ("0\n"); + exit (status); }