cruft
[apps/madmutt.git] / lib-lib / list.c
1 /*
2  *  This program is free software; you can redistribute it and/or modify
3  *  it under the terms of the GNU General Public License as published by
4  *  the Free Software Foundation; either version 2 of the License, or (at
5  *  your option) any later version.
6  *
7  *  This program is distributed in the hope that it will be useful, but
8  *  WITHOUT ANY WARRANTY; without even the implied warranty of
9  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10  *  General Public License for more details.
11  *
12  *  You should have received a copy of the GNU General Public License
13  *  along with this program; if not, write to the Free Software
14  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
15  *  MA 02110-1301, USA.
16  *
17  *  Copyright © 2006 Pierre Habouzit
18  */
19
20 /*
21  * Copyright notice from original mutt:
22  * Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
23  */
24
25 #include "lib-lib.h"
26
27 string_list_t *string_list_dup(const string_list_t *p) {
28     string_list_t *res = NULL;
29     string_list_t **last = &res;
30
31     for (; p; p = p->next) {
32         *last = string_item_new();
33         (*last)->data = m_strdup(p->data);
34         last = &(*last)->next;
35     }
36
37     return res;
38 }
39
40 int string_list_contains(const string_list_t *t, const char *s, const char *any)
41 {
42     while (t) {
43         if (!ascii_strncasecmp(s, t->data, m_strlen(t->data))
44         || (any && !ascii_strcasecmp(t->data, any)))
45             return 1;
46         t = t->next;
47     }
48     return 0;
49 }
50
51 void string_list_add(string_list_t **list, const char *str)
52 {
53     if (m_strisempty(str))
54         return;
55
56     while (*list) {
57         if (!ascii_strcasecmp(str, (*list)->data))
58             return;
59         list = &(*list)->next;
60     }
61
62     *list = p_new(string_list_t, 1);
63     (*list)->data = m_strdup(str);
64 }
65
66 void string_list_remove(string_list_t **l, const char *str)
67 {
68     while (*l) {
69         if (!ascii_strcasecmp(str, (*l)->data)) {
70             string_list_t *it = string_list_pop(l);
71             string_item_delete(&it);
72         } else {
73             l = &(*l)->next;
74         }
75     }
76 }
77
78 /* FIXME: b0rken API's, replace that at any cost */
79 string_list_t *mutt_add_list_n(string_list_t *head, const void *data, size_t len) {
80     string_list_t *tmp;
81
82     for (tmp = head; tmp && tmp->next; tmp = tmp->next);
83
84     if (tmp) {
85         tmp->next = p_new(string_list_t, 1);
86         tmp = tmp->next;
87     } else {
88         head = tmp = p_new(string_list_t, 1);
89     }
90
91     tmp->data = p_dup((const char *)data, len);
92     tmp->next = NULL;
93     return head;
94 }
95