| From 4c0ae9bbc7424ca9fc220f56487e9927e8841f87 Mon Sep 17 00:00:00 2001 |
| From: Kevin Wolf <kwolf@redhat.com> |
| Date: Tue, 5 Nov 2013 14:09:00 +0100 |
| Subject: [PATCH 47/87] Implement qdict_flatten() |
| |
| RH-Author: Kevin Wolf <kwolf@redhat.com> |
| Message-id: <1383660558-32096-7-git-send-email-kwolf@redhat.com> |
| Patchwork-id: 55385 |
| O-Subject: [RHEL-7.0 qemu-kvm PATCH 06/24] Implement qdict_flatten() |
| Bugzilla: 978402 |
| RH-Acked-by: Fam Zheng <famz@redhat.com> |
| RH-Acked-by: Laszlo Ersek <lersek@redhat.com> |
| RH-Acked-by: Max Reitz <mreitz@redhat.com> |
| |
| qdict_flatten(): For each nested QDict with key x, all fields with key y |
| are moved to this QDict and their key is renamed to "x.y". This operation |
| is applied recursively for nested QDicts. |
| |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| Reviewed-by: Eric Blake <eblake@redhat.com> |
| (cherry picked from commit f660dc6a2e97756596b2e79ce6127a3034f2308b) |
| |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| |
| include/qapi/qmp/qdict.h | 1 + |
| qobject/qdict.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ |
| 2 files changed, 52 insertions(+) |
| |
| Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com> |
| |
| include/qapi/qmp/qdict.h | 1 + |
| qobject/qdict.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ |
| 2 files changed, 52 insertions(+), 0 deletions(-) |
| |
| diff --git a/include/qapi/qmp/qdict.h b/include/qapi/qmp/qdict.h |
| index 685b2e3..d6855d1 100644 |
| |
| |
| @@ -65,5 +65,6 @@ 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); |
| |
| QDict *qdict_clone_shallow(const QDict *src); |
| +void qdict_flatten(QDict *qdict); |
| |
| #endif /* QDICT_H */ |
| diff --git a/qobject/qdict.c b/qobject/qdict.c |
| index ed381f9..472f106 100644 |
| |
| |
| @@ -476,3 +476,54 @@ static void qdict_destroy_obj(QObject *obj) |
| |
| g_free(qdict); |
| } |
| + |
| +static void qdict_do_flatten(QDict *qdict, QDict *target, const char *prefix) |
| +{ |
| + QObject *value; |
| + const QDictEntry *entry, *next; |
| + const char *new_key; |
| + bool delete; |
| + |
| + entry = qdict_first(qdict); |
| + |
| + while (entry != NULL) { |
| + |
| + next = qdict_next(qdict, entry); |
| + value = qdict_entry_value(entry); |
| + new_key = NULL; |
| + delete = false; |
| + |
| + if (prefix) { |
| + qobject_incref(value); |
| + new_key = g_strdup_printf("%s.%s", prefix, entry->key); |
| + qdict_put_obj(target, new_key, value); |
| + delete = true; |
| + } |
| + |
| + if (qobject_type(value) == QTYPE_QDICT) { |
| + qdict_do_flatten(qobject_to_qdict(value), target, |
| + new_key ? new_key : entry->key); |
| + delete = true; |
| + } |
| + |
| + if (delete) { |
| + qdict_del(qdict, entry->key); |
| + |
| + /* Restart loop after modifying the iterated QDict */ |
| + entry = qdict_first(qdict); |
| + continue; |
| + } |
| + |
| + entry = next; |
| + } |
| +} |
| + |
| +/** |
| + * qdict_flatten(): For each nested QDict with key x, all fields with key y |
| + * are moved to this QDict and their key is renamed to "x.y". This operation |
| + * is applied recursively for nested QDicts. |
| + */ |
| +void qdict_flatten(QDict *qdict) |
| +{ |
| + qdict_do_flatten(qdict, qdict, NULL); |
| +} |
| -- |
| 1.7.1 |
| |