mhl and mhbuild ignore to long lines
[mmh] / uip / mhl.c
index b8213b0..dd77f5b 100644 (file)
--- a/uip/mhl.c
+++ b/uip/mhl.c
@@ -78,7 +78,8 @@ char *version=VERSION;
 #define SPLIT       0x001000  /* split headers (don't concatenate) */
 #define NONEWLINE   0x002000  /* don't write trailing newline */
 #define RTRIM       0x004000  /* trim trailing whitespace    */
-#define LBITS       "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07LEFTADJUST\010COMPRESS\011ADDRFMT\012DATEFMT\013FORMAT\014INIT\015SPLIT\016NONEWLINE\017RTRIM"
+#define RAW         0x008000  /* print the raw input         */
+#define LBITS       "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07LEFTADJUST\010COMPRESS\011ADDRFMT\012DATEFMT\013FORMAT\014INIT\015SPLIT\016NONEWLINE\017RTRIM\020RAW"
 #define GFLAGS      (NOCOMPONENT | UPPERCASE | CENTER | LEFTADJUST | COMPRESS | SPLIT)
 
 struct mcomp {
@@ -139,21 +140,22 @@ struct triple {
 
 static struct triple triples[] = {
        { "nocomponent",  NOCOMPONENT, 0 },
-       { "uppercase", UPPERCASE, 0 },
+       { "uppercase", UPPERCASE, RAW },
        { "nouppercase", 0, UPPERCASE },
-       { "center", CENTER, 0 },
+       { "center", CENTER, RAW },
        { "nocenter", 0, CENTER },
-       { "leftadjust", LEFTADJUST, 0 },
+       { "leftadjust", LEFTADJUST, RAW },
        { "noleftadjust", 0, LEFTADJUST },
-       { "compress", COMPRESS, 0 },
+       { "compress", COMPRESS, RAW },
        { "nocompress", 0, COMPRESS },
        { "split", SPLIT, 0 },
        { "nosplit", 0, SPLIT },
-       { "rtrim", RTRIM, 0 },
+       { "rtrim", RTRIM, RAW },
        { "nortrim", 0, RTRIM },
-       { "addrfield", ADDRFMT, DATEFMT },
-       { "datefield", DATEFMT, ADDRFMT },
-       { "newline", 0, NONEWLINE },
+       { "raw", RAW|SPLIT|NOCOMPONENT|NONEWLINE, UPPERCASE|CENTER|LEFTADJUST|COMPRESS|DATEFMT|ADDRFMT },
+       { "addrfield", ADDRFMT, DATEFMT|RAW },
+       { "datefield", DATEFMT, ADDRFMT|RAW },
+       { "newline", 0, NONEWLINE|RAW },
        { "nonewline", NONEWLINE, 0 },
        { NULL, 0, 0 }
 };
@@ -598,6 +600,34 @@ process(char *fname, int ofilen, int ofilec)
                c1->c_flags &= ~HDROUTPUT;
 }
 
+static boolean
+simplematch(char *pattern, char *b)
+{
+       char *match = strrchr(pattern, '*');
+       char repl;
+       boolean ret;
+
+       /* check if pattern ends with a * and is not escaped witch a \ */
+       if (!match || match[1] || (match > pattern && match[-1] == '\\')) {
+               if (!match || match[1]) {
+                       return mh_strcasecmp(pattern, b) == 0;
+               }
+               match[0] = '\0';
+               match[-1] = '*';
+               ret = mh_strcasecmp(pattern, b)==0;
+               match[-1] = '\\';
+               match[0] = '*';
+               return ret;
+       }
+
+       repl = b[match-pattern];
+       b[match-pattern] = '\0';
+       *match = '\0';
+       ret = (mh_strcasecmp(pattern, b) == 0);
+       b[match-pattern] = repl;
+       *match = '*';
+       return ret;
+}
 
 static void
 mhlfile(FILE *fp, char *mname, int ofilen, int ofilec)
@@ -624,9 +654,11 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec)
 
        for (state = FLD2; !eflag; ) {
                switch (state = m_getfld2(state, &f, fp)) {
+               case LENERR2:
+                       state = FLD2;
                case FLD2:
                        for (ip = ignores; *ip; ip++)
-                               if (mh_strcasecmp(f.name, *ip)==0) {
+                               if (simplematch(*ip, f.name)) {
                                        break;
                                }
                        if (*ip) {
@@ -699,7 +731,6 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec)
                        }
                        return;
 
-               case LENERR2:
                case FMTERR2:
                case IOERR2:
                        advise(NULL, "format error in message %s", mname);
@@ -881,7 +912,6 @@ free_queue(struct mcomp **head, struct mcomp **tail)
        *head = *tail = NULL;
 }
 
-
 static void
 putcomp(struct mcomp *c1, struct mcomp *c2, int flag)
 {
@@ -908,6 +938,23 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag)
                return;
        }
 
+       if (c1->c_flags & RAW) {
+               switch (flag) {
+               case ONECOMP:
+                       printf("%s:%s", c1->c_name, c1->c_text);
+                       break;
+               case TWOCOMP:
+                       printf("%s:%s", c2->c_name, c2->c_text);
+                       break;
+               case BODYCOMP:
+                       fputs(c2->c_text, stdout);
+                       break;
+               default:
+                       adios(EX_SOFTWARE, NULL, "BUG: putcomp() is called with a unknown flag");
+               }
+               return;
+       }
+
        if (c1->c_fstr && (c1->c_flags & (ADDRFMT | DATEFMT | FORMAT)))
                mcomp_format(c1, c2);
 
@@ -1004,7 +1051,6 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag)
                c1->c_flags &= ~HDROUTPUT;  /* Buffer ended on a newline */
 }
 
-
 static char *
 oneline(char *stuff, long flags)
 {
@@ -1054,7 +1100,6 @@ oneline(char *stuff, long flags)
        return ret;
 }
 
-
 static void
 putstr(char *string)
 {