root / qdict.c @ 079d0b7f
History | View | Annotate | Download (10.5 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 | 7267c094 | Anthony Liguori | qdict = g_malloc0(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 | 7267c094 | Anthony Liguori | entry = g_malloc0(sizeof(*entry));
|
79 | 7267c094 | Anthony Liguori | entry->key = g_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 | 0d078b2a | Luiz Capitulino | * qdict_entry_value(): Return qdict entry value
|
87 | 0d078b2a | Luiz Capitulino | *
|
88 | 0d078b2a | Luiz Capitulino | * Return weak reference.
|
89 | 0d078b2a | Luiz Capitulino | */
|
90 | 0d078b2a | Luiz Capitulino | QObject *qdict_entry_value(const QDictEntry *entry)
|
91 | 0d078b2a | Luiz Capitulino | { |
92 | 0d078b2a | Luiz Capitulino | return entry->value;
|
93 | 0d078b2a | Luiz Capitulino | } |
94 | 0d078b2a | Luiz Capitulino | |
95 | 0d078b2a | Luiz Capitulino | /**
|
96 | 0d078b2a | Luiz Capitulino | * qdict_entry_key(): Return qdict entry key
|
97 | 0d078b2a | Luiz Capitulino | *
|
98 | 0d078b2a | Luiz Capitulino | * Return a *pointer* to the string, it has to be duplicated before being
|
99 | 0d078b2a | Luiz Capitulino | * stored.
|
100 | 0d078b2a | Luiz Capitulino | */
|
101 | 0d078b2a | Luiz Capitulino | const char *qdict_entry_key(const QDictEntry *entry) |
102 | 0d078b2a | Luiz Capitulino | { |
103 | 0d078b2a | Luiz Capitulino | return entry->key;
|
104 | 0d078b2a | Luiz Capitulino | } |
105 | 0d078b2a | Luiz Capitulino | |
106 | 0d078b2a | Luiz Capitulino | /**
|
107 | fb08dde0 | Luiz Capitulino | * qdict_find(): List lookup function
|
108 | fb08dde0 | Luiz Capitulino | */
|
109 | fb08dde0 | Luiz Capitulino | static QDictEntry *qdict_find(const QDict *qdict, |
110 | c8bc3cd7 | Luiz Capitulino | const char *key, unsigned int bucket) |
111 | fb08dde0 | Luiz Capitulino | { |
112 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
113 | fb08dde0 | Luiz Capitulino | |
114 | c8bc3cd7 | Luiz Capitulino | QLIST_FOREACH(entry, &qdict->table[bucket], next) |
115 | fb08dde0 | Luiz Capitulino | if (!strcmp(entry->key, key))
|
116 | fb08dde0 | Luiz Capitulino | return entry;
|
117 | fb08dde0 | Luiz Capitulino | |
118 | fb08dde0 | Luiz Capitulino | return NULL; |
119 | fb08dde0 | Luiz Capitulino | } |
120 | fb08dde0 | Luiz Capitulino | |
121 | fb08dde0 | Luiz Capitulino | /**
|
122 | fb08dde0 | Luiz Capitulino | * qdict_put_obj(): Put a new QObject into the dictionary
|
123 | fb08dde0 | Luiz Capitulino | *
|
124 | fb08dde0 | Luiz Capitulino | * Insert the pair 'key:value' into 'qdict', if 'key' already exists
|
125 | fb08dde0 | Luiz Capitulino | * its 'value' will be replaced.
|
126 | fb08dde0 | Luiz Capitulino | *
|
127 | fb08dde0 | Luiz Capitulino | * This is done by freeing the reference to the stored QObject and
|
128 | fb08dde0 | Luiz Capitulino | * storing the new one in the same entry.
|
129 | fb08dde0 | Luiz Capitulino | *
|
130 | fb08dde0 | Luiz Capitulino | * NOTE: ownership of 'value' is transferred to the QDict
|
131 | fb08dde0 | Luiz Capitulino | */
|
132 | fb08dde0 | Luiz Capitulino | void qdict_put_obj(QDict *qdict, const char *key, QObject *value) |
133 | fb08dde0 | Luiz Capitulino | { |
134 | c8bc3cd7 | Luiz Capitulino | unsigned int bucket; |
135 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
136 | fb08dde0 | Luiz Capitulino | |
137 | c8bc3cd7 | Luiz Capitulino | bucket = tdb_hash(key) % QDICT_BUCKET_MAX; |
138 | c8bc3cd7 | Luiz Capitulino | entry = qdict_find(qdict, key, bucket); |
139 | fb08dde0 | Luiz Capitulino | if (entry) {
|
140 | fb08dde0 | Luiz Capitulino | /* replace key's value */
|
141 | fb08dde0 | Luiz Capitulino | qobject_decref(entry->value); |
142 | fb08dde0 | Luiz Capitulino | entry->value = value; |
143 | fb08dde0 | Luiz Capitulino | } else {
|
144 | fb08dde0 | Luiz Capitulino | /* allocate a new entry */
|
145 | fb08dde0 | Luiz Capitulino | entry = alloc_entry(key, value); |
146 | c8bc3cd7 | Luiz Capitulino | QLIST_INSERT_HEAD(&qdict->table[bucket], entry, next); |
147 | 29ec3156 | Luiz Capitulino | qdict->size++; |
148 | fb08dde0 | Luiz Capitulino | } |
149 | fb08dde0 | Luiz Capitulino | } |
150 | fb08dde0 | Luiz Capitulino | |
151 | fb08dde0 | Luiz Capitulino | /**
|
152 | fb08dde0 | Luiz Capitulino | * qdict_get(): Lookup for a given 'key'
|
153 | fb08dde0 | Luiz Capitulino | *
|
154 | fb08dde0 | Luiz Capitulino | * Return a weak reference to the QObject associated with 'key' if
|
155 | fb08dde0 | Luiz Capitulino | * 'key' is present in the dictionary, NULL otherwise.
|
156 | fb08dde0 | Luiz Capitulino | */
|
157 | fb08dde0 | Luiz Capitulino | QObject *qdict_get(const QDict *qdict, const char *key) |
158 | fb08dde0 | Luiz Capitulino | { |
159 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
160 | fb08dde0 | Luiz Capitulino | |
161 | c8bc3cd7 | Luiz Capitulino | entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX); |
162 | fb08dde0 | Luiz Capitulino | return (entry == NULL ? NULL : entry->value); |
163 | fb08dde0 | Luiz Capitulino | } |
164 | fb08dde0 | Luiz Capitulino | |
165 | fb08dde0 | Luiz Capitulino | /**
|
166 | fb08dde0 | Luiz Capitulino | * qdict_haskey(): Check if 'key' exists
|
167 | fb08dde0 | Luiz Capitulino | *
|
168 | fb08dde0 | Luiz Capitulino | * Return 1 if 'key' exists in the dict, 0 otherwise
|
169 | fb08dde0 | Luiz Capitulino | */
|
170 | fb08dde0 | Luiz Capitulino | int qdict_haskey(const QDict *qdict, const char *key) |
171 | fb08dde0 | Luiz Capitulino | { |
172 | c8bc3cd7 | Luiz Capitulino | unsigned int bucket = tdb_hash(key) % QDICT_BUCKET_MAX; |
173 | c8bc3cd7 | Luiz Capitulino | return (qdict_find(qdict, key, bucket) == NULL ? 0 : 1); |
174 | fb08dde0 | Luiz Capitulino | } |
175 | fb08dde0 | Luiz Capitulino | |
176 | fb08dde0 | Luiz Capitulino | /**
|
177 | fb08dde0 | Luiz Capitulino | * qdict_size(): Return the size of the dictionary
|
178 | fb08dde0 | Luiz Capitulino | */
|
179 | fb08dde0 | Luiz Capitulino | size_t qdict_size(const QDict *qdict)
|
180 | fb08dde0 | Luiz Capitulino | { |
181 | fb08dde0 | Luiz Capitulino | return qdict->size;
|
182 | fb08dde0 | Luiz Capitulino | } |
183 | fb08dde0 | Luiz Capitulino | |
184 | fb08dde0 | Luiz Capitulino | /**
|
185 | fb08dde0 | Luiz Capitulino | * qdict_get_obj(): Get a QObject of a specific type
|
186 | fb08dde0 | Luiz Capitulino | */
|
187 | fb08dde0 | Luiz Capitulino | static QObject *qdict_get_obj(const QDict *qdict, const char *key, |
188 | fb08dde0 | Luiz Capitulino | qtype_code type) |
189 | fb08dde0 | Luiz Capitulino | { |
190 | fb08dde0 | Luiz Capitulino | QObject *obj; |
191 | fb08dde0 | Luiz Capitulino | |
192 | fb08dde0 | Luiz Capitulino | obj = qdict_get(qdict, key); |
193 | fb08dde0 | Luiz Capitulino | assert(obj != NULL);
|
194 | fb08dde0 | Luiz Capitulino | assert(qobject_type(obj) == type); |
195 | fb08dde0 | Luiz Capitulino | |
196 | fb08dde0 | Luiz Capitulino | return obj;
|
197 | fb08dde0 | Luiz Capitulino | } |
198 | fb08dde0 | Luiz Capitulino | |
199 | fb08dde0 | Luiz Capitulino | /**
|
200 | acc3b033 | Markus Armbruster | * qdict_get_double(): Get an number mapped by 'key'
|
201 | acc3b033 | Markus Armbruster | *
|
202 | acc3b033 | Markus Armbruster | * This function assumes that 'key' exists and it stores a
|
203 | acc3b033 | Markus Armbruster | * QFloat or QInt object.
|
204 | acc3b033 | Markus Armbruster | *
|
205 | acc3b033 | Markus Armbruster | * Return number mapped by 'key'.
|
206 | acc3b033 | Markus Armbruster | */
|
207 | acc3b033 | Markus Armbruster | double qdict_get_double(const QDict *qdict, const char *key) |
208 | acc3b033 | Markus Armbruster | { |
209 | acc3b033 | Markus Armbruster | QObject *obj = qdict_get(qdict, key); |
210 | acc3b033 | Markus Armbruster | |
211 | acc3b033 | Markus Armbruster | assert(obj); |
212 | acc3b033 | Markus Armbruster | switch (qobject_type(obj)) {
|
213 | acc3b033 | Markus Armbruster | case QTYPE_QFLOAT:
|
214 | acc3b033 | Markus Armbruster | return qfloat_get_double(qobject_to_qfloat(obj));
|
215 | acc3b033 | Markus Armbruster | case QTYPE_QINT:
|
216 | acc3b033 | Markus Armbruster | return qint_get_int(qobject_to_qint(obj));
|
217 | acc3b033 | Markus Armbruster | default:
|
218 | 43dc2a64 | Blue Swirl | abort(); |
219 | acc3b033 | Markus Armbruster | } |
220 | acc3b033 | Markus Armbruster | } |
221 | acc3b033 | Markus Armbruster | |
222 | acc3b033 | Markus Armbruster | /**
|
223 | fb08dde0 | Luiz Capitulino | * qdict_get_int(): Get an integer mapped by 'key'
|
224 | fb08dde0 | Luiz Capitulino | *
|
225 | fb08dde0 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
226 | fb08dde0 | Luiz Capitulino | * QInt object.
|
227 | fb08dde0 | Luiz Capitulino | *
|
228 | fb08dde0 | Luiz Capitulino | * Return integer mapped by 'key'.
|
229 | fb08dde0 | Luiz Capitulino | */
|
230 | fb08dde0 | Luiz Capitulino | int64_t qdict_get_int(const QDict *qdict, const char *key) |
231 | fb08dde0 | Luiz Capitulino | { |
232 | fb08dde0 | Luiz Capitulino | QObject *obj = qdict_get_obj(qdict, key, QTYPE_QINT); |
233 | fb08dde0 | Luiz Capitulino | return qint_get_int(qobject_to_qint(obj));
|
234 | fb08dde0 | Luiz Capitulino | } |
235 | fb08dde0 | Luiz Capitulino | |
236 | fb08dde0 | Luiz Capitulino | /**
|
237 | cd4dde36 | Luiz Capitulino | * qdict_get_bool(): Get a bool mapped by 'key'
|
238 | cd4dde36 | Luiz Capitulino | *
|
239 | cd4dde36 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
240 | cd4dde36 | Luiz Capitulino | * QBool object.
|
241 | cd4dde36 | Luiz Capitulino | *
|
242 | cd4dde36 | Luiz Capitulino | * Return bool mapped by 'key'.
|
243 | cd4dde36 | Luiz Capitulino | */
|
244 | cd4dde36 | Luiz Capitulino | int qdict_get_bool(const QDict *qdict, const char *key) |
245 | cd4dde36 | Luiz Capitulino | { |
246 | cd4dde36 | Luiz Capitulino | QObject *obj = qdict_get_obj(qdict, key, QTYPE_QBOOL); |
247 | cd4dde36 | Luiz Capitulino | return qbool_get_int(qobject_to_qbool(obj));
|
248 | cd4dde36 | Luiz Capitulino | } |
249 | cd4dde36 | Luiz Capitulino | |
250 | cd4dde36 | Luiz Capitulino | /**
|
251 | f2e17508 | Luiz Capitulino | * qdict_get_qlist(): Get the QList mapped by 'key'
|
252 | f2e17508 | Luiz Capitulino | *
|
253 | f2e17508 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
254 | f2e17508 | Luiz Capitulino | * QList object.
|
255 | f2e17508 | Luiz Capitulino | *
|
256 | f2e17508 | Luiz Capitulino | * Return QList mapped by 'key'.
|
257 | f2e17508 | Luiz Capitulino | */
|
258 | f2e17508 | Luiz Capitulino | QList *qdict_get_qlist(const QDict *qdict, const char *key) |
259 | f2e17508 | Luiz Capitulino | { |
260 | f2e17508 | Luiz Capitulino | return qobject_to_qlist(qdict_get_obj(qdict, key, QTYPE_QLIST));
|
261 | f2e17508 | Luiz Capitulino | } |
262 | f2e17508 | Luiz Capitulino | |
263 | f2e17508 | Luiz Capitulino | /**
|
264 | df10ce6a | Luiz Capitulino | * qdict_get_qdict(): Get the QDict mapped by 'key'
|
265 | df10ce6a | Luiz Capitulino | *
|
266 | df10ce6a | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
267 | df10ce6a | Luiz Capitulino | * QDict object.
|
268 | df10ce6a | Luiz Capitulino | *
|
269 | df10ce6a | Luiz Capitulino | * Return QDict mapped by 'key'.
|
270 | df10ce6a | Luiz Capitulino | */
|
271 | df10ce6a | Luiz Capitulino | QDict *qdict_get_qdict(const QDict *qdict, const char *key) |
272 | df10ce6a | Luiz Capitulino | { |
273 | df10ce6a | Luiz Capitulino | return qobject_to_qdict(qdict_get_obj(qdict, key, QTYPE_QDICT));
|
274 | df10ce6a | Luiz Capitulino | } |
275 | df10ce6a | Luiz Capitulino | |
276 | df10ce6a | Luiz Capitulino | /**
|
277 | fb08dde0 | Luiz Capitulino | * qdict_get_str(): Get a pointer to the stored string mapped
|
278 | fb08dde0 | Luiz Capitulino | * by 'key'
|
279 | fb08dde0 | Luiz Capitulino | *
|
280 | fb08dde0 | Luiz Capitulino | * This function assumes that 'key' exists and it stores a
|
281 | fb08dde0 | Luiz Capitulino | * QString object.
|
282 | fb08dde0 | Luiz Capitulino | *
|
283 | fb08dde0 | Luiz Capitulino | * Return pointer to the string mapped by 'key'.
|
284 | fb08dde0 | Luiz Capitulino | */
|
285 | fb08dde0 | Luiz Capitulino | const char *qdict_get_str(const QDict *qdict, const char *key) |
286 | fb08dde0 | Luiz Capitulino | { |
287 | fb08dde0 | Luiz Capitulino | QObject *obj = qdict_get_obj(qdict, key, QTYPE_QSTRING); |
288 | fb08dde0 | Luiz Capitulino | return qstring_get_str(qobject_to_qstring(obj));
|
289 | fb08dde0 | Luiz Capitulino | } |
290 | fb08dde0 | Luiz Capitulino | |
291 | fb08dde0 | Luiz Capitulino | /**
|
292 | fb08dde0 | Luiz Capitulino | * qdict_get_try_int(): Try to get integer mapped by 'key'
|
293 | fb08dde0 | Luiz Capitulino | *
|
294 | fb08dde0 | Luiz Capitulino | * Return integer mapped by 'key', if it is not present in
|
295 | fb08dde0 | Luiz Capitulino | * the dictionary or if the stored object is not of QInt type
|
296 | 83aba69e | Luiz Capitulino | * 'def_value' will be returned.
|
297 | fb08dde0 | Luiz Capitulino | */
|
298 | fb08dde0 | Luiz Capitulino | int64_t qdict_get_try_int(const QDict *qdict, const char *key, |
299 | 83aba69e | Luiz Capitulino | int64_t def_value) |
300 | fb08dde0 | Luiz Capitulino | { |
301 | fb08dde0 | Luiz Capitulino | QObject *obj; |
302 | fb08dde0 | Luiz Capitulino | |
303 | fb08dde0 | Luiz Capitulino | obj = qdict_get(qdict, key); |
304 | fb08dde0 | Luiz Capitulino | if (!obj || qobject_type(obj) != QTYPE_QINT)
|
305 | 83aba69e | Luiz Capitulino | return def_value;
|
306 | fb08dde0 | Luiz Capitulino | |
307 | fb08dde0 | Luiz Capitulino | return qint_get_int(qobject_to_qint(obj));
|
308 | fb08dde0 | Luiz Capitulino | } |
309 | fb08dde0 | Luiz Capitulino | |
310 | fb08dde0 | Luiz Capitulino | /**
|
311 | 35006ac8 | Luiz Capitulino | * qdict_get_try_bool(): Try to get a bool mapped by 'key'
|
312 | 35006ac8 | Luiz Capitulino | *
|
313 | 35006ac8 | Luiz Capitulino | * Return bool mapped by 'key', if it is not present in the
|
314 | 35006ac8 | Luiz Capitulino | * dictionary or if the stored object is not of QBool type
|
315 | 35006ac8 | Luiz Capitulino | * 'def_value' will be returned.
|
316 | 35006ac8 | Luiz Capitulino | */
|
317 | 35006ac8 | Luiz Capitulino | int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value) |
318 | 35006ac8 | Luiz Capitulino | { |
319 | 35006ac8 | Luiz Capitulino | QObject *obj; |
320 | 35006ac8 | Luiz Capitulino | |
321 | 35006ac8 | Luiz Capitulino | obj = qdict_get(qdict, key); |
322 | 35006ac8 | Luiz Capitulino | if (!obj || qobject_type(obj) != QTYPE_QBOOL)
|
323 | 35006ac8 | Luiz Capitulino | return def_value;
|
324 | 35006ac8 | Luiz Capitulino | |
325 | 35006ac8 | Luiz Capitulino | return qbool_get_int(qobject_to_qbool(obj));
|
326 | 35006ac8 | Luiz Capitulino | } |
327 | 35006ac8 | Luiz Capitulino | |
328 | 35006ac8 | Luiz Capitulino | /**
|
329 | fb08dde0 | Luiz Capitulino | * qdict_get_try_str(): Try to get a pointer to the stored string
|
330 | fb08dde0 | Luiz Capitulino | * mapped by 'key'
|
331 | fb08dde0 | Luiz Capitulino | *
|
332 | fb08dde0 | Luiz Capitulino | * Return a pointer to the string mapped by 'key', if it is not present
|
333 | fb08dde0 | Luiz Capitulino | * in the dictionary or if the stored object is not of QString type
|
334 | fb08dde0 | Luiz Capitulino | * NULL will be returned.
|
335 | fb08dde0 | Luiz Capitulino | */
|
336 | fb08dde0 | Luiz Capitulino | const char *qdict_get_try_str(const QDict *qdict, const char *key) |
337 | fb08dde0 | Luiz Capitulino | { |
338 | fb08dde0 | Luiz Capitulino | QObject *obj; |
339 | fb08dde0 | Luiz Capitulino | |
340 | fb08dde0 | Luiz Capitulino | obj = qdict_get(qdict, key); |
341 | fb08dde0 | Luiz Capitulino | if (!obj || qobject_type(obj) != QTYPE_QSTRING)
|
342 | fb08dde0 | Luiz Capitulino | return NULL; |
343 | fb08dde0 | Luiz Capitulino | |
344 | fb08dde0 | Luiz Capitulino | return qstring_get_str(qobject_to_qstring(obj));
|
345 | fb08dde0 | Luiz Capitulino | } |
346 | fb08dde0 | Luiz Capitulino | |
347 | fb08dde0 | Luiz Capitulino | /**
|
348 | 21f800d3 | Luiz Capitulino | * qdict_iter(): Iterate over all the dictionary's stored values.
|
349 | 21f800d3 | Luiz Capitulino | *
|
350 | 21f800d3 | Luiz Capitulino | * This function allows the user to provide an iterator, which will be
|
351 | 21f800d3 | Luiz Capitulino | * called for each stored value in the dictionary.
|
352 | 21f800d3 | Luiz Capitulino | */
|
353 | 21f800d3 | Luiz Capitulino | void qdict_iter(const QDict *qdict, |
354 | 21f800d3 | Luiz Capitulino | void (*iter)(const char *key, QObject *obj, void *opaque), |
355 | 21f800d3 | Luiz Capitulino | void *opaque)
|
356 | 21f800d3 | Luiz Capitulino | { |
357 | 21f800d3 | Luiz Capitulino | int i;
|
358 | 21f800d3 | Luiz Capitulino | QDictEntry *entry; |
359 | 21f800d3 | Luiz Capitulino | |
360 | c8bc3cd7 | Luiz Capitulino | for (i = 0; i < QDICT_BUCKET_MAX; i++) { |
361 | 21f800d3 | Luiz Capitulino | QLIST_FOREACH(entry, &qdict->table[i], next) |
362 | 21f800d3 | Luiz Capitulino | iter(entry->key, entry->value, opaque); |
363 | 21f800d3 | Luiz Capitulino | } |
364 | 21f800d3 | Luiz Capitulino | } |
365 | 21f800d3 | Luiz Capitulino | |
366 | f2b07f35 | Luiz Capitulino | static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket) |
367 | f2b07f35 | Luiz Capitulino | { |
368 | f2b07f35 | Luiz Capitulino | int i;
|
369 | f2b07f35 | Luiz Capitulino | |
370 | f2b07f35 | Luiz Capitulino | for (i = first_bucket; i < QDICT_BUCKET_MAX; i++) {
|
371 | f2b07f35 | Luiz Capitulino | if (!QLIST_EMPTY(&qdict->table[i])) {
|
372 | f2b07f35 | Luiz Capitulino | return QLIST_FIRST(&qdict->table[i]);
|
373 | f2b07f35 | Luiz Capitulino | } |
374 | f2b07f35 | Luiz Capitulino | } |
375 | f2b07f35 | Luiz Capitulino | |
376 | f2b07f35 | Luiz Capitulino | return NULL; |
377 | f2b07f35 | Luiz Capitulino | } |
378 | f2b07f35 | Luiz Capitulino | |
379 | f2b07f35 | Luiz Capitulino | /**
|
380 | f2b07f35 | Luiz Capitulino | * qdict_first(): Return first qdict entry for iteration.
|
381 | f2b07f35 | Luiz Capitulino | */
|
382 | f2b07f35 | Luiz Capitulino | const QDictEntry *qdict_first(const QDict *qdict) |
383 | f2b07f35 | Luiz Capitulino | { |
384 | f2b07f35 | Luiz Capitulino | return qdict_next_entry(qdict, 0); |
385 | f2b07f35 | Luiz Capitulino | } |
386 | f2b07f35 | Luiz Capitulino | |
387 | f2b07f35 | Luiz Capitulino | /**
|
388 | f2b07f35 | Luiz Capitulino | * qdict_next(): Return next qdict entry in an iteration.
|
389 | f2b07f35 | Luiz Capitulino | */
|
390 | f2b07f35 | Luiz Capitulino | const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry) |
391 | f2b07f35 | Luiz Capitulino | { |
392 | f2b07f35 | Luiz Capitulino | QDictEntry *ret; |
393 | f2b07f35 | Luiz Capitulino | |
394 | f2b07f35 | Luiz Capitulino | ret = QLIST_NEXT(entry, next); |
395 | f2b07f35 | Luiz Capitulino | if (!ret) {
|
396 | f2b07f35 | Luiz Capitulino | unsigned int bucket = tdb_hash(entry->key) % QDICT_BUCKET_MAX; |
397 | f2b07f35 | Luiz Capitulino | ret = qdict_next_entry(qdict, bucket + 1);
|
398 | f2b07f35 | Luiz Capitulino | } |
399 | f2b07f35 | Luiz Capitulino | |
400 | f2b07f35 | Luiz Capitulino | return ret;
|
401 | f2b07f35 | Luiz Capitulino | } |
402 | f2b07f35 | Luiz Capitulino | |
403 | 21f800d3 | Luiz Capitulino | /**
|
404 | fb08dde0 | Luiz Capitulino | * qentry_destroy(): Free all the memory allocated by a QDictEntry
|
405 | fb08dde0 | Luiz Capitulino | */
|
406 | fb08dde0 | Luiz Capitulino | static void qentry_destroy(QDictEntry *e) |
407 | fb08dde0 | Luiz Capitulino | { |
408 | fb08dde0 | Luiz Capitulino | assert(e != NULL);
|
409 | fb08dde0 | Luiz Capitulino | assert(e->key != NULL);
|
410 | fb08dde0 | Luiz Capitulino | assert(e->value != NULL);
|
411 | fb08dde0 | Luiz Capitulino | |
412 | fb08dde0 | Luiz Capitulino | qobject_decref(e->value); |
413 | 7267c094 | Anthony Liguori | g_free(e->key); |
414 | 7267c094 | Anthony Liguori | g_free(e); |
415 | fb08dde0 | Luiz Capitulino | } |
416 | fb08dde0 | Luiz Capitulino | |
417 | fb08dde0 | Luiz Capitulino | /**
|
418 | fb08dde0 | Luiz Capitulino | * qdict_del(): Delete a 'key:value' pair from the dictionary
|
419 | fb08dde0 | Luiz Capitulino | *
|
420 | fb08dde0 | Luiz Capitulino | * This will destroy all data allocated by this entry.
|
421 | fb08dde0 | Luiz Capitulino | */
|
422 | fb08dde0 | Luiz Capitulino | void qdict_del(QDict *qdict, const char *key) |
423 | fb08dde0 | Luiz Capitulino | { |
424 | fb08dde0 | Luiz Capitulino | QDictEntry *entry; |
425 | fb08dde0 | Luiz Capitulino | |
426 | c8bc3cd7 | Luiz Capitulino | entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX); |
427 | fb08dde0 | Luiz Capitulino | if (entry) {
|
428 | 72cf2d4f | Blue Swirl | QLIST_REMOVE(entry, next); |
429 | fb08dde0 | Luiz Capitulino | qentry_destroy(entry); |
430 | fb08dde0 | Luiz Capitulino | qdict->size--; |
431 | fb08dde0 | Luiz Capitulino | } |
432 | fb08dde0 | Luiz Capitulino | } |
433 | fb08dde0 | Luiz Capitulino | |
434 | fb08dde0 | Luiz Capitulino | /**
|
435 | fb08dde0 | Luiz Capitulino | * qdict_destroy_obj(): Free all the memory allocated by a QDict
|
436 | fb08dde0 | Luiz Capitulino | */
|
437 | fb08dde0 | Luiz Capitulino | static void qdict_destroy_obj(QObject *obj) |
438 | fb08dde0 | Luiz Capitulino | { |
439 | fb08dde0 | Luiz Capitulino | int i;
|
440 | fb08dde0 | Luiz Capitulino | QDict *qdict; |
441 | fb08dde0 | Luiz Capitulino | |
442 | fb08dde0 | Luiz Capitulino | assert(obj != NULL);
|
443 | fb08dde0 | Luiz Capitulino | qdict = qobject_to_qdict(obj); |
444 | fb08dde0 | Luiz Capitulino | |
445 | c8bc3cd7 | Luiz Capitulino | for (i = 0; i < QDICT_BUCKET_MAX; i++) { |
446 | 72cf2d4f | Blue Swirl | QDictEntry *entry = QLIST_FIRST(&qdict->table[i]); |
447 | fb08dde0 | Luiz Capitulino | while (entry) {
|
448 | 72cf2d4f | Blue Swirl | QDictEntry *tmp = QLIST_NEXT(entry, next); |
449 | 72cf2d4f | Blue Swirl | QLIST_REMOVE(entry, next); |
450 | fb08dde0 | Luiz Capitulino | qentry_destroy(entry); |
451 | fb08dde0 | Luiz Capitulino | entry = tmp; |
452 | fb08dde0 | Luiz Capitulino | } |
453 | fb08dde0 | Luiz Capitulino | } |
454 | fb08dde0 | Luiz Capitulino | |
455 | 7267c094 | Anthony Liguori | g_free(qdict); |
456 | fb08dde0 | Luiz Capitulino | } |