From 9bec745dde6a85b16d2bb87a4ab1c86961e5d950 Mon Sep 17 00:00:00 2001 From: Duncaen Date: Mon, 17 Apr 2017 02:54:22 +0200 Subject: mpick: allow string expressions on any header --- mpick.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'mpick.c') diff --git a/mpick.c b/mpick.c index ae745db..9bc216f 100644 --- a/mpick.c +++ b/mpick.c @@ -76,7 +76,6 @@ enum prop { PROP_REPLIES, PROP_SIZE, PROP_TOTAL, - PROP_SUBJECT, PROP_FROM, PROP_TO, PROP_INDEX, @@ -130,7 +129,6 @@ struct mailinfo { int prune; int flags; off_t total; - char *subject; }; struct mlist { @@ -331,14 +329,18 @@ parse_strcmp() { enum prop prop; enum op op; + char *h; - if (token("subject")) - prop = PROP_SUBJECT; - else if (token("from")) + h = 0; + prop = 0; + + if (token("from")) prop = PROP_FROM; else if (token("to")) prop = PROP_TO; - else + else if (token("subject")) + h = "subject"; + else if (!parse_string(&h)) return parse_inner(); if (token("~~~")) @@ -366,7 +368,11 @@ parse_strcmp() int r = 0; struct expr *e = mkexpr(op); - e->a.prop = prop; + + if (prop) + e->a.prop = prop; + else + e->a.string = h; if (prop == PROP_FROM || prop == PROP_TO) { char *disp, *addr; @@ -666,7 +672,7 @@ parse_msglist(char *s) case '/': s++; e1 = mkexpr(EXPR_REGEXI); - e1->a.prop = PROP_SUBJECT; + e1->a.string = "subject"; e1->b.regex = malloc(sizeof (regex_t)); r = regcomp(e1->b.regex, s, REG_EXTENDED | REG_NOSUB | REG_ICASE); if (r != 0) { @@ -774,16 +780,13 @@ msg_date(struct mailinfo *m) } char * -msg_subject(struct mailinfo *m) +msg_hdr(struct mailinfo *m, const char *h) { - if (m->subject) - return m->subject; - if (!m->msg) m->msg = blaze822(m->fpath); char *b; - if (!m->msg || !(b = blaze822_hdr(m->msg, "subject"))) + if (!m->msg || !(b = blaze822_chdr(m->msg, h))) goto err; char buf[100]; @@ -791,9 +794,9 @@ msg_subject(struct mailinfo *m) if (!*buf) goto err; - return (m->subject = strdup(buf)); + return strdup(buf); err: - return (m->subject = ""); + return ""; } char * @@ -904,9 +907,9 @@ eval(struct expr *e, struct mailinfo *m) const char *s = ""; switch(e->a.prop) { case PROP_PATH: s = m->fpath; break; - case PROP_SUBJECT: s = msg_subject(m); break; case PROP_FROM: s = msg_addr(m, "from", e->extra); break; case PROP_TO: s = msg_addr(m, "to", e->extra); break; + default: s = msg_hdr(m, e->a.string); break; } switch (e->op) { case EXPR_STREQ: return strcmp(e->b.string, s) == 0; @@ -947,7 +950,6 @@ mailfile(char *file) m->depth = 0; m->sb = 0; m->msg = 0; - m->subject = 0; while (*m->fpath == ' ' || *m->fpath== '\t') { m->depth++; -- cgit 1.4.1