summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2016-07-18 19:42:25 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2016-07-18 19:42:25 +0200
commit7f81aa6012164f64876c9ad370105792b6042953 (patch)
treeeff6771bfec902a4919e6a1b481247068a8aecad
parent11f1ff945ab2ea8fc508c87ac51b126b038dc030 (diff)
downloadmblaze-7f81aa6012164f64876c9ad370105792b6042953.tar.gz
mblaze-7f81aa6012164f64876c9ad370105792b6042953.tar.xz
mblaze-7f81aa6012164f64876c9ad370105792b6042953.zip
thread: prune empty messages from top with only one child
-rw-r--r--thread.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/thread.c b/thread.c
index 829fe02..b645233 100644
--- a/thread.c
+++ b/thread.c
@@ -243,6 +243,22 @@ find_roots()
 }
 
 void
+prune_tree(struct container *c, int depth)
+{
+	do {
+		if (c->child)
+			prune_tree(c->child, depth+1);
+		if (!c->file && c->child && !c->child->next) {
+			// turn into child if we don't exist and only have a child
+			c->mid = c->child->mid;
+			c->file = c->child->file;
+			c->msg = c->child->msg;
+			c->child = c->child->child;
+		}
+	} while ((c = c->next));
+}
+
+void
 print_tree(struct container *c, int depth)
 {
 	do {
@@ -267,7 +283,7 @@ main(int argc, char *argv[])
 	int i = blaze822_loop(argc-1, argv+1, thread);
 
 	find_roots();
-
+	prune_tree(top, -1);
 	print_tree(top, -1);
 
 	fprintf(stderr, "%d mails threaded\n", i);