Open SCAP Library
list.h
1 /*
2  * Copyright 2009 Red Hat Inc., Durham, North Carolina.
3  * All Rights Reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  *
19  * Authors:
20  * Lukas Kuklinek <lkuklinek@redhat.com>
21  */
22 
23 /*
24  * @file
25  * @internal
26  * @{
27  */
28 #ifndef OSCAP_LIST_
29 #define OSCAP_LIST_
30 
31 #include <stdlib.h>
32 #include <stdbool.h>
33 
34 #include "util.h"
35 #include "public/oscap.h"
36 #include "public/oscap_text.h"
37 
38 
39 // list item dump function type
40 typedef void (*oscap_dump_func) ();
41 // generic comparison function type
42 typedef bool (*oscap_cmp_func) (void *, void *);
43 
44 /*
45  * Linear linked list.
46  */
47 
49  void *data;
50  struct oscap_list_item *next;
51 };
52 
53 struct oscap_list {
54  struct oscap_list_item *first;
55  struct oscap_list_item *last;
56  size_t itemcount;
57 };
58 
59 // FIXME: SCE engine uses these
60 
61 struct oscap_list *oscap_list_new(void);
62 void oscap_create_lists(struct oscap_list **first, ...);
63 bool oscap_list_add(struct oscap_list *list, void *value);
64 bool oscap_list_push(struct oscap_list *list, void *value);
65 bool oscap_list_prepend(struct oscap_list *list, void *value);
66 bool oscap_list_pop(struct oscap_list *list, oscap_destruct_func destructor);
67 bool oscap_list_remove(struct oscap_list *list, void *value, oscap_cmp_func compare, oscap_destruct_func destructor);
68 struct oscap_list *oscap_list_clone(const struct oscap_list * list, oscap_clone_func cloner);
69 void oscap_list_free(struct oscap_list *list, oscap_destruct_func destructor);
70 void oscap_list_free0(struct oscap_list *list);
71 void oscap_list_dump(struct oscap_list *list, oscap_dump_func dumper, int depth);
72 int oscap_list_get_itemcount(struct oscap_list *list);
73 bool oscap_list_contains(struct oscap_list *list, void *what, oscap_cmp_func compare);
74 struct oscap_list *oscap_list_destructive_join(struct oscap_list *list1, struct oscap_list *list2);
75 
76 
77 
78 /* Linked List iterator. */
79 
80 typedef bool(*oscap_filter_func) (void *, void *);
81 
83  struct oscap_list_item *cur;
84  struct oscap_list *list;
85  oscap_filter_func filter;
86  void *user_data;
87 };
88 
89 // FIXME: SCE engine uses these
90 
91 void *oscap_iterator_new(struct oscap_list *list);
92 void *oscap_iterator_new_filter(struct oscap_list *list, oscap_filter_func filter, void *user_data);
93 void *oscap_iterator_next(struct oscap_iterator *it);
94 size_t oscap_iterator_get_itemcount(const struct oscap_iterator *it);
95 bool oscap_iterator_has_more(struct oscap_iterator *it);
96 void oscap_iterator_reset(struct oscap_iterator *it);
97 void *oscap_iterator_detach(struct oscap_iterator *it);
98 void oscap_iterator_free(struct oscap_iterator *it);
99 
100 
101 void *oscap_list_find(struct oscap_list *list, void *what, oscap_cmp_func compare);
102 
109 #define OSCAP_FOREACH_GENERIC(itype, vtype, val, init_val, code) \
110  { \
111  struct itype##_iterator *val##_iter = (init_val); \
112  vtype val; \
113  while (itype##_iterator_has_more(val##_iter)) { \
114  val = itype##_iterator_next(val##_iter); \
115  code \
116  } \
117  itype##_iterator_free(val##_iter); \
118  }
119 
128 #define OSCAP_FOREACH(type, val, init_val, code) \
129  OSCAP_FOREACH_GENERIC(type, struct type *, val, init_val, code)
130 
142 #define OSCAP_FOR_GENERIC(itype, vtype, val, init_val) \
143  vtype val = NULL; struct itype##_iterator *val##_iter = (init_val); \
144  while (itype##_iterator_has_more(val##_iter) \
145  ? (val = itype##_iterator_next(val##_iter), true) \
146  : (itype##_iterator_free(val##_iter), val##_iter = NULL, false))
147 
155 #define OSCAP_FOR(type, val, init_val) OSCAP_FOR_GENERIC(type, struct type *, val, init_val)
156 
163 #define OSCAP_FOR_STR(val, init_val) OSCAP_FOR_GENERIC(oscap_string, const char *, val, init_val)
164 
165 /*
166  * Hash table
167  */
168 
169 // Comparison function.
170 typedef int (*oscap_compare_func) (const char *, const char *);
171 // Hash table item.
173  struct oscap_htable_item *next; // Next item.
174  char *key; // Item key.
175  void *value; // Item value.
176 };
177 
178 // Hash table.
179 struct oscap_htable {
180  size_t hsize; // Size of the hash table.
181  size_t itemcount; // Number of elements in the hash table.
182  struct oscap_htable_item **table; // The table itself.
183  oscap_compare_func cmp; // Funcion used to compare keys (e.g. strcmp).
184 };
185 
186 /*
187  * Create a new hash table.
188  * @param cmp Pointer to a function used as the key comparator.
189  * @hsize Size of the hash table.
190  * @internal
191  * @return new hash table
192  */
193 struct oscap_htable *oscap_htable_new1(oscap_compare_func cmp, size_t hsize);
194 
195 /*
196  * Create a new hash table.
197  *
198  * The table will use strcmp() as the comparison function and will have default table size.
199  * @see oscap_htable_new1()
200  * @return new hash table
201  */
202 struct oscap_htable *oscap_htable_new(void);
203 
204 /*
205  * Do a Deep Copy of a hashtable and all of its items
206  *
207  * @return deep copy of hash table
208  */
209 struct oscap_htable * oscap_htable_clone(const struct oscap_htable * table, oscap_clone_func cloner);
210 
211 /*
212  * Add an item to the hash table.
213  * @return True on success, false if the key already exists.
214  */
215 bool oscap_htable_add(struct oscap_htable *htable, const char *key, void *item);
216 
217 /*
218  * Get a hash table item.
219  * @return An item, NULL if item with specified key is not present in the hash table.
220  */
221 void *oscap_htable_get(struct oscap_htable *htable, const char *key);
222 
228 size_t oscap_htable_itemcount(struct oscap_htable *htable);
229 
230 void *oscap_htable_detach(struct oscap_htable *htable, const char *key);
231 
232 void oscap_htable_dump(struct oscap_htable *htable, oscap_dump_func dumper, int depth);
233 
234 /*
235  * Delete the hash table.
236  * @param htable Hash table to be deleted.
237  * @param destructor Function used to delete individual items.
238  */
239 void oscap_htable_free(struct oscap_htable *htable, oscap_destruct_func destructor);
240 /*
241  * Dispose the hash table -- do not dispose individial items.
242  * @param htable Hash table to be deleted.
243  */
244 void oscap_htable_free0(struct oscap_htable *htable);
245 
246 
250 struct oscap_htable_iterator;
251 
257 struct oscap_htable_iterator *oscap_htable_iterator_new(struct oscap_htable *htable);
258 
264 bool oscap_htable_iterator_has_more(struct oscap_htable_iterator *hit);
265 
271 const struct oscap_htable_item *oscap_htable_iterator_next(struct oscap_htable_iterator *hit);
272 
278 const char *oscap_htable_iterator_next_key(struct oscap_htable_iterator *hit);
279 
285 void *oscap_htable_iterator_next_value(struct oscap_htable_iterator *hit);
286 
294 void oscap_htable_iterator_next_kv(struct oscap_htable_iterator *hit, const char **key, void **value);
295 
300 void oscap_htable_iterator_reset(struct oscap_htable_iterator *hit);
301 
306 void oscap_htable_iterator_free(struct oscap_htable_iterator *hit);
307 
308 void oscap_print_depth(int depth);
309 
310 
311 #endif
General OpenScap functions and types.
Multilingual text processing interface.
Definition: list.h:172
Definition: list.c:572
Definition: list.h:179
Definition: list.h:82
Definition: list.h:48
Definition: list.h:53