xref: /netbsd-src/external/gpl2/lvm2/dist/lib/datastruct/str_list.c (revision 274254cdae52594c1aa480a736aef78313d15c9c)
1 /*	$NetBSD: str_list.c,v 1.1.1.1 2008/12/22 00:17:54 haad Exp $	*/
2 
3 /*
4  * Copyright (C) 2003-2004 Sistina Software, Inc. All rights reserved.
5  * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
6  *
7  * This file is part of LVM2.
8  *
9  * This copyrighted material is made available to anyone wishing to use,
10  * modify, copy, or redistribute it subject to the terms and conditions
11  * of the GNU Lesser General Public License v.2.1.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program; if not, write to the Free Software Foundation,
15  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  */
17 
18 #include "lib.h"
19 #include "str_list.h"
20 
21 struct dm_list *str_list_create(struct dm_pool *mem)
22 {
23 	struct dm_list *sl;
24 
25 	if (!(sl = dm_pool_alloc(mem, sizeof(struct dm_list))))
26 		return_NULL;
27 
28 	dm_list_init(sl);
29 
30 	return sl;
31 }
32 
33 int str_list_add(struct dm_pool *mem, struct dm_list *sll, const char *str)
34 {
35 	struct str_list *sln;
36 
37 	if (!str)
38 		return_0;
39 
40 	/* Already in list? */
41 	if (str_list_match_item(sll, str))
42 		return 1;
43 
44 	if (!(sln = dm_pool_alloc(mem, sizeof(*sln))))
45 		return_0;
46 
47 	sln->str = str;
48 	dm_list_add(sll, &sln->list);
49 
50 	return 1;
51 }
52 
53 int str_list_del(struct dm_list *sll, const char *str)
54 {
55 	struct dm_list *slh, *slht;
56 
57 	dm_list_iterate_safe(slh, slht, sll) {
58 		if (!strcmp(str, dm_list_item(slh, struct str_list)->str))
59 			 dm_list_del(slh);
60 	}
61 
62 	return 1;
63 }
64 
65 int str_list_dup(struct dm_pool *mem, struct dm_list *sllnew,
66 		 const struct dm_list *sllold)
67 {
68 	struct str_list *sl;
69 
70 	dm_list_init(sllnew);
71 
72 	dm_list_iterate_items(sl, sllold) {
73 		if (!str_list_add(mem, sllnew, dm_pool_strdup(mem, sl->str)))
74 			return_0;
75 	}
76 
77 	return 1;
78 }
79 
80 /*
81  * Is item on list?
82  */
83 int str_list_match_item(const struct dm_list *sll, const char *str)
84 {
85 	struct str_list *sl;
86 
87 	dm_list_iterate_items(sl, sll)
88 	    if (!strcmp(str, sl->str))
89 		return 1;
90 
91 	return 0;
92 }
93 
94 /*
95  * Is at least one item on both lists?
96  */
97 int str_list_match_list(const struct dm_list *sll, const struct dm_list *sll2)
98 {
99 	struct str_list *sl;
100 
101 	dm_list_iterate_items(sl, sll)
102 	    if (str_list_match_item(sll2, sl->str))
103 		return 1;
104 
105 	return 0;
106 }
107 
108 /*
109  * Do both lists contain the same set of items?
110  */
111 int str_list_lists_equal(const struct dm_list *sll, const struct dm_list *sll2)
112 {
113 	struct str_list *sl;
114 
115 	if (dm_list_size(sll) != dm_list_size(sll2))
116 		return 0;
117 
118 	dm_list_iterate_items(sl, sll)
119 	    if (!str_list_match_item(sll2, sl->str))
120 		return 0;
121 
122 	return 1;
123 }
124