root / qdict.c @ 408392b3
History | View | Annotate | Download (8.8 kB)
1 | fb08dde0 | Luiz Capitulino | /*
|
---|---|---|---|
2 | 41836a9f | Luiz Capitulino | * QDict Module
|
3 | fb08dde0 | Luiz Capitulino | *
|
4 | fb08dde0 | Luiz Capitulino | * Copyright (C) 2009 Red Hat Inc.
|
5 | fb08dde0 | Luiz Capitulino | *
|
6 | fb08dde0 | Luiz Capitulino | * Authors:
|
7 | fb08dde0 | Luiz Capitulino | * Luiz Capitulino <lcapitulino@redhat.com>
|
8 | fb08dde0 | Luiz Capitulino | *
|
9 | 41836a9f | Luiz Capitulino | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
10 | 41836a9f | Luiz Capitulino | * See the COPYING.LIB file in the top-level directory.
|
11 | fb08dde0 | Luiz Capitulino | */
|
12 | fb08dde0 | Luiz Capitulino | |
13 | fb08dde0 | Luiz Capitulino | #include "qint.h" |
14 | acc3b033 | Markus Armbruster | #include "qfloat.h" |
15 | fb08dde0 | Luiz Capitulino | #include "qdict.h" |
16 | cd4dde36 | Luiz Capitulino | #include "qbool.h" |
17 | fb08dde0 | Luiz Capitulino | #include "qstring.h" |
18 | fb08dde0 | Luiz Capitulino | #include "qobject.h" |
19 | 72cf2d4f | Blue Swirl | #include "qemu-queue.h" |
20 | fb08dde0 | Luiz Capitulino | #include "qemu-common.h" |
21 | fb08dde0 | Luiz Capitulino | |
22 | aa43d9cc | Blue Swirl | static void qdict_destroy_obj(QObject *obj); |
23 | aa43d9cc | Blue Swirl | |
24 | aa43d9cc | Blue Swirl | static const QType qdict_type = { |
25 | aa43d9cc | Blue Swirl | .code = QTYPE_QDICT, |
26 | aa43d9cc | Blue Swirl | .destroy = qdict_destroy_obj, |
27 | aa43d9cc | Blue Swirl | }; |
28 | fb08dde0 | Luiz Capitulino | |
29 | fb08dde0 | Luiz Capitulino | /**
|
30 | fb08dde0 | Luiz Capitulino | * qdict_new(): Create a new QDict
|
31 | fb08dde0 | Luiz Capitulino | *
|
32 | fb08dde0 | Luiz Capitulino | * Return strong reference.
|
33 | fb08dde0 | Luiz Capitulino | */
|
34 | fb08dde0 | Luiz Capitulino | QDict *qdict_new(void)
|
35 | fb08dde0 | Luiz Capitulino | { |
36 | fb08dde0 | Luiz Capitulino | QDict *qdict; |
37 | fb08dde0 | Luiz Capitulino | |
38 | fb08dde0 | Luiz Capitulino | qdict = qemu_mallocz(sizeof(*qdict));
|
39 | fb08dde0 | Luiz Capitulino | QOBJECT_INIT(qdict, &qdict_type); |
40 | fb08dde0 | Luiz Capitulino | |
41 | fb08dde0 | Luiz Capitulino | return qdict;
|
42 | fb08dde0 | Luiz Capitulino | } |
43 | fb08dde0 | Luiz Capitulino | |
44 | fb08dde0 | Luiz Capitulino | /**
|
45 | fb08dde0 | Luiz Capitulino | * qobject_to_qdict(): Convert a QObject into a QDict
|
46 | fb08dde0 | Luiz Capitulino | */
|
47 | fb08dde0 | Luiz Capitulino | QDict *qobject_to_qdict(const QObject *obj)
|
48 | fb08dde0 | Luiz Capitulino | { |
49 | fb08dde0 | Luiz Capitulino | if (qobject_type(obj) != QTYPE_QDICT)
|
50 | fb08dde0 | Luiz Capitulino | return NULL; |
51 | fb08dde0 | Luiz Capitulino | |
52 | fb08dde0 | Luiz Capitulino | return container_of(obj, QDict, base);
|
53 | fb08dde0 | Luiz Capitulino | } |
54 | fb08dde0 | Luiz Capitulino | |
55 | fb08dde0 | Luiz Capitulino | /**
|
56 | fb08dde0 | Luiz Capitulino | * tdb_hash(): based on the hash agorithm from gdbm, via tdb
|
57 | fb08dde0 | Luiz Capitulino | * (from module-init-tools)
|
58 | fb08dde0 | Luiz Capitulino | */
|
59 | fb08dde0 | Luiz Capitulino | static unsigned int tdb_hash(const char *name) |
60 | fb08dde0 | Luiz Capitulino | { |
61 | fb08dde0 | Luiz Capitulino | unsigned value; /* Used to compute the hash value. */ |
62 | fb08dde0 | Luiz Capitulino | unsigned i; /* Used to cycle through random values. */ |
63 | fb08dde0 | Luiz Capitulino | |
64 | fb08dde0 | Luiz Capitulino | /* Set the initial value from the key size. */
|
65 | fb08dde0 | Luiz Capitulino | for (value = 0x238F13AF * strlen(name), i=0; name[i]; i++) |
66 | fb08dde0 | Luiz Capitulino | value = (value + (((const unsigned char *)name)[i] << (i*5 % 24))); |
67 | fb08dde0 | Luiz Capitulino | |
68 | fb08dde0 | Luiz Capitulino | return (1103515243 * value + 12345); |
69 | fb08dde0 | Luiz Capitulino | } |
70 | fb08dde0 | Luiz Capitulino | |
71 | fb08dde0 | Luiz Capitulino | /**
|
72 | fb08dde0 | Luiz Capitulino | * alloc_entry(): allocate a new QDictEntry
|
73 | fb08dde0 | Luiz Capitulino | */
|
74 | fb08dde0 | Luiz Capitulino | static QDictEntry *alloc_entry(const char *key, QObject *value) |
75 | fb08dde0 | Luiz Capitulino | { |
76 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
77 | fb08dde0 | Luiz Capitulino | |
78 | fb08dde0 | Luiz Capitulino | entry = qemu_mallocz(sizeof(*entry));
|
79 | fb08dde0 | Luiz Capitulino | entry->key = qemu_strdup(key); |
80 | fb08dde0 | Luiz Capitulino | entry->value = value; |
81 | fb08dde0 | Luiz Capitulino | |
82 | fb08dde0 | Luiz Capitulino | return entry;
|
83 | fb08dde0 | Luiz Capitulino | } |
84 | fb08dde0 | Luiz Capitulino | |
85 | fb08dde0 | Luiz Capitulino | /**
|
86 | fb08dde0 | Luiz Capitulino | * qdict_find(): List lookup function
|
87 | fb08dde0 | Luiz Capitulino | */
|
88 | fb08dde0 | Luiz Capitulino | static QDictEntry *qdict_find(const QDict *qdict, |
89 | fb08dde0 | Luiz Capitulino | const char *key, unsigned int hash) |
90 | fb08dde0 | Luiz Capitulino | { |
91 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
92 | fb08dde0 | Luiz Capitulino | |
93 | 72cf2d4f | Blue Swirl | QLIST_FOREACH(entry, &qdict->table[hash], next) |
94 | fb08dde0 | Luiz Capitulino | if (!strcmp(entry->key, key))
|
95 | fb08dde0 | Luiz Capitulino | return entry;
|
96 | fb08dde0 | Luiz Capitulino | |
97 | fb08dde0 | Luiz Capitulino | return NULL; |
98 | fb08dde0 | Luiz Capitulino | } |
99 | fb08dde0 | Luiz Capitulino | |
100 | fb08dde0 | Luiz Capitulino | /**
|
101 | fb08dde0 | Luiz Capitulino | * qdict_put_obj(): Put a new QObject into the dictionary
|
102 | fb08dde0 | Luiz Capitulino | *
|
103 | fb08dde0 | Luiz Capitulino | * Insert the pair 'key:value' into 'qdict', if 'key' already exists
|
104 | fb08dde0 | Luiz Capitulino | * its 'value' will be replaced.
|
105 | fb08dde0 | Luiz Capitulino | *
|
106 | fb08dde0 | Luiz Capitulino | * This is done by freeing the reference to the stored QObject and
|
107 | fb08dde0 | Luiz Capitulino | * storing the new one in the same entry.
|
108 | fb08dde0 | Luiz Capitulino | *
|
109 | fb08dde0 | Luiz Capitulino | * NOTE: ownership of 'value' is transferred to the QDict
|
110 | fb08dde0 | Luiz Capitulino | */
|
111 | fb08dde0 | Luiz Capitulino | void qdict_put_obj(QDict *qdict, const char *key, QObject *value) |
112 | fb08dde0 | Luiz Capitulino | { |
113 | fb08dde0 | Luiz Capitulino | unsigned int hash; |
114 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
115 | fb08dde0 | Luiz Capitulino | |
116 | fb08dde0 | Luiz Capitulino | hash = tdb_hash(key) % QDICT_HASH_SIZE; |
117 | fb08dde0 | Luiz Capitulino | entry = qdict_find(qdict, key, hash); |
118 | fb08dde0 | Luiz Capitulino | if (entry) {
|
119 | fb08dde0 | Luiz Capitulino | /* replace key's value */
|
120 | fb08dde0 | Luiz Capitulino | qobject_decref(entry->value); |
121 | fb08dde0 | Luiz Capitulino | entry->value = value; |
122 | fb08dde0 | Luiz Capitulino | } else {
|
123 | fb08dde0 | Luiz Capitulino | /* allocate a new entry */
|
124 | fb08dde0 | Luiz Capitulino | entry = alloc_entry(key, value); |
125 | 72cf2d4f | Blue Swirl | QLIST_INSERT_HEAD(&qdict->table[hash], entry, next); |
126 | 29ec3156 | Luiz Capitulino | qdict->size++; |
127 | fb08dde0 | Luiz Capitulino | } |
128 | fb08dde0 | Luiz Capitulino | } |
129 | fb08dde0 | Luiz Capitulino | |
130 | fb08dde0 | Luiz Capitulino | /**
|
131 | fb08dde0 | Luiz Capitulino | * qdict_get(): Lookup for a given 'key'
|
132 | fb08dde0 | Luiz Capitulino | *
|
133 | fb08dde0 | Luiz Capitulino | * Return a weak reference to the QObject associated with 'key' if
|
134 | fb08dde0 | Luiz Capitulino | * 'key' is present in the dictionary, NULL otherwise.
|
135 | fb08dde0 | Luiz Capitulino | */
|
136 | fb08dde0 | Luiz Capitulino | QObject *qdict_get(const QDict *qdict, const char *key) |
137 | fb08dde0 | Luiz Capitulino | { |
138 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
139 | fb08dde0 | Luiz Capitulino | |
140 | fb08dde0 | Luiz Capitulino | entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE); |
141 | fb08dde0 | Luiz Capitulino | return (entry == NULL ? NULL : entry->value); |
142 | fb08dde0 | Luiz Capitulino | } |
143 | fb08dde0 | Luiz Capitulino | |
144 | fb08dde0 | Luiz Capitulino | /**
|
145 | fb08dde0 | Luiz Capitulino | * qdict_haskey(): Check if 'key' exists
|
146 | fb08dde0 | Luiz Capitulino | *
|
147 | fb08dde0 | Luiz Capitulino | * Return 1 if 'key' exists in the dict, 0 otherwise
|
148 | fb08dde0 | Luiz Capitulino | */
|
149 | fb08dde0 | Luiz Capitulino | int qdict_haskey(const QDict *qdict, const char *key) |
150 | fb08dde0 | Luiz Capitulino | { |
151 | fb08dde0 | Luiz Capitulino | unsigned int hash = tdb_hash(key) % QDICT_HASH_SIZE; |
152 | fb08dde0 | Luiz Capitulino | return (qdict_find(qdict, key, hash) == NULL ? 0 : 1); |
153 | fb08dde0 | Luiz Capitulino | } |
154 | fb08dde0 | Luiz Capitulino | |
155 | fb08dde0 | Luiz Capitulino | /**
|
156 | fb08dde0 | Luiz Capitulino | * qdict_size(): Return the size of the dictionary
|
157 | fb08dde0 | Luiz Capitulino | */
|
158 | fb08dde0 | Luiz Capitulino | size_t qdict_size(const QDict *qdict)
|
159 | fb08dde0 | Luiz Capitulino | { |
160 | fb08dde0 | Luiz Capitulino | return qdict->size;
|
161 | fb08dde0 | Luiz Capitulino | } |
162 | fb08dde0 | Luiz Capitulino | |
163 | fb08dde0 | Luiz Capitulino | /**
|
164 | fb08dde0 | Luiz Capitulino | * qdict_get_obj(): Get a QObject of a specific type
|
165 | fb08dde0 | Luiz Capitulino | */
|
166 | fb08dde0 | Luiz Capitulino | static QObject *qdict_get_obj(const QDict *qdict, const char *key, |
167 | fb08dde0 | Luiz Capitulino | qtype_code type) |
168 | fb08dde0 | Luiz Capitulino | { |
169 | fb08dde0 | Luiz Capitulino | QObject *obj; |
170 | fb08dde0 | Luiz Capitulino | |
171 | fb08dde0 | Luiz Capitulino | obj = qdict_get(qdict, key); |
172 | fb08dde0 | Luiz Capitulino | assert(obj != NULL);
|
173 | fb08dde0 | Luiz Capitulino | assert(qobject_type(obj) == type); |
174 | fb08dde0 | Luiz Capitulino | |
175 | fb08dde0 | Luiz Capitulino | return obj;
|
176 | fb08dde0 | Luiz Capitulino | } |
177 | fb08dde0 | Luiz Capitulino | |
178 | fb08dde0 | Luiz Capitulino | /**
|
179 | acc3b033 | Markus Armbruster | * qdict_get_double(): Get an number mapped by 'key'
|
180 | acc3b033 | Markus Armbruster | *
|
181 | acc3b033 | Markus Armbruster | * This function assumes that 'key' exists and it stores a
|
182 | acc3b033 | Markus Armbruster | * QFloat or QInt object.
|
183 | acc3b033 | Markus Armbruster | *
|
184 | acc3b033 | Markus Armbruster | * Return number mapped by 'key'.
|
185 | acc3b033 | Markus Armbruster | */
|
186 | acc3b033 | Markus Armbruster | double qdict_get_double(const QDict *qdict, const char *key) |
187 | acc3b033 | Markus Armbruster | { |
188 | acc3b033 | Markus Armbruster | QObject *obj = qdict_get(qdict, key); |
189 | acc3b033 | Markus Armbruster | |
190 | acc3b033 | Markus Armbruster | assert(obj); |
191 | acc3b033 | Markus Armbruster | switch (qobject_type(obj)) {
|
192 | acc3b033 | Markus Armbruster | case QTYPE_QFLOAT:
|
193 | acc3b033 | Markus Armbruster | return qfloat_get_double(qobject_to_qfloat(obj));
|
194 | acc3b033 | Markus Armbruster | case QTYPE_QINT:
|
195 | acc3b033 | Markus Armbruster | return qint_get_int(qobject_to_qint(obj));
|
196 | acc3b033 | Markus Armbruster | default:
|
197 | 43dc2a64 | Blue Swirl | abort(); |
198 | acc3b033 | Markus Armbruster | } |
199 | acc3b033 | Markus Armbruster | } |
200 | acc3b033 | Markus Armbruster | |
201 | acc3b033 | Markus Armbruster | /**
|
202 | fb08dde0 | Luiz Capitulino | * qdict_get_int(): Get an integer mapped by 'key'
|
203 | fb08dde0 | Luiz Capitulino | *
|
204 | fb08dde0 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
205 | fb08dde0 | Luiz Capitulino | * QInt object.
|
206 | fb08dde0 | Luiz Capitulino | *
|
207 | fb08dde0 | Luiz Capitulino | * Return integer mapped by 'key'.
|
208 | fb08dde0 | Luiz Capitulino | */
|
209 | fb08dde0 | Luiz Capitulino | int64_t qdict_get_int(const QDict *qdict, const char *key) |
210 | fb08dde0 | Luiz Capitulino | { |
211 | fb08dde0 | Luiz Capitulino | QObject *obj = qdict_get_obj(qdict, key, QTYPE_QINT); |
212 | fb08dde0 | Luiz Capitulino | return qint_get_int(qobject_to_qint(obj));
|
213 | fb08dde0 | Luiz Capitulino | } |
214 | fb08dde0 | Luiz Capitulino | |
215 | fb08dde0 | Luiz Capitulino | /**
|
216 | cd4dde36 | Luiz Capitulino | * qdict_get_bool(): Get a bool mapped by 'key'
|
217 | cd4dde36 | Luiz Capitulino | *
|
218 | cd4dde36 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
219 | cd4dde36 | Luiz Capitulino | * QBool object.
|
220 | cd4dde36 | Luiz Capitulino | *
|
221 | cd4dde36 | Luiz Capitulino | * Return bool mapped by 'key'.
|
222 | cd4dde36 | Luiz Capitulino | */
|
223 | cd4dde36 | Luiz Capitulino | int qdict_get_bool(const QDict *qdict, const char *key) |
224 | cd4dde36 | Luiz Capitulino | { |
225 | cd4dde36 | Luiz Capitulino | QObject *obj = qdict_get_obj(qdict, key, QTYPE_QBOOL); |
226 | cd4dde36 | Luiz Capitulino | return qbool_get_int(qobject_to_qbool(obj));
|
227 | cd4dde36 | Luiz Capitulino | } |
228 | cd4dde36 | Luiz Capitulino | |
229 | cd4dde36 | Luiz Capitulino | /**
|
230 | f2e17508 | Luiz Capitulino | * qdict_get_qlist(): Get the QList mapped by 'key'
|
231 | f2e17508 | Luiz Capitulino | *
|
232 | f2e17508 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
233 | f2e17508 | Luiz Capitulino | * QList object.
|
234 | f2e17508 | Luiz Capitulino | *
|
235 | f2e17508 | Luiz Capitulino | * Return QList mapped by 'key'.
|
236 | f2e17508 | Luiz Capitulino | */
|
237 | f2e17508 | Luiz Capitulino | QList *qdict_get_qlist(const QDict *qdict, const char *key) |
238 | f2e17508 | Luiz Capitulino | { |
239 | f2e17508 | Luiz Capitulino | return qobject_to_qlist(qdict_get_obj(qdict, key, QTYPE_QLIST));
|
240 | f2e17508 | Luiz Capitulino | } |
241 | f2e17508 | Luiz Capitulino | |
242 | f2e17508 | Luiz Capitulino | /**
|
243 | df10ce6a | Luiz Capitulino | * qdict_get_qdict(): Get the QDict mapped by 'key'
|
244 | df10ce6a | Luiz Capitulino | *
|
245 | df10ce6a | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
246 | df10ce6a | Luiz Capitulino | * QDict object.
|
247 | df10ce6a | Luiz Capitulino | *
|
248 | df10ce6a | Luiz Capitulino | * Return QDict mapped by 'key'.
|
249 | df10ce6a | Luiz Capitulino | */
|
250 | df10ce6a | Luiz Capitulino | QDict *qdict_get_qdict(const QDict *qdict, const char *key) |
251 | df10ce6a | Luiz Capitulino | { |
252 | df10ce6a | Luiz Capitulino | return qobject_to_qdict(qdict_get_obj(qdict, key, QTYPE_QDICT));
|
253 | df10ce6a | Luiz Capitulino | } |
254 | df10ce6a | Luiz Capitulino | |
255 | df10ce6a | Luiz Capitulino | /**
|
256 | fb08dde0 | Luiz Capitulino | * qdict_get_str(): Get a pointer to the stored string mapped
|
257 | fb08dde0 | Luiz Capitulino | * by 'key'
|
258 | fb08dde0 | Luiz Capitulino | *
|
259 | fb08dde0 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
260 | fb08dde0 | Luiz Capitulino | * QString object.
|
261 | fb08dde0 | Luiz Capitulino | *
|
262 | fb08dde0 | Luiz Capitulino | * Return pointer to the string mapped by 'key'.
|
263 | fb08dde0 | Luiz Capitulino | */
|
264 | fb08dde0 | Luiz Capitulino | const char *qdict_get_str(const QDict *qdict, const char *key) |
265 | fb08dde0 | Luiz Capitulino | { |
266 | fb08dde0 | Luiz Capitulino | QObject *obj = qdict_get_obj(qdict, key, QTYPE_QSTRING); |
267 | fb08dde0 | Luiz Capitulino | return qstring_get_str(qobject_to_qstring(obj));
|
268 | fb08dde0 | Luiz Capitulino | } |
269 | fb08dde0 | Luiz Capitulino | |
270 | fb08dde0 | Luiz Capitulino | /**
|
271 | fb08dde0 | Luiz Capitulino | * qdict_get_try_int(): Try to get integer mapped by 'key'
|
272 | fb08dde0 | Luiz Capitulino | *
|
273 | fb08dde0 | Luiz Capitulino | * Return integer mapped by 'key', if it is not present in
|
274 | fb08dde0 | Luiz Capitulino | * the dictionary or if the stored object is not of QInt type
|
275 | fb08dde0 | Luiz Capitulino | * 'err_value' will be returned.
|
276 | fb08dde0 | Luiz Capitulino | */
|
277 | fb08dde0 | Luiz Capitulino | int64_t qdict_get_try_int(const QDict *qdict, const char *key, |
278 | fb08dde0 | Luiz Capitulino | int64_t err_value) |
279 | fb08dde0 | Luiz Capitulino | { |
280 | fb08dde0 | Luiz Capitulino | QObject *obj; |
281 | fb08dde0 | Luiz Capitulino | |
282 | fb08dde0 | Luiz Capitulino | obj = qdict_get(qdict, key); |
283 | fb08dde0 | Luiz Capitulino | if (!obj || qobject_type(obj) != QTYPE_QINT)
|
284 | fb08dde0 | Luiz Capitulino | return err_value;
|
285 | fb08dde0 | Luiz Capitulino | |
286 | fb08dde0 | Luiz Capitulino | return qint_get_int(qobject_to_qint(obj));
|
287 | fb08dde0 | Luiz Capitulino | } |
288 | fb08dde0 | Luiz Capitulino | |
289 | fb08dde0 | Luiz Capitulino | /**
|
290 | fb08dde0 | Luiz Capitulino | * qdict_get_try_str(): Try to get a pointer to the stored string
|
291 | fb08dde0 | Luiz Capitulino | * mapped by 'key'
|
292 | fb08dde0 | Luiz Capitulino | *
|
293 | fb08dde0 | Luiz Capitulino | * Return a pointer to the string mapped by 'key', if it is not present
|
294 | fb08dde0 | Luiz Capitulino | * in the dictionary or if the stored object is not of QString type
|
295 | fb08dde0 | Luiz Capitulino | * NULL will be returned.
|
296 | fb08dde0 | Luiz Capitulino | */
|
297 | fb08dde0 | Luiz Capitulino | const char *qdict_get_try_str(const QDict *qdict, const char *key) |
298 | fb08dde0 | Luiz Capitulino | { |
299 | fb08dde0 | Luiz Capitulino | QObject *obj; |
300 | fb08dde0 | Luiz Capitulino | |
301 | fb08dde0 | Luiz Capitulino | obj = qdict_get(qdict, key); |
302 | fb08dde0 | Luiz Capitulino | if (!obj || qobject_type(obj) != QTYPE_QSTRING)
|
303 | fb08dde0 | Luiz Capitulino | return NULL; |
304 | fb08dde0 | Luiz Capitulino | |
305 | fb08dde0 | Luiz Capitulino | return qstring_get_str(qobject_to_qstring(obj));
|
306 | fb08dde0 | Luiz Capitulino | } |
307 | fb08dde0 | Luiz Capitulino | |
308 | fb08dde0 | Luiz Capitulino | /**
|
309 | 21f800d3 | Luiz Capitulino | * qdict_iter(): Iterate over all the dictionary's stored values.
|
310 | 21f800d3 | Luiz Capitulino | *
|
311 | 21f800d3 | Luiz Capitulino | * This function allows the user to provide an iterator, which will be
|
312 | 21f800d3 | Luiz Capitulino | * called for each stored value in the dictionary.
|
313 | 21f800d3 | Luiz Capitulino | */
|
314 | 21f800d3 | Luiz Capitulino | void qdict_iter(const QDict *qdict, |
315 | 21f800d3 | Luiz Capitulino | void (*iter)(const char *key, QObject *obj, void *opaque), |
316 | 21f800d3 | Luiz Capitulino | void *opaque)
|
317 | 21f800d3 | Luiz Capitulino | { |
318 | 21f800d3 | Luiz Capitulino | int i;
|
319 | 21f800d3 | Luiz Capitulino | QDictEntry *entry; |
320 | 21f800d3 | Luiz Capitulino | |
321 | 21f800d3 | Luiz Capitulino | for (i = 0; i < QDICT_HASH_SIZE; i++) { |
322 | 21f800d3 | Luiz Capitulino | QLIST_FOREACH(entry, &qdict->table[i], next) |
323 | 21f800d3 | Luiz Capitulino | iter(entry->key, entry->value, opaque); |
324 | 21f800d3 | Luiz Capitulino | } |
325 | 21f800d3 | Luiz Capitulino | } |
326 | 21f800d3 | Luiz Capitulino | |
327 | 21f800d3 | Luiz Capitulino | /**
|
328 | fb08dde0 | Luiz Capitulino | * qentry_destroy(): Free all the memory allocated by a QDictEntry
|
329 | fb08dde0 | Luiz Capitulino | */
|
330 | fb08dde0 | Luiz Capitulino | static void qentry_destroy(QDictEntry *e) |
331 | fb08dde0 | Luiz Capitulino | { |
332 | fb08dde0 | Luiz Capitulino | assert(e != NULL);
|
333 | fb08dde0 | Luiz Capitulino | assert(e->key != NULL);
|
334 | fb08dde0 | Luiz Capitulino | assert(e->value != NULL);
|
335 | fb08dde0 | Luiz Capitulino | |
336 | fb08dde0 | Luiz Capitulino | qobject_decref(e->value); |
337 | fb08dde0 | Luiz Capitulino | qemu_free(e->key); |
338 | fb08dde0 | Luiz Capitulino | qemu_free(e); |
339 | fb08dde0 | Luiz Capitulino | } |
340 | fb08dde0 | Luiz Capitulino | |
341 | fb08dde0 | Luiz Capitulino | /**
|
342 | fb08dde0 | Luiz Capitulino | * qdict_del(): Delete a 'key:value' pair from the dictionary
|
343 | fb08dde0 | Luiz Capitulino | *
|
344 | fb08dde0 | Luiz Capitulino | * This will destroy all data allocated by this entry.
|
345 | fb08dde0 | Luiz Capitulino | */
|
346 | fb08dde0 | Luiz Capitulino | void qdict_del(QDict *qdict, const char *key) |
347 | fb08dde0 | Luiz Capitulino | { |
348 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
349 | fb08dde0 | Luiz Capitulino | |
350 | fb08dde0 | Luiz Capitulino | entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE); |
351 | fb08dde0 | Luiz Capitulino | if (entry) {
|
352 | 72cf2d4f | Blue Swirl | QLIST_REMOVE(entry, next); |
353 | fb08dde0 | Luiz Capitulino | qentry_destroy(entry); |
354 | fb08dde0 | Luiz Capitulino | qdict->size--; |
355 | fb08dde0 | Luiz Capitulino | } |
356 | fb08dde0 | Luiz Capitulino | } |
357 | fb08dde0 | Luiz Capitulino | |
358 | fb08dde0 | Luiz Capitulino | /**
|
359 | fb08dde0 | Luiz Capitulino | * qdict_destroy_obj(): Free all the memory allocated by a QDict
|
360 | fb08dde0 | Luiz Capitulino | */
|
361 | fb08dde0 | Luiz Capitulino | static void qdict_destroy_obj(QObject *obj) |
362 | fb08dde0 | Luiz Capitulino | { |
363 | fb08dde0 | Luiz Capitulino | int i;
|
364 | fb08dde0 | Luiz Capitulino | QDict *qdict; |
365 | fb08dde0 | Luiz Capitulino | |
366 | fb08dde0 | Luiz Capitulino | assert(obj != NULL);
|
367 | fb08dde0 | Luiz Capitulino | qdict = qobject_to_qdict(obj); |
368 | fb08dde0 | Luiz Capitulino | |
369 | fb08dde0 | Luiz Capitulino | for (i = 0; i < QDICT_HASH_SIZE; i++) { |
370 | 72cf2d4f | Blue Swirl | QDictEntry *entry = QLIST_FIRST(&qdict->table[i]); |
371 | fb08dde0 | Luiz Capitulino | while (entry) {
|
372 | 72cf2d4f | Blue Swirl | QDictEntry *tmp = QLIST_NEXT(entry, next); |
373 | 72cf2d4f | Blue Swirl | QLIST_REMOVE(entry, next); |
374 | fb08dde0 | Luiz Capitulino | qentry_destroy(entry); |
375 | fb08dde0 | Luiz Capitulino | entry = tmp; |
376 | fb08dde0 | Luiz Capitulino | } |
377 | fb08dde0 | Luiz Capitulino | } |
378 | fb08dde0 | Luiz Capitulino | |
379 | fb08dde0 | Luiz Capitulino | qemu_free(qdict); |
380 | fb08dde0 | Luiz Capitulino | } |