Home | History | Annotate | Line # | Download | only in datastruct
      1 /*	$NetBSD: str_list.c,v 1.1.1.2 2009/12/02 00:26:32 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 		log_errno(ENOMEM, "str_list allocation failed");
     27 		return NULL;
     28 	}
     29 
     30 	dm_list_init(sl);
     31 
     32 	return sl;
     33 }
     34 
     35 int str_list_add(struct dm_pool *mem, struct dm_list *sll, const char *str)
     36 {
     37 	struct str_list *sln;
     38 
     39 	if (!str)
     40 		return_0;
     41 
     42 	/* Already in list? */
     43 	if (str_list_match_item(sll, str))
     44 		return 1;
     45 
     46 	if (!(sln = dm_pool_alloc(mem, sizeof(*sln))))
     47 		return_0;
     48 
     49 	sln->str = str;
     50 	dm_list_add(sll, &sln->list);
     51 
     52 	return 1;
     53 }
     54 
     55 int str_list_del(struct dm_list *sll, const char *str)
     56 {
     57 	struct dm_list *slh, *slht;
     58 
     59 	dm_list_iterate_safe(slh, slht, sll) {
     60 		if (!strcmp(str, dm_list_item(slh, struct str_list)->str))
     61 			 dm_list_del(slh);
     62 	}
     63 
     64 	return 1;
     65 }
     66 
     67 int str_list_dup(struct dm_pool *mem, struct dm_list *sllnew,
     68 		 const struct dm_list *sllold)
     69 {
     70 	struct str_list *sl;
     71 
     72 	dm_list_init(sllnew);
     73 
     74 	dm_list_iterate_items(sl, sllold) {
     75 		if (!str_list_add(mem, sllnew, dm_pool_strdup(mem, sl->str)))
     76 			return_0;
     77 	}
     78 
     79 	return 1;
     80 }
     81 
     82 /*
     83  * Is item on list?
     84  */
     85 int str_list_match_item(const struct dm_list *sll, const char *str)
     86 {
     87 	struct str_list *sl;
     88 
     89 	dm_list_iterate_items(sl, sll)
     90 	    if (!strcmp(str, sl->str))
     91 		return 1;
     92 
     93 	return 0;
     94 }
     95 
     96 /*
     97  * Is at least one item on both lists?
     98  */
     99 int str_list_match_list(const struct dm_list *sll, const struct dm_list *sll2)
    100 {
    101 	struct str_list *sl;
    102 
    103 	dm_list_iterate_items(sl, sll)
    104 	    if (str_list_match_item(sll2, sl->str))
    105 		return 1;
    106 
    107 	return 0;
    108 }
    109 
    110 /*
    111  * Do both lists contain the same set of items?
    112  */
    113 int str_list_lists_equal(const struct dm_list *sll, const struct dm_list *sll2)
    114 {
    115 	struct str_list *sl;
    116 
    117 	if (dm_list_size(sll) != dm_list_size(sll2))
    118 		return 0;
    119 
    120 	dm_list_iterate_items(sl, sll)
    121 	    if (!str_list_match_item(sll2, sl->str))
    122 		return 0;
    123 
    124 	return 1;
    125 }
    126