In pick(1), attempt to decode each header field as if it were
[mmh] / uip / picksbr.c
index 85bc4bc..91893e3 100644 (file)
@@ -78,9 +78,10 @@ static struct swit parswit[] = {
 
 
 static char linebuf[LBSIZE + 1];
+static char decoded_linebuf[LBSIZE + 1];
 
 /* the magic array for case-independence */
-static char cc[] = {
+static unsigned char cc[] = {
        0000,0001,0002,0003,0004,0005,0006,0007,
        0010,0011,0012,0013,0014,0015,0016,0017,
        0020,0021,0022,0023,0024,0025,0026,0027,
@@ -175,23 +176,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();
@@ -656,12 +657,11 @@ static int
 GREPaction (params)
 plist
 {
-    NMH_UNUSED (msgnum);
-
     int c, body, lf;
     long pos = start;
     register char *p1, *p2, *ebp, *cbp;
     char ibuf[BUFSIZ];
+    NMH_UNUSED (msgnum);
 
     fseek (fp, start, SEEK_SET);
     body = 0;
@@ -702,7 +702,8 @@ plist
                        break;
                    }
                    lf++;
-                   c = ' ';
+                   /* Unfold by skipping the newline. */
+                   c = 0;
                }
            }
            if (c && p1 < &linebuf[LBSIZE - 1])
@@ -714,6 +715,13 @@ 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))
                return 1;
@@ -931,12 +939,11 @@ static int
 TWSaction (params)
 plist
 {
-    NMH_UNUSED (stop);
-
     int state;
     register char *bp;
     char buf[BUFSIZ], name[NAMESZ];
     register struct tws *tw;
+    NMH_UNUSED (stop);
 
     fseek (fp, start, SEEK_SET);
     for (state = FLD, bp = NULL;;) {