mpick: add 'replies' filter expression

pull/2/head
Duncaen 8 years ago committed by Christian Neukirchen
parent 6fbe731671
commit afd499696d

@ -49,6 +49,7 @@ enum prop {
PROP_DEPTH,
PROP_MTIME,
PROP_PATH,
PROP_REPLIES,
PROP_SIZE,
PROP_TOTAL,
PROP_SUBJECT,
@ -106,6 +107,7 @@ struct mailinfo {
struct mlist {
struct mailinfo *m;
struct mlist *parent;
struct mlist *next;
};
@ -430,7 +432,10 @@ parse_cmp()
prop = PROP_DEPTH;
else if (token("index"))
prop = PROP_INDEX;
else if (token("size"))
else if (token("replies")) {
prop = PROP_REPLIES;
need_thr = 1;
} else if (token("size"))
prop = PROP_SIZE;
else if (token("total"))
prop = PROP_TOTAL;
@ -690,7 +695,7 @@ msg_date(struct mailinfo *m)
return m->date;
char *b;
if ((b = blaze822_hdr(m->msg, "date")))
if (m->msg && (b = blaze822_hdr(m->msg, "date")))
return (m->date = blaze822_date(b));
return -1;
@ -703,7 +708,7 @@ msg_subject(struct mailinfo *m)
return m->subject;
char *b;
if ((b = blaze822_hdr(m->msg, "subject")) == '\0')
if (m->msg == 0 || (b = blaze822_hdr(m->msg, "subject")) == 0)
return "";
blaze822_decode_rfc2047(m->subject, b, sizeof m->subject - 1, "UTF-8");
@ -751,6 +756,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_REPLIES: v = m->replies; break;
case PROP_SIZE: v = m->sb->st_size; break;
case PROP_DATE: v = msg_date(m);
case PROP_FLAG: v = m->flags; break;
@ -819,6 +825,7 @@ mailfile(char *file)
m->fpath = file;
m->index = num++;
m->flags = 0;
m->replies = 0;
m->depth = 0;
m->sb = 0;
m->msg = 0;
@ -834,7 +841,7 @@ mailfile(char *file)
m->msg = blaze822(m->fpath);
if (!m->msg)
return 0;
return m;
if ((e = strrchr(m->fpath, '/') - 1) && (e - m->fpath) >= 2 &&
*e-- == 'w' && *e-- == 'e' && *e-- == 'n')
@ -909,6 +916,7 @@ do_thr()
}
free(thr);
thr = 0;
}
void
@ -935,28 +943,33 @@ collect(char *file)
ml = thr->cur = thr->childs;
thr->cur->m = m;
} else {
/* previous mail is a prent, current one is a child */
if (thr->cur->m->depth < m->depth)
ml = thr->cur + 1;
if (thr->cur->m->depth < m->depth) {
/* previous mail is a prent */
thr->cur->m->flags |= FLAG_PARENT;
ml->parent = thr->cur;
} else if (thr->cur->m->depth == m->depth) {
/* same depth == same parent */
ml->parent = thr->cur->parent;
} else if (thr->cur->m->depth > m->depth) {
/* find parent mail */
struct mlist *pl;
for (pl = thr->cur; pl->m->depth >= m->depth; pl--);
ml->parent = pl;
}
m->flags |= FLAG_CHILD;
ml = thr->cur + 1;
thr->cur->next = ml;
thr->cur = ml;
ml->m = m;
}
m->fpath = strdup(m->fpath);
for (ml = ml->parent; ml; ml = ml->parent)
ml->m->replies++;
if (Tflag) {
if (thr->matched)
return;
if (expr && !eval(expr, m))
return;
thr->matched++;
}
m->fpath = strdup(m->fpath);
}
void
@ -964,18 +977,19 @@ oneline(char *file)
{
struct mailinfo *m;
if ((m = mailfile(file)) == 0)
return;
m = mailfile(file);
if (expr && !eval(expr, m))
goto out;
printf("%s\n", file);
fputs(file, stdout);
putchar('\n');
kept++;
out:
blaze822_free(m->msg);
free(m->sb);
if (m->msg)
blaze822_free(m->msg);
if (m->sb)
free(m->sb);
free(m);
}

Loading…
Cancel
Save