1 /* nv_pair_list.c - the opkg package management system
2 
3    Carl D. Worth
4 
5    Copyright (C) 2001 University of Southern California
6 
7    This program is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License as
9    published by the Free Software Foundation; either version 2, or (at
10    your option) any later version.
11 
12    This program is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16 */
17 
18 #include "nv_pair.h"
19 #include "void_list.h"
20 #include "nv_pair_list.h"
21 #include "libbb/libbb.h"
22 
nv_pair_list_init(nv_pair_list_t * list)23 void nv_pair_list_init(nv_pair_list_t * list)
24 {
25 	void_list_init((void_list_t *) list);
26 }
27 
nv_pair_list_deinit(nv_pair_list_t * list)28 void nv_pair_list_deinit(nv_pair_list_t * list)
29 {
30 	nv_pair_list_elt_t *pos;
31 	nv_pair_t *nv_pair;
32 
33 	while (!void_list_empty(list)) {
34 		pos = nv_pair_list_pop(list);
35 		if (!pos)
36 			break;
37 		nv_pair = (nv_pair_t *) pos->data;
38 		nv_pair_deinit(nv_pair);
39 		/* malloced in nv_pair_list_append */
40 		free(nv_pair);
41 		pos->data = NULL;
42 		free(pos);
43 	}
44 	void_list_deinit((void_list_t *) list);
45 }
46 
nv_pair_list_append(nv_pair_list_t * list,const char * name,const char * value)47 nv_pair_t *nv_pair_list_append(nv_pair_list_t * list, const char *name,
48 			       const char *value)
49 {
50 	/* freed in nv_pair_list_deinit */
51 	nv_pair_t *nv_pair = xcalloc(1, sizeof(nv_pair_t));
52 	nv_pair_init(nv_pair, name, value);
53 	void_list_append((void_list_t *) list, nv_pair);
54 
55 	return nv_pair;
56 }
57 
nv_pair_list_push(nv_pair_list_t * list,nv_pair_t * data)58 void nv_pair_list_push(nv_pair_list_t * list, nv_pair_t * data)
59 {
60 	void_list_push((void_list_t *) list, data);
61 }
62 
nv_pair_list_pop(nv_pair_list_t * list)63 nv_pair_list_elt_t *nv_pair_list_pop(nv_pair_list_t * list)
64 {
65 	return (nv_pair_list_elt_t *) void_list_pop((void_list_t *) list);
66 }
67 
nv_pair_list_find(nv_pair_list_t * list,char * name)68 char *nv_pair_list_find(nv_pair_list_t * list, char *name)
69 {
70 	nv_pair_list_elt_t *iter;
71 	nv_pair_t *nv_pair;
72 
73 	list_for_each_entry(iter, &list->head, node) {
74 		nv_pair = (nv_pair_t *) iter->data;
75 		if (strcmp(nv_pair->name, name) == 0) {
76 			return nv_pair->value;
77 		}
78 	}
79 	return NULL;
80 }
81 
nv_pair_list_first(nv_pair_list_t * list)82 nv_pair_list_elt_t *nv_pair_list_first(nv_pair_list_t * list)
83 {
84 	return (nv_pair_list_elt_t *) void_list_first((void_list_t *) list);
85 }
86 
nv_pair_list_next(nv_pair_list_t * list,nv_pair_list_elt_t * node)87 nv_pair_list_elt_t *nv_pair_list_next(nv_pair_list_t * list,
88 				      nv_pair_list_elt_t * node)
89 {
90 	return (nv_pair_list_elt_t *) void_list_next((void_list_t *) list,
91 						     (void_list_elt_t *) node);
92 }
93