X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fpick.c;h=a5e658d126554e9579e1feacbb29db8c163220f1;hp=3fb853cdc40e512dfaf1fbfcc38f525953f2efc8;hb=6e7d34c614291079de750ceda1d4f5ec537beb81;hpb=d5b5e6e4813b7fd77dc1664df4304537f3002cf3 diff --git a/uip/pick.c b/uip/pick.c index 3fb853c..a5e658d 100644 --- a/uip/pick.c +++ b/uip/pick.c @@ -9,6 +9,9 @@ #include #include #include +#include +#include +#include #ifdef HAVE_SYS_TIME_H # include @@ -45,23 +48,23 @@ static struct swit switches[] = { #define BEFRSW 13 { "before date", 0 }, #define DATFDSW 14 - { "datefield field", 5 }, + { "datefield field", 5 }, /* 5 chars required to differ from -date */ #define SEQSW 15 { "sequence name", 0 }, #define PUBLSW 16 { "public", 0 }, #define NPUBLSW 17 - { "nopublic", 0 }, + { "nopublic", 2 }, #define ZEROSW 18 { "zero", 0 }, #define NZEROSW 19 - { "nozero", 0 }, + { "nozero", 2 }, #define LISTSW 20 { "list", 0 }, #define NLISTSW 21 - { "nolist", 0 }, + { "nolist", 2 }, #define VERSIONSW 22 - { "version", 0 }, + { "Version", 0 }, #define HELPSW 23 { "help", 0 }, { NULL, 0 } @@ -76,7 +79,7 @@ static int pmatches(FILE *, int, long, long); static int listsw = -1; -static void putzero_done(int) NORETURN; +void putzero_done(); int main(int argc, char **argv) @@ -89,13 +92,13 @@ main(int argc, char **argv) char *seqs[NUMATTRS + 1], *vec[MAXARGS]; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; - register FILE *fp; + FILE *fp; - done=putzero_done; + if (atexit(putzero_done) != 0) { + adios(EX_OSERR, NULL, "atexit failed"); + } -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif invo_name = mhbasename(argv[0]); /* read user profile/context */ @@ -114,19 +117,19 @@ main(int argc, char **argv) case AMBIGSW: ambigsw(cp, switches); listsw = 0; /* HACK */ - done(1); + exit(EX_USAGE); case UNKWNSW: - adios(NULL, "-%s unknown", cp); + adios(EX_USAGE, 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); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); listsw = 0; /* HACK */ - done(1); + exit(argc == 2 ? EX_OK : EX_USAGE); case CCSW: case DATESW: @@ -140,12 +143,12 @@ main(int argc, char **argv) vec[vecp++] = --cp; pattern: if (!(cp = *argp++)) /* allow -xyz arguments */ - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); vec[vecp++] = cp; continue; case OTHRSW: - adios(NULL, "internal error!"); + adios(EX_SOFTWARE, NULL, "internal error!"); case ANDSW: case ORSW: @@ -157,15 +160,15 @@ main(int argc, char **argv) case SEQSW: if (!(cp = *argp++) || *cp == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, 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); + adios(EX_USAGE, NULL, "too many sequences (more than %d) specified", NUMATTRS); if (!seq_nameok(cp)) - done(1); + exit(EX_USAGE); seqs[seqp++] = cp; continue; @@ -192,7 +195,7 @@ main(int argc, char **argv) } if (*cp == '+' || *cp == '@') { if (folder) - adios(NULL, "only one folder at a time!"); + adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = getcpy(expandfol(cp)); } else @@ -212,20 +215,20 @@ main(int argc, char **argv) maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) - adios(maildir, "unable to change directory to"); + adios(EX_OSERR, 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); + adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) - adios(NULL, "no messages in %s", folder); + adios(EX_DATAERR, 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); + exit(EX_USAGE); seq_setprev(mp); /* set the previous-sequence */ /* @@ -236,11 +239,11 @@ main(int argc, char **argv) listsw = !seqp; if (publicsw == 1 && is_readonly(mp)) - adios(NULL, "folder %s is read-only, so -public not allowed", + adios(EX_NOPERM, NULL, "folder %s is read-only, so -public not allowed", folder); if (!pcompile(vec, NULL)) - done(1); + exit(EX_SOFTWARE); lo = mp->lowsel; hi = mp->hghsel; @@ -271,7 +274,6 @@ main(int argc, char **argv) } else { /* if it doesn't match, then unselect it */ unset_selected(mp, msgnum); - mp->numsel--; } if (fp) fclose(fp); @@ -282,7 +284,7 @@ main(int argc, char **argv) mp->hghsel = hi; if (mp->numsel <= 0) - adios(NULL, "no messages match specification"); + adios(EX_DATAERR, NULL, "no messages match specification"); seqs[seqp] = NULL; @@ -291,7 +293,7 @@ main(int argc, char **argv) */ for (seqp = 0; seqs[seqp]; seqp++) if (!seq_addsel(mp, seqs[seqp], publicsw, zerosw)) - done(1); + exit(EX_USAGE); /* ** Print total matched if not printing each matched message number. @@ -304,17 +306,16 @@ main(int argc, char **argv) seq_save(mp); /* synchronize message sequences */ context_save(); /* save the context file */ folder_free(mp); /* free folder/message structure */ - done(0); - return 1; + listsw = 0; /* HACK */ + return 0; } -static void -putzero_done(int status) +void +putzero_done() { - if (listsw && status && !isatty(fileno(stdout))) + if (listsw && !isatty(fileno(stdout))) printf("0\n"); - exit(status); } @@ -379,6 +380,7 @@ static struct swit parswit[] = { static char linebuf[LBSIZE + 1]; +static char decoded_linebuf[LBSIZE + 1]; /* the magic array for case-independence */ static char cc[] = { @@ -476,23 +478,23 @@ static struct nexus *head; /* ** prototypes for date routines */ -static struct tws *tws_parse(); -static struct tws *tws_special(); +static struct tws *tws_parse(char *, int); +static struct tws *tws_special(char *); /* ** static prototypes */ -static void PRaction(); -static int gcompile(); -static int advance(); -static int cclass(); -static int tcompile(); - -static struct nexus *parse(); -static struct nexus *nexp1(); -static struct nexus *nexp2(); -static struct nexus *nexp3(); -static struct nexus *newnexus(); +static void PRaction(struct nexus *, int); +static int gcompile(struct nexus *, char *); +static int advance(char *, char *); +static int cclass(unsigned char *, int, int); +static int tcompile(char *, struct tws *, int); + +static struct nexus *parse(void); +static struct nexus *nexp1(void); +static struct nexus *nexp2(void); +static struct nexus *nexp3(void); +static struct nexus *newnexus(int (*)()); static int ORaction(); static int ANDaction(); @@ -504,7 +506,7 @@ static int TWSaction(); static int pcompile(char **vec, char *date) { - register char *cp; + char *cp; if ((cp = getenv("MHPDEBUG")) && *cp) pdebug++; @@ -529,8 +531,8 @@ pcompile(char **vec, char *date) static struct nexus * parse(void) { - register char *cp; - register struct nexus *n, *o; + char *cp; + struct nexus *n, *o; if ((n = nexp1()) == NULL || (cp = nxtarg()) == NULL) return n; @@ -570,8 +572,8 @@ header: ; static struct nexus * nexp1(void) { - register char *cp; - register struct nexus *n, *o; + char *cp; + struct nexus *n, *o; if ((n = nexp2()) == NULL || (cp = nxtarg()) == NULL) return n; @@ -612,8 +614,8 @@ header: ; static struct nexus * nexp2(void) { - register char *cp; - register struct nexus *n; + char *cp; + struct nexus *n; if ((cp = nxtarg()) == NULL) return NULL; @@ -653,9 +655,9 @@ static struct nexus * nexp3(void) { int i; - register char *cp, *dp; + char *cp, *dp; char buffer[BUFSIZ], temp[64]; - register struct nexus *n; + struct nexus *n; if ((cp = nxtarg()) == NULL) return NULL; @@ -764,10 +766,9 @@ pattern: ; static struct nexus * newnexus(int (*action)()) { - register struct nexus *p; + struct nexus *p; - if ((p = (struct nexus *) calloc((size_t) 1, sizeof *p)) == NULL) - adios(NULL, "unable to allocate component storage"); + p = (struct nexus *) mh_xcalloc((size_t) 1, sizeof *p); p->n_action = action; return p; @@ -777,8 +778,8 @@ newnexus(int (*action)()) #define args(a) a, fp, msgnum, start, stop #define params args(n) #define plist \ - register struct nexus *n; \ - register FILE *fp; \ + struct nexus *n; \ + FILE *fp; \ int msgnum; \ long start, \ stop; @@ -799,7 +800,7 @@ pmatches(FILE *fp, int msgnum, long start, long stop) static void PRaction(struct nexus *n, int level) { - register int i; + int i; for (i = 0; i < level; i++) fprintf(stderr, "| "); @@ -829,7 +830,7 @@ PRaction(struct nexus *n, int level) if (n->n_action == TWSaction) { fprintf(stderr, "TEMPORAL(%s) %s: %s\n", n->n_after ? "after" : "before", n->n_datef, - dasctime(&n->n_tws, TW_NULL)); + dasctime(&n->n_tws)); return; } fprintf(stderr, "UNKNOWN(0x%x)\n", @@ -868,9 +869,9 @@ plist static int gcompile(struct nexus *n, char *astr) { - register int c; + int c; int cclcnt; - register unsigned char *ep, *dp, *sp, *lastep = 0; + unsigned char *ep, *dp, *sp, *lastep = 0; dp = (ep = n->n_expbuf) + sizeof n->n_expbuf; sp = astr; @@ -960,7 +961,7 @@ plist { int c, body, lf; long pos = start; - register char *p1, *p2, *ebp, *cbp; + char *p1, *p2, *ebp, *cbp; char ibuf[BUFSIZ]; fseek(fp, start, SEEK_SET); @@ -1014,8 +1015,17 @@ plist p1 = linebuf; p2 = n->n_expbuf; + /* + ** Attempt to decode as a MIME header. If it's the + ** last header, body will be 1 and lf will be at least 1. + */ + if ((body == 0 || lf > 0) && decode_rfc2047(linebuf, + decoded_linebuf, sizeof decoded_linebuf)) { + p1 = decoded_linebuf; + } + if (n->n_circf) { - if (advance(p1, p2)) + if (advance(p1, p2)) return 1; continue; } @@ -1041,7 +1051,7 @@ plist static int advance(char *alp, char *aep) { - register unsigned char *lp, *ep, *curlp; + unsigned char *lp, *ep, *curlp; lp = (unsigned char *)alp; ep = (unsigned char *)aep; @@ -1118,8 +1128,8 @@ star: static int cclass(unsigned char *aset, int ac, int af) { - register unsigned int n; - register unsigned char c, *set; + unsigned int n; + unsigned char c, *set; set = aset; if ((c = ac) == 0) @@ -1137,7 +1147,7 @@ cclass(unsigned char *aset, int ac, int af) static int tcompile(char *ap, struct tws *tb, int isafter) { - register struct tws *tw; + struct tws *tw; if ((tw = tws_parse(ap, isafter)) == NULL) return 0; @@ -1151,7 +1161,7 @@ static struct tws * tws_parse(char *ap, int isafter) { char buffer[BUFSIZ]; - register struct tws *tw, *ts; + struct tws *tw, *ts; if ((tw = tws_special(ap)) != NULL) { tw->tw_sec = tw->tw_min = isafter ? 59 : 0; @@ -1193,7 +1203,7 @@ tws_special(char *ap) { int i; time_t clock; - register struct tws *tw; + struct tws *tw; time(&clock); if (!mh_strcasecmp(ap, "today")) @@ -1231,45 +1241,40 @@ static int TWSaction(params) plist { - int state; - register char *bp; - char buf[BUFSIZ], name[NAMESZ]; - register struct tws *tw; + enum state state; + struct field f = {{0}}; + char *bp; + struct tws *tw; fseek(fp, start, SEEK_SET); - for (state = FLD, bp = NULL;;) { - switch (state = m_getfld(state, name, buf, sizeof buf, fp)) { - case FLD: - case FLDEOF: - case FLDPLUS: - if (bp != NULL) { + for (state = FLD2, bp = NULL;;) { + switch (state = m_getfld2(state, &f, fp)) { + case FLD2: + if (bp) { free(bp); bp = NULL; } - bp = getcpy(buf); - while (state == FLDPLUS) { - state = m_getfld(state, name, buf, - sizeof buf, fp); - bp = add(buf, bp); - } - if (!mh_strcasecmp(name, n->n_datef)) + bp = getcpy(f.value); + if (mh_strcasecmp(f.name, n->n_datef)==0) { break; - if (state != FLDEOF) - continue; + } + continue; - case BODY: - case BODYEOF: - case FILEEOF: - case LENERR: - case FMTERR: - if (state == LENERR || state == FMTERR) - advise(NULL, "format error in message %d", msgnum); - if (bp != NULL) + case LENERR2: + case FMTERR2: + case ERR2: + advise(NULL, "format error in message %d", msgnum); + /* FALL */ + + case BODY2: + case FILEEOF2: + if (bp) { free(bp); + } return 0; default: - adios(NULL, "internal error -- you lose"); + adios(EX_SOFTWARE, NULL, "internal error -- you lose"); } break; }