Open SCAP Library
Loading...
Searching...
No Matches
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
40typedef void (*oscap_dump_func) ();
41// generic comparison function type
42typedef 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
53struct 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
61struct oscap_list *oscap_list_new(void);
62void oscap_create_lists(struct oscap_list **first, ...);
63bool oscap_list_add(struct oscap_list *list, void *value);
64bool oscap_list_push(struct oscap_list *list, void *value);
65bool oscap_list_prepend(struct oscap_list *list, void *value);
66bool oscap_list_pop(struct oscap_list *list, oscap_destruct_func destructor);
67bool oscap_list_remove(struct oscap_list *list, void *value, oscap_cmp_func compare, oscap_destruct_func destructor);
68struct oscap_list *oscap_list_clone(const struct oscap_list * list, oscap_clone_func cloner);
69void oscap_list_free(struct oscap_list *list, oscap_destruct_func destructor);
70void oscap_list_free0(struct oscap_list *list);
71void oscap_list_dump(struct oscap_list *list, oscap_dump_func dumper, int depth);
72int oscap_list_get_itemcount(struct oscap_list *list);
73bool oscap_list_contains(struct oscap_list *list, void *what, oscap_cmp_func compare);
74struct oscap_list *oscap_list_destructive_join(struct oscap_list *list1, struct oscap_list *list2);
75
76
77
78/* Linked List iterator. */
79
80typedef 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
91void *oscap_iterator_new(struct oscap_list *list);
92void *oscap_iterator_new_filter(struct oscap_list *list, oscap_filter_func filter, void *user_data);
93void *oscap_iterator_next(struct oscap_iterator *it);
94size_t oscap_iterator_get_itemcount(const struct oscap_iterator *it);
95bool oscap_iterator_has_more(struct oscap_iterator *it);
96void oscap_iterator_reset(struct oscap_iterator *it);
97void *oscap_iterator_detach(struct oscap_iterator *it);
98void oscap_iterator_free(struct oscap_iterator *it);
99
100
101void *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.
170typedef 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.
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 */
193struct 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 */
202struct 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 */
209struct 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 */
215bool 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 */
221void *oscap_htable_get(struct oscap_htable *htable, const char *key);
222
228size_t oscap_htable_itemcount(struct oscap_htable *htable);
229
230void *oscap_htable_detach(struct oscap_htable *htable, const char *key);
231
232void 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 */
239void 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 */
244void oscap_htable_free0(struct oscap_htable *htable);
245
246
251
257struct oscap_htable_iterator *oscap_htable_iterator_new(struct oscap_htable *htable);
258
264bool oscap_htable_iterator_has_more(struct oscap_htable_iterator *hit);
265
271const struct oscap_htable_item *oscap_htable_iterator_next(struct oscap_htable_iterator *hit);
272
278const char *oscap_htable_iterator_next_key(struct oscap_htable_iterator *hit);
279
285void *oscap_htable_iterator_next_value(struct oscap_htable_iterator *hit);
286
294void oscap_htable_iterator_next_kv(struct oscap_htable_iterator *hit, const char **key, void **value);
295
300void oscap_htable_iterator_reset(struct oscap_htable_iterator *hit);
301
306void oscap_htable_iterator_free(struct oscap_htable_iterator *hit);
307
308void 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