about summary refs log tree commit diff
path: root/mpick.c
diff options
context:
space:
mode:
authorDuncaen <mail@duncano.de>2017-04-17 02:54:22 +0200
committerDuncaen <mail@duncano.de>2017-04-17 03:01:57 +0200
commit9bec745dde6a85b16d2bb87a4ab1c86961e5d950 (patch)
tree6113d3dfb054ac3f858718e4f86705a0e3e5e95d /mpick.c
parent2895704eee6330cb549964de2d8b662040010fdd (diff)
downloadmblaze-9bec745dde6a85b16d2bb87a4ab1c86961e5d950.tar.gz
mblaze-9bec745dde6a85b16d2bb87a4ab1c86961e5d950.tar.xz
mblaze-9bec745dde6a85b16d2bb87a4ab1c86961e5d950.zip
mpick: allow string expressions on any header
Diffstat (limited to 'mpick.c')
-rw-r--r--mpick.c36
1 files changed, 19 insertions, 17 deletions
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++;