Home | History | Annotate | Download | only in mixer
      1 /*
      2  *  Bag of pointers
      3  *  Copyright (c) 2001 by Abramo Bagnara <abramo (at) alsa-project.org>
      4  *
      5  *
      6  *   This library is free software; you can redistribute it and/or modify
      7  *   it under the terms of the GNU Lesser General Public License as
      8  *   published by the Free Software Foundation; either version 2.1 of
      9  *   the License, or (at your option) any later version.
     10  *
     11  *   This program is distributed in the hope that it will be useful,
     12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  *   GNU Lesser General Public License for more details.
     15  *
     16  *   You should have received a copy of the GNU Lesser General Public
     17  *   License along with this library; if not, write to the Free Software
     18  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
     19  *
     20  */
     21 
     22 #include "mixer_local.h"
     23 
     24 int bag_new(bag_t **bag)
     25 {
     26 	bag_t *b = malloc(sizeof(*b));
     27 	if (!b)
     28 		return -ENOMEM;
     29 	INIT_LIST_HEAD(b);
     30 	*bag = b;
     31 	return 0;
     32 }
     33 
     34 void bag_free(bag_t *bag)
     35 {
     36 	assert(list_empty(bag));
     37 	free(bag);
     38 }
     39 
     40 int bag_empty(bag_t *bag)
     41 {
     42 	return list_empty(bag);
     43 }
     44 
     45 int bag_add(bag_t *bag, void *ptr)
     46 {
     47 	bag1_t *b = malloc(sizeof(*b));
     48 	if (!b)
     49 		return -ENOMEM;
     50 	b->ptr = ptr;
     51 	list_add_tail(&b->list, bag);
     52 	return 0;
     53 }
     54 
     55 int bag_del(bag_t *bag, void *ptr)
     56 {
     57 	struct list_head *pos;
     58 	list_for_each(pos, bag) {
     59 		bag1_t *b = list_entry(pos, bag1_t, list);
     60 		if (b->ptr == ptr) {
     61 			list_del(&b->list);
     62 			free(b);
     63 			return 0;
     64 		}
     65 	}
     66 	return -ENOENT;
     67 }
     68 
     69 void bag_del_all(bag_t *bag)
     70 {
     71 	while (!list_empty(bag))
     72 		list_del(bag->next);
     73 }
     74