X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhl.c;h=fa83602d0b21c0ab5ccc91b94772d3cb98667857;hp=b8213b048820f5f2c3c32a91732c8f4bac3cc488;hb=HEAD;hpb=24d23e290e7b1320eca49cfd2ea0ca0af3e761e0 diff --git a/uip/mhl.c b/uip/mhl.c index b8213b0..dd77f5b 100644 --- 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) {