#include "irc.h"
static char cvsrevision[] = "$Id: list.c 3 2008-02-25 09:49:14Z keaston $";
CVS_REVISION(list_c)
#include "struct.h"
#include "list.h"
#include "ircaux.h"
#define MAIN_SOURCE
#include "modval.h"
static int add_list_stricmp (List *, List *);
static int list_stricmp (List *, char *);
static int list_match (List *, char *);
static int add_list_stricmp(List *item1, List *item2)
{
return my_stricmp(item1->name, item2->name);
}
static int list_stricmp(List *item1, char *str)
{
return my_stricmp(item1->name, str);
}
int list_strnicmp(List *item1, char *str)
{
return my_strnicmp(item1->name, str, strlen(str));
}
static int list_wildstrcmp(List *item1, char *str)
{
if (wild_match(item1->name, str) || wild_match(str, item1->name))
return 0;
else
return 1;
}
static int list_match(List *item1, char *str)
{
return wild_match(item1->name, str);
}
void BX_add_to_list_ext(List **list, List *add, int (*cmp_func)(List *, List *))
{
register List *tmp;
List *last;
if (!cmp_func)
cmp_func = add_list_stricmp;
last = NULL;
for (tmp = *list; tmp; tmp = tmp->next)
{
if (cmp_func(tmp, add) > 0)
break;
last = tmp;
}
if (last)
last->next = add;
else
*list = add;
add->next = tmp;
}
void BX_add_to_list(List **list, List *add)
{
add_to_list_ext(list, add, NULL);
}
List * BX_find_in_list_ext(register List **list, char *name, int wild, int (*cmp_func)(List *, char *))
{
register List *tmp;
int best_match,
current_match;
if (!cmp_func)
cmp_func = wild ? list_match : list_stricmp;
best_match = 0;
if (wild)
{
register List *match = NULL;
for (tmp = *list; tmp; tmp = tmp->next)
{
if ((current_match = cmp_func(tmp, name)) > best_match)
{
match = tmp;
best_match = current_match;
}
}
return (match);
}
else
{
for (tmp = *list; tmp; tmp = tmp->next)
if (cmp_func(tmp, name) == 0)
return (tmp);
}
return NULL;
}
List * BX_find_in_list(List **list, char *name, int wild)
{
return find_in_list_ext(list, name, wild, NULL);
}
List *BX_remove_from_list_ext(List **list, char *name, int (*cmp_func)(List *, char *))
{
register List *tmp;
List *last;
if (!cmp_func)
cmp_func = list_stricmp;
last = NULL;
for (tmp = *list; tmp; tmp = tmp->next)
{
if (!cmp_func(tmp, name))
{
if (last)
last->next = tmp->next;
else
*list = tmp->next;
return (tmp);
}
last = tmp;
}
return NULL;
}
List *BX_remove_from_list(List **list, char *name)
{
return remove_from_list_ext(list, name, NULL);
}
List *BX_removewild_from_list(List **list, char *name)
{
return remove_from_list_ext(list, name, list_wildstrcmp);
}
List *BX_list_lookup_ext(register List **list, char *name, int wild, int delete, int (*cmp_func)(List *, char *))
{
register List *tmp;
if (delete)
tmp = remove_from_list_ext(list, name, cmp_func);
else
tmp = find_in_list_ext(list, name, wild, cmp_func);
return (tmp);
}
List *BX_list_lookup(List **list, char *name, int wild, int delete)
{
return list_lookup_ext(list, name, wild, delete, NULL);
}