⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.c

📁 EPIC IRC客户端。来源于IRCII客户端但做了很多性能和功能的优化。
💻 C
字号:
/* $EPIC: list.c,v 1.4 2003/05/09 04:29:52 jnelson Exp $ *//* * list.c: some generic linked list managing stuff  * * Copyright (c) 1990 Michael Sandroff. * Copyright (c) 1991, 1992 Troy Rollo. * Copyright (c) 1992-1996 Matthew Green. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notices, the above paragraph (the one permitting redistribution), *    this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. The names of the author(s) may not be used to endorse or promote *    products derived from this software without specific prior written *    permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#include "irc.h"#include "list.h"#include "ircaux.h"static __inline__ int	add_list_strcmp (List *item1, List *item2){	return my_stricmp(item1->name, item2->name);}static __inline__ int	list_strcmp (List *item1, const char *str){	return my_stricmp(item1->name, str);}static __inline__ int	list_match (List *item1, const char *str){	return wild_match(item1->name, str);}/* * add_to_list: This will add an element to a list.  The requirements for the * list are that the first element in each list structure be a pointer to the * next element in the list, and the second element in the list structure be * a pointer to a character (char *) which represents the sort key.  For * example  * * struct my_list{ struct my_list *next; char *name; <whatever else you want>};  * * The parameters are:  "list" which is a pointer to the head of the list. "add" * which is a pre-allocated element to be added to the list. */void 	add_to_list (List **list, List *add){	List	*tmp,		*last = NULL;	for (tmp = *list; tmp; tmp = tmp->next)	{		if (add_list_strcmp(tmp, add) > 0)			break;		last = tmp;	}	if (last)		last->next = add;	else		*list = add;	add->next = tmp;	return;}/* * find_in_list: This looks up the given name in the given list.  List and * name are as described above.  If wild is true, each name in the list is * used as a wild card expression to match name... otherwise, normal matching * is done  */List	*find_in_list (List **list, const char *name, int wild){	List	*tmp;	int	best_match = 0,		current_match;	int	(*cmp_func) (List *, const char *);	cmp_func = wild ? list_match : list_strcmp;	if (wild)	{		List	*match = (List *) 0;		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 ((List *) 0);}/* * remove_from_list: this remove the given name from the given list (again as * described above).  If found, it is removed from the list and returned * (memory is not deallocated).  If not found, null is returned.  */List	*remove_from_list (List **list, const char *name){	List	*tmp,		*last = NULL;	for (tmp = *list; tmp; tmp = tmp->next)	{		if (list_strcmp(tmp, name) == 0)		{			if (last)				last->next = tmp->next;			else				*list = tmp->next;			return (tmp);		}		last = tmp;	}	return ((List *) 0);}/* * list_lookup: this routine just consolidates remove_from_list and * find_in_list.  I did this cause it fit better with some alread existing * code  */List 	*list_lookup (List **list, const char *name, int wild, int rem){	List	*tmp;	if (rem)		tmp = remove_from_list(list, name);	else		tmp = find_in_list(list, name, wild);	return (tmp);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -