qdict.c revision 9251866320b5f8329a043bb56b3a794f78d12849
12910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/* 22910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * QDict data type. 32910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 42910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Copyright (C) 2009 Red Hat Inc. 52910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 62910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Authors: 72910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Luiz Capitulino <lcapitulino@redhat.com> 82910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 92910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This work is licensed under the terms of the GNU GPL, version 2. See 102910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * the COPYING file in the top-level directory. 112910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 122910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 132910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#include "qint.h" 149251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner#include "qfloat.h" 152910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#include "qdict.h" 162910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#include "qbool.h" 172910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#include "qstring.h" 182910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#include "qobject.h" 192910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#include "qemu-queue.h" 202910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner#include "qemu-common.h" 212910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 222910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic void qdict_destroy_obj(QObject *obj); 232910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 242910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic const QType qdict_type = { 252910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner .code = QTYPE_QDICT, 262910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner .destroy = qdict_destroy_obj, 272910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner}; 282910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 292910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 302910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_new(): Create a new QDict 312910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 322910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return strong reference. 332910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 342910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' TurnerQDict *qdict_new(void) 352910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 362910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDict *qdict; 372910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 382910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qdict = qemu_mallocz(sizeof(*qdict)); 392910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QOBJECT_INIT(qdict, &qdict_type); 402910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 412910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qdict; 422910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 432910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 442910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 452910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qobject_to_qdict(): Convert a QObject into a QDict 462910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 472910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' TurnerQDict *qobject_to_qdict(const QObject *obj) 482910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 492910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner if (qobject_type(obj) != QTYPE_QDICT) 502910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return NULL; 512910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 522910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return container_of(obj, QDict, base); 532910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 542910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 552910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 562910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * tdb_hash(): based on the hash agorithm from gdbm, via tdb 572910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * (from module-init-tools) 582910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 592910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic unsigned int tdb_hash(const char *name) 602910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 612910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner unsigned value; /* Used to compute the hash value. */ 622910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner unsigned i; /* Used to cycle through random values. */ 632910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 642910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner /* Set the initial value from the key size. */ 652910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner for (value = 0x238F13AF * strlen(name), i=0; name[i]; i++) 662910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner value = (value + (((const unsigned char *)name)[i] << (i*5 % 24))); 672910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 682910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return (1103515243 * value + 12345); 692910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 702910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 712910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 722910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * alloc_entry(): allocate a new QDictEntry 732910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 742910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic QDictEntry *alloc_entry(const char *key, QObject *value) 752910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 762910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *entry; 772910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 782910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry = qemu_mallocz(sizeof(*entry)); 792910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry->key = qemu_strdup(key); 802910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry->value = value; 812910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 822910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return entry; 832910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 842910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 852910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 862910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_find(): List lookup function 872910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 882910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic QDictEntry *qdict_find(const QDict *qdict, 892910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner const char *key, unsigned int hash) 902910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 912910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *entry; 922910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 932910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QLIST_FOREACH(entry, &qdict->table[hash], next) 942910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner if (!strcmp(entry->key, key)) 952910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return entry; 962910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 972910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return NULL; 982910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 992910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1002910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 1012910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_put_obj(): Put a new QObject into the dictionary 1022910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 1032910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Insert the pair 'key:value' into 'qdict', if 'key' already exists 1042910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * its 'value' will be replaced. 1052910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 1062910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This is done by freeing the reference to the stored QObject and 1072910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * storing the new one in the same entry. 1082910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 1092910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * NOTE: ownership of 'value' is transferred to the QDict 1102910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 1112910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnervoid qdict_put_obj(QDict *qdict, const char *key, QObject *value) 1122910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 1132910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner unsigned int hash; 1142910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *entry; 1152910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1162910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner hash = tdb_hash(key) % QDICT_HASH_SIZE; 1172910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry = qdict_find(qdict, key, hash); 1182910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner if (entry) { 1192910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner /* replace key's value */ 1202910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qobject_decref(entry->value); 1212910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry->value = value; 1222910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner } else { 1232910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner /* allocate a new entry */ 1242910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry = alloc_entry(key, value); 1252910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QLIST_INSERT_HEAD(&qdict->table[hash], entry, next); 1262910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qdict->size++; 1272910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner } 1282910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 1292910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1302910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 1312910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get(): Lookup for a given 'key' 1322910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 1332910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return a weak reference to the QObject associated with 'key' if 1342910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 'key' is present in the dictionary, NULL otherwise. 1352910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 1362910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' TurnerQObject *qdict_get(const QDict *qdict, const char *key) 1372910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 1382910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *entry; 1392910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1402910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE); 1412910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return (entry == NULL ? NULL : entry->value); 1422910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 1432910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1442910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 1452910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_haskey(): Check if 'key' exists 1462910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 1472910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return 1 if 'key' exists in the dict, 0 otherwise 1482910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 1492910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerint qdict_haskey(const QDict *qdict, const char *key) 1502910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 1512910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner unsigned int hash = tdb_hash(key) % QDICT_HASH_SIZE; 1522910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return (qdict_find(qdict, key, hash) == NULL ? 0 : 1); 1532910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 1542910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1552910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 1562910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_size(): Return the size of the dictionary 1572910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 1582910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnersize_t qdict_size(const QDict *qdict) 1592910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 1602910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qdict->size; 1612910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 1622910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1632910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 1642910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_obj(): Get a QObject of a specific type 1652910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 1662910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic QObject *qdict_get_obj(const QDict *qdict, const char *key, 1672910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qtype_code type) 1682910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 1692910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QObject *obj; 1702910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1712910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner obj = qdict_get(qdict, key); 1722910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner assert(obj != NULL); 1732910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner assert(qobject_type(obj) == type); 1742910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1752910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return obj; 1762910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 1772910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 1782910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 1799251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner * qdict_get_double(): Get an number mapped by 'key' 1809251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner * 1819251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner * This function assumes that 'key' exists and it stores a 1829251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner * QFloat or QInt object. 1839251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner * 1849251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner * Return number mapped by 'key'. 1859251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner */ 1869251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turnerdouble qdict_get_double(const QDict *qdict, const char *key) 1879251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner{ 1889251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner QObject *obj = qdict_get(qdict, key); 1899251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner 1909251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner assert(obj); 1919251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner switch (qobject_type(obj)) { 1929251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner case QTYPE_QFLOAT: 1939251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner return qfloat_get_double(qobject_to_qfloat(obj)); 1949251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner case QTYPE_QINT: 1959251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner return qint_get_int(qobject_to_qint(obj)); 1969251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner default: 1979251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner assert(0); 1989251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner } 1999251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner} 2009251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner 2019251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner/** 2022910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_int(): Get an integer mapped by 'key' 2032910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2042910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This function assumes that 'key' exists and it stores a 2052910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * QInt object. 2062910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2072910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return integer mapped by 'key'. 2082910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 2092910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerint64_t qdict_get_int(const QDict *qdict, const char *key) 2102910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 2112910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QObject *obj = qdict_get_obj(qdict, key, QTYPE_QINT); 2122910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qint_get_int(qobject_to_qint(obj)); 2132910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 2142910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2152910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 2162910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_bool(): Get a bool mapped by 'key' 2172910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2182910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This function assumes that 'key' exists and it stores a 2192910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * QBool object. 2202910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2212910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return bool mapped by 'key'. 2222910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 2232910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerint qdict_get_bool(const QDict *qdict, const char *key) 2242910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 2252910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QObject *obj = qdict_get_obj(qdict, key, QTYPE_QBOOL); 2262910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qbool_get_int(qobject_to_qbool(obj)); 2272910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 2282910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2292910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 2302910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_qlist(): Get the QList mapped by 'key' 2312910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2322910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This function assumes that 'key' exists and it stores a 2332910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * QList object. 2342910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2352910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return QList mapped by 'key'. 2362910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 2372910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' TurnerQList *qdict_get_qlist(const QDict *qdict, const char *key) 2382910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 2392910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qobject_to_qlist(qdict_get_obj(qdict, key, QTYPE_QLIST)); 2402910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 2412910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2422910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 2432910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_qdict(): Get the QDict mapped by 'key' 2442910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2452910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This function assumes that 'key' exists and it stores a 2462910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * QDict object. 2472910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2482910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return QDict mapped by 'key'. 2492910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 2502910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' TurnerQDict *qdict_get_qdict(const QDict *qdict, const char *key) 2512910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 2522910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qobject_to_qdict(qdict_get_obj(qdict, key, QTYPE_QDICT)); 2532910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 2542910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2552910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 2562910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_str(): Get a pointer to the stored string mapped 2572910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * by 'key' 2582910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2592910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This function assumes that 'key' exists and it stores a 2602910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * QString object. 2612910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2622910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return pointer to the string mapped by 'key'. 2632910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 2642910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerconst char *qdict_get_str(const QDict *qdict, const char *key) 2652910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 2662910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QObject *obj = qdict_get_obj(qdict, key, QTYPE_QSTRING); 2672910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qstring_get_str(qobject_to_qstring(obj)); 2682910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 2692910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2702910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 2712910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_try_int(): Try to get integer mapped by 'key' 2722910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2732910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return integer mapped by 'key', if it is not present in 2742910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * the dictionary or if the stored object is not of QInt type 2752910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 'err_value' will be returned. 2762910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 2772910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerint64_t qdict_get_try_int(const QDict *qdict, const char *key, 2782910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner int64_t err_value) 2792910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 2802910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QObject *obj; 2812910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2822910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner obj = qdict_get(qdict, key); 2832910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner if (!obj || qobject_type(obj) != QTYPE_QINT) 2842910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return err_value; 2852910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2862910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qint_get_int(qobject_to_qint(obj)); 2872910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 2882910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 2892910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 2902910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_get_try_str(): Try to get a pointer to the stored string 2912910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * mapped by 'key' 2922910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 2932910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * Return a pointer to the string mapped by 'key', if it is not present 2942910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * in the dictionary or if the stored object is not of QString type 2952910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * NULL will be returned. 2962910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 2972910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerconst char *qdict_get_try_str(const QDict *qdict, const char *key) 2982910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 2992910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QObject *obj; 3002910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3012910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner obj = qdict_get(qdict, key); 3022910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner if (!obj || qobject_type(obj) != QTYPE_QSTRING) 3032910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return NULL; 3042910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3052910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner return qstring_get_str(qobject_to_qstring(obj)); 3062910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 3072910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3082910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 3092910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_iter(): Iterate over all the dictionary's stored values. 3102910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 3112910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This function allows the user to provide an iterator, which will be 3122910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * called for each stored value in the dictionary. 3132910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 3142910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnervoid qdict_iter(const QDict *qdict, 3152910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner void (*iter)(const char *key, QObject *obj, void *opaque), 3162910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner void *opaque) 3172910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 3182910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner int i; 3192910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *entry; 3202910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3212910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner for (i = 0; i < QDICT_HASH_SIZE; i++) { 3222910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QLIST_FOREACH(entry, &qdict->table[i], next) 3232910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner iter(entry->key, entry->value, opaque); 3242910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner } 3252910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 3262910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3272910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 3282910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qentry_destroy(): Free all the memory allocated by a QDictEntry 3292910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 3302910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic void qentry_destroy(QDictEntry *e) 3312910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 3322910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner assert(e != NULL); 3332910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner assert(e->key != NULL); 3342910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner assert(e->value != NULL); 3352910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3362910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qobject_decref(e->value); 3372910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qemu_free(e->key); 3382910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qemu_free(e); 3392910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 3402910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3412910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 3422910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_del(): Delete a 'key:value' pair from the dictionary 3432910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * 3442910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * This will destroy all data allocated by this entry. 3452910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 3462910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnervoid qdict_del(QDict *qdict, const char *key) 3472910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 3482910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *entry; 3492910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3502910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE); 3512910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner if (entry) { 3522910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QLIST_REMOVE(entry, next); 3532910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qentry_destroy(entry); 3542910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qdict->size--; 3552910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner } 3562910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 3572910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3582910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner/** 3592910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * qdict_destroy_obj(): Free all the memory allocated by a QDict 3602910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner */ 3612910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turnerstatic void qdict_destroy_obj(QObject *obj) 3622910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner{ 3632910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner int i; 3642910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDict *qdict; 3652910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3662910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner assert(obj != NULL); 3672910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qdict = qobject_to_qdict(obj); 3682910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3692910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner for (i = 0; i < QDICT_HASH_SIZE; i++) { 3702910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *entry = QLIST_FIRST(&qdict->table[i]); 3712910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner while (entry) { 3722910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QDictEntry *tmp = QLIST_NEXT(entry, next); 3732910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner QLIST_REMOVE(entry, next); 3742910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qentry_destroy(entry); 3752910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner entry = tmp; 3762910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner } 3772910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner } 3782910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner 3792910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner qemu_free(qdict); 3802910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner} 381