diff options
author | Carl Worth <cworth@cworth.org> | 2010-11-11 00:07:24 -0800 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2010-11-11 03:40:19 -0800 |
commit | 1d02dd64afe245a2b5a8461feeba975e61f0c233 (patch) | |
tree | 53ac99ecf481c27709e2d0f26b9c7d8d6d246b02 /lib/filenames.c | |
parent | d87db8843266caf6b11c1f2f1874328830b23878 (diff) |
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.
Diffstat (limited to 'lib/filenames.c')
-rw-r--r-- | lib/filenames.c | 72 |
1 files changed, 39 insertions, 33 deletions
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 @@ -90,12 +102,6 @@ notmuch_filenames_get (notmuch_filenames_t *filenames) } void -_notmuch_filenames_move_to_first (notmuch_filenames_t *filenames) -{ - filenames->iterator = filenames->head; -} - -void notmuch_filenames_move_to_next (notmuch_filenames_t *filenames) { if (filenames->iterator == NULL) |