From afdfd07fe459aa50a6194355ed8984b6cee4a1ee Mon Sep 17 00:00:00 2001 From: Duncaen Date: Sun, 31 Jul 2016 16:51:49 +0200 Subject: [PATCH 1/3] mpick: fix reuse of num --- mpick.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mpick.c b/mpick.c index 2ac5e49..ba70951 100644 --- a/mpick.c +++ b/mpick.c @@ -796,7 +796,7 @@ eval(struct expr *e, struct mailinfo *m) case EXPR_GT: case EXPR_ALLSET: case EXPR_ANYSET: { - long v = 0, num; + long v = 0, n; if (!m->sb && ( e->a.prop == PROP_ATIME || @@ -813,14 +813,14 @@ eval(struct expr *e, struct mailinfo *m) switch (e->b.var) { case VAR_CUR: if (!cur_idx) - num = (e->op == EXPR_LT || e->op == EXPR_LE) ? LONG_MAX : -1; + n = (e->op == EXPR_LT || e->op == EXPR_LE) ? LONG_MAX : -1; else - num = cur_idx; + n = cur_idx; break; - default: num = 0; + default: n = 0; } } else { - num = e->b.num; + n = e->b.num; } switch (e->a.prop) { @@ -838,14 +838,14 @@ eval(struct expr *e, struct mailinfo *m) } switch (e->op) { - case EXPR_LT: return v < num; - case EXPR_LE: return v <= num; - case EXPR_EQ: return v == num; - case EXPR_NEQ: return v != num; - case EXPR_GE: return v >= num; - case EXPR_GT: return v > num; - case EXPR_ALLSET: return (v & num) == num; - case EXPR_ANYSET: return (v & num) > 0; + case EXPR_LT: return v < n; + case EXPR_LE: return v <= n; + case EXPR_EQ: return v == n; + case EXPR_NEQ: return v != n; + case EXPR_GE: return v >= n; + case EXPR_GT: return v > n; + case EXPR_ALLSET: return (v & n) == n; + case EXPR_ANYSET: return (v & n) > 0; } } case EXPR_STREQ: From 0344e5a425afc11e988101156722a0e47722a1af Mon Sep 17 00:00:00 2001 From: Duncaen Date: Sun, 31 Jul 2016 17:05:20 +0200 Subject: [PATCH 2/3] mpick: add kept expression --- man/mpick.1 | 2 +- mpick.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/man/mpick.1 b/man/mpick.1 index 2ac7911..cbf2ad1 100644 --- a/man/mpick.1 +++ b/man/mpick.1 @@ -101,7 +101,7 @@ tests are given by the following EBNF: ::= atime | ctime | mtime | date - ::= depth | replies | index | size | total + ::= depth | kept | replies | index | size | total ::= <= | < | >= | > | == | = | != diff --git a/mpick.c b/mpick.c index ba70951..25c797e 100644 --- a/mpick.c +++ b/mpick.c @@ -60,6 +60,7 @@ enum prop { PROP_ATIME = 1, PROP_CTIME, PROP_DEPTH, + PROP_KEPT, PROP_MTIME, PROP_PATH, PROP_REPLIES, @@ -460,6 +461,8 @@ parse_cmp() if (token("depth")) prop = PROP_DEPTH; + else if (token("kept")) + prop = PROP_KEPT; else if (token("index")) prop = PROP_INDEX; else if (token("replies")) { @@ -827,6 +830,7 @@ eval(struct expr *e, struct mailinfo *m) case PROP_ATIME: v = m->sb->st_atime; break; case PROP_CTIME: v = m->sb->st_ctime; break; case PROP_MTIME: v = m->sb->st_mtime; break; + case PROP_KEPT: v = kept; break; case PROP_REPLIES: v = m->replies; break; case PROP_SIZE: v = m->sb->st_size; break; case PROP_DATE: v = msg_date(m); break; From 12e504fa42b43e031d070ca37395882a276ddbb0 Mon Sep 17 00:00:00 2001 From: Duncaen Date: Fri, 20 Jan 2017 23:24:39 +0100 Subject: [PATCH 3/3] mpick: add msglist from address support Fixes #9 --- mpick.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/mpick.c b/mpick.c index 25c797e..7850a74 100644 --- a/mpick.c +++ b/mpick.c @@ -721,7 +721,27 @@ parse_msglist(char *s) return e1; } else { - expr = chain(parse_expr("from.addr == 's'"), EXPR_AND, expr); + char *disp, *addr; + + d = blaze822_addr(s, &disp, &addr); + if (!disp && !addr) + parse_error("invalid address at '%.15s'", pos); + + d = strdup((disp) ? disp : addr); + + e1 = mkexpr(EXPR_REGEXI); + e1->a.prop = PROP_FROM; + e1->b.regex = malloc(sizeof (regex_t)); + e1->extra = (disp) ? 0 : 1; + + r = regcomp(e1->b.regex, d, REG_EXTENDED | REG_NOSUB | REG_ICASE); + if (r != 0) { + char msg[256]; + regerror(r, e1->b.regex, msg, sizeof msg); + parse_error("invalid regex '%s': %s", d, msg); + } + + return e1; } } return 0;