Fix uip/whom.c for C89 compatibility
[mmh] / uip / pick.c
index a487adc..4cb33fb 100644 (file)
@@ -70,6 +70,8 @@ static struct swit switches[] = {
        { NULL, 0 }
 };
 
+char *version=VERSION;
+
 /*
 ** static prototypes
 */
@@ -92,7 +94,7 @@ 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;
 
         if (atexit(putzero_done) != 0) {
                adios(EX_OSERR, NULL, "atexit failed");
@@ -197,7 +199,7 @@ main(int argc, char **argv)
                        if (folder)
                                adios(EX_USAGE, NULL, "only one folder at a time!");
                        else
-                               folder = getcpy(expandfol(cp));
+                               folder = mh_xstrdup(expandfol(cp));
                } else
                        app_msgarg(&msgs, cp);
        }
@@ -274,7 +276,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);
@@ -381,6 +382,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[] = {
@@ -506,7 +508,7 @@ static int TWSaction();
 static int
 pcompile(char **vec, char *date)
 {
-       register char *cp;
+       char *cp;
 
        if ((cp = getenv("MHPDEBUG")) && *cp)
                pdebug++;
@@ -531,8 +533,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;
@@ -572,8 +574,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;
@@ -614,8 +616,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;
@@ -655,9 +657,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;
@@ -731,7 +733,7 @@ pattern: ;
                        padvise(NULL, "pattern error in %s %s", argp[-2], cp);
                        return NULL;
                }
-               n->n_patbuf = getcpy(dp);
+               n->n_patbuf = mh_xstrdup(dp);
                return n;
 
        case PROTHR:
@@ -766,10 +768,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(EX_OSERR, NULL, "unable to allocate component storage");
+       p = mh_xcalloc(1, sizeof *p);
 
        p->n_action = action;
        return p;
@@ -779,8 +780,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;
@@ -801,7 +802,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, "| ");
@@ -870,9 +871,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;
@@ -962,7 +963,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);
@@ -1016,8 +1017,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;
                }
@@ -1043,7 +1053,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;
@@ -1120,8 +1130,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)
@@ -1139,7 +1149,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;
@@ -1153,7 +1163,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;
@@ -1195,7 +1205,7 @@ tws_special(char *ap)
 {
        int i;
        time_t clock;
-       register struct tws *tw;
+       struct tws *tw;
 
        time(&clock);
        if (!mh_strcasecmp(ap, "today"))
@@ -1233,41 +1243,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) {
-                               free(bp);
-                               bp = NULL;
-                       }
-                       bp = getcpy(buf);
-                       while (state == FLDPLUS) {
-                               state = m_getfld(state, name, buf,
-                                               sizeof buf, fp);
-                               bp = add(buf, bp);
+       for (state = FLD2, bp = NULL;;) {
+               switch (state = m_getfld2(state, &f, fp)) {
+               case LENERR2:
+                       state = FLD2;
+                       /* FALL */
+
+               case FLD2:
+                       if (bp) {
+                               mh_free0(&bp);
                        }
-                       if (!mh_strcasecmp(name, n->n_datef))
+                       bp = mh_xstrdup(f.value);
+                       if (mh_strcasecmp(f.name, n->n_datef)==0) {
                                break;
-                       if (state != FLDEOF)
-                               continue;
+                       }
+                       continue;
+
+               case FMTERR2:
+                       advise(NULL, "format error in message %d", msgnum);
+                       state = FLD2;
+                       continue;
+
+               case IOERR2:
+                       adios(EX_IOERR, "m_getfld2", "io error on message %d", msgnum);
+                       /* FALL */
 
-               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)
-                               free(bp);
+               case BODY2:
+               case FILEEOF2:
+                       mh_free0(&bp);
                        return 0;
 
                default:
@@ -1284,6 +1293,6 @@ plist
                        : (twsort(tw, &n->n_tws) < 0);
 
        if (bp != NULL)
-               free(bp);
+               mh_free0(&bp);
        return state;
 }