aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mime-node.c27
-rw-r--r--notmuch-client.h5
2 files changed, 32 insertions, 0 deletions
diff --git a/mime-node.c b/mime-node.c
index 760c55f6..d26bb445 100644
--- a/mime-node.c
+++ b/mime-node.c
@@ -236,3 +236,30 @@ mime_node_child (const mime_node_t *parent, int child)
}
return _mime_node_create (parent, sub);
}
+
+static mime_node_t *
+_mime_node_seek_dfs_walk (mime_node_t *node, int *n)
+{
+ mime_node_t *ret = NULL;
+ int i;
+
+ if (*n == 0)
+ return node;
+
+ *n -= 1;
+ for (i = 0; i < node->nchildren && !ret; i++) {
+ mime_node_t *child = mime_node_child (node, i);
+ ret = _mime_node_seek_dfs_walk (child, n);
+ if (!ret)
+ talloc_free (child);
+ }
+ return ret;
+}
+
+mime_node_t *
+mime_node_seek_dfs (mime_node_t *node, int n)
+{
+ if (n < 0)
+ return NULL;
+ return _mime_node_seek_dfs_walk (node, &n);
+}
diff --git a/notmuch-client.h b/notmuch-client.h
index 64b255c7..517c010a 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -324,5 +324,10 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
mime_node_t *
mime_node_child (const mime_node_t *parent, int child);
+/* Return the nth child of node in a depth-first traversal. If n is
+ * 0, returns node itself. Returns NULL if there is no such part. */
+mime_node_t *
+mime_node_seek_dfs (mime_node_t *node, int n);
+
#include "command-line-arguments.h"
#endif