X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhl.c;h=fa83602d0b21c0ab5ccc91b94772d3cb98667857;hp=20f5d31f8bb5998e1655855ed57bcd78f3e58d2f;hb=HEAD;hpb=a87df3543d3bc128ba4079d1f95638476ba5ca50 diff --git a/uip/mhl.c b/uip/mhl.c index 20f5d31..dd77f5b 100644 --- a/uip/mhl.c +++ b/uip/mhl.c @@ -61,6 +61,8 @@ static struct swit switches[] = { { NULL, 0 } }; +char *version=VERSION; + #define NOCOMPONENT 0x000001 /* don't show component name */ #define UPPERCASE 0x000002 /* display in all upper case */ #define CENTER 0x000004 /* center line */ @@ -75,7 +77,9 @@ static struct swit switches[] = { #define INIT 0x000800 /* initialize component */ #define SPLIT 0x001000 /* split headers (don't concatenate) */ #define NONEWLINE 0x002000 /* don't write trailing newline */ -#define LBITS "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07LEFTADJUST\010COMPRESS\011ADDRFMT\012DATEFMT\013FORMAT\014INIT\015SPLIT\016NONEWLINE" +#define RTRIM 0x004000 /* trim trailing whitespace */ +#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 { @@ -136,19 +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 }, - { "addrfield", ADDRFMT, DATEFMT }, - { "datefield", DATEFMT, ADDRFMT }, - { "newline", 0, NONEWLINE }, + { "rtrim", RTRIM, RAW }, + { "nortrim", 0, RTRIM }, + { "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 } }; @@ -369,7 +376,7 @@ mhl_format(char *file, int width) int n = 0; /* split the fields */ - tmparray = brkstring(getcpy(++parptr), ",", + tmparray = brkstring(mh_xstrdup(++parptr), ",", NULL); /* ** copy pointers to split fields @@ -400,10 +407,10 @@ mhl_format(char *file, int width) if (!c1->c_fstr && global.c_fstr) { if ((c1->c_flags & DATEFMT) && (global.c_flags & DATEFMT)) { - c1->c_fstr = getcpy(global.c_fstr); + c1->c_fstr = mh_xstrdup(global.c_fstr); } else if ((c1->c_flags & ADDRFMT) && (global.c_flags & ADDRFMT)) { - c1->c_fstr = getcpy(global.c_fstr); + c1->c_fstr = mh_xstrdup(global.c_fstr); } } continue; @@ -458,8 +465,8 @@ evalvar(struct mcomp *c1) return 1; cp = concat("=", cp, NULL); fmtstr = new_fs(cp, NULL); - free(cp); - c1->c_fstr = getcpy(fmtstr); + mh_free0(&cp); + c1->c_fstr = mh_xstrdup(fmtstr); c1->c_flags |= FORMAT; return 0; } @@ -468,7 +475,7 @@ evalvar(struct mcomp *c1) char *fmtstr; fmtstr = new_fs("=%(decode{text})", NULL); - c1->c_fstr = getcpy(fmtstr); + c1->c_fstr = mh_xstrdup(fmtstr); c1->c_flags |= FORMAT; return 0; } @@ -530,7 +537,7 @@ ptos(char *name, char **s) } c = *parptr; *parptr = 0; - *s = getcpy(cp); + *s = mh_xstrdup(cp); if ((*parptr = c) == '"') parptr++; return 0; @@ -586,20 +593,47 @@ process(char *fname, int ofilen, int ofilec) if (fp != stdin) fclose(fp); if (holder.c_text) { - free(holder.c_text); - holder.c_text = NULL; + mh_free0(&(holder.c_text)); } free_queue(&msghd, &msgtl); for (c1 = fmthd; c1; c1 = c1->c_next) 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) { enum state state; - struct field f = free_field; + struct field f = {{0}}; struct mcomp *c1, *c2, *c3; char **ip; @@ -620,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) { @@ -661,8 +697,7 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) holder.c_text = concat("(Message ", mname, ")\n", NULL); putcomp(c1, &holder, ONECOMP); - free(holder.c_text); - holder.c_text = NULL; + mh_free0(&(holder.c_text)); continue; } if (mh_strcasecmp(c1->c_name, "extras")==0) { @@ -674,15 +709,14 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) continue; } if (dobody && mh_strcasecmp(c1->c_name, "body")==0) { - holder.c_text = getcpy(f.value); + holder.c_text = mh_xstrdup(f.value); while (state == BODY2) { putcomp(c1, &holder, BODYCOMP); state = m_getfld2(state, &f, fp); free(holder.c_text); - holder.c_text = getcpy(f.value); + holder.c_text = mh_xstrdup(f.value); } - free(holder.c_text); - holder.c_text = NULL; + mh_free0(&(holder.c_text)); continue; } for (c2 = msghd; c2; c2 = c2->c_next) { @@ -697,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); @@ -776,21 +809,21 @@ mcomp_format(struct mcomp *c1, struct mcomp *c2) fmt_scan(c1->c_fmt, buffer, sizeof(buffer) - 1, dat); /* Don't need to append a newline, dctime() already did */ - c2->c_text = getcpy(buffer); + c2->c_text = mh_xstrdup(buffer); - free(ap); + mh_free0(&ap); return; } (q = &pq)->pq_next = NULL; while ((cp = getname(ap))) { - p = (struct pqpair *) mh_xcalloc((size_t) 1, sizeof(*p)); + p = mh_xcalloc(1, sizeof(*p)); if ((mp = getm(cp, NULL, 0, AD_NAME, error)) == NULL) { - p->pq_text = getcpy(cp); - p->pq_error = getcpy(error); + p->pq_text = mh_xstrdup(cp); + p->pq_error = mh_xstrdup(error); } else { - p->pq_text = getcpy(mp->m_text); + p->pq_text = mh_xstrdup(mp->m_text); mnfree(mp); } q = (q->pq_next = p); @@ -813,11 +846,11 @@ mcomp_format(struct mcomp *c1, struct mcomp *c2) c2->c_text = add(buffer, c2->c_text); } - free(p->pq_text); + mh_free0(&(p->pq_text)); if (p->pq_error) - free(p->pq_error); + mh_free0(&(p->pq_error)); q = p->pq_next; - free((char *) p); + mh_free0(&p); } c2->c_text = add("\n", c2->c_text); @@ -831,15 +864,15 @@ add_queue(struct mcomp **head, struct mcomp **tail, char *name, { struct mcomp *c1; - c1 = (struct mcomp *) mh_xcalloc((size_t) 1, sizeof(*c1)); + c1 = mh_xcalloc(1, sizeof(*c1)); c1->c_flags = flags & ~INIT; - if ((c1->c_name = name ? getcpy(name) : NULL)) + if ((c1->c_name = name ? mh_xstrdup(name) : NULL)) c1->c_flags |= mcomp_flags(c1->c_name); - c1->c_text = text ? getcpy(text) : NULL; + c1->c_text = text ? mh_xstrdup(text) : NULL; if (flags & INIT) { if (global.c_ovtxt) - c1->c_ovtxt = getcpy(global.c_ovtxt); + c1->c_ovtxt = mh_xstrdup(global.c_ovtxt); c1->c_offset = global.c_offset; c1->c_ovoff = global. c_ovoff; c1->c_width = 0; @@ -864,28 +897,30 @@ free_queue(struct mcomp **head, struct mcomp **tail) for (c1 = *head; c1; c1 = c2) { c2 = c1->c_next; if (c1->c_name) - free(c1->c_name); + mh_free0(&(c1->c_name)); if (c1->c_text) - free(c1->c_text); + mh_free0(&(c1->c_text)); if (c1->c_ovtxt) - free(c1->c_ovtxt); + mh_free0(&(c1->c_ovtxt)); if (c1->c_fstr) - free(c1->c_fstr); + mh_free0(&(c1->c_fstr)); if (c1->c_fmt) - free((char *) c1->c_fmt); - free((char *) c1); + mh_free0(&(c1->c_fmt)); + mh_free0(&c1); } *head = *tail = NULL; } - static void putcomp(struct mcomp *c1, struct mcomp *c2, int flag) { int count, cchdr; unsigned char *cp; + char trimmed_prefix[BUFSIZ]; + strncpy(trimmed_prefix, c1->c_text ? c1->c_text : c1->c_name, sizeof(trimmed_prefix) - 1); + rtrim(trimmed_prefix); cchdr = 0; lm = 0; wid = c1->c_width ? c1->c_width : global.c_width; @@ -898,11 +933,28 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) onelp = NULL; if (c1->c_flags & CLEARTEXT) { - putstr(c1->c_text); + putstr((c1->c_flags & RTRIM) ? rtrim(c1->c_text) : c1->c_text); putstr("\n"); 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); @@ -923,7 +975,11 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) for (cp = (c1->c_text ? c1->c_text : c1->c_name); *cp; cp++) if (islower(*cp)) *cp = toupper(*cp); - putstr(c1->c_text ? c1->c_text : c1->c_name); + if (*c2->c_text && *c2->c_text != '\n' && *c2->c_text != '\r') { + putstr(c1->c_text ? c1->c_text : c1->c_name); + } else { + putstr(trimmed_prefix); + } if (flag != BODYCOMP) { putstr(": "); if (!(c1->c_flags & SPLIT)) @@ -971,16 +1027,23 @@ putcomp(struct mcomp *c1, struct mcomp *c2, int flag) } count += c1->c_offset; - if ((cp = oneline(c2->c_text, c1->c_flags))) - putstr(cp); + if ((cp = oneline(c2->c_text, c1->c_flags))) { + putstr((c1->c_flags & RTRIM) ? rtrim(cp) : cp); + } if (term == '\n') putstr("\n"); while ((cp = oneline(c2->c_text, c1->c_flags))) { lm = count; - if (flag == BODYCOMP && !(c1->c_flags & NOCOMPONENT)) - putstr(c1->c_text ? c1->c_text : c1->c_name); + if (flag == BODYCOMP && !(c1->c_flags & NOCOMPONENT)) { + if (*cp) { + putstr(c1->c_text ? c1->c_text : c1->c_name); + } else { + putstr(trimmed_prefix); + } + } if (*cp) - putstr(cp); + putstr((c1->c_flags & RTRIM) ? rtrim(cp) : cp); + if (term == '\n') putstr("\n"); } @@ -988,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) { @@ -1038,7 +1100,6 @@ oneline(char *stuff, long flags) return ret; } - static void putstr(char *string) {