aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Turner <digit@android.com>2010-09-09 23:02:33 +0200
committerDavid 'Digit' Turner <digit@android.com>2010-09-13 00:30:34 -0700
commitcb34fa2cb61a4a838b32126fd28eb3450fd9f8ec (patch)
treecd50d3707a97498f22d0f94a75ec32aee4849da9
parent9a5f7cee50272ec12fe23452cb2638bee8c35374 (diff)
downloadexternal_qemu-cb34fa2cb61a4a838b32126fd28eb3450fd9f8ec.zip
external_qemu-cb34fa2cb61a4a838b32126fd28eb3450fd9f8ec.tar.gz
external_qemu-cb34fa2cb61a4a838b32126fd28eb3450fd9f8ec.tar.bz2
upstream: minor QObject update.
-rw-r--r--net-checksum.c3
-rw-r--r--qbool.c8
-rw-r--r--qdict.c114
-rw-r--r--qdict.h23
4 files changed, 116 insertions, 32 deletions
diff --git a/net-checksum.c b/net-checksum.c
index fac0651..4956c5c 100644
--- a/net-checksum.c
+++ b/net-checksum.c
@@ -12,8 +12,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "hw/hw.h"
diff --git a/qbool.c b/qbool.c
index 5ab734c..ad4873f 100644
--- a/qbool.c
+++ b/qbool.c
@@ -1,14 +1,6 @@
/*
* QBool Module
*
- * Copyright (C) 2009 Red Hat Inc.
- *
- * Authors:
- * Luiz Capitulino <lcapitulino@redhat.com>
- *
- * This work is licensed under the terms of the GNU GPL, version 2. See
- * the COPYING file in the top-level directory.
- *
* Copyright IBM, Corp. 2009
*
* Authors:
diff --git a/qdict.c b/qdict.c
index 7d1469d..dee0fb4 100644
--- a/qdict.c
+++ b/qdict.c
@@ -1,13 +1,13 @@
/*
- * QDict data type.
+ * QDict Module
*
* Copyright (C) 2009 Red Hat Inc.
*
* Authors:
* Luiz Capitulino <lcapitulino@redhat.com>
*
- * This work is licensed under the terms of the GNU GPL, version 2. See
- * the COPYING file in the top-level directory.
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
*/
#include "qint.h"
@@ -83,14 +83,35 @@ static QDictEntry *alloc_entry(const char *key, QObject *value)
}
/**
+ * qdict_entry_value(): Return qdict entry value
+ *
+ * Return weak reference.
+ */
+QObject *qdict_entry_value(const QDictEntry *entry)
+{
+ return entry->value;
+}
+
+/**
+ * qdict_entry_key(): Return qdict entry key
+ *
+ * Return a *pointer* to the string, it has to be duplicated before being
+ * stored.
+ */
+const char *qdict_entry_key(const QDictEntry *entry)
+{
+ return entry->key;
+}
+
+/**
* qdict_find(): List lookup function
*/
static QDictEntry *qdict_find(const QDict *qdict,
- const char *key, unsigned int hash)
+ const char *key, unsigned int bucket)
{
QDictEntry *entry;
- QLIST_FOREACH(entry, &qdict->table[hash], next)
+ QLIST_FOREACH(entry, &qdict->table[bucket], next)
if (!strcmp(entry->key, key))
return entry;
@@ -110,11 +131,11 @@ static QDictEntry *qdict_find(const QDict *qdict,
*/
void qdict_put_obj(QDict *qdict, const char *key, QObject *value)
{
- unsigned int hash;
+ unsigned int bucket;
QDictEntry *entry;
- hash = tdb_hash(key) % QDICT_HASH_SIZE;
- entry = qdict_find(qdict, key, hash);
+ bucket = tdb_hash(key) % QDICT_BUCKET_MAX;
+ entry = qdict_find(qdict, key, bucket);
if (entry) {
/* replace key's value */
qobject_decref(entry->value);
@@ -122,7 +143,7 @@ void qdict_put_obj(QDict *qdict, const char *key, QObject *value)
} else {
/* allocate a new entry */
entry = alloc_entry(key, value);
- QLIST_INSERT_HEAD(&qdict->table[hash], entry, next);
+ QLIST_INSERT_HEAD(&qdict->table[bucket], entry, next);
qdict->size++;
}
}
@@ -137,7 +158,7 @@ QObject *qdict_get(const QDict *qdict, const char *key)
{
QDictEntry *entry;
- entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE);
+ entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX);
return (entry == NULL ? NULL : entry->value);
}
@@ -148,8 +169,8 @@ QObject *qdict_get(const QDict *qdict, const char *key)
*/
int qdict_haskey(const QDict *qdict, const char *key)
{
- unsigned int hash = tdb_hash(key) % QDICT_HASH_SIZE;
- return (qdict_find(qdict, key, hash) == NULL ? 0 : 1);
+ unsigned int bucket = tdb_hash(key) % QDICT_BUCKET_MAX;
+ return (qdict_find(qdict, key, bucket) == NULL ? 0 : 1);
}
/**
@@ -194,7 +215,7 @@ double qdict_get_double(const QDict *qdict, const char *key)
case QTYPE_QINT:
return qint_get_int(qobject_to_qint(obj));
default:
- assert(0);
+ abort();
}
}
@@ -272,21 +293,39 @@ const char *qdict_get_str(const QDict *qdict, const char *key)
*
* Return integer mapped by 'key', if it is not present in
* the dictionary or if the stored object is not of QInt type
- * 'err_value' will be returned.
+ * 'def_value' will be returned.
*/
int64_t qdict_get_try_int(const QDict *qdict, const char *key,
- int64_t err_value)
+ int64_t def_value)
{
QObject *obj;
obj = qdict_get(qdict, key);
if (!obj || qobject_type(obj) != QTYPE_QINT)
- return err_value;
+ return def_value;
return qint_get_int(qobject_to_qint(obj));
}
/**
+ * qdict_get_try_bool(): Try to get a bool mapped by 'key'
+ *
+ * Return bool mapped by 'key', if it is not present in the
+ * dictionary or if the stored object is not of QBool type
+ * 'def_value' will be returned.
+ */
+int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value)
+{
+ QObject *obj;
+
+ obj = qdict_get(qdict, key);
+ if (!obj || qobject_type(obj) != QTYPE_QBOOL)
+ return def_value;
+
+ return qbool_get_int(qobject_to_qbool(obj));
+}
+
+/**
* qdict_get_try_str(): Try to get a pointer to the stored string
* mapped by 'key'
*
@@ -318,12 +357,49 @@ void qdict_iter(const QDict *qdict,
int i;
QDictEntry *entry;
- for (i = 0; i < QDICT_HASH_SIZE; i++) {
+ for (i = 0; i < QDICT_BUCKET_MAX; i++) {
QLIST_FOREACH(entry, &qdict->table[i], next)
iter(entry->key, entry->value, opaque);
}
}
+static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket)
+{
+ int i;
+
+ for (i = first_bucket; i < QDICT_BUCKET_MAX; i++) {
+ if (!QLIST_EMPTY(&qdict->table[i])) {
+ return QLIST_FIRST(&qdict->table[i]);
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * qdict_first(): Return first qdict entry for iteration.
+ */
+const QDictEntry *qdict_first(const QDict *qdict)
+{
+ return qdict_next_entry(qdict, 0);
+}
+
+/**
+ * qdict_next(): Return next qdict entry in an iteration.
+ */
+const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry)
+{
+ QDictEntry *ret;
+
+ ret = QLIST_NEXT(entry, next);
+ if (!ret) {
+ unsigned int bucket = tdb_hash(entry->key) % QDICT_BUCKET_MAX;
+ ret = qdict_next_entry(qdict, bucket + 1);
+ }
+
+ return ret;
+}
+
/**
* qentry_destroy(): Free all the memory allocated by a QDictEntry
*/
@@ -347,7 +423,7 @@ void qdict_del(QDict *qdict, const char *key)
{
QDictEntry *entry;
- entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE);
+ entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX);
if (entry) {
QLIST_REMOVE(entry, next);
qentry_destroy(entry);
@@ -366,7 +442,7 @@ static void qdict_destroy_obj(QObject *obj)
assert(obj != NULL);
qdict = qobject_to_qdict(obj);
- for (i = 0; i < QDICT_HASH_SIZE; i++) {
+ for (i = 0; i < QDICT_BUCKET_MAX; i++) {
QDictEntry *entry = QLIST_FIRST(&qdict->table[i]);
while (entry) {
QDictEntry *tmp = QLIST_NEXT(entry, next);
diff --git a/qdict.h b/qdict.h
index 579dcdd..929d8d2 100644
--- a/qdict.h
+++ b/qdict.h
@@ -1,3 +1,15 @@
+/*
+ * QDict Module
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * Authors:
+ * Luiz Capitulino <lcapitulino@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+
#ifndef QDICT_H
#define QDICT_H
@@ -6,7 +18,7 @@
#include "qemu-queue.h"
#include <stdint.h>
-#define QDICT_HASH_SIZE 512
+#define QDICT_BUCKET_MAX 512
typedef struct QDictEntry {
char *key;
@@ -17,11 +29,13 @@ typedef struct QDictEntry {
typedef struct QDict {
QObject_HEAD;
size_t size;
- QLIST_HEAD(,QDictEntry) table[QDICT_HASH_SIZE];
+ QLIST_HEAD(,QDictEntry) table[QDICT_BUCKET_MAX];
} QDict;
/* Object API */
QDict *qdict_new(void);
+const char *qdict_entry_key(const QDictEntry *entry);
+QObject *qdict_entry_value(const QDictEntry *entry);
size_t qdict_size(const QDict *qdict);
void qdict_put_obj(QDict *qdict, const char *key, QObject *value);
void qdict_del(QDict *qdict, const char *key);
@@ -31,6 +45,8 @@ QDict *qobject_to_qdict(const QObject *obj);
void qdict_iter(const QDict *qdict,
void (*iter)(const char *key, QObject *obj, void *opaque),
void *opaque);
+const QDictEntry *qdict_first(const QDict *qdict);
+const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry);
/* Helper to qdict_put_obj(), accepts any object */
#define qdict_put(qdict, key, obj) \
@@ -44,7 +60,8 @@ QList *qdict_get_qlist(const QDict *qdict, const char *key);
QDict *qdict_get_qdict(const QDict *qdict, const char *key);
const char *qdict_get_str(const QDict *qdict, const char *key);
int64_t qdict_get_try_int(const QDict *qdict, const char *key,
- int64_t err_value);
+ int64_t def_value);
+int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value);
const char *qdict_get_try_str(const QDict *qdict, const char *key);
#endif /* QDICT_H */