+int string_list_contains(const string_list_t *t, const char *s, const char *any)
+{
+ while (t) {
+ if (!ascii_strncasecmp(s, t->data, m_strlen(t->data))
+ || (any && !ascii_strcasecmp(t->data, any)))
+ return 1;
+ t = t->next;
+ }
+ return 0;
+}
+
+void string_list_add(string_list_t **list, const char *str)
+{
+ if (m_strisempty(str))
+ return;
+
+ while (*list) {
+ if (!ascii_strcasecmp(str, (*list)->data))
+ return;
+ list = &(*list)->next;
+ }
+
+ *list = p_new(string_list_t, 1);
+ (*list)->data = m_strdup(str);
+}
+
+void string_list_remove(string_list_t **l, const char *str)
+{
+ while (*l) {
+ if (!ascii_strcasecmp(str, (*l)->data)) {
+ string_list_t *it = string_list_pop(l);
+ string_item_delete(&it);
+ } else {
+ l = &(*l)->next;
+ }
+ }
+}
+
+/* FIXME: b0rken API's, replace that at any cost */