X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=lib%2Ffilenames.c;fp=lib%2Ffilenames.c;h=cff9e8302d21c17bc59874a5c229567df33910ca;hp=0000000000000000000000000000000000000000;hb=d87db8843266caf6b11c1f2f1874328830b23878;hpb=d422dcf0a276f2806d5563fbdc48fa7d69e4c3eb diff --git a/lib/filenames.c b/lib/filenames.c new file mode 100644 index 00000000..cff9e830 --- /dev/null +++ b/lib/filenames.c @@ -0,0 +1,111 @@ +/* filenames.c - Iterator for a list of filenames + * + * Copyright © 2010 Intel Corporation + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/ . + * + * Author: Carl Worth + */ + +#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; +}; + +/* Create a new notmuch_filenames_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_filenames_t *filenames; + + filenames = talloc (ctx, notmuch_filenames_t); + if (unlikely (filenames == NULL)) + return NULL; + + filenames->head = NULL; + filenames->tail = &filenames->head; + + filenames->iterator = NULL; + + return filenames; +} + +/* Append a single 'node' to the end of 'filenames'. + */ +void +_notmuch_filenames_add_filename (notmuch_filenames_t *filenames, + const char *filename) +{ + /* Create and initialize new node. */ + notmuch_filenames_node_t *node = talloc (filenames, + notmuch_filenames_node_t); + + node->filename = talloc_strdup (node, filename); + node->next = NULL; + + /* Append the node to the list. */ + *(filenames->tail) = node; + filenames->tail = &node->next; +} + +notmuch_bool_t +notmuch_filenames_valid (notmuch_filenames_t *filenames) +{ + if (filenames == NULL) + return FALSE; + + return (filenames->iterator != NULL); +} + +const char * +notmuch_filenames_get (notmuch_filenames_t *filenames) +{ + if (filenames->iterator == NULL) + return NULL; + + 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) +{ + if (filenames->iterator == NULL) + return; + + filenames->iterator = filenames->iterator->next; +} + +void +notmuch_filenames_destroy (notmuch_filenames_t *filenames) +{ + talloc_free (filenames); +}