From 1d02dd64afe245a2b5a8461feeba975e61f0c233 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 11 Nov 2010 00:07:24 -0800 Subject: lib: Add new, public notmuch_message_get_filenames This augments the existing notmuch_message_get_filename by allowing the caller access to all filenames in the case of multiple files for a single message. To support this, we split the iterator (notmuch_filenames_t) away from the list storage (notmuch_filename_list_t) where previously these were a single object (notmuch_filenames_t). Then, whenever the user asks for a file or filename, the message object lazily creates a complete notmuch_filename_list_t and then: For notmuch_message_get_filename, returns the first filename in the list. For notmuch_message_get_filenames, creates and returns a new iterator for the filename list. --- lib/filenames.c | 72 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 33 deletions(-) (limited to 'lib/filenames.c') diff --git a/lib/filenames.c b/lib/filenames.c index cff9e830..50e14354 100644 --- a/lib/filenames.c +++ b/lib/filenames.c @@ -20,55 +20,67 @@ #include "notmuch-private.h" -typedef struct _notmuch_filenames_node { - char *filename; - struct _notmuch_filenames_node *next; -} notmuch_filenames_node_t; - struct _notmuch_filenames { - notmuch_filenames_node_t *head; - notmuch_filenames_node_t **tail; - notmuch_filenames_node_t *iterator; + notmuch_filename_node_t *iterator; }; -/* Create a new notmuch_filenames_t object, with 'ctx' as its +/* Create a new notmuch_filename_list_t object, with 'ctx' as its * talloc owner. * * This function can return NULL in case of out-of-memory. */ -notmuch_filenames_t * -_notmuch_filenames_create (const void *ctx) +notmuch_filename_list_t * +_notmuch_filename_list_create (const void *ctx) { - notmuch_filenames_t *filenames; + notmuch_filename_list_t *list; - filenames = talloc (ctx, notmuch_filenames_t); - if (unlikely (filenames == NULL)) + list = talloc (ctx, notmuch_filename_list_t); + if (unlikely (list == NULL)) return NULL; - filenames->head = NULL; - filenames->tail = &filenames->head; - - filenames->iterator = NULL; + list->head = NULL; + list->tail = &list->head; - return filenames; + return list; } -/* Append a single 'node' to the end of 'filenames'. - */ void -_notmuch_filenames_add_filename (notmuch_filenames_t *filenames, - const char *filename) +_notmuch_filename_list_add_filename (notmuch_filename_list_t *list, + const char *filename) { /* Create and initialize new node. */ - notmuch_filenames_node_t *node = talloc (filenames, - notmuch_filenames_node_t); + notmuch_filename_node_t *node = talloc (list, + notmuch_filename_node_t); node->filename = talloc_strdup (node, filename); node->next = NULL; /* Append the node to the list. */ - *(filenames->tail) = node; - filenames->tail = &node->next; + *(list->tail) = node; + list->tail = &node->next; +} + +void +_notmuch_filename_list_destroy (notmuch_filename_list_t *list) +{ + talloc_free (list); +} + +/* The notmuch_filenames_t is an iterator object for a + * notmuch_filename_list_t */ +notmuch_filenames_t * +_notmuch_filenames_create (const void *ctx, + notmuch_filename_list_t *list) +{ + notmuch_filenames_t *filenames; + + filenames = talloc (ctx, notmuch_filenames_t); + if (unlikely (filenames == NULL)) + return NULL; + + filenames->iterator = list->head; + + return filenames; } notmuch_bool_t @@ -89,12 +101,6 @@ notmuch_filenames_get (notmuch_filenames_t *filenames) return filenames->iterator->filename; } -void -_notmuch_filenames_move_to_first (notmuch_filenames_t *filenames) -{ - filenames->iterator = filenames->head; -} - void notmuch_filenames_move_to_next (notmuch_filenames_t *filenames) { -- cgit v1.2.3